Feature: Allow bills without items so that tables can be seated from the guest book.

Feature: Allow guest book entries to be associated with running vouchers
Feature: Allow removing customer from voucher
This commit is contained in:
Amritanshu Agrawal 2023-03-24 09:09:13 +05:30
parent 1b4c26733d
commit 56ae7500cc
7 changed files with 64 additions and 25 deletions

View File

@ -46,6 +46,8 @@ def do_update_table(item: Voucher, guest_book: GuestBook | None, db: Session):
db.add(item.status)
else:
item.status.status = status_
if guest_book is not None:
item.status.guest_book_id = guest_book.id
def check_permissions(item: Voucher | None, voucher_type: VoucherType, permissions: list[str]):

View File

@ -53,13 +53,15 @@ def save(
voucher_type = VoucherType(p)
guest_book = get_guest_book(g, db)
item: Voucher = do_save(data, voucher_type, guest_book, db, user)
need_to_print_kot = sum(len(k.inventories) for k in item.kots) > 0
if update_table:
do_update_table(item, guest_book, db)
db.commit()
voucher_id = item.id
with SessionFuture() as db:
print_kot(voucher_id, db)
if item.voucher_type != VoucherType.KOT:
if need_to_print_kot:
print_kot(voucher_id, db)
if need_to_print_kot and item.voucher_type != VoucherType.KOT:
print_bill(voucher_id, db)
except SQLAlchemyError as e:
traceback.print_exc()
@ -169,7 +171,13 @@ def do_save(
db.flush()
do_update_settlements(item, [], db)
do_update_bill_numbers(item, db)
if len(item.kots) == 0 or len(item.kots[0].inventories) == 0:
if (
sum(len(k.inventories) for k in item.kots) == 0
and guest_book is None
and data.pax == 0
and data.customer is None
):
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail="Please add some products",

View File

@ -69,6 +69,7 @@ def from_table(
user: UserToken = Security(get_user),
):
with SessionFuture() as db:
guest = None if g is None else db.execute(select(GuestBook).where(GuestBook.id == g)).scalar_one()
if v is not None:
item = (
db.execute(
@ -86,12 +87,10 @@ def from_table(
detail="Voucher not found",
)
else:
if guest is not None:
item.voucher.customer = guest.customer
return voucher_info(item.voucher, db)
table = db.execute(select(FoodTable).where(FoodTable.id == id_)).scalar_one()
if g is not None:
guest = db.execute(select(GuestBook).where(GuestBook.id == g)).scalar_one()
else:
guest = None
return voucher_blank(table, guest)
@ -149,8 +148,7 @@ def voucher_info(item: Voucher, db: Session):
"billId": ", ".join(f"{x.regime.prefix}-{x.bill_number}" for x in item.bills),
"table": {"id": item.food_table_id, "name": item.food_table.name},
"customer": {"id": item.customer_id, "name": item.customer.name} if item.customer is not None else None,
"guest": None, # TODO: Wire this functionality
"narration": item.narration, # TODO: Wire this functionality
"narration": item.narration,
"reason": item.reason,
"voucherType": item.voucher_type,
"kots": [

View File

@ -61,11 +61,15 @@ def update_route(
check_permissions(item, voucher_type, user.permissions)
item.pax = data.pax
if guest_book is not None:
item.pax = guest_book.pax
item.food_table_id = data.table.id_
if data.customer is not None:
item.customer_id = data.customer.id_
else:
item.customer_id = None
if guest_book is not None:
item.pax = guest_book.pax
item.customer_id = guest_book.customer_id
item.food_table_id = data.table.id_
if item.voucher_type != VoucherType.KOT:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,

View File

@ -26,6 +26,7 @@ import { ModifiersComponent } from './modifiers/modifiers.component';
export class BillService {
public dataObs: BehaviorSubject<BillViewItem[]>;
public bill: Bill = new Bill();
private originalBill: Bill = new Bill();
public grossAmount: BehaviorSubject<number>;
public discountAmount: BehaviorSubject<number>;
public hhAmount: BehaviorSubject<number>;
@ -93,6 +94,7 @@ export class BillService {
this.updateTable = updateTable;
bill.kots.push(new Kot());
this.bill = bill;
this.originalBill = JSON.parse(JSON.stringify(this.bill));
this.selection.clear();
this.displayBill();
}
@ -223,31 +225,52 @@ export class BillService {
this.displayBill();
}
isBillDiffent(bill: Bill, guestBookId: string | null): boolean {
const newItems = bill.kots
.filter((k: Kot) => k.id === undefined)
.reduce((p: number, k: Kot) => p + k.inventories.filter((i) => i.quantity !== 0).length, 0);
if (newItems > 0) {
return true;
}
if (guestBookId !== null) {
return true;
}
if (bill.pax != this.originalBill.pax) {
return true;
}
if (bill.customer !== this.originalBill.customer) {
return true;
}
return false;
}
printKot(guestBookId: string | null): Observable<boolean> {
const item = JSON.parse(JSON.stringify(this.bill));
const newKot = this.bill.kots.find((k) => k.id === undefined) as Kot;
if (newKot.inventories.filter((x) => x.quantity !== 0).length === 0) {
return throwError('Cannot print a blank KOT\nPlease add some products!');
if (!this.isBillDiffent(item, guestBookId)) {
return throwError(() => Error('Cannot print a blank KOT\nPlease add some products!'));
}
if (!this.happyHourItemsBalanced() || this.happyHourItemsMoreThanRegular()) {
return throwError('Happy hour products are not balanced.');
return throwError(() => Error('Happy hour products are not balanced.'));
}
return this.ser
.saveOrUpdate(item, VoucherType.Kot, guestBookId, this.updateTable)
.pipe(tap(() => (this.allowDeactivate = true)));
}
printBill(guest_book_id: string | null, voucherType: VoucherType): Observable<boolean> {
printBill(guestBookId: string | null, voucherType: VoucherType): Observable<boolean> {
const item = JSON.parse(JSON.stringify(this.bill));
const newKot = this.bill.kots.find((k) => k.id === undefined) as Kot;
if (item.kots.length === 1 && newKot.inventories.length === 0) {
return throwError('Cannot print a blank Bill\nPlease add some products!');
const products = item.kots.reduce(
(p: number, k: Kot) => p + k.inventories.filter((i) => i.quantity !== 0).length,
0,
);
if (products === 0) {
return throwError(() => Error('Cannot print a blank Bill\nPlease add some products!'));
}
if (!this.happyHourItemsBalanced() || this.happyHourItemsMoreThanRegular()) {
return throwError('Happy hour products are not balanced.');
return throwError(() => Error('Happy hour products are not balanced.'));
}
return this.ser
.saveOrUpdate(item, voucherType, guest_book_id, this.updateTable)
.saveOrUpdate(item, voucherType, guestBookId, this.updateTable)
.pipe(tap(() => (this.allowDeactivate = true)));
}
@ -364,6 +387,8 @@ export class BillService {
}
private happyHourItemsMoreThanRegular(): boolean {
// This is for the whole bill. eg. Kot 1 => Reg 2 + HH 2; Kot 2 => Reg 4; Kot 3 => Reg - 4
// This is pass okay in happy hours items balanced, but overall this is wrong. Hence this check
const invs: { [id: string]: { normal: number; happy: number } } = {};
for (const kot of this.bill.kots) {
for (const inventory of kot.inventories) {

View File

@ -18,7 +18,7 @@ export class Bill {
kotId: string;
billId: string;
table: Table;
customer?: { id: string; name: string };
customer: { id: string; name: string } | null;
guest: GuestBook;
reason: string;
voucherType: VoucherType;
@ -37,6 +37,7 @@ export class Bill {
this.billId = '';
this.kotId = '';
this.table = new Table();
this.customer = null;
this.guest = new GuestBook();
// this.settlements = [];
this.reason = '';

View File

@ -83,9 +83,10 @@ export class BillsComponent implements OnInit {
dialogRef.afterClosed().subscribe((result: boolean | Customer) => {
if (!result) {
return;
this.bs.bill.customer = null;
} else {
this.bs.bill.customer = result as Customer;
}
this.bs.bill.customer = result as Customer;
});
}