Product List and Query working

This commit is contained in:
Amritanshu Agrawal 2020-11-08 19:09:31 +05:30
parent 0c9ebd29d7
commit 94b63e4385
12 changed files with 142 additions and 99 deletions

View File

@ -35,7 +35,7 @@ def upgrade():
"menu_categories",
sa.Column("id", postgresql.UUID(as_uuid=True), server_default=sa.text("gen_random_uuid()"), nullable=False),
sa.Column("name", sa.Unicode(length=255), nullable=False),
sa.Column("discount_limit", sa.Numeric(), nullable=False),
sa.Column("discount_limit", sa.Numeric(precision=15, scale=5), nullable=False),
sa.Column("is_active", sa.Boolean(), nullable=False),
sa.Column("is_fixture", sa.Boolean(), nullable=False),
sa.Column("sort_order", sa.Integer(), nullable=False),
@ -107,7 +107,7 @@ def upgrade():
"taxes",
sa.Column("id", postgresql.UUID(as_uuid=True), server_default=sa.text("gen_random_uuid()"), nullable=False),
sa.Column("name", sa.Unicode(length=255), nullable=False),
sa.Column("rate", sa.Numeric(), nullable=False),
sa.Column("rate", sa.Numeric(precision=15, scale=5), nullable=False),
sa.Column("is_fixture", sa.Boolean(), nullable=False),
sa.PrimaryKeyConstraint("id", name=op.f("pk_taxes")),
sa.UniqueConstraint("name", name=op.f("uq_taxes_name")),
@ -163,7 +163,7 @@ def upgrade():
"guest_book",
sa.Column("id", postgresql.UUID(as_uuid=True), server_default=sa.text("gen_random_uuid()"), nullable=False),
sa.Column("customer_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.Column("pax", sa.Numeric(), nullable=False),
sa.Column("pax", sa.Integer, nullable=False),
sa.Column("creation_date", sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(
["customer_id"],
@ -177,7 +177,7 @@ def upgrade():
sa.Column("id", postgresql.UUID(as_uuid=True), server_default=sa.text("gen_random_uuid()"), nullable=False),
sa.Column("name", sa.Unicode(length=255), nullable=False),
sa.Column("show_in_bill", sa.Boolean(), nullable=False),
sa.Column("price", sa.Numeric(), nullable=False),
sa.Column("price", sa.Numeric(precision=15, scale=2), nullable=False),
sa.Column("is_active", sa.Boolean(), nullable=False),
sa.Column("modifier_category_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
@ -260,10 +260,10 @@ def upgrade():
sa.Column("menu_category_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.Column("sale_category_id", postgresql.UUID(as_uuid=True), nullable=True),
sa.Column("sale_category_name", sa.Unicode(length=255), nullable=True),
sa.Column("price", sa.Numeric(), nullable=False),
sa.Column("price", sa.Numeric(precision=15, scale=2), nullable=False),
sa.Column("has_happy_hour", sa.Boolean(), nullable=False),
sa.Column("is_not_available", sa.Boolean(), nullable=False),
sa.Column("quantity", sa.Numeric(), nullable=False),
sa.Column("quantity", sa.Numeric(precision=15, scale=2), nullable=False),
sa.Column("is_active", sa.Boolean(), nullable=False),
sa.Column("sort_order", sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(
@ -283,9 +283,9 @@ def upgrade():
"vouchers",
sa.Column("id", postgresql.UUID(as_uuid=True), server_default=sa.text("gen_random_uuid()"), nullable=False),
sa.Column("date", sa.DateTime(), nullable=False),
sa.Column("pax", sa.Numeric(), nullable=False),
sa.Column("bill_id", sa.Numeric(), nullable=True),
sa.Column("kot_id", sa.Numeric(), nullable=False),
sa.Column("pax", sa.Integer(), nullable=False),
sa.Column("bill_id", sa.Integer(), nullable=True),
sa.Column("kot_id", sa.Integer(), nullable=False),
sa.Column("creation_date", sa.DateTime(timezone=True), nullable=False),
sa.Column("last_edit_date", sa.DateTime(timezone=True), nullable=False),
sa.Column("food_table_id", postgresql.UUID(as_uuid=True), nullable=False),
@ -314,7 +314,7 @@ def upgrade():
"kots",
sa.Column("id", postgresql.UUID(as_uuid=True), server_default=sa.text("gen_random_uuid()"), nullable=False),
sa.Column("voucher_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.Column("code", sa.Numeric(), nullable=False),
sa.Column("code", sa.Integer(), nullable=False),
sa.Column("food_table_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.Column("date", sa.DateTime(), nullable=False),
sa.Column("user_id", postgresql.UUID(as_uuid=True), nullable=False),
@ -400,7 +400,7 @@ def upgrade():
sa.Column("id", postgresql.UUID(as_uuid=True), server_default=sa.text("gen_random_uuid()"), nullable=False),
sa.Column("voucher_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.Column("settled", sa.Integer(), nullable=False),
sa.Column("amount", sa.Numeric(), nullable=False),
sa.Column("amount", sa.Numeric(precision=15, scale=2), nullable=False),
sa.ForeignKeyConstraint(
["settled"],
["settle_options.id"],
@ -420,13 +420,13 @@ def upgrade():
sa.Column("id", postgresql.UUID(as_uuid=True), server_default=sa.text("gen_random_uuid()"), nullable=False),
sa.Column("kot_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.Column("product_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.Column("quantity", sa.Numeric(), nullable=True),
sa.Column("price", sa.Numeric(), nullable=True),
sa.Column("quantity", sa.Numeric(precision=15, scale=2), nullable=True),
sa.Column("price", sa.Numeric(precision=15, scale=2), nullable=True),
sa.Column("is_happy_hour", sa.Boolean(), nullable=False),
sa.Column("tax_rate", sa.Numeric(), nullable=True),
sa.Column("tax_rate", sa.Numeric(precision=15, scale=5), nullable=True),
sa.Column("tax_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.Column("discount", sa.Numeric(), nullable=True),
sa.Column("sort_order", sa.Numeric(), nullable=False),
sa.Column("discount", sa.Numeric(precision=15, scale=5), nullable=True),
sa.Column("sort_order", sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(["kot_id"], ["kots.id"], name=op.f("fk_inventories_kot_id_kots")),
sa.ForeignKeyConstraint(
["product_id"],
@ -449,7 +449,7 @@ def upgrade():
sa.Column("id", postgresql.UUID(as_uuid=True), server_default=sa.text("gen_random_uuid()"), nullable=False),
sa.Column("inventory_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.Column("modifier_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.Column("price", sa.Numeric(), nullable=False),
sa.Column("price", sa.Numeric(precision=15, scale=2), nullable=False),
sa.ForeignKeyConstraint(
["inventory_id"],
["inventories.id"],

View File

@ -90,7 +90,7 @@ class Tax(Base):
"id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4
)
name = Column("name", Unicode(255), nullable=False, unique=True)
rate = Column("rate", Numeric, nullable=False)
rate = Column("rate", Numeric(precision=15, scale=5), nullable=False)
is_fixture = Column("is_fixture", Boolean, nullable=False)
def __init__(self, name=None, rate=None, is_fixture=False, id_=None):
@ -107,7 +107,7 @@ class MenuCategory(Base):
"id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4
)
name = Column("name", Unicode(255), nullable=False, unique=True)
discount_limit = Column("discount_limit", Numeric, nullable=False)
discount_limit = Column("discount_limit", Numeric(precision=15, scale=5), nullable=False)
is_active = Column("is_active", Boolean, nullable=False)
is_fixture = Column("is_fixture", Boolean, nullable=False)
@ -145,6 +145,7 @@ class ProductVersions(Base):
"id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4
)
version_id = Column("version_id", UUID(as_uuid=True), ForeignKey("product_histories.id"), nullable=False)
histories = relationship("ProductHistory")
modifier_categories_products = Table(
@ -181,10 +182,10 @@ class ProductHistory(Base):
ForeignKey("sale_categories.id"),
nullable=False,
)
price = Column("price", Numeric, nullable=False)
price = Column("price", Numeric(precision=15, scale=2), nullable=False)
has_happy_hour = Column("has_happy_hour", Boolean, nullable=False)
is_not_available = Column("is_not_available", Boolean, nullable=False)
quantity = Column("quantity", Numeric, nullable=False)
quantity = Column("quantity", Numeric(precision=15, scale=2), nullable=False)
sort_order = Column("sort_order", Integer, nullable=False)
valid_from = Column("valid_from", Date(), nullable=True)
@ -291,7 +292,7 @@ class Modifier(Base):
)
name = Column("name", Unicode(255), nullable=False, unique=True)
show_in_bill = Column("show_in_bill", Boolean, nullable=False)
price = Column("price", Numeric, nullable=False)
price = Column("price", Numeric(precision=15, scale=2), nullable=False)
is_active = Column("is_active", Boolean, nullable=False)
modifier_category_id = Column(
"modifier_category_id",

View File

@ -39,7 +39,7 @@ class GuestBook(Base):
"id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4
)
customer_id = Column("customer_id", UUID(as_uuid=True), ForeignKey("customers.id"), nullable=False)
pax = Column("pax", Numeric, nullable=False)
pax = Column("pax", Integer, nullable=False)
date = Column("creation_date", DateTime(timezone=True), nullable=False)
customer = relationship("Customer")
@ -98,7 +98,7 @@ class InventoryModifier(Base):
)
inventory_id = Column("inventory_id", UUID(as_uuid=True), ForeignKey("inventories.id"), nullable=False)
modifier_id = Column("modifier_id", UUID(as_uuid=True), ForeignKey("modifiers.id"), nullable=False)
price = Column("price", Numeric, nullable=False)
price = Column("price", Numeric(precision=15, scale=2), nullable=False)
inventory = relationship("Inventory", backref="modifiers")
modifier = relationship("Modifier")
@ -117,9 +117,9 @@ class Voucher(Base):
"id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4
)
date = Column("date", DateTime, nullable=False, index=True)
pax = Column("pax", Numeric, nullable=False)
bill_id = Column("bill_id", Numeric)
kot_id = Column("kot_id", Numeric, nullable=False, unique=True)
pax = Column("pax", Integer, nullable=False)
bill_id = Column("bill_id", Integer)
kot_id = Column("kot_id", Integer, nullable=False, unique=True)
creation_date = Column("creation_date", DateTime(timezone=True), nullable=False)
last_edit_date = Column("last_edit_date", DateTime(timezone=True), nullable=False)
food_table_id = Column(
@ -222,7 +222,7 @@ class Kot(Base):
nullable=False,
index=True,
)
code = Column("code", Numeric, nullable=False, unique=True)
code = Column("code", Integer, nullable=False, unique=True)
food_table_id = Column(
"food_table_id",
UUID(as_uuid=True),
@ -267,7 +267,7 @@ class Settlement(Base):
index=True,
)
settled = Column("settled", Integer, ForeignKey("settle_options.id"), nullable=False)
amount = Column("amount", Numeric, nullable=False)
amount = Column("amount", Numeric(precision=15, scale=2), nullable=False)
settle_option = relationship("SettleOption")
@ -312,13 +312,13 @@ class Inventory(Base):
)
kot_id = Column("kot_id", UUID(as_uuid=True), ForeignKey("kots.id"), nullable=False, index=True)
product_id = Column("product_id", UUID(as_uuid=True), ForeignKey("product_versions.id"), nullable=False)
quantity = Column("quantity", Numeric)
price = Column("price", Numeric)
quantity = Column("quantity", Numeric(precision=15, scale=2))
price = Column("price", Numeric(precision=15, scale=2))
is_happy_hour = Column("is_happy_hour", Boolean, nullable=False)
tax_rate = Column("tax_rate", Numeric)
tax_rate = Column("tax_rate", Numeric(precision=15, scale=5))
tax_id = Column("tax_id", UUID(as_uuid=True), ForeignKey("taxes.id"), nullable=False)
discount = Column("discount", Numeric)
sort_order = Column("sort_order", Numeric, nullable=False)
discount = Column("discount", Numeric(precision=15, scale=5))
sort_order = Column("sort_order", Integer, nullable=False)
kot = relationship("Kot", backref="inventories")
tax = relationship("Tax", foreign_keys=tax_id)

View File

@ -10,7 +10,7 @@ from sqlalchemy.orm import Session
from ..core.security import get_current_active_user as get_user
from ..db.session import SessionLocal
from ..models.master import MenuCategory, Product
from ..models.master import MenuCategory, ProductVersions
from ..schemas.auth import UserToken

View File

@ -11,7 +11,7 @@ from sqlalchemy.orm import Session
from ..core.security import get_current_active_user as get_user
from ..db.session import SessionLocal
from ..models.master import MenuCategory, ModifierCategory, Product
from ..models.master import MenuCategory, ModifierCategory, ProductVersions
from ..schemas.auth import UserToken

View File

@ -1,16 +1,19 @@
import uuid
from datetime import date, datetime, timedelta
from typing import List, Optional
import barker.schemas.master as schemas
from fastapi import APIRouter, Depends, HTTPException, Security, status
from sqlalchemy import and_, or_
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import Session, joinedload
from sqlalchemy.orm import Session, contains_eager, joinedload
from ..core.config import settings
from ..core.security import get_current_active_user as get_user
from ..db.session import SessionLocal
from ..models.master import Product
from ..models.master import MenuCategory, ProductHistory, ProductVersions, SaleCategory
from ..schemas.auth import UserToken
@ -70,7 +73,7 @@ def save(
user: UserToken = Security(get_user, scopes=["products"]),
):
try:
item = Product(
item = ProductHistory(
name=data.name,
units=data.units,
menu_category_id=data.menu_category.id_,
@ -158,14 +161,35 @@ def show_blank(
@router.get("/list")
def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)):
def show_list(d: str = None, db: Session = Depends(get_db), user: UserToken = Depends(get_user)):
date_ = (
(datetime.now() - timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)).date()
if d is None
else datetime.strptime(d, "%d-%b-%Y").date()
)
return [
product_info(item)
for item in db.query(Product)
.order_by(Product.menu_category_id)
.order_by(Product.sort_order)
.order_by(Product.name)
.options(joinedload(Product.menu_category), joinedload(Product.sale_category))
product_info(item.histories)
for item in db.query(ProductVersions)
.join(ProductVersions.histories)
.join(ProductHistory.menu_category)
.filter(
and_(
or_(ProductHistory.valid_from == None, ProductHistory.valid_from <= date_),
or_(ProductHistory.valid_till == None, ProductHistory.valid_till >= date_),
)
)
.order_by(MenuCategory.sort_order)
.order_by(MenuCategory.name)
.order_by(ProductHistory.sort_order)
.order_by(ProductHistory.name)
.options(
joinedload(ProductVersions.histories, innerjoin=True),
joinedload(ProductVersions.histories, ProductHistory.menu_category, innerjoin=True),
joinedload(ProductVersions.histories, ProductHistory.sale_category, innerjoin=True),
contains_eager(ProductVersions.histories),
contains_eager(ProductVersions.histories, ProductHistory.menu_category),
contains_eager(ProductVersions.histories, ProductHistory.sale_category),
)
.all()
]
@ -173,58 +197,42 @@ def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)
@router.get("/query")
async def show_term(
mc: uuid.UUID = None,
a: bool = None,
d: str = None,
db: Session = Depends(get_db),
current_user: UserToken = Depends(get_user),
):
date_ = (
(datetime.now() - timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)).date()
if d is None
else datetime.strptime(d, "%d-%b-%Y").date()
)
list_ = []
for item in (
db.query(Product)
.filter(Product.is_active == a, Product.menu_category_id == mc)
.order_by(Product.sort_order, Product.name)
db.query(ProductVersions)
.join(ProductVersions.histories)
.join(ProductVersions.histories, ProductHistory.sale_category)
.join(ProductVersions.histories, ProductHistory.sale_category, SaleCategory.tax)
.filter(
and_(
ProductHistory.menu_category_id == mc,
or_(ProductHistory.valid_from == None, ProductHistory.valid_from <= date_),
or_(ProductHistory.valid_till == None, ProductHistory.valid_till >= date_),
)
)
.order_by(ProductHistory.sort_order, ProductHistory.name)
.options(
joinedload(ProductVersions.histories, innerjoin=True),
joinedload(ProductVersions.histories, ProductHistory.sale_category, innerjoin=True),
joinedload(ProductVersions.histories, ProductHistory.sale_category, SaleCategory.tax, innerjoin=True),
contains_eager(ProductVersions.histories),
contains_eager(ProductVersions.histories, ProductHistory.sale_category),
contains_eager(ProductVersions.histories, ProductHistory.sale_category, SaleCategory.tax),
)
.all()
):
list_.append(
{
"id": item.id,
"name": item.full_name,
"saleCategory": {
"id": item.sale_category_id,
"name": item.sale_category.name,
},
"tax": {
"id": item.sale_category.tax_id,
"name": item.sale_category.tax.name,
"rate": item.sale_category.tax.rate,
},
"price": item.price,
"hasHappyHour": False,
"isNotAvailable": item.is_not_available,
"isActive": item.is_active,
"sortOrder": item.sort_order,
}
)
if item.has_happy_hour:
list_.append(
{
"id": item.id,
"name": "H H " + item.full_name,
"saleCategory": {
"id": item.sale_category_id,
"name": item.sale_category.name,
},
"tax": {
"id": item.sale_category.tax_id,
"name": item.sale_category.tax.name,
"rate": item.sale_category.tax.rate,
},
"price": item.price,
"hasHappyHour": True,
"isNotAvailable": item.is_not_available,
"isActive": item.is_active,
"sortOrder": item.sort_order,
}
)
list_.append(query_product_info(item.histories, False))
if item.histories.has_happy_hour:
list_.append(query_product_info(item.histories, True))
return list_
@ -238,7 +246,27 @@ def show_id(
return product_info(item)
def product_info(item: Optional[Product]):
def query_product_info(item: ProductHistory, happy_hour: bool):
return {
"id": item.id,
"name": ("H H " if happy_hour else "") + item.full_name,
"saleCategory": {
"id": item.sale_category_id,
"name": item.sale_category.name,
},
"tax": {
"id": item.sale_category.tax_id,
"name": item.sale_category.tax.name,
"rate": item.sale_category.tax.rate,
},
"price": item.price,
"hasHappyHour": happy_hour,
"isNotAvailable": item.is_not_available,
"sortOrder": item.sort_order,
}
def product_info(item: Optional[ProductHistory]):
if item is None:
return {
"name": "",
@ -263,6 +291,6 @@ def product_info(item: Optional[Product]):
"price": item.price,
"hasHappyHour": item.has_happy_hour,
"isNotAvailable": item.is_not_available,
"isActive": item.is_active,
"isActive": True,
"sortOrder": item.sort_order,
}

View File

@ -7,7 +7,7 @@ from sqlalchemy.sql.expression import func
from ...core.config import settings
from ...core.security import get_current_active_user as get_user
from ...db.session import SessionLocal
from ...models import Inventory, Kot, Product, Voucher, VoucherType
from ...models import Inventory, Kot, ProductVersions, Voucher, VoucherType
from ...schemas.auth import UserToken

View File

@ -10,7 +10,14 @@ from sqlalchemy.orm import Session
from ...core.config import settings
from ...core.security import get_current_active_user as get_user
from ...db.session import SessionLocal
from ...models import Inventory, Kot, Product, SaleCategory, Voucher, VoucherType
from ...models import (
Inventory,
Kot,
ProductVersions,
SaleCategory,
Voucher,
VoucherType,
)
from ...printing.discount_report import print_discount_report
from ...schemas.auth import UserToken
from ...schemas.discount_report import DiscountReport, DiscountReportItem

View File

@ -11,7 +11,7 @@ from ...models import (
Inventory,
Kot,
MenuCategory,
Product,
ProductVersions,
SaleCategory,
Voucher,
VoucherType,

View File

@ -13,7 +13,7 @@ from ...db.session import SessionLocal
from ...models import (
Inventory,
Kot,
Product,
ProductVersions,
SaleCategory,
Settlement,
SettleOption,

View File

@ -17,7 +17,7 @@ from ...models import (
Inventory,
InventoryModifier,
Kot,
Product,
ProductVersions,
Voucher,
VoucherType,
)

View File

@ -12,7 +12,14 @@ from sqlalchemy.orm import Session
from ...core.security import get_current_active_user as get_user
from ...db.session import SessionLocal
from ...models import Inventory, InventoryModifier, Kot, Product, Voucher, VoucherType
from ...models import (
Inventory,
InventoryModifier,
Kot,
ProductVersions,
Voucher,
VoucherType,
)
from ...printing import print_bill, print_kot
from ...routers.voucher import (
check_permissions,