Bundle item has an option to not print in the bill.

Bills and Kots should print properly with bundles
This commit is contained in:
2026-02-10 18:00:03 +00:00
parent 7382d487ac
commit 91b3740ec0
36 changed files with 290 additions and 141 deletions

View File

@ -17,6 +17,7 @@ import { of as observableOf, BehaviorSubject, debounceTime, distinctUntilChanged
import { MenuCategory } from '../../core/menu-category';
import { ProductQuery } from '../../core/product-query';
import { SaleCategory } from '../../core/sale-category';
import { ProductService } from '../../product/product.service';
import { ConfirmDialogComponent } from '../../shared/confirm-dialog/confirm-dialog.component';
import { Bundle, BundleItem } from '../bundle';
@ -59,6 +60,7 @@ export class BundleDetailComponent implements OnInit, AfterViewInit {
units: FormControl<string>;
salePrice: FormControl<number>;
menuCategory: FormControl<string>;
saleCategory: FormControl<string>;
hasHappyHour: FormControl<boolean>;
isNotAvailable: FormControl<boolean>;
@ -67,10 +69,12 @@ export class BundleDetailComponent implements OnInit, AfterViewInit {
itemId: FormControl<ProductQuery | string>;
quantity: FormControl<number>;
salePrice: FormControl<number>;
printInBill: FormControl<boolean>;
}>;
}>;
menuCategories: MenuCategory[] = [];
saleCategories: SaleCategory[] = [];
public items$ = new BehaviorSubject<BundleItem[]>([]);
dataSource: BundleDetailDatasource = new BundleDetailDatasource(this.items$);
@ -79,7 +83,7 @@ export class BundleDetailComponent implements OnInit, AfterViewInit {
itemProduct: ProductQuery | null = null;
itemProducts: Observable<ProductQuery[]>;
displayedColumns = ['name', 'quantity', 'salePrice', 'action'];
displayedColumns = ['name', 'quantity', 'salePrice', 'printInBill', 'action'];
constructor() {
this.form = new FormGroup({
@ -87,6 +91,7 @@ export class BundleDetailComponent implements OnInit, AfterViewInit {
units: new FormControl<string>('', { nonNullable: true }),
salePrice: new FormControl<number>(0, { nonNullable: true }),
menuCategory: new FormControl<string>('', { nonNullable: true }),
saleCategory: new FormControl<string>('', { nonNullable: true }),
hasHappyHour: new FormControl<boolean>(false, { nonNullable: true }),
isNotAvailable: new FormControl<boolean>(false, { nonNullable: true }),
@ -94,6 +99,7 @@ export class BundleDetailComponent implements OnInit, AfterViewInit {
itemId: new FormControl<ProductQuery | string>('', { nonNullable: true }),
quantity: new FormControl<number>(1, { nonNullable: true }),
salePrice: new FormControl<number>(0, { nonNullable: true }),
printInBill: new FormControl<boolean>(true, { nonNullable: true }),
}),
});
this.itemProducts = this.form.controls.addRow.controls.itemId.valueChanges.pipe(
@ -119,8 +125,10 @@ export class BundleDetailComponent implements OnInit, AfterViewInit {
const data = value as {
item: Bundle;
menuCategories: MenuCategory[];
saleCategories: SaleCategory[];
};
this.menuCategories = data.menuCategories;
this.saleCategories = data.saleCategories;
this.showItem(data.item);
});
}
@ -158,6 +166,7 @@ export class BundleDetailComponent implements OnInit, AfterViewInit {
units: this.item.units ?? '',
salePrice: Number(this.item.salePrice ?? 0),
menuCategory: this.item.menuCategory?.id ?? '',
saleCategory: this.item.saleCategory?.id ?? '',
hasHappyHour: this.item.hasHappyHour ?? false,
isNotAvailable: this.item.isNotAvailable ?? false,
@ -165,6 +174,7 @@ export class BundleDetailComponent implements OnInit, AfterViewInit {
itemId: '',
quantity: 1,
salePrice: 0,
printInBill: true,
},
});
this.itemProduct = null;
@ -217,6 +227,7 @@ export class BundleDetailComponent implements OnInit, AfterViewInit {
name: this.itemProduct?.name ?? '',
quantity,
salePrice,
printInBill: v.printInBill || false,
});
this.item.items.push(bi);
@ -315,6 +326,19 @@ export class BundleDetailComponent implements OnInit, AfterViewInit {
}
this.item.menuCategory.id = menuCategoryId;
// sale category
const saleCategoryId = v.saleCategory ?? '';
if (!saleCategoryId) {
// keep it as-is; backend will 422 anyway, but we can show UI error too
this.snackBar.open('Menu Category is required', 'Error');
return this.item;
}
if (this.item.saleCategory === null || this.item.saleCategory === undefined) {
this.item.saleCategory = new SaleCategory();
}
this.item.saleCategory.id = saleCategoryId;
// ensure items array exists
if (!this.item.items) {
this.item.items = [];