/** * WPML compatibility functions * * @global array $duplicated_posts Array to store the posts being duplicated. * * @package Yoast\WP\Duplicate_Post * @since 3.2 */ add_action( 'admin_init', 'duplicate_post_wpml_init' ); /** * Add handlers for WPML compatibility. */ function duplicate_post_wpml_init() { if ( defined( 'ICL_SITEPRESS_VERSION' ) ) { add_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10, 3 ); add_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10, 3 ); add_action( 'shutdown', 'duplicate_wpml_string_packages', 11 ); } } global $duplicated_posts; // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: Renaming a global variable is a BC break. $duplicated_posts = []; /** * Copy post translations. * * @global SitePress $sitepress Instance of the Main WPML class. * @global array $duplicated_posts Array of duplicated posts. * * @param int $post_id ID of the copy. * @param WP_Post $post Original post object. * @param string $status Status of the new post. */ function duplicate_post_wpml_copy_translations( $post_id, $post, $status = '' ) { global $sitepress; global $duplicated_posts; remove_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10 ); remove_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10 ); $current_language = $sitepress->get_current_language(); $trid = $sitepress->get_element_trid( $post->ID ); if ( ! empty( $trid ) ) { $translations = $sitepress->get_element_translations( $trid ); $new_trid = $sitepress->get_element_trid( $post_id ); foreach ( $translations as $code => $details ) { if ( $code !== $current_language ) { if ( $details->element_id ) { $translation = get_post( $details->element_id ); if ( ! $translation ) { continue; } $new_post_id = duplicate_post_create_duplicate( $translation, $status ); if ( ! is_wp_error( $new_post_id ) ) { $sitepress->set_element_language_details( $new_post_id, 'post_' . $translation->post_type, $new_trid, $code, $current_language ); } } } } // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: see above. $duplicated_posts[ $post->ID ] = $post_id; } } /** * Duplicate string packages. * * @global array() $duplicated_posts Array of duplicated posts. */ function duplicate_wpml_string_packages() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: renaming the function would be a BC-break. global $duplicated_posts; foreach ( $duplicated_posts as $original_post_id => $duplicate_post_id ) { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. $original_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $original_post_id ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. $new_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $duplicate_post_id ); if ( is_array( $original_string_packages ) ) { foreach ( $original_string_packages as $original_string_package ) { $translated_original_strings = $original_string_package->get_translated_strings( [] ); foreach ( $new_string_packages as $new_string_package ) { $cache = new WPML_WP_Cache( 'WPML_Package' ); $cache->flush_group_cache(); $new_strings = $new_string_package->get_package_strings(); foreach ( $new_strings as $new_string ) { if ( isset( $translated_original_strings[ $new_string->name ] ) ) { foreach ( $translated_original_strings[ $new_string->name ] as $language => $translated_string ) { do_action( // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. 'wpml_add_string_translation', $new_string->id, $language, $translated_string['value'], $translated_string['status'] ); } } } } } } } } Odoo POSレジ機能 – Raqqa

Odoo POSレジ機能

POSオーダーデータの各項目の説明

項目名説明
オーダ参照販売拠点(例えば「製パン店 店舗」)と内部オーダー番号。注文がどこで行われたかを識別します。
セッションPOSの稼働セッション(例:POS/00001)。1日の営業単位で管理されます。
日付注文日時。POSシステムで注文が確定されたタイミングです。
POS販売が行われた店舗名やレジ名(例:製パン店 店舗、レストランなど)。
レシート番号実際のレシート印刷時の番号。会計処理に紐づく一意の注文IDです。
顧客顧客名(通常POS注文では匿名が多いため、空欄になることも)。
キャッシャーレジ担当者の名前(このサンプルでは空欄)。POSユーザーと紐づくこともあります。
合計この注文の支払合計金額。単位はおそらく通貨(円)です。
状態注文の状態を示します。
主な値は以下の通り:
支払済 – 取引が完了
新規 – まだ処理中
取消済 – キャンセル処理済

POSセッションデータの各項目の説明

項目名説明
セッションIDセッションの識別子。POSごとに自動で割り振られるユニークなID。例:POS/00002
POSセッションが実行されたPOS(販売地点)の名称。例:レストラン、家具屋など。
開始者セッションを開始したユーザーの名前。
開始日セッションを開始した日時。
クロージング日セッションを閉じた日時。未記入の場合はまだ「進行中」の状態。
開始残高セッション開始時にレジに入っていた現金の金額。例:オープンキャッシュ200,000円など。
終了残高実際にセッション終了時にレジに残っていた現金の金額。
理論終了残高売上や支払い記録から計算される「理論上あるべき」終了残高。
状態セッションの状態:進行中(まだオープン中)、クローズ済・記帳済(レジ閉じ・記帳済み)など。

各列の意味

列名内容
日付支払いが行われた日時。POS注文に関連するタイムスタンプです。
支払方法使用された支払い手段(例:カード、現金など)。
オーダこの支払いが関連するPOSオーダーのID(例:製パン店 店舗/0001)です。
キャッシャー誰がキャッシャー(レジ担当)かを示す項目(このデータでは欠損していることが多いです)。
金額その支払いの金額です(通貨は設定により異なりますが、通常は円)。

🔍 顧客(Customer)の主な目的

1. 売上の記録先の特定

  • 誰に販売したかを明確にし、将来の問い合わせやレポート作成に活用。
  • 匿名顧客(デフォルト顧客)も設定可能。

2. 後日支払・請求管理

  • 顧客が請求先(Invoice)として指定されることで、後払いの処理が可能。

3. 販売履歴の追跡

  • 顧客ごとの購入履歴が保持され、マーケティングやロイヤリティ分析に活用。

🗂 顧客のタブ別の機能(res.partner

🔹 1. 連絡先

  • 名前、電話番号、メール、住所などの基本的な顧客情報を入力。
  • 顧客分類(個人・法人など)やタグの設定も可能。

🔹 2. 販売と購買

  • 支払い条件(Payment Terms)
  • 配送先住所(Delivery Address)
  • 顧客の販売担当者や価格リスト
  • サプライヤーとしての設定(この顧客から購入もする場合)

🔹 3. 会計

  • 売掛・買掛勘定の指定
  • 税区分(内税/外税)設定
  • 支払い遅延時のフォローアップルール

🔹 4. 内部メモ

  • スタッフ向けの自由メモ(支払い遅延の常習者など)

💡 POSとの関連

POSの注文時に指定された顧客は pos.order.partner_id に格納され、売上の記録・請求書発行・レポート出力などに活用されます。特に請求書の発行機能を有効にしている場合、顧客情報が正確であることが重要になります。

他のモジュールで使う顧客と同じもの。

製品に関しても同じなので、割愛。

✅ Odooレストランモードの使い方(概要)

1. アプリのインストール

  • Odooの「Point of Sale(POS)」アプリをインストールします。
  • レストラン機能はこのPOSアプリのオプションです。

2. 新しいPOSの設定

  1. 「設定」→「ポイントオブセール」→「新規作成」
  2. 以下の設定を行います:
    • 販売名:例「レストラン1」
    • 販売タイプ:「レストラン」を選択
    • テーブル管理を有効化(オプション)

3. テーブルレイアウトを設定

  • POS設定画面で「テーブルマネジメント」をONにすると、座席レイアウトの編集が可能になります。
  • テーブルごとに名前や人数、位置を定義できます。

4. 製品(料理)を登録

  • 「製品」メニューで料理やドリンクを登録
  • 必要に応じて「カテゴリ」も設定(例:ドリンク、メイン、デザート)

5. 注文の流れ(スタッフ操作)

  1. POSを起動(セッションを開始)
  2. テーブルを選択
  3. 料理やドリンクをタップして注文
  4. オーダーを送信 → キッチンプリンタに注文内容が印刷(※設定要)
  5. 会計時に「支払い」→支払い方法を選択して処理

6. 周辺機器連携(オプション)

  • レシートプリンタ(POSレシート)
  • キッチンプリンタ(キッチンチケット)
  • キャッシュドロワー
  • タッチスクリーンやiPadも可

🔧 オプション機能(設定からON/OFF可)

機能説明
注文をキッチンに送信キッチンプリンタと連携
注文の分割支払い複数人での支払いに対応
セッション管理シフトごとの管理や売上記録
タグ付き商品例:辛さレベル、オプション選択
オフラインモードネットワークが不安定な店舗に対応

📝 注意点

  • Odooエンタープライズ版のみでフル機能利用可(特にキッチンチケットや複数POSの統合管理など)
  • ブラウザベースで操作可能(iPadなどでも使用可)
  • 支払いは販売モジュールではなくPOSから処理され、会計連携も可能

💡 使い所(業種別)

業種Odoo POS(レストラン)の活用例
レストランテーブルごとの管理、厨房連携、座席予約対応
カフェイートイン・テイクアウトの切替、ドリンクカテゴリ管理
フードコートタッチ注文、支払い後チケット発行
居酒屋注文ごとのチケット印刷、分割会計、客単価分析

✅ 食材と料理の関連付け(構成概要)

1. 購買モジュール:食材の仕入管理

  • 野菜、肉、調味料などを「製品(プロダクト)」として登録
  • タイプは「在庫商品(Stockable)」で管理
  • 発注点や最小在庫ルールを設定すれば、自動購買にも対応

2. 在庫モジュール:食材の数量・場所を管理

  • 入庫・出庫・廃棄・内部転送などもここで管理

3. 製造モジュール(MRP):レシピ管理と材料消費

  • 料理(例:ビーフカレー)を“製品”として登録し、
  • 材料(食材)を部品表(BoM:Bill of Materials)として定義 例:コピーする編集する- ビーフカレー(料理) - 牛肉 200g - 玉ねぎ 100g - カレールー 50g - 水 300ml
  • 料理を“製造”すると、その材料が在庫から減る
  • 調理工程やステップを工程(routing)として登録も可能

🔄 全体フロー(簡略)

plaintextコピーする編集する[購買] → [在庫] → [製造] → [提供・POS販売] → [会計連携]

✅ レストラン運用での活用例

シーンOdooでの管理方法
食材の仕入購買モジュール(仕入先・価格・数量)
食材の保管在庫モジュール(入庫、廃棄)
レシピ管理製造モジュール(BoM)
料理の提供POS(レストランモード)
原価管理BoM + 食材単価の連動で実現可能

✅ 関連付けのメリット

  • 食材の使用量を自動で記録できる(在庫を減らす)
  • メニューごとの原価計算が可能
  • 在庫が少なくなった食材を自動で購買リクエストに変換できる
  • 廃棄や棚卸も在庫モジュールで対応可能

🔍 レジオープンとは?

項目説明
用語英語:Open a New Session / 日本語:レジオープン
機能POS(レストラン)で販売を開始するための営業開始ボタン
対象一つのレジ端末、もしくはPOSユーザーのセッション単位
目的売上記録、現金管理(オープニングキャッシュ)、締め処理単位を区切るため

🧾 レジオープン時の操作の流れ

  1. POSアプリを開く
  2. 「レストラン」POSを選択
  3. 「レジオープン(Open a New Session)」をクリック
  4. 必要に応じて以下を入力
    • 初期現金(オープニングキャッシュ)
    • 担当者(ユーザー)
    • 開始時刻(自動記録)
  5. → POS画面(テーブル配置やメニュー注文)に遷移
  6. 注文受付・会計処理を実施

🔒 レジを閉じるとは?

営業が終了したら「**レジを閉じる(Close Session)」」を実施して締めます。

  • 現金の確認(実残高 vs 計算残高)
  • 売上集計(商品別、時間帯別など)
  • 支払い方法ごとの合計(現金、カード、QRなど)

🏪 レジオープンの意味合い(実店舗での例)

実店舗での操作Odoo POSでの対応
開店準備・レジ起動「レジオープン」ボタンで開始
販売業務開始POS注文受付が可能に
現金をレジに入れるオープニングキャッシュの入力
閉店・レジ締め「レジクローズ」から締め処理

💡レジオープンを使うメリット

  • 複数店舗・スタッフごとの売上管理が可能
  • 現金・カード等の決済別集計が明確になる
  • 営業時間単位の会計監査がやりやすくなる
  • POSの操作ログ(開始・終了・注文内容)がトレース可能

🔍 開始現金とは?

項目説明
内容レジ開始時に実際に入っている現金の金額
目的セッション中の現金取引との照合(帳簿残 vs 実残)
タイミングPOSセッション開始時(営業開始時)に入力
関連機能セッション終了時の現金差額確認精算チェックに使われる

🧾 例:開始現金の入力場面

あなたがレストランの開店準備をしていて、前日からのつり銭がレジに以下のようにあるとします:

  • 10,000円札 × 1枚
  • 1,000円札 × 3枚
  • 100円玉 × 10枚

合計で 13,000円

この場合、Odoo POSの「開始現金」欄に 13,000 と入力します。


📊 なぜ重要なのか?

  • レジ締め時(セッション終了時)に、理論残高と実残高の差を確認できる
  • 差額の原因(誤釣銭、紛失、入力ミスなど)を追跡できる
  • 会計上の整合性を保ち、内部監査や経営分析にも活用できる

💡補足

  • この「開始現金」は日々変動する金額で、あらかじめ「固定額を準備」する店舗も多いです(例:毎朝つり銭として10,000円を用意)。
  • Odooでは「現金管理(Cash Control)」機能をオンにすることで、開始現金や入出金をきちんと管理できます。

🍽 アクションメニューの機能概要

ボタン名機能概要主な用途
分割(Split)注文を複数の会計に分割グループ客が別々に支払う場合など
転送(Transfer)注文を他のテーブルに移動席替え誤ったテーブルへの入力時など

✂️ 分割(Split)の詳細

🔹 目的

  • 一つのテーブルの注文を複数の支払い者で分けるために使用。
  • 例えば「3人で食事をして、それぞれが注文した分だけ支払いたい」場合など。

🔹 操作の流れ

  1. アクション → 分割 を選択
  2. 各商品に対して「誰が支払うか」を選択(ドラッグ&ドロップで分配)
  3. 分割されたグループごとに支払い処理が可能になる

🔹 メリット

  • 現場スタッフが複雑な注文分けを簡単に処理できる
  • 顧客満足度の向上(柔軟な対応が可能)

🔄 転送(Transfer)の詳細

🔹 目的

  • 注文を他のテーブルに移す機能
  • よくあるのは「テーブルを移動したい」「間違ったテーブルに注文した」などのケース

🔹 操作の流れ

  1. アクション → 転送 を選択
  2. 移動先のテーブルを選択
  3. 注文がそのテーブルに移される(元のテーブルは空になる)

🔹 メリット

  • 注文をキャンセルせずにそのまま正しいテーブルに移行できる
  • サービスの柔軟性が向上し、スタッフの負担が軽減

✅ 注意点

機能補足
分割注文ごとに支払いタイミングが異なる場合にも使える
転送支払いが済んでいない状態でのみ移動可能

🔍 テーブル配置の編集機能について

項目内容
利用可能版**Odoo Enterprise(有料)**のみ
編集方法ビジュアルなフロアエディタで、テーブルの追加・移動・サイズ変更が可能
フロア数複数のフロアを作成可能(例:1階、2階、テラスなど)
カスタマイズ性テーブル名や形状、色なども編集可能
操作場所POSアプリ → 設定 → フロアプランから操作可能(※Enterpriseのみ)

🍽 Preparation Display の主な役割

目的説明
注文伝達POSで入力された注文が、自動でキッチンやバーに表示される
ステータス管理スタッフが「調理中」「準備完了」などの状態をタッチ操作で更新
ペーパーレスプリンタの代わりにディスプレイで対応する(ペーパーレス運用)
多拠点対応複数の調理場所(例:キッチン・バー)に対応し、注文をルーティング可能

🧑‍🍳 機能詳細

機能内容
表示内容テーブル番号、注文内容、数量、時間など
ステータス「未着手」「調理中」「完了」などが選べる
色分け表示状態や経過時間に応じて色が変わることで、優先度を視認しやすくなる
自動更新POS側で注文を送信すると、自動でキッチンディスプレイに反映される

💡 運用イメージ

  1. ウェイターがPOSでテーブルの注文を入力
  2. 「注文を送信」すると、Preparation Displayに内容が即時表示される
  3. キッチンスタッフが画面で確認し、料理開始
  4. 完了したら「完了」ステータスを選択
  5. ウェイターが「準備完了」を画面で確認して配膳へ

📌 注意点

  • タブレットやPCなど、Webブラウザがあれば別端末で表示可能です。
  • ハードウェア(キッチンモニタやタッチディスプレイなど)は自前で用意する必要があります。

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です