配送キャリア別の配送希望日・時間帯ルール¶
- 作成日: 2026-04-13
- 目的: checkout の配送希望日・配送希望時間帯を、配送方法ごとの配送キャリア設定で制御する。
決定事項¶
- 配送希望日候補は
ChannelではなくShippingMethodの custom field を正本とする。 ShippingMethodは SMILE から取り込まれた実在の配送方法を前提とし、seed で仮の配送方法を新設しない。- 配送方法ごとに次の値を Dashboard から編集できること。
smileShippingCompanyCodesdeliveryCarrierCodedeliveryDateLeadDaysdeliveryDateSelectionStartOffsetDaysdeliveryDateSelectionEndOffsetDaysdeliveryTimeSlots- チャネルごとに次の営業スケジュールを Dashboard から編集できること。
deliveryClosedWeekdaysdeliveryExcludeNationalHolidaysdeliveryHolidayDates- checkout の既定配送方法は、原則として
Customer.customFields.shippingCompanyCodeと、選択可能なShippingMethod.customFields.smileShippingCompanyCodesの一致で決定する。 - ただし checkout 時点で選択可能な
ShippingMethodが 1 件に確定している場合は、SMILE 側のshippingCompanyCodeが欠落していても、その 1 件を既定配送方法として採用する。 - SMILE 側の
shippingCompanyCodeが欠落しており、かつ checkout 時点で選択可能なShippingMethodが複数件または 0 件の場合は、checkout を進めず「お問い合わせください」を表示する。 shippingCompanyCodeは存在するが一致するShippingMethodが存在しない場合も、checkout を進めず「お問い合わせください」を表示する。- checkout の配送希望日は自由入力ではなく select box とし、先頭に「最短日出荷」を表示したうえで、
最短配達可能日 + 開始オフセットから最短配達可能日 + 終了オフセットまでの候補日を表示する。 - checkout の初期選択は「最短日出荷」とする。保存済みの有効な日付指定がある場合は、その保存済み値を優先して復元する。
- 「最短日出荷」は日付固定の配送希望日ではなく、最短で出荷・配送できる手配を依頼する特別候補として扱う。保存時は
Order.customFields.deliveryDateをnullにし、Order.customFields.specialInstructionsに最短日出荷を付与する。 - 最短配達可能日は
deliveryDateLeadDaysとdefaultCutoffTimeと都道府県別leadDaysOffsetを合成して算出する。 effectiveLeadDays = deliveryDateLeadDays + leadDaysOffset + (基準時刻が cutoffTime を過ぎていれば +1)- 都道府県別
leadDaysOffsetはProvinceDeliveryProfileを正本にする(docs/specifications/2026-05-shipping-zone-and-carrier-rules.md)。 defaultCutoffTimeは SMILE Export Settings (smile.exportSettings.defaultCutoffTime) を正本とし、未保存の場合は共有定数DEFAULT_CUTOFF_TIME ("14:00")にフォールバックする。これにより SMILE 設定保存有無で checkout の配送日 selector が silent hide されない。- checkout の配送希望時間帯は、選択中の配送方法の
deliveryTimeSlotsだけを表示する。 - checkout の配送希望時間帯は「指定なし」を初期選択とする。選択中の配送方法の
deliveryTimeSlotsに「指定なし」が含まれていない場合も、checkout では先頭候補として補完する。保存済みの有効な時間帯指定がある場合は、その保存済み値を優先して復元する。 - SMILE 受注CSVの
時間帯はdeliveryTimeSlotsの表示文字列を直接出力しない。配送方法ごとの 「配送時間帯コード × 配送方法」マッピングで、表示文字列を SMILE の整数時間帯コードへ変換する。 - 配送希望日候補は、チャネルに設定された休業曜日・休業日を除外した営業日だけを表示する。
deliveryExcludeNationalHolidays=trueの場合、日本の祝日ライブラリ@holiday-jp/holiday_jpに含まれる祝日も候補から除外する。- checkout で日付候補を選択した場合は
Order.customFields.deliveryDate、配送希望時間帯はOrder.customFields.deliveryTimeSlotに保存する。「最短日出荷」を選択した場合は配送希望日を保存せず、備考で後続連携へ渡す。 - 配送希望日または配送希望時間帯に必要な設定が未入力の配送方法では、未設定の selector を表示しない。
Order.customFields.deliveryTimeSlotに値があるのに、該当する配送方法の SMILE 時間帯コードマッピングが 見つからない場合、SMILE export は fail-closed で失敗させる。時間指定なしは指定なしマッピングを経由して SMILE コード99として扱う。
配送キャリア別の既定値¶
- この仕様でいう「初期データ」は、配送方法そのものの seed ではなく、SMILE 取込済み
ShippingMethodに適用するためのキャリア別既定値を指す。 - 運用では Dashboard 上で各配送方法の
deliveryCarrierCodeを選び、必要に応じて既定値を上書きする。 - 既定配送方法の自動選択を安定させるため、各配送方法には
smileShippingCompanyCodesを設定する。 - 初期候補として
1(ゆうパック)と4(ヤマト運輸)を用意するが、運用で必要に応じて編集できる。
SMILE 運送会社コードと配送キャリア判定¶
checkout では SMILE 由来の Customer.customFields.shippingCompanyCode を正規化し、選択可能な
ShippingMethod.customFields.smileShippingCompanyCodes と照合して既定配送方法を決める。キャリアそのものは、
一致した ShippingMethod.customFields.deliveryCarrierCode を正本にする。
| SMILE 運送会社コード | 正規化後 | 想定配送キャリア | ShippingMethod.smileShippingCompanyCodes |
ShippingMethod.deliveryCarrierCode |
備考 |
|---|---|---|---|---|---|
1 |
1 |
日本郵便 / ゆうパック | ["1"] |
japan-post |
標準候補 |
0001 |
1 |
日本郵便 / ゆうパック | ["1"] |
japan-post |
zero-padding を取り除いて 1 と同一扱い |
4 |
4 |
ヤマト運輸 | ["4"] |
yamato |
標準候補 |
0004 |
4 |
ヤマト運輸 | ["4"] |
yamato |
zero-padding を取り除いて 4 と同一扱い |
| 空文字 / 未設定 | なし | 判定しない | - | - | 選択可能な配送方法が 1 件だけなら採用する |
| その他 | 入力値 | 運用設定に従う | 同じ値を候補に設定した配送方法 | 運用で設定した値 | 一致する配送方法が無ければ checkout 停止 |
1 や 4 からキャリアへ直接変換するのではなく、SMILE コードで配送方法を選び、その配送方法に設定された
deliveryCarrierCode で配送希望日・時間帯候補を制御する。新しい SMILE コードを扱う場合は、
対象の ShippingMethod.smileShippingCompanyCodes に候補値を追加し、対応する deliveryCarrierCode を明示する。
japan-postdeliveryDateLeadDays:0deliveryDateSelectionStartOffsetDays:1deliveryDateSelectionEndOffsetDays:7deliveryTimeSlots:午前中,12-14時,14-16時,16-18時,18-20時,19-21時yamatodeliveryDateLeadDays:0deliveryDateSelectionStartOffsetDays:1deliveryDateSelectionEndOffsetDays:7deliveryTimeSlots:午前中,14-16時,16-18時,18-20時,19-21時
SMILE 時間帯コードマッピング¶
SMILE 側の時間帯マスタは配送キャリア別ではなく、整数コードのグローバルマスタとして扱われる。 配送会社ごとの時間帯統廃合や将来のコードレンジ分割に耐えるため、コード変換はキャリア定数ではなく 配送方法ごとのマッピングレコードを正本にする。
初期値:
| 配送方法 | 表示時間帯 | SMILEコード |
|---|---|---|
| 日本郵便 | 午前中 | 1 |
| 日本郵便 | 12-14時 | 2 |
| 日本郵便 | 14-16時 | 3 |
| 日本郵便 | 16-18時 | 4 |
| 日本郵便 | 18-20時 | 5 |
| 日本郵便 | 19-21時 | 7 |
| 日本郵便 | 指定なし | 99 |
| ヤマト運輸 | 午前中 | 1 |
| ヤマト運輸 | 14-16時 | 3 |
| ヤマト運輸 | 16-18時 | 4 |
| ヤマト運輸 | 18-20時 | 5 |
| ヤマト運輸 | 19-21時 | 7 |
| ヤマト運輸 | 指定なし | 99 |
将来 SMILE 側で 20 番台をヤマト、30 番台を日本郵便のように分ける場合も、
配送方法ごとのマッピングを差し替えるだけで checkout の表示候補と export の変換を維持する。
調査メモ¶
- ヤマト運輸の法人 FAQ では、宅急便(常温)の日時指定は「発送日の翌日から 7 日以内」とされている。
- 日本郵便の 2024-01-30 リリースでは、ゆうパックの配達希望時間帯は 2024-10-01 以降 6 区分で、
20時-21時は廃止されている。 - 本システムでは UX を単純化するため、日付固定の配送希望日候補は両キャリアとも
最短配達可能日+1から+7に統一し、これとは別に「最短日出荷」を常に選べるようにする。将来差分が必要になった場合も ShippingMethod 画面で個別調整できる。 - 祝日判定は外部 API へ依存せず、
@holiday-jp/holiday_jpに同梱された日本祝日データを使用する。
出典¶
- ヤマト運輸 法人 FAQ「宅急便の日時指定は、何日先までできますか?」
- 日本郵便 ニュースリリース「2024年問題などを踏まえたサービスの見直し」
- 日本郵便 別添3「ゆうパックの配達希望時間帯『20時-21時』の廃止」