Fix: Add Tax was not working as TaxIn required a name with length more than 1.

This commit is contained in:
Amritanshu Agrawal 2020-12-21 08:02:36 +05:30
parent f65c19ce1a
commit 4386ee45b8
6 changed files with 97 additions and 87 deletions

View File

@ -1,6 +1,6 @@
import uuid import uuid
from typing import List, Optional from typing import List, Union
import barker.schemas.table as schemas import barker.schemas.table as schemas
@ -32,7 +32,7 @@ def sort_order(
data: List[schemas.Table], data: List[schemas.Table],
db: Session = Depends(get_db), db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["sections"]), user: UserToken = Security(get_user, scopes=["sections"]),
): ) -> List[schemas.Table]:
try: try:
for index, item in enumerate(data): for index, item in enumerate(data):
db.query(FoodTable).filter(FoodTable.id == item.id_).update({FoodTable.sort_order: index}) db.query(FoodTable).filter(FoodTable.id == item.id_).update({FoodTable.sort_order: index})
@ -64,7 +64,7 @@ def save(
data: schemas.TableIn, data: schemas.TableIn,
db: Session = Depends(get_db), db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["sections"]), user: UserToken = Security(get_user, scopes=["sections"]),
): ) -> schemas.Table:
try: try:
item = FoodTable( item = FoodTable(
name=data.name, name=data.name,
@ -92,7 +92,7 @@ def update(
data: schemas.TableIn, data: schemas.TableIn,
db: Session = Depends(get_db), db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["sections"]), user: UserToken = Security(get_user, scopes=["sections"]),
): ) -> schemas.Table:
try: try:
item: FoodTable = db.query(FoodTable).filter(FoodTable.id == id_).first() item: FoodTable = db.query(FoodTable).filter(FoodTable.id == id_).first()
item.name = data.name item.name = data.name
@ -112,17 +112,17 @@ def update(
raise raise
@router.delete("/{id_}") @router.delete("/{id_}", response_model=schemas.TableBlank)
def delete( def delete(
id_: uuid.UUID, id_: uuid.UUID,
db: Session = Depends(get_db), db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["sections"]), user: UserToken = Security(get_user, scopes=["sections"]),
): ) -> schemas.TableBlank:
try: try:
item: FoodTable = db.query(FoodTable).filter(FoodTable.id == id_).first() item: FoodTable = db.query(FoodTable).filter(FoodTable.id == id_).first()
db.delete(item) db.delete(item)
db.commit() db.commit()
return food_table_info(item) return food_table_blank()
except SQLAlchemyError as e: except SQLAlchemyError as e:
db.rollback() db.rollback()
raise HTTPException( raise HTTPException(
@ -134,27 +134,17 @@ def delete(
raise raise
@router.get("") @router.get("", response_model=schemas.TableBlank)
def show_blank( def show_blank(
db: Session = Depends(get_db), db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["sections"]), user: UserToken = Security(get_user, scopes=["sections"]),
): ) -> schemas.TableBlank:
return food_table_info(None) return food_table_blank()
@router.get("/list") @router.get("/list", response_model=List[schemas.Table])
def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)): def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)):
return [ return [food_table_info(item) for item in db.query(FoodTable).order_by(FoodTable.sort_order).all()]
{
"id": item.id,
"name": item.name,
"seats": item.seats,
"section": {"id": item.section_id, "name": item.section.name},
"isActive": item.is_active,
"sortOrder": item.sort_order,
}
for item in db.query(FoodTable).order_by(FoodTable.sort_order).all()
]
@router.get("/running") @router.get("/running")
@ -183,38 +173,40 @@ def show_running(db: Session = Depends(get_db), user: UserToken = Depends(get_us
return food_tables return food_tables
@router.get("/from-voucher/{id_}") @router.get("/from-voucher/{id_}", response_model=Union[schemas.Table, schemas.TableBlank])
def show_voucher( def show_voucher(
id_: uuid.UUID, id_: uuid.UUID,
db: Session = Depends(get_db), db: Session = Depends(get_db),
user: UserToken = Security(get_user), user: UserToken = Security(get_user),
): ) -> Union[schemas.Table, schemas.TableBlank]:
overview: Overview = db.query(Overview).filter(Overview.voucher_id == id_).first() overview: Overview = db.query(Overview).filter(Overview.voucher_id == id_).first()
if overview is not None: if overview is not None:
return food_table_info(overview.food_table) return food_table_info(overview.food_table)
return food_table_info(None) return food_table_blank()
@router.get("/{id_}") @router.get("/{id_}", response_model=schemas.Table)
def show_id( def show_id(
id_: uuid.UUID, id_: uuid.UUID,
db: Session = Depends(get_db), db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["sections"]), user: UserToken = Security(get_user, scopes=["sections"]),
): ) -> schemas.Table:
item: FoodTable = db.query(FoodTable).filter(FoodTable.id == id_).first() item: FoodTable = db.query(FoodTable).filter(FoodTable.id == id_).first()
return food_table_info(item) return food_table_info(item)
def food_table_info(item: Optional[FoodTable]): def food_table_info(item: FoodTable) -> schemas.Table:
if item is None: return schemas.Table(
return {"name": "", "seats": 0, "section": {}, "isActive": True, "sortOrder": 0} id=item.id,
return { name=item.name,
"id": item.id, seats=item.seats,
"name": item.name, section=schemas.SectionLink(id=item.section_id, name=item.section.name),
"seats": item.seats, isActive=item.is_active,
"section": {"id": item.section_id, "name": item.section.name}, status="" if item.status is None else item.status.status,
"isActive": item.is_active, sortOrder=item.sort_order,
"status": "" if item.status is None else item.status.status, voucherId=None if item.status is None else item.status.voucher_id,
"sortOrder": item.sort_order, )
"voucherId": None if item.status is None else item.status.voucher_id,
}
def food_table_blank() -> schemas.TableBlank:
return schemas.TableBlank(name="", seats=0, isActive=True, sortOrder=0)

View File

@ -2,17 +2,19 @@ import re
import uuid import uuid
from decimal import Decimal from decimal import Decimal
from typing import Optional from typing import List
import barker.schemas.tax as schemas import barker.schemas.tax as schemas
from fastapi import APIRouter, Depends, HTTPException, Security, status from fastapi import APIRouter, Depends, HTTPException, Security, status
from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from sqlalchemy.sql.functions import count
from ..core.security import get_current_active_user as get_user from ..core.security import get_current_active_user as get_user
from ..db.session import SessionLocal from ..db.session import SessionLocal
from ..models.master import Tax from ..models.master import SaleCategory, Tax
from ..models.voucher import Inventory
from ..schemas.auth import UserToken from ..schemas.auth import UserToken
@ -33,9 +35,9 @@ def save(
data: schemas.TaxIn, data: schemas.TaxIn,
db: Session = Depends(get_db), db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["taxes"]), user: UserToken = Security(get_user, scopes=["taxes"]),
): ) -> schemas.Tax:
try: try:
item = Tax(name=data.name, rate=round(data.rate / Decimal(100), 4)) item = Tax(name=data.name, rate=round(data.rate, 5))
if not name_valid(data.name): if not name_valid(data.name):
raise HTTPException( raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
@ -61,7 +63,7 @@ def update(
data: schemas.TaxIn, data: schemas.TaxIn,
db: Session = Depends(get_db), db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["taxes"]), user: UserToken = Security(get_user, scopes=["taxes"]),
): ) -> schemas.Tax:
try: try:
item: Tax = db.query(Tax).filter(Tax.id == id_).first() item: Tax = db.query(Tax).filter(Tax.id == id_).first()
if item.is_fixture: if item.is_fixture:
@ -75,7 +77,7 @@ def update(
detail="The name is not valid", detail="The name is not valid",
) )
item.name = data.name item.name = data.name
item.rate = round(data.rate / Decimal(100), 4) item.rate = round(data.rate, 5)
db.commit() db.commit()
return tax_info(item) return tax_info(item)
except SQLAlchemyError as e: except SQLAlchemyError as e:
@ -89,12 +91,12 @@ def update(
raise raise
@router.delete("/{id_}") @router.delete("/{id_}", response_model=schemas.TaxBlank)
def delete( def delete(
id_: uuid.UUID, id_: uuid.UUID,
db: Session = Depends(get_db), db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["taxes"]), user: UserToken = Security(get_user, scopes=["taxes"]),
): ) -> schemas.TaxBlank:
try: try:
item: Tax = db.query(Tax).filter(Tax.id == id_).first() item: Tax = db.query(Tax).filter(Tax.id == id_).first()
if item is None: if item is None:
@ -102,62 +104,63 @@ def delete(
status_code=status.HTTP_404_NOT_FOUND, status_code=status.HTTP_404_NOT_FOUND,
detail="Tax not found", detail="Tax not found",
) )
elif item.is_fixture: if item.is_fixture:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_423_LOCKED, status_code=status.HTTP_423_LOCKED,
detail=f"{item.name} is a fixture and cannot be edited or deleted.", detail=f"{item.name} is a fixture and cannot be edited or deleted.",
) )
else: if db.query(count(SaleCategory.tax_id)).filter(SaleCategory.tax_id == item.id).scalar() > 0:
db.delete(item) raise HTTPException(
db.commit() status_code=status.HTTP_423_LOCKED,
return tax_info(None) detail=f"{item.name} has associated Sale Categories and cannot be deleted",
)
if db.query(count(Inventory.tax_id)).filter(Inventory.tax_id == item.id).scalar() > 0:
raise HTTPException(
status_code=status.HTTP_423_LOCKED,
detail=f"{item.name} has associated Inventories and cannot be deleted",
)
db.delete(item)
db.commit()
return tax_blank()
except Exception: except Exception:
db.rollback() db.rollback()
raise raise
@router.get("") @router.get("", response_model=schemas.TaxBlank)
def show_blank( def show_blank(
db: Session = Depends(get_db), db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["taxes"]), user: UserToken = Security(get_user, scopes=["taxes"]),
): ) -> schemas.TaxBlank:
return tax_info(None) return tax_blank()
@router.get("/list") @router.get("/list", response_model=List[schemas.Tax])
def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)): def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)) -> List[schemas.Tax]:
return [ return [tax_info(item) for item in db.query(Tax).order_by(Tax.name).all()]
{
"id": item.id,
"name": item.name,
"rate": item.rate,
"isFixture": item.is_fixture,
}
for item in db.query(Tax).order_by(Tax.name).all()
]
@router.get("/{id_}") @router.get("/{id_}", response_model=schemas.Tax)
def show_id( def show_id(
id_: uuid.UUID, id_: uuid.UUID,
db: Session = Depends(get_db), db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["taxes"]), user: UserToken = Security(get_user, scopes=["taxes"]),
): ) -> schemas.Tax:
item: Tax = db.query(Tax).filter(Tax.id == id_).first() item: Tax = db.query(Tax).filter(Tax.id == id_).first()
return tax_info(item) return tax_info(item)
def tax_info(item: Optional[Tax]): def tax_info(item: Tax) -> schemas.Tax:
if item is None: return schemas.Tax(
tax = {"name": "", "rate": 0, "isFixture": False} id=item.id,
else: name=item.name,
tax = { rate=item.rate,
"id": item.id, isFixture=item.is_fixture,
"name": item.name, )
"rate": item.rate * 100,
"isFixture": item.is_fixture,
} def tax_blank() -> schemas.TaxBlank:
return tax return schemas.TaxBlank(name="", rate=0, isFixture=False)
def name_valid(name: str) -> bool: def name_valid(name: str) -> bool:

View File

@ -11,6 +11,7 @@ from .product_link import ProductLink
class MenuCategoryIn(BaseModel): class MenuCategoryIn(BaseModel):
name: str = Field(..., min_length=1) name: str = Field(..., min_length=1)
is_active: bool is_active: bool
is_fixture: bool
class Config: class Config:
anystr_strip_whitespace = True anystr_strip_whitespace = True
@ -19,7 +20,6 @@ class MenuCategoryIn(BaseModel):
class MenuCategory(MenuCategoryIn): class MenuCategory(MenuCategoryIn):
id_: uuid.UUID id_: uuid.UUID
is_fixture: bool
sort_order: int sort_order: int
class Config: class Config:

View File

@ -27,6 +27,14 @@ class Table(TableIn):
alias_generator = to_camel alias_generator = to_camel
class TableBlank(TableIn):
name: str = Field(..., min_length=1)
section: Optional[SectionLink]
class Config:
alias_generator = to_camel
class TableLink(BaseModel): class TableLink(BaseModel):
id_: uuid.UUID = Field(...) id_: uuid.UUID = Field(...)
name: Optional[str] name: Optional[str]

View File

@ -10,20 +10,26 @@ from . import to_camel
class TaxIn(BaseModel): class TaxIn(BaseModel):
name: str = Field(..., min_length=1) name: str = Field(..., min_length=1)
rate: Decimal = Field(ge=0, multiple_of=0.01, default=0) rate: Decimal = Field(ge=0, default=0)
is_fixture: bool
class Config: class Config:
fields = {"id_": "id"}
anystr_strip_whitespace = True anystr_strip_whitespace = True
alias_generator = to_camel alias_generator = to_camel
class Tax(TaxIn): class Tax(TaxIn):
id_: uuid.UUID id_: uuid.UUID
is_fixture: bool
class Config: class Config:
fields = {"id_": "id"} anystr_strip_whitespace = True
alias_generator = to_camel
class TaxBlank(TaxIn):
name: str
class Config:
anystr_strip_whitespace = True anystr_strip_whitespace = True
alias_generator = to_camel alias_generator = to_camel

View File

@ -2,6 +2,7 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angula
import { FormBuilder, FormGroup } from '@angular/forms'; import { FormBuilder, FormGroup } from '@angular/forms';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { round } from 'mathjs';
import { Tax } from '../../core/tax'; import { Tax } from '../../core/tax';
import { ToasterService } from '../../core/toaster.service'; import { ToasterService } from '../../core/toaster.service';
@ -44,7 +45,7 @@ export class TaxDetailComponent implements OnInit, AfterViewInit {
this.item = item; this.item = item;
this.form.setValue({ this.form.setValue({
name: this.item.name || '', name: this.item.name || '',
rate: this.item.rate || '', rate: this.item.rate * 100,
}); });
} }
@ -96,7 +97,7 @@ export class TaxDetailComponent implements OnInit, AfterViewInit {
getItem(): Tax { getItem(): Tax {
const formModel = this.form.value; const formModel = this.form.value;
this.item.name = formModel.name; this.item.name = formModel.name;
this.item.rate = +formModel.rate; this.item.rate = round(+formModel.rate / 100, 5);
return this.item; return this.item;
} }
} }