Note
Dynamics 365 Commerce による Retail Interest Group は Yammer から Viva Engage に移行しました。 新しい Viva Engage コミュニティにアクセスできない場合は、このフォーム (https://aka.ms/JoinD365commerceVivaEngageCommunity) に入力して追加し、最新のディスカッションに参加してください。
この記事では、Microsoft Dynamics 365 Commerce で POS 要求ハンドラーをオーバーライドする方法について説明します。
この記事では、POS ビジネス ロジックをオーバーライドするための拡張パターンについて説明します。 コア POS ビジネス フローにビジネス ロジックを変更または追加するシナリオがある場合は、このパターンに従います。
たとえば、シリアル品目を販売すると、POS によってダイアログ ボックスが表示され、スキャン後にその品目のシリアル番号を入力できます。 シリアル番号をコードで入力してシリアル番号プロセスを自動化する場合は、このシリアル番号要求ハンドラーをオーバーライドし、カスタム ビジネス ロジックを使用できます。 POS のビジネス ロジックのほとんどは、要求ハンドラーに実装されます。 ただし、関連する要求ハンドラーをオーバーライドし、ビジネス フローに従って応答を返すことができます。
Note
すべての要求ハンドラー ロジックがカスタマイズ用に公開されるわけではありません。 ビジネス ロジックをカスタマイズし、その要求ハンドラーをオーバーライドできない場合は、サポート チケットを作成するか、Microsoft Dynamics Lifecycle Services (LCS) 機能拡張ツールで要求をログに記録します。
オーバーライドするために公開される POS 要求ハンドラー ロジック
この一覧は、Microsoft Dynamics 365 Finance - バージョン 7.3.5 に基づいています。
毎月の更新ごとに、Microsoft は拡張ポイントを追加します。 Retail SDK の Pos.api.d.ts ファイルで完全な一覧を確認します。
買い物カゴ拡張ハンドラー
| 要求名 | Description |
|---|---|
| AddTenderLineToCartClientRequestHandler | このハンドラーは、支払い手段の行をカートに追加するときに実行されます。 |
| GetKeyedInPriceClientRequestHandler | このハンドラーは、販売中に価格に構成キーを持つ項目を追加すると実行されます。 |
| GetPickupDateClientRequestHandler | 顧客の注文時に集荷日を選択すると実行されます。 |
| GetShippingDateClientRequestHandler | 顧客の注文時に出荷日を選択すると実行されます。 |
| ShowChangeDueClientRequestHandler | トランザクションの最後に [期限の変更] ダイアログ ボックスが表示されたときに実行されます。 |
| GetReceiptEmailAddressClientRequestHandler | 受信メール アドレスを取得すると実行されます。 |
| DepositOverrideOperationRequestHandler | デポジットをオーバーライドすると実行されます。 |
| GetShippingChargeClientRequestHandler | 顧客注文フロー中に出荷請求ワークフローが開始されたときに実行されます。 |
| GetKeyedInPriceClientRequestHandler | [製品価格] ダイアログ ボックスにキーが表示されたときに実行されます。 |
支払拡張機能ハンドラー
| 要求名 | Description |
|---|---|
| GetGiftCardByIdServiceRequestHandler | このハンドラーは、ギフト カード ID を受け取ったときに実行されます。 |
| GetPaymentCardTypeByBinRangeClientRequestHandler | このハンドラーは、POS が Visa や Mastercard などのカードの種類を取得したときに実行されます。 これは、カード支払/入金の明細行の処理中の HQ コンフィギュレーションに基づきます。 |
周辺機器要求ハンドラー
| 要求名 | Description |
|---|---|
| CardPaymentAuthorizePaymentRequestHandler | カードの支払いを承認すると実行されます。 |
| CardPaymentCapturePaymentRequestHandler | カード支払いをキャプチャするときに実行されます。 |
| CardPaymentExecuteTaskRequestHandler | カスタム タスクを実行するために実行します。 このハンドラーは、主に、サポートされていない支払いコネクタを使用したカスタム機能の拡張機能に使用します。 |
| CardPaymentRefundPaymentRequestHandler | カードの支払いを払い戻すときに実行されます。 |
| CardPaymentVoidPaymentRequestHandler | カード支払いを無効にすると実行されます。 |
| CardPaymentBeginTransactionRequestHandler | カード支払いを開始すると実行されます。 |
| CardPaymentEndTransactionRequestHandler | カードの支払いを終了すると実行されます。 |
| CardPaymentEnquireGiftCardBalancePeripheralRequestHandler | ギフト カード残高の問い合わせを行うときに実行されます。 |
| PaymentTerminalAuthorizePaymentActivityRequestHandler | 支払いターミナルまたはデバイスを使用してカードの支払いを承認すると実行されます。 |
| PaymentTerminalAuthorizePaymentRequestHandler | 支払いターミナルまたはデバイスを使用してカードの支払いを承認すると実行されます。 |
| PaymentTerminalEnquireGiftCardBalancePeripheralRequestHandler | 支払い端末または端末を使用して、ギフト カード残高の照会を行うときに実行されます。 |
| PaymentTerminalExecuteTaskRequestHandler | カスタム タスクを実行するために実行します。 このハンドラーは、主に、サポートされていない支払いターミナルまたはデバイスを使用するカスタム機能の拡張機能に使用します。 |
| PaymentTerminalRefundPaymentRequestHandler | 支払いターミナルまたはデバイスを使用してカードの支払いを払い戻すときに実行されます。 |
| PaymentTerminalUpdateLinesRequestHandler | POS が、表示目的で支払デバイスに明細の詳細を送信するときに実行されます。 |
| PaymentTerminalVoidPaymentRequestHandler | 支払いターミナルまたはデバイスを使用してカードの支払いを無効にすると実行されます。 |
| PaymentTerminalBeginTransactionRequestHandler | 支払いターミナルまたはデバイスを使用してカード支払いを開始すると実行されます。 |
| PaymentTerminalCancelOperationRequestHandler | 支払いターミナルまたはデバイスを使用してカードの支払いを取り消すと実行されます。 |
| PaymentTerminalEndTransactionRequestHandler | 支払いターミナルまたはデバイスを使用してカードの支払いを終了すると実行されます。 |
| CashDrawerOpenRequestHandler | POS がキャッシュ ドロワーのオープン要求を開始したときに実行されます。 |
| PaymentTerminalActivateGiftCardPeripheralRequestHandler | POS がギフト カードのアクティブ化要求を開始したときに実行されます。 |
| PaymentTerminalAddBalanceToGiftCardPeripheralRequestHandler | POS がギフト カード要求に残高の追加を開始したときに実行されます。 |
スキャン要求ハンドラー
| 要求名 | Description |
|---|---|
| GetScanResultClientRequestHandler | POS トランザクション画面 Numpad をスキャンまたは入力すると実行されます。 |
店舗フルフィルメント要求ハンドラー
| 要求名 | Description |
|---|---|
| PrintPackingSlipClientRequestHandler | 店舗のフルフィルメントビューから梱包明細を印刷する際に実行されます。 |
| MarkAsPickedServiceRequestHandler | 販売ラインをストアフルフィルメントビューでピック済みとしてマークすると、実行されます。 |
店舗運営要求ハンドラー
| 要求名 | Description |
|---|---|
| CreateTenderRemovalTransactionClientRequestHandler | POS で入札削除操作を開始すると実行されます。 |
| CreateFloatEntryTransactionClientRequestHandler | POS で float エントリ操作を開始すると実行されます。 |
| SelectZipCodeInfoClientRequestHandler | POS で住所の追加ビューまたは編集ビューに郵便番号を入力すると実行されます。 |
| CreateStartingAmountTransactionClientRequestHandler | POS で開始金額宣言を開始すると実行されます。 |
| LoyaltyCardPointsBalanceOperationRequestHandler | POS でロイヤルティ カード残高操作を開始すると実行されます。 |
| GetReportParametersClientRequestHandler | レポート パラメーターを使用すると実行されます。 POS レポートに入力パラメーターが必要な場合、このダイアログではパラメーターがキャプチャされます。 |
| GetPickingAndReceivingOrdersClientRequestHandler | 注文がピッキングおよび受領処理のために取得されるときに実行されます。 |
| GetStartingAmountClientRequestHandler | POS で開始金額宣言を開始すると (ビューに移動する前に) 実行されます。 |
支払/入金計算要求ハンドラー
| 要求名 | Description |
|---|---|
| CreateSafeDropTransactionClientRequestHandler | POS で安全なドロップ操作を実行すると実行されます。 |
| GetTenderDetailsClientRequestHandler | POS で入札申告の詳細を取得すると実行されます。 |
| CreateBankDropTransactionClientRequestHandler | POS で銀行ドロップ操作を実行すると実行されます。 |
| CreateTenderDeclarationTransactionClientRequestHandler | POS で入札申告操作を実行すると実行されます。 |
| GetCountedTenderDetailAmountClientRequestHandler | POSで精算カウントの詳細を行うときに実行されます。 |
| CreateBankDropTransactionClientRequestHandler | POS で銀行ドロップ操作を実行すると実行されます。 |
販売注文の要求ハンドラー
| 要求名 | Description |
|---|---|
| GetGiftReceiptsClientRequestHandler | POS でギフトレシートを印刷するときに実行されます。 |
| SelectCustomerOrderTypeClientRequestHandler | 顧客の注文または見積もりを選択するオプションを含むダイアログ ボックスが表示されたときに実行されます。 |
| GetCancellationChargeClientRequestHandler | 顧客注文ワークフロー中にキャンセル配送料を入力するダイアログ ボックスが表示されたときに実行されます。 |
POS でハンドラーをオーバーライドする
上記の POS 要求ハンドラー ロジックのいずれかをオーバーライドするには、次の手順に従います。
- 新しいクラスを作成し、対応するハンドラー クラスから拡張します。 たとえば、
GetSerialNumberClientRequestHandlerをオーバーライドする場合は、GetSerialNumberClientRequestHandlerからクラスを拡張します。 -
executeAsyncメソッドを実装します。 - 既定のハンドラーを呼び出すか、
executeAsyncメソッド内にカスタム ロジックを追加して応答を返します。
詳細な手順
次の手順例は、クラス GetSerialNumberClientRequestHandler オーバーライドして POS のシリアル番号エントリを自動化する方法を示しています。 既定では、シリアル番号を要求するように項目が構成されている場合は、POS によってシリアル番号を入力するダイアログ ボックスが表示されます。 このダイアログ ボックスが表示されないようにし、コードでシリアル番号を入力します。
POS 要求ハンドラー ロジックをオーバーライドするには、次の手順に従います。
Visual Studio 2015 を管理者モードで開きます。
から
...\RetailSDK\POSを開きます。POS の下 。拡張機能 プロジェクトで、 POSRequestHandlerExtension という名前の新しいフォルダーを作成します。
POSRequestHandlerExtension フォルダーの下に、Handlers という名前の新しいフォルダーを作成します。
Handlers フォルダーに新しい
.ts(TypeScript) ファイルを追加し、GetSerialNumberClientRequestHandlerExt.ts名前を付けます。次の import ステートメントを追加して、関連するエンティティとコンテキストを GetSerialNumberClientRequestHandlerExt.ts ファイルにインポートします。
import { GetSerialNumberClientRequestHandler } from "PosApi/Extend/RequestHandlers/ProductsRequestHandlers"; import { GetSerialNumberClientRequest, GetSerialNumberClientResponse } from "PosApi/Consume/Products"; import { ClientEntities } from "PosApi/Entities";GetSerialNumberClientRequestHandlerExt.ts ファイルで、という名前の新しいクラスを作成し、
GetSerialNumberClientRequestHandlerExtendから拡張します。export default class GetSerialNumberClientRequestHandlerExt extends GetSerialNumberClientRequestHandler { }executeAsyncクラス内にGetSerialNumberClientRequestHandlerExtメソッドを実装します。executeAsyncメソッドで、カスタム ロジックを記述し、応答を返すか、既定のハンドラーを呼び出します。 POS はシリアル項目を販売するときに、シリアル番号のロジックを実行するexecuteAsyncを探します。 ただし、オーバーライドしているため、POS は標準メソッドではなく、このオーバーライドされたexecuteAsyncメソッドを実行します。executeAsync メソッドをオーバーライドする方法のサンプル実装
public executeAsync(request: GetSerialNumberClientRequest<GetSerialNumberClientResponse>): Promise<ClientEntities.ICancelableDataResult<GetSerialNumberClientResponse>> { // User could implement new business logic here to process the serial number. // The following example sets serial number "112233" for product 82001. if (request.product.ItemId === "82001") { let response: GetSerialNumberClientResponse = new GetSerialNumberClientResponse("112233"); return Promise.resolve(<ClientEntities.ICancelableDataResult<GetSerialNumberClientResponse>>{ canceled: false, data: response }); } // If you don’t want to execute custom logic on some conditions, and you just want to call the standard logic, you can call the default request, as shown below. return this.defaultExecuteAsync(request); }完全なサンプル コード:
import { GetSerialNumberClientRequestHandler } from "PosApi/Extend/RequestHandlers/ProductsRequestHandlers"; import { GetSerialNumberClientRequest, GetSerialNumberClientResponse } from "PosApi/Consume/Products"; import { ClientEntities } from "PosApi/Entities"; /** * Override request handler class for getting serial number request. */ export default class GetSerialNumberClientRequestHandlerExt extends GetSerialNumberClientRequestHandler { /** * Executes the request handler asynchronously. * @param {GetSerialNumberClientRequest<GetSerialNumberClientResponse>} request The request containing the response. * @return {Promise<ICancelableDataResult<GetSerialNumberClientResponse>>} The cancelable promise containing the response. */ public executeAsync(request: GetSerialNumberClientRequest<GetSerialNumberClientResponse>): Promise<ClientEntities.ICancelableDataResult<GetSerialNumberClientResponse>> { // User could implement new business logic here to process the serial number. // The following example sets serial number "112233" for product 82001. if (request.product.ItemId === "82001") { let response: GetSerialNumberClientResponse = new GetSerialNumberClientResponse("112233"); return Promise.resolve(<ClientEntities.ICancelableDataResult<GetSerialNumberClientResponse>>{ canceled: false, data: response }); } return this.defaultExecuteAsync(request); }POSRequestHandlerExtension フォルダーの下に新しい json ファイルを作成します。 manifest.json という名前を付けます。
manifest.json ファイルに、次のコードをコピーして貼り付けます。 このコードをコピーする前に、既定で生成されたコードを削除してください。
{ "$schema": "../manifestSchema.json", "name": "Pos_Extensibility_Samples", "publisher": "Microsoft", "version": "7.3.5.0", "minimumPosVersion": "7.3.5.0", "components": { "extend": { "requestHandlers": [ { "modulePath": "Handlers/GetSerialNumberClientRequestHandlerExt" } ] } } }POS.Extensions プロジェクトの extensions.json ファイルを開きます。 実行時に POS にこの拡張機能が含まれるように、
POSRequestHandlerExtensionサンプルで更新します。{ "extensionPackages": [ { "baseUrl": "SampleExtensions2" }, { "baseUrl": " SampleExtensions" }, { "baseUrl": "POSRequestHandlerExtension" } ] }Note
extension.json ファイルには常に 2 つの拡張フォルダー名が含まれている必要があるため、SampleExtensions フォルダー名またはカスタム拡張フォルダー名を保持してください。 運用環境では、サンプル拡張機能を使用しないでください。 独自の拡張フォルダーを追加し、すべてのサンプルを削除します。
tsconfig.json ファイルを開き、除外リストから拡張パッケージ フォルダーをコメント アウトします。 POS では、このファイルを使用して、コンパイル用の拡張機能を含めたり除外したりします。 既定では、リストに除外されたすべての拡張リストが含まれています。 POS の拡張部分をコンパイルする場合は、次のコードに示すように、拡張フォルダー名を追加し、拡張機能の一覧から拡張機能をコメントする必要があります。
"exclude": [ // "SampleExtensions", //"SampleExtensions2", //"POSRequestHandlerExtension" ],プロジェクトをコンパイル、およびリビルドします。
拡張機能をテストする
拡張機能をテストするには、次の手順に従います。
- F5 キーを押し、POS を展開してカスタマイズをテストします。
- POS が開始されたら、POS にサインインし、トランザクションへシリアル品目を追加します。
- 拡張コードにブレークポイントを配置します。 シリアル項目を追加すると、拡張コードをデバッグできます。