/// <summary> /// Registers the clock in/ clock out request from the employee. /// </summary> /// <param name="context">The request context.</param> /// <param name="isClockIn">Whether this is a clockIn request (true) or clockOut (false).</param> /// <returns>Returns the activity DateTimeOffset in channel local time zone.</returns> private static DateTimeOffset RegisterClockInAndOut(RequestContext context, bool isClockIn) { ThrowIf.Null(context, "context"); var request = new EmployeeClockInOutRealtimeRequest( context.GetPrincipal().UserId, context.GetTerminal().TerminalId, isClockIn); return(context.Execute <SingleEntityDataServiceResponse <DateTimeOffset> >(request).Entity); }
/// <summary> /// Invoked after request has been processed by <see cref="IRequestHandler"/>. /// </summary> /// <param name="request">The request message processed by handler.</param> /// <param name="response">The response message generated by handler.</param> public void OnExecuted(Request request, Response response) { ThrowIf.Null(request, "request"); Type requestType = request.GetType(); if (requestType == typeof(GetCartsDataRequest)) { OnGetCartsExecuted((GetCartsDataRequest)request, (EntityDataServiceResponse <SalesTransaction>)response); } }
/// <summary> /// Adds or updates reason code lines for cart level reason code lines. /// </summary> /// <param name="salesTransaction">The sales transaction.</param> /// <param name="cart">The cart to update or add.</param> public static void AddOrUpdateReasonCodeLinesOnTransaction(SalesTransaction salesTransaction, Cart cart) { ThrowIf.Null(salesTransaction, "salesTransaction"); ThrowIf.Null(cart, "cart"); if (cart.ReasonCodeLines != null && cart.ReasonCodeLines.Any()) { AddOrUpdateReasonCodeLinesHelper(salesTransaction.ReasonCodeLines, cart.ReasonCodeLines, salesTransaction.Id, string.Empty, ReasonCodeLineType.Header); } }
public PutCustomPropertyRequest(IFabricClient fabricClient, Uri name, string propertyName, T data, TimeSpan timeout) : base(fabricClient, timeout) { ThrowIf.Null(name, "name"); ThrowIf.NullOrEmpty(propertyName, "propertyName"); this.Name = name; this.PropertyName = propertyName; this.Data = data; this.ConfigureErrorCodes(); }
/// <summary> /// Gets a button grids by identifiers. /// </summary> /// <param name="request">The get button grids data request.</param> /// <returns> /// Collection of matching button grids. /// </returns> private EntityDataServiceResponse <ButtonGrid> GetButtonsGrids(GetButtonGridsDataRequest request) { ThrowIf.Null(request, "request"); ThrowIf.Null(request.ButtonGridIds, "request.ButtonGridIds"); ThrowIf.Null(request.QueryResultSettings, "request.QueryResultSettings"); PagedResult <ButtonGrid> buttonGrids = null; // Default query to retrieve all the button grids. var query = new SqlPagedQuery(request.QueryResultSettings) { From = ButtonGridsView, OrderBy = ButtonGrid.ButtonGridIdColumn }; // Update query when only one button grid is retrieved. if (request.ButtonGridIds.Count() == 1) { query.Where = string.Format("{0} = @{0}", ButtonGrid.ButtonGridIdColumn); query.Parameters[string.Format("@{0}", ButtonGrid.ButtonGridIdColumn)] = request.ButtonGridIds.FirstOrDefault(); } // Update query for retrieving multiple button grids. if (request.ButtonGridIds.HasMultiple()) { using (StringIdTableType buttonGridIdTableType = new StringIdTableType(request.ButtonGridIds, ButtonGrid.ButtonGridIdColumn)) { query.Parameters[ButtonGridIdTableTypeParameterName] = buttonGridIdTableType; // Query execution for retrieving multiple button grids. buttonGrids = this.ExecuteQuery <ButtonGrid>(query, request.RequestContext); } } else { // Query execution for retrieving one or all the button grids. buttonGrids = this.ExecuteQuery <ButtonGrid>(query, request.RequestContext); } // Get the button grid buttons. if (buttonGrids != null && buttonGrids.Results != null) { var buttonGridIds = buttonGrids.Results.Select(b => b.Id); ReadOnlyCollection <ButtonGridButton> buttons = this.GetButtonGridButtons(buttonGridIds, request.RequestContext).Results; foreach (var buttonGrid in buttonGrids.Results) { buttonGrid.Buttons = buttons.Where(b => string.Equals(b.ButtonGridId, buttonGrid.Id, StringComparison.OrdinalIgnoreCase)); } } return(new EntityDataServiceResponse <ButtonGrid>(buttonGrids)); }
/// <summary> /// Executes the workflow to retrieve changed products. /// </summary> /// <param name="request">The request.</param> /// <returns>The response.</returns> protected override VerifyProductExistenceResponse Process(VerifyProductExistenceRequest request) { ThrowIf.Null(request, "request"); VerifyProductExistenceDataRequest dataRequest = new VerifyProductExistenceDataRequest(request.Criteria, request.QueryResultSettings); ReadOnlyCollection <ProductExistenceId> ids = this.Context.Runtime.Execute <EntityDataServiceResponse <ProductExistenceId> >(dataRequest, this.Context).PagedEntityCollection.Results; VerifyProductExistenceResponse response = new VerifyProductExistenceResponse(ids); return(response); }
/// <summary> /// Sets the line level delivery options. /// </summary> /// <param name="salesTransaction">The sales transaction being updated.</param> /// <param name="lineDeliverySpecifications">The delivery specifications at the line level.</param> /// <returns>Updated sales transaction.</returns> private SalesTransaction UpdateLineLevelDeliveryOptions(SalesTransaction salesTransaction, IEnumerable <LineDeliverySpecification> lineDeliverySpecifications) { ThrowIf.Null(lineDeliverySpecifications, "lineDeliverySpecifications"); // Clear header level delivery information. salesTransaction.DeliveryMode = null; salesTransaction.ShippingAddress = null; Dictionary <string, LineDeliverySpecification> lineDeliverySpecificationsByLineId = lineDeliverySpecifications.ToDictionary(k => k.LineId); foreach (var salesLine in salesTransaction.SalesLines) { if (salesLine != null) { LineDeliverySpecification currentLineDeliverySpecification; if (lineDeliverySpecificationsByLineId.TryGetValue(salesLine.LineId, out currentLineDeliverySpecification)) { ClearLineLevelDeliveryValues(salesLine); DeliverySpecification currentDeliverySpecification = currentLineDeliverySpecification.DeliverySpecification; this.ValidateDeliveryMode(currentDeliverySpecification.DeliveryModeId); salesLine.DeliveryMode = currentDeliverySpecification.DeliveryModeId; switch (currentDeliverySpecification.DeliveryPreferenceType) { case DeliveryPreferenceType.ShipToAddress: salesLine.ShippingAddress = currentDeliverySpecification.DeliveryAddress; break; case DeliveryPreferenceType.PickupFromStore: salesLine.ShippingAddress = currentDeliverySpecification.DeliveryAddress; salesLine.FulfillmentStoreId = currentDeliverySpecification.PickUpStoreId; break; case DeliveryPreferenceType.ElectronicDelivery: UpdateElectronicDeliveryInfo( salesLine, currentDeliverySpecification.ElectronicDeliveryEmailAddress, currentDeliverySpecification.ElectronicDeliveryEmailContent); break; default: var message = string.Format("Unsupported delivery preference type [{0}] is specified.", currentDeliverySpecification.DeliveryPreferenceType); throw new InvalidOperationException(message); } } } } return(salesTransaction); }
/// <summary> /// Executes the workflow to retrieve customer loyalty information. /// </summary> /// <param name="request">The request.</param> /// <returns>The response.</returns> protected override UpdateCustomerResponse Process(UpdateCustomerRequest request) { ThrowIf.Null(request, "request"); CustomerHelper.ValidateAddresses(this.Context, request.UpdatedCustomer.Addresses); var saveCustomerServiceRequest = new SaveCustomerServiceRequest(request.UpdatedCustomer); var saveCustomerServiceResponse = this.Context.Execute <SaveCustomerServiceResponse>(saveCustomerServiceRequest); return(new UpdateCustomerResponse(saveCustomerServiceResponse.UpdatedCustomer)); }
public StartNodeTransitionRequest(IFabricClient fabricClient, NodeTransitionDescription description, TimeSpan timeout) : base(fabricClient, timeout) { ThrowIf.Null(description, "description"); this.Description = description; this.RetryErrorCodes.Add((uint)NativeTypes.FABRIC_ERROR_CODE.FABRIC_E_NOT_READY); this.RetryErrorCodes.Add((uint)NativeTypes.FABRIC_ERROR_CODE.FABRIC_E_RECONFIGURATION_PENDING); this.SucceedErrorCodes.Add((uint)NativeTypes.FABRIC_ERROR_CODE.FABRIC_E_TEST_COMMAND_OPERATION_ID_ALREADY_EXISTS); }
/// <summary> /// Helper methods to calculates the required reason codes. /// </summary> /// <param name="requestContext">The request context.</param> /// <param name="serviceRequest">The service request.</param> /// <exception cref="ConfigurationException">Required Service missing: {0}.</exception> private static void CalculateRequiredReasonCodesHelper(RequestContext requestContext, CalculateRequiredReasonCodesServiceRequest serviceRequest) { ThrowIf.Null(serviceRequest.SalesTransaction, "serviceRequest.SalesTransaction"); // Reason codes are only calculated for retail stores and carts that are not customer orders. if ((requestContext.GetChannelConfiguration().ChannelType == RetailChannelType.RetailStore) && (serviceRequest.SalesTransaction.CartType != CartType.CustomerOrder)) { var serviceResponse = requestContext.Execute <CalculateRequiredReasonCodesServiceResponse>(serviceRequest); ReasonCodesWorkflowHelper.ThrowIfRequiredReasonCodesMissing(serviceResponse); } }
public RemoveApplicationPackageRequest( IFabricClient fabricClient, string imageStoreConnectionString, string applicationPackagePathInImageStore, TimeSpan timeout) : base(fabricClient, timeout) { ThrowIf.Null(applicationPackagePathInImageStore, "applicationPackagePathInImageStore"); this.ImageStoreConnectionString = imageStoreConnectionString; this.ApplicationPackagePathInImageStore = applicationPackagePathInImageStore; }
/// <summary> /// Unlocks the gift cards that are on active sales lines. /// </summary> /// <param name="context">The context.</param> /// <param name="salesTransaction">The sales transaction.</param> internal static void UnlockGiftCardsOnActiveSalesLines(RequestContext context, SalesTransaction salesTransaction) { ThrowIf.Null(context, "context"); ThrowIf.Null(salesTransaction, "salesTransaction"); IEnumerable <SalesLine> activeGiftCardLines = salesTransaction.SalesLines.Where(l => l.IsGiftCardLine && !l.IsVoided); foreach (SalesLine line in activeGiftCardLines) { GiftCardWorkflowHelper.UnlockGiftCard(context, line.GiftCardId); } }
public UpdateApplicationRequest( IFabricClient fabricClient, ApplicationUpdateDescription updateDescription, TimeSpan timeout) : base(fabricClient, timeout) { ThrowIf.Null(updateDescription, "ApplicationUpdateDescription"); this.UpdateDescription = updateDescription; this.ConfigureErrorCodes(); }
/// <summary> /// The data service method to execute the data manager to get the device configuration. /// </summary> /// <param name="request">The data service request.</param> /// <returns>The data service response.</returns> private SingleEntityDataServiceResponse <DeviceConfiguration> GetDeviceConfiguration(GetDeviceConfigurationDataRequest request) { ThrowIf.Null(request, "request"); ThrowIf.Null(request.RequestContext, "request.RequestContext"); ThrowIf.Null(request.QueryResultSettings, "request.QueryResultSettings"); ICommercePrincipal principal = request.RequestContext.GetPrincipal(); if (principal.IsChannelAgnostic || principal.IsTerminalAgnostic || string.IsNullOrWhiteSpace(principal.DeviceNumber)) { throw new InvalidOperationException("Current request context is not associated to a device."); } Terminal terminal = request.RequestContext.GetTerminal(); ParameterSet parameters = new ParameterSet(); Tuple <PagedResult <DeviceConfiguration>, ReadOnlyCollection <HardwareConfiguration>, ReadOnlyCollection <HardwareConfiguration>, ReadOnlyCollection <HardwareConfiguration> > dataSets = null; parameters[DatabaseAccessor.ChannelIdVariableName] = terminal.ChannelId; parameters[TerminalIdVariableName] = terminal.TerminalId; parameters[IncludeImagesVariableName] = request.IncludeImages; using (SqlServerDatabaseContext databaseContext = new SqlServerDatabaseContext(request.RequestContext, request.QueryResultSettings)) { dataSets = databaseContext.ExecuteStoredProcedure <DeviceConfiguration, HardwareConfiguration, HardwareConfiguration, HardwareConfiguration>(GetDeviceConfigurationSprocName, parameters); } DeviceConfiguration deviceConfiguration = dataSets.Item1.SingleOrDefault(); ReadOnlyCollection <HardwareConfiguration> drawers = dataSets.Item2; ReadOnlyCollection <HardwareConfiguration> printers = dataSets.Item3; ReadOnlyCollection <HardwareConfiguration> pinpads = dataSets.Item4; if (deviceConfiguration != null) { deviceConfiguration.HardwareConfigurations = new HardwareConfigurations(); deviceConfiguration.HardwareConfigurations.CashDrawerConfigurations.AddRange(drawers); deviceConfiguration.HardwareConfigurations.PrinterConfigurations.AddRange(printers); deviceConfiguration.HardwareConfigurations.PinPadConfiguration = pinpads.SingleOrDefault(); } GetDeviceDataRequest getDeviceRequest = new GetDeviceDataRequest(principal.DeviceNumber); Device device = request.RequestContext.Execute <SingleEntityDataServiceResponse <Device> >(getDeviceRequest).Entity; if (deviceConfiguration != null && device != null) { deviceConfiguration.UseInMemoryDeviceDataStorage = device.UseInMemoryDeviceDataStorage; } return(new SingleEntityDataServiceResponse <DeviceConfiguration>(deviceConfiguration)); }
/// <summary> /// Processes the GetXZReportReceiptRequest to return the X or Z report receipts. The request should not be null. /// </summary> /// <param name="request">The request parameter.</param> /// <returns>The GetReceiptResponse.</returns> protected override GetReceiptResponse Process(GetXAndZReportReceiptRequest request) { ThrowIf.Null(request, "request"); var getReceiptServiceRequest = this.CreateXZReportReceiptServiceRequest(request); var getReceiptServiceResponse = this.Context.Execute <GetReceiptServiceResponse>(getReceiptServiceRequest); // Save the transaction log for printing X or X report this.LogTransaction(request); return(new GetReceiptResponse(getReceiptServiceResponse.Receipts)); }
protected static CommandDefinition CreateCommand(string commandText, object?parameters, IDbTransaction?transaction, CancellationToken cancellationToken) { ThrowIf.Null(commandText, nameof(commandText)); return(new CommandDefinition ( commandText: commandText, parameters: parameters, transaction: transaction, cancellationToken: cancellationToken )); }
/// <summary> /// Executes the workflow for a get price check for a product. /// </summary> /// <param name="request">The request.</param> /// <returns>The response.</returns> protected override PriceCheckResponse Process(PriceCheckRequest request) { ThrowIf.Null(request, "request"); ItemBarcode itemBarcode = null; if (string.IsNullOrEmpty(request.Barcode) && string.IsNullOrEmpty(request.ItemId)) { throw new DataValidationException(DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_ItemIdBarcodeMissing, "Either an item identifier or barcode is required."); } if (string.IsNullOrEmpty(request.ItemId)) { GetProductBarcodeDataRequest dataRequest = new GetProductBarcodeDataRequest(request.Barcode); itemBarcode = this.Context.Runtime.Execute <GetProductBarcodeDataResponse>(dataRequest, this.Context).Barcode; } SalesTransaction salesTransaction = new SalesTransaction() { Id = Guid.NewGuid().ToString(), CustomerId = request.CustomerAccountNumber, }; SalesLine salesLine = new SalesLine() { ItemId = request.ItemId, InventoryDimensionId = request.InventoryDimensionId ?? itemBarcode.InventoryDimensionId, SalesOrderUnitOfMeasure = request.UnitOfMeasureSymbol ?? itemBarcode.UnitId, Quantity = 1m, LineId = Guid.NewGuid().ToString() }; salesTransaction.SalesLines.Add(salesLine); GetIndependentPriceDiscountServiceRequest priceRequest = new GetIndependentPriceDiscountServiceRequest(salesTransaction); GetPriceServiceResponse pricingServiceResponse = this.Context.Execute <GetPriceServiceResponse>(priceRequest); SalesLine resultLine = pricingServiceResponse.Transaction.SalesLines[0]; ProductPrice productPrice = GetProductPrice( resultLine.ItemId, resultLine.InventoryDimensionId, resultLine.BasePrice, resultLine.TotalAmount, this.Context.GetChannelConfiguration().Currency); var productPrices = new List <ProductPrice> { productPrice }; return(new PriceCheckResponse(productPrices.AsPagedResult())); }
/// <summary> /// Register the time for employee break. /// </summary> /// <param name="context">The request context.</param> /// <param name="jobId">The job identifier.</param> /// <returns>Returns the activity DateTimeOffset in channel local time zone.</returns> public static DateTimeOffset RegisterEmployeeBreak(RequestContext context, string jobId) { ThrowIf.Null(context, "context"); ThrowIf.NullOrWhiteSpace(jobId, "jobId"); var request = new RegisterEmployeeBreakRealtimeRequest( context.GetPrincipal().UserId, context.GetTerminal().TerminalId, jobId); return(context.Execute <SingleEntityDataServiceResponse <DateTimeOffset> >(request).Entity); }
public PatientController ( IPatientService patientService, ILogger <PatientController> logger ) { ThrowIf.Null(patientService, nameof(patientService)); ThrowIf.Null(logger, nameof(logger)); _patientService = patientService; _logger = logger; }
/// <summary> /// Upload an offline sales order. /// </summary> /// <param name="request">The request.</param> /// <returns>The response.</returns> protected override UploadOrderResponse Process(UploadOrderRequest request) { ThrowIf.Null(request, "request"); request.Order.ValidateSalesOrder(this.Context); var saveTransactionRequest = new SaveSalesTransactionDataRequest(request.Order); this.Context.Runtime.Execute <NullResponse>(saveTransactionRequest, this.Context); return(new UploadOrderResponse()); }
/// <summary> /// Construct the Payment Device class and open the connection from it. /// </summary> /// <returns>The response.</returns> /// <param name="request">Open payment terminal device request.</param> private NullResponse Open(OpenPaymentTerminalDeviceRequest request) { ThrowIf.Null(request, nameof(request)); // Open the device for payments Utilities.WaitAsyncTask(() => Task.Run(async() => { await this.OpenAsync(request.DeviceName, request.TerminalSettings, request.DeviceConfig).ConfigureAwait(false); })); return(new NullResponse()); }
/// <summary> /// Creates the mapped exception for <see cref="Exception"/> returned during invoking realtime transaction service method. /// </summary> /// <param name="methodName">The method name.</param> /// <param name="exception">The exception.</param> /// <param name="errorResourceId">The <see cref="CommunicationErrors"/> enumeration.</param> /// <param name="errorMessage">The error message in the communication exception.</param> /// <returns>The <see cref="CommunicationException"/>.</returns> public static CRT.CommunicationException CreateCommunicationException(string methodName, Exception exception, CommunicationErrors errorResourceId, string errorMessage = "") { ThrowIf.Null(methodName, "methodName"); ThrowIf.Null(exception, "exception"); errorMessage = string.IsNullOrWhiteSpace(errorMessage) ? string.Format("Exception while calling invoke method {0}: {1}", methodName, exception.Message) : errorMessage; return(new CRT.CommunicationException( errorResourceId, exception, errorMessage)); }
public static T UiThread <T>(this Control control, Func <T> func) { ThrowIf.Null(control, nameof(control)); ThrowIf.Null(func, nameof(func)); if (control.InvokeRequired) { return((T)control.Invoke(func)); } return(func()); }
/// <summary> /// Adds loyalty card tier table schema into the data table. /// </summary> /// <param name="table">The data table.</param> private static void AddLoyaltyCardTierTableTypeSchema(DataTable table) { ThrowIf.Null(table, "table"); // NOTE: The order of colums here MUST match the @TVP_LOYALTYCARDTIERTABLETYPE. table.Columns.Add(LoyaltySqlServerDataService.RecIdColumn, typeof(long)); table.Columns.Add(LoyaltySqlServerDataService.AffiliationColumn, typeof(long)); table.Columns.Add(LoyaltySqlServerDataService.LoyaltyCardColumn, typeof(long)); table.Columns.Add(LoyaltySqlServerDataService.LoyaltyTierColumn, typeof(long)); table.Columns.Add(LoyaltySqlServerDataService.ValidFromColumn, typeof(DateTime)); table.Columns.Add(LoyaltySqlServerDataService.ValidToColumn, typeof(DateTime)); }
/// <summary> /// Initializes a new instance of the <see cref="IndiaPriceHelper"/> class. /// </summary> /// <param name="channelConfiguration">The channel configuration.</param> /// <param name="pricingDataManager">Pricing data manager.</param> /// <param name="transaction">Current transaction.</param> /// /// <param name="priceGroup">Customer price group.</param> /// <returns>The instance of IndiaPriceHelper.</returns> public IndiaPriceHelper(ChannelConfiguration channelConfiguration, IPricingDataAccessor pricingDataManager, SalesTransaction transaction, string priceGroup) { ThrowIf.Null(channelConfiguration, "channelConfiguration"); ThrowIf.Null(pricingDataManager, "pricingDataManager"); ThrowIf.Null(transaction, "transaction"); this.channelConfiguration = channelConfiguration; this.pricingDataManager = pricingDataManager; this.salesTransaction = transaction; this.customerId = transaction.CustomerId; this.priceGroup = priceGroup; }
public static DbTempTableColumn <TRow> From <TValue>(string name, string dbType, Func <TRow, TValue> getValue) { ThrowIf.NullOrWhiteSpace(name, nameof(name)); ThrowIf.NullOrWhiteSpace(dbType, nameof(dbType)); ThrowIf.Null(getValue, nameof(getValue)); var type = typeof(TValue); object?GetBoxedValue(TRow obj) => getValue(obj); return(new DbTempTableColumn <TRow>(name, dbType, type, GetBoxedValue)); }
/// <summary> /// Voids active gift card lines on the transaction. /// </summary> /// <param name="context">The context.</param> /// <param name="salesTransaction">The sales transaction.</param> internal static void VoidGiftCardSalesLines(RequestContext context, SalesTransaction salesTransaction) { ThrowIf.Null(context, "context"); ThrowIf.Null(salesTransaction, "salesTransaction"); IEnumerable <SalesLine> activeGiftCardLines = salesTransaction.SalesLines.Where(l => l.IsGiftCardLine && !l.IsVoided); foreach (SalesLine line in activeGiftCardLines) { GiftCardWorkflowHelper.VoidGiftCardOperation(context, salesTransaction, line.GiftCardId, line.GiftCardCurrencyCode, line.GiftCardOperation, line.TotalAmount); } }
public DbTempTableColumn(string name, string dbType, Type type, Func <TRow, object?> getValue) { ThrowIf.NullOrWhiteSpace(name, nameof(name)); ThrowIf.NullOrWhiteSpace(dbType, nameof(dbType)); ThrowIf.Null(type, nameof(type)); ThrowIf.Null(getValue, nameof(getValue)); Name = name; DbType = dbType; Type = type; GetValue = getValue; }
public UpdateServiceGroupRequest(IFabricClient fabricClient, ServiceKind serviceKind, Uri serviceGroupName, int targetReplicaSetSize, TimeSpan replicaRestartWaitDuration, TimeSpan quorumLossWaitDuration, int instanceCount, TimeSpan timeout) : base(fabricClient, timeout) { ThrowIf.Null(serviceGroupName, "serviceNameGroup"); this.ServiceGroupName = serviceGroupName; this.ServiceKind = serviceKind; this.TargetReplicaSetSize = targetReplicaSetSize; this.ReplicaRestartWaitDuration = replicaRestartWaitDuration; this.QuorumLossWaitDuration = quorumLossWaitDuration; this.InstanceCount = instanceCount; }
/// <summary> /// Executes the workflow to do user authentication. /// </summary> /// <param name="request">The request.</param> /// <returns>The response.</returns> protected override UserAuthenticationResponse Process(UserAuthenticationRequest request) { ThrowIf.Null(request, "request"); Device device = null; CommerceIdentity identity; Employee employee; string deviceId = string.IsNullOrWhiteSpace(request.DeviceId) ? request.RequestContext.GetPrincipal().DeviceNumber : request.DeviceId; string deviceToken = string.IsNullOrWhiteSpace(request.DeviceToken) ? request.RequestContext.GetPrincipal().DeviceToken : request.DeviceToken; try { // Authenticate device only when the device token is specified if (!string.IsNullOrWhiteSpace(deviceToken)) { device = AuthenticationHelper.AuthenticateDevice( this.Context, deviceToken); } // User logs on. employee = AuthenticationHelper.AuthenticateAndAuthorizeUser(request, device); identity = new CommerceIdentity(employee, device); // If the request is for elevate operation if (request.RetailOperation != RetailOperation.None) { // Add the Elevation properties to the claim. identity.OriginalUserId = this.Context.GetPrincipal().UserId; identity.ElevatedRetailOperation = request.RetailOperation; // successful manager override for operation with id and operator with id var message = string.Format( "Manager with id '{0}' has approved override for operation with id '{1}' to the operator with id '{2}'.", request.StaffId, identity.ElevatedRetailOperation, identity.OriginalUserId); LogAuditEntry(request.RequestContext, "ElevateUser", message); } return(new UserAuthenticationResponse(employee, device, identity)); } catch (Exception exception) { RetailLogger.Log.CrtWorkflowUserAuthenticationRequestHandlerFailure(request.StaffId, deviceId, exception); throw; } }