python| まとめ | 現役エンジニア&プログラミングスクール講師「python」のまとめページです。pythonに関して抑えておきたい知識や文法やにについて記事をまとめています。まとめページの下部には「おすすめの学習書籍」「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中...

目標

  • 会計時に現金とキャッシュレスの同時支払を行えるようにする。

支払処理の修正

支払処理の修正

ここからは、会計時に現金とキャッシュレスの同時支払を行えるようにプログラムやテンプレートを修正していきます。まずは、修正用のGitブランチを準備します。

release-register-002ブランチの作成

developブランチでgit checkout -b release-register-002コマンドを入力します。今回の修正はこのブランチで行います。

支払処理の修正プログラミング

models.pyの編集(ordersapp内)

models.pyファイルを次のように編集します。

from datetime import timedelta, timezone

from sqlalchemy.sql import func  # type: ignore

from apps.common.db import db

JST = timezone(timedelta(hours=9))


# 伝票(Bill)モデル
class Bill(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    status = db.Column(
        db.String(20), default="Order in progress"
    )  # 伝票のステータス(Order in progress, pending, paid)
    table_id = db.Column(
        db.Integer, db.ForeignKey("table.id"), nullable=False
    )  # テーブルとの関連
    orders = db.relationship("Order", backref="bill", lazy=True, cascade="all, delete")

    table = db.relationship("Table", back_populates="bill")  # 1つのテーブルに1つの伝票
    created_at = db.Column(db.DateTime, default=func.now(), server_default=func.now())

    cash_amount = db.Column(db.Integer, default=0)  # 現金支払額
    cashless_amount = db.Column(db.Integer, default=0)  # キャッシュレス支払額

    @property
    def total_amount(self):
        return sum(order.total for order in self.orders)  # 関連する注文の合計

    def __repr__(self):
        return f"<Bill {self.id} - Status: {self.status}>"

    def get_created_at_jst(self):
        """JST に変換し、さらに9時間を加算して取得"""
        if self.created_at is None:
            return None
        return (self.created_at + timedelta(hours=9)).strftime("%Y-%m-%d %H:%M")


# 注文(Order)モデル
class Order(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    table_id = db.Column(db.Integer, db.ForeignKey("table.id"), nullable=False)
    bill_id = db.Column(db.Integer, db.ForeignKey("bill.id"), nullable=True)
    product_id = db.Column(db.Integer, db.ForeignKey("product.id"), nullable=False)
    product_name = db.Column(db.String(100), nullable=False)
    quantity = db.Column(db.Integer, nullable=False)
    total = db.Column(db.Float, nullable=False)  # Float に変更

    # 消費税関連
    vat_id = db.Column(db.Integer, db.ForeignKey("vat.id"), nullable=True)  # 外部キー
    vat_number = db.Column(db.Integer, nullable=True)  # vat.number を保存

    status = db.Column(
        db.String(20), default="not_served"
    )  # ステータスを追加("not_served" または "served")
    created_at = db.Column(db.DateTime, default=func.now(), server_default=func.now())

    table = db.relationship("Table", backref="orders", lazy=True)
    product = db.relationship("Product", backref="orders", lazy=True)
    vat = db.relationship("Vat", backref="orders", lazy=True)  # Vat とのリレーション

    def __repr__(self):
        return f"<Order {self.id} - Table {self.table_id} - {self.product_name} x {self.quantity}>"

    def get_created_at_jst(self):
        """JST に変換し取得"""
        if self.created_at is None:
            return None
        return (self.created_at + timedelta(hours=9)).strftime("%Y-%m-%d %H:%M")

forms.pyの編集(ordersapp内)

forms.pyファイルを次のように編集します。

この続きはNoteとなります。

今回は以上になります。

「python」おすすめ書籍 ベスト3 | 現役エンジニア&プログラミングスクール講師「python」の学習でお勧めしたい書籍をご紹介しています。お勧めする理由としては、考え方、イメージなどを適切に捉えていること、「生のpython」に焦点をあてて解説をしている書籍であることなどが理由です。勿論、この他にも良い書籍はありますが、特に質の高かったものを選んで記事にしています。ページの下部には「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中。...

ブックマークのすすめ

「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】について解説している記事です。削除方法も掲載しています。...
【パソコン選び】失敗しないための重要ポイント | 現役エンジニア&プログラミングスクール講師【パソコン選び】失敗しないための重要ポイントについての記事です。パソコンのタイプと購入時に検討すべき点・家電量販店で見かけるCPUの見方・購入者が必要とするメモリ容量・HDDとSSDについて・ディスプレイの種類・バッテリーの持ち時間や保証・Officeソフト・ウィルス対策ソフトについて書いています。...