No automatic signout

Voucher basic working
running tables shifted to cards from buttons, this gives us immense styling oportunities
This commit is contained in:
Amritanshu
2019-07-12 12:36:38 +05:30
parent 4513e8b263
commit bcad4cdae3
31 changed files with 1085 additions and 713 deletions

View File

@ -1,28 +1,28 @@
"\Program Files\PostgreSQL\10\bin\dropdb.exe" -U postgres petty
"\Program Files\PostgreSQL\10\bin\createdb.exe" -U postgres petty
"\Program Files\PostgreSQL\11\bin\dropdb.exe" -U postgres petty
"\Program Files\PostgreSQL\11\bin\createdb.exe" -U postgres petty
..\env\Scripts\initdb.exe ..\development.ini
..\env\Scripts\fixtures.exe ..\development.ini
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < a-Roles.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < b-Permissions.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < c-RolePermissions.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < d-Users.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < e-UserRoles.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < f-Customers.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < g-FoodTables.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < h-Taxes.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < i-ProductGroups.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < j-Products.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < k-Vouchers.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < l-Voucher-Food-Table.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < m-Kots.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < n-Inventories.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < o-Modifiers.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < p-InventoryModifiers.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < q-Locations.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < r-MachineLocations.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < s-Printers.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < t-PrintLocations.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < u-ProductGroupModifiers.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < v-Reprints.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < w-Settings.sql
"\Program Files\PostgreSQL\10\bin\psql.exe" -U postgres petty < x-VoucherSettlements.sql
rem "\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < a-Roles.sql
rem "\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < b-Permissions.sql
rem "\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < c-RolePermissions.sql
rem "\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < d-Users.sql
rem "\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < e-UserRoles.sql
"\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < f-Customers.sql
"\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < g-FoodTables.sql
"\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < h-Taxes.sql
"\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < i-MenuCategories.sql
"\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < j-SaleCategories.sql
"\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < k-Products.sql
"\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < l-Modifiers.sql
"\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < m-Sections.sql
"\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < n-Printers.sql
"\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < o-SectionPrinters.sql
"\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < p-Vouchers.sql
"\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < q-Kots.sql
"\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < r-Inventories.sql
"\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < s-InventoryModifiers.sql
"\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < t-Overview.sql
REM "\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < u-ProductGroupModifiers.sql
REM "\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < v-Reprints.sql
REM "\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < w-Settings.sql
REM "\Program Files\PostgreSQL\11\bin\psql.exe" -U postgres petty < x-VoucherSettlements.sql

View File

@ -4,22 +4,24 @@ call:copyQuery b-Permissions "SELECT 'INSERT INTO permissions(id, name) VALUES (
call:copyQuery c-RolePermissions "SELECT 'INSERT INTO role_permissions(id, permission_id, role_id) VALUES (''' + CAST(RoleGroupID AS Nvarchar(36)) + ''', ''' + CAST(RoleID AS Nvarchar(36)) + ''', ''' + CAST(GroupID AS Nvarchar(36)) + ''');' FROM Test.dbo.Auth_RoleGroups;"
call:copyQuery d-Users "SELECT 'INSERT INTO users(id, name, msr_string, password, locked_out) VALUES (''' + CAST(UserID AS Nvarchar(36)) + ''', ''' + Name + ''', ' + COALESCE('''' + MsrString + '''','null') + ', ''' + Password + ''', ' + CASE WHEN LockedOut = 1 THEN 'true' ELSE 'false' END + ');' FROM Test.dbo.Auth_Users;"
call:copyQuery e-UserRoles "SELECT 'INSERT INTO user_roles(id, user_id, role_id) VALUES (''' + CAST(UserGroupID AS Nvarchar(36)) + ''', ''' + CAST(UserID AS Nvarchar(36)) + ''', ''' + CAST(GroupID AS Nvarchar(36)) + ''');' FROM Test.dbo.Auth_UserGroups;"
call:copyQuery f-Customers "SELECT 'INSERT INTO customers(id, name, address, is_important, phone) VALUES (''' + CAST(CustomerID AS Nvarchar(36)) + ''', ''' + REPLACE(Name, '''', '''''') + ''', ''' + COALESCE(Address, 'null') + ''', ' + CASE WHEN Important = 1 THEN 'true' ELSE 'false' END + ', ''' + COALESCE(Phone, 'null') + ''');' FROM Test.dbo.Customers;"
call:copyQuery g-FoodTables "SELECT 'INSERT INTO food_tables(id, name, is_active, location, sort_order) VALUES (''' + CAST(FoodTableID AS Nvarchar(36)) + ''', ''' + Name + ''', ' + CASE WHEN IsActive = 1 THEN 'true' ELSE 'false' END + ', ''' + COALESCE(Location, 'null') + ''', ' + CAST(SortOrder AS Nvarchar(36)) + ');' FROM Test.dbo.FoodTables;"
call:copyQuery f-Customers "SELECT 'INSERT INTO customers(id, name, address, company, phone) VALUES (''' + CAST(CustomerID AS Nvarchar(36)) + ''', ''' + REPLACE(Name, '''', '''''') + ''', ''' + COALESCE(Address, 'null') + ''', '''', ''' + COALESCE(Phone, Name) + ''');' FROM Test.dbo.Customers WHERE CustomerID != '2c716f4b-0736-429a-ad51-610d7c47cb5e';"
call:copyQuery g-FoodTables "SELECT 'INSERT INTO food_tables(id, name, seats, is_active, section_id, sort_order) VALUES (''' + CAST(FoodTableID AS Nvarchar(36)) + ''', ''' + Name + ''', 0, ' + CASE WHEN IsActive = 1 THEN 'true' ELSE 'false' END + ', ''3f13f6e7-dc76-4fca-8fdb-b2bbf29b35df'', ' + CAST(SortOrder AS Nvarchar(36)) + ');' FROM Test.dbo.FoodTables;"
call:copyQuery h-Taxes "SELECT 'INSERT INTO taxes(id, name, rate, is_fixture) VALUES ('''+ CAST(TaxID AS Nvarchar(36)) + ''', ' + '''' + REPLACE(Name, '''', '''''') + '''' + ', ' + CAST(Rate AS Nvarchar(36)) + ', false);' FROM Test.dbo.Taxes;"
call:copyQuery i-ProductGroups "SELECT 'INSERT INTO menu_categories(id, name, discount_limit, is_active, is_fixture, sort_order) VALUES (''' + CAST(ProductGroupID AS Nvarchar(36)) + ''', ''' + REPLACE(Name, '''', '''''') + ''', ' + CAST(DiscountLimit AS nvarchar(36)) + ', ' + CASE WHEN IsActive = 1 THEN 'true' ELSE 'false' END + ', false, ' + CAST(SortOrder AS Nvarchar(36)) + ');' FROM Test.dbo.ProductGroups;"
call:copyQuery i-SaleCategories "SELECT 'INSERT INTO sale_categories(id, name, tax_id) VALUES (''' + CAST(newid() AS Nvarchar(36)) + ''', ''' + REPLACE(pgo.GroupType, '''', '''''') + ''', ''' + CAST((select top 1 t.TaxID from Test.dbo.Taxes t inner join Test.dbo.Products p on t.TaxID = p.VatID inner join Test.dbo.ProductGroups pg on p.ProductGroupID = pg.ProductGroupID where pg.GroupType = pgo.GroupType) AS Nvarchar(36)) + ''');' from (select distinct pgx.GroupType from Test.dbo.ProductGroups pgx) as pgo;"
call:copyQuery j-Products "SELECT 'INSERT INTO products(id, name, units, menu_category_id, sale_category_id, price, has_happy_hour, is_active, is_not_available, sort_order, quantity) VALUES (''' + CAST(ProductID AS Nvarchar(36)) + ''', ' + '''' + REPLACE(Name, '''', '''''') + '''' + ', ' + '''' + Units + '''' + ', ' + '''' + CAST(ProductGroupID AS Nvarchar(36)) + '''' + ', ' + '(select id from sale_categories where name = ''' + (SELECT GroupType FROM Test.dbo.ProductGroups pgs WHERE pgs.ProductGroupID = Products.ProductGroupID) + ''')' + ', ' + CAST(Price AS Nvarchar(36)) + ', ' + CASE WHEN HasHappyHour = 1 THEN 'true' ELSE 'false' END + ', ' + CASE WHEN IsActive = 1 THEN 'true' ELSE 'false' END + ', ' + CASE WHEN IsNotAvailable = 1 THEN 'true' ELSE 'false' END + ', ' + CAST(SortOrder AS Nvarchar(36)) + ', ' + CAST(Quantity AS Nvarchar(36)) + ');' FROM Test.dbo.Products;"
call:copyQuery k-Vouchers "SELECT 'INSERT INTO vouchers(id, date, pax, user_id, creation_date, last_edit_date, bill_id, food_table_id, customer_id, narration, is_void, void_reason, is_printed, voucher_type, kot_id) VALUES (''' + CAST(VoucherID AS Nvarchar(36)) + ''', ' + '''' + CONVERT(Nvarchar(36), Date, 126) + ''', ' + COALESCE(CAST(Pax AS Nvarchar(36)), 'null') + ', ' + '''' + CAST(UserID AS Nvarchar(36)) + ''', ' + '''' + CONVERT(Nvarchar(36), CreationDate, 126) + ''', ' + '''' + CONVERT(Nvarchar(36), LastEditDate, 126) + ''', ' + COALESCE(CAST(BillID AS Nvarchar(36)), 'null') + ', ' + '''' + CAST(TableID AS Nvarchar(36)) + ''', ' + '''' + CAST(CustomerID AS Nvarchar(36)) + ''', ' + COALESCE('''' + REPLACE(Narration, '''', '''''') + '''', 'null') + ', ' + CASE WHEN Void = 1 THEN 'true' ELSE 'false' END + ', ' + COALESCE('''' + REPLACE(VoidReason, '''', '''''') + '''', 'null') + ', ' + CASE WHEN Printed = 1 THEN 'true' ELSE 'false' END + ', ' + CAST(VoucherType AS Nvarchar(36)) + ', ' + CAST(KotID AS Nvarchar(36)) + ');' FROM Test.dbo.Vouchers;"
call:copyQuery l-Voucher-Food-Table "SELECT 'INSERT INTO voucher_food_table(id, voucher_id, food_table_id, status) VALUES (''' + CAST(newid() AS Nvarchar(36)) + ''', ' + '''' + CAST(VoucherID AS Nvarchar(36)) + ''', ' + '''' + CAST(FoodTableID AS Nvarchar(36)) + ''', ' + '''' + Status + ''');' FROM Test.dbo.FoodTables WHERE VoucherID IS NOT NULL;"
call:copyQuery m-Kots "SELECT 'INSERT INTO kots(id, voucher_id, code, food_table_id, date, user_id) VALUES (''' + CAST(KotID AS Nvarchar(36)) + ''', ' + '''' + CAST(VoucherID AS Nvarchar(36)) + '''' + ', ' + CAST(Code AS Nvarchar(36)) + ', ' + '''' + CAST(TableID AS Nvarchar(36)) + '''' + ', ' + '''' + CONVERT(Nvarchar(36), Date, 126) + ''', ' + '''' + CAST(UserID AS Nvarchar(36)) + '''' + ');' FROM Test.dbo.Kots;"
call:copyQuery n-Inventories "SELECT 'INSERT INTO inventories(id, kot_id, product_id, sort_order, quantity, price, is_happy_hour, service_charge, is_sc_taxable, service_tax_rate, vat_rate, service_tax_id, vat_id, discount) VALUES (''' + CAST(InventoryID AS Nvarchar(36)) + ''', ' + '''' + CAST(KotID AS Nvarchar(36)) + '''' + ', ' + '''' + CAST(ProductID AS Nvarchar(36)) + '''' + ', ' + CAST(SortOrder AS Nvarchar(36)) + ', ' + CAST(Quantity AS Nvarchar(36)) + ', ' + CAST(Price AS Nvarchar(36)) + ', ' + CASE WHEN IsHappyHour = 1 THEN 'true' ELSE 'false' END + ', ' + CAST(ServiceCharge AS Nvarchar(36)) + ', ' + CASE WHEN IsScTaxable = 1 THEN 'true' ELSE 'false' END + ', ' + CAST(ServiceTaxRate AS Nvarchar(36)) + ', ' + CAST(VatRate AS Nvarchar(36)) + ', ' + '''' + CAST(ServiceTaxID AS Nvarchar(36)) + '''' + ', ' + '''' + CAST(VatID AS Nvarchar(36)) + '''' + ', ' + CAST(Discount AS Nvarchar(36)) + ');' FROM Test.dbo.Inventories;"
call:copyQuery o-Modifiers "SELECT 'INSERT INTO modifiers(id, name, show_in_bill, is_active, modifier_category_id, price) VALUES (''' + CAST(ModifierID AS Nvarchar(36)) + ''', ' + '''' + REPLACE(Name, '''', '''''') + '''' + ', ' + CASE WHEN ShowInBill = 1 THEN 'true' ELSE 'false' END + ', true, {ID}, ' + CAST(Price AS Nvarchar(36)) + ');' FROM Test.dbo.Modifiers;"
call:copyQuery p-InventoryModifiers "SELECT 'INSERT INTO inventory_modifiers(id, inventory_id, modifier_id, price) VALUES (''' + CAST(InventoryModifierID AS Nvarchar(36)) + ''', ' + '''' + CAST(InventoryID AS Nvarchar(36)) + '''' + ', ' + '''' + CAST(ModifierID AS Nvarchar(36)) + '''' + ', 0);' FROM Test.dbo.InventoryModifiers;"
call:copyQuery q-Sections "SELECT 'INSERT INTO sections(id, name) VALUES (''' + CAST(NewID() AS Nvarchar(36)) + ''', ''' + Location + ''');' FROM Test.dbo.PrintLocations GROUP BY Location;"
call:copyQuery r-MachineLocations "SELECT 'INSERT INTO machine_locations(id, machine_name, location_id) SELECT ''' + CAST(MachineLocationID AS Nvarchar(36)) + ''', ' + '''' + REPLACE(Machine, '''', '''''') + '''' + ', id from locations where name = ' + '''' + REPLACE(Location, '''', '''''') + '''' + ';' FROM Test.dbo.MachineLocations;"
call:copyQuery s-Printers "SELECT 'INSERT INTO printers(id, name, address, cut_code) VALUES (''' + CAST(NewID() AS Nvarchar(36)) + ''', ''' + Printer + ''', ''' + ''' + Printer + ''', ''' + CutCode + ''');' FROM Test.dbo.PrintLocations GROUP BY Printer, CutCode;"
call:copyQuery t-SectionPrinters "SELECT 'INSERT INTO section_printers(id, menu_category_id, section_id, printer_id, copies) VALUES (''' + CAST(PrintLocationID AS Nvarchar(36)) + ''', ' + COALESCE('''' + CAST(ProductGroupID AS Nvarchar(36)) + '''','null') + ', ' + '(select id from sections where name = ''' + Location + ''')' + ', ' + '(select id from printers where name = ''' + Printer + ''')' + ', ' + CAST(Copies AS nvarchar(36)) + ');' FROM Test.dbo.PrintLocations;"
call:copyQuery i-MenuCategories "SELECT 'INSERT INTO menu_categories(id, name, discount_limit, is_active, is_fixture, sort_order) VALUES (''' + CAST(ProductGroupID AS Nvarchar(36)) + ''', ''' + REPLACE(Name, '''', '''''') + ''', ' + CAST(DiscountLimit AS nvarchar(36)) + ', ' + CASE WHEN IsActive = 1 THEN 'true' ELSE 'false' END + ', false, ' + CAST(SortOrder AS Nvarchar(36)) + ');' FROM Test.dbo.ProductGroups;"
call:copyQuery j-SaleCategories "SELECT 'INSERT INTO sale_categories(id, name, tax_id) VALUES (''' + CAST(newid() AS Nvarchar(36)) + ''', ''' + REPLACE(pgo.GroupType, '''', '''''') + ''', ''' + CAST((select top 1 t.TaxID from Test.dbo.Taxes t inner join Test.dbo.Products p on t.TaxID = p.VatID inner join Test.dbo.ProductGroups pg on p.ProductGroupID = pg.ProductGroupID where pg.GroupType = pgo.GroupType) AS Nvarchar(36)) + ''');' from (select distinct pgx.GroupType from Test.dbo.ProductGroups pgx) as pgo;"
call:copyQuery k-Products "SELECT 'INSERT INTO products(id, name, units, menu_category_id, sale_category_id, price, has_happy_hour, is_active, is_not_available, sort_order, quantity) VALUES (''' + CAST(ProductID AS Nvarchar(36)) + ''', ' + '''' + REPLACE(Name, '''', '''''') + '''' + ', ' + '''' + Units + '''' + ', ' + '''' + CAST(ProductGroupID AS Nvarchar(36)) + '''' + ', ' + '(select id from sale_categories where name = ''' + (SELECT GroupType FROM Test.dbo.ProductGroups pgs WHERE pgs.ProductGroupID = Products.ProductGroupID) + ''')' + ', ' + CAST(Price AS Nvarchar(36)) + ', ' + CASE WHEN HasHappyHour = 1 THEN 'true' ELSE 'false' END + ', ' + CASE WHEN IsActive = 1 THEN 'true' ELSE 'false' END + ', ' + CASE WHEN IsNotAvailable = 1 THEN 'true' ELSE 'false' END + ', ' + CAST(SortOrder AS Nvarchar(36)) + ', ' + CAST(Quantity AS Nvarchar(36)) + ');' FROM Test.dbo.Products;"
call:copyQuery l-Modifiers "SELECT 'INSERT INTO modifiers(id, name, show_in_bill, is_active, modifier_category_id, price) VALUES (''' + CAST(ModifierID AS Nvarchar(36)) + ''', ' + '''' + REPLACE(Name, '''', '''''') + '''' + ', ' + CASE WHEN ShowInBill = 1 THEN 'true' ELSE 'false' END + ', true, {ID}, ' + CAST(Price AS Nvarchar(36)) + ');' FROM Test.dbo.Modifiers;"
call:copyQuery m-Sections "SELECT 'INSERT INTO sections(id, name) VALUES (''' + CAST(NewID() AS Nvarchar(36)) + ''', ''' + Location + ''');' FROM Test.dbo.PrintLocations GROUP BY Location;"
call:copyQuery n-Printers "SELECT 'INSERT INTO printers(id, name, address, cut_code) VALUES (''' + CAST(NewID() AS Nvarchar(36)) + ''', ''' + Printer + ''', ''' + Printer + ''', ''' + CutCode + ''');' FROM Test.dbo.PrintLocations GROUP BY Printer, CutCode;"
call:copyQuery o-SectionPrinters "SELECT 'INSERT INTO section_printers(id, menu_category_id, section_id, printer_id, copies) VALUES (''' + CAST(PrintLocationID AS Nvarchar(36)) + ''', ' + COALESCE('''' + CAST(ProductGroupID AS Nvarchar(36)) + '''','null') + ', ' + '(select id from sections where name = ''' + Location + ''')' + ', ' + '(select id from printers where name = ''' + Printer + ''')' + ', ' + CAST(Copies AS nvarchar(36)) + ');' FROM Test.dbo.PrintLocations;"
call:copyQuery p-Vouchers "SELECT 'INSERT INTO vouchers(id, date, pax, user_id, creation_date, last_edit_date, bill_id, food_table_id, customer_id, narration, is_void, void_reason, is_printed, voucher_type, kot_id) VALUES (''' + CAST(VoucherID AS Nvarchar(36)) + ''', ' + '''' + CONVERT(Nvarchar(36), Date, 126) + ''', ' + COALESCE(CAST(Pax AS Nvarchar(36)), 'null') + ', (SELECT id from users limit 1), ' + '''' + CONVERT(Nvarchar(36), CreationDate, 126) + ''', ' + '''' + CONVERT(Nvarchar(36), LastEditDate, 126) + ''', ' + COALESCE(CAST(BillID AS Nvarchar(36)), 'null') + ', ' + '''' + CAST(TableID AS Nvarchar(36)) + ''', ' + '''' + CAST(CustomerID AS Nvarchar(36)) + ''', ' + COALESCE('''' + REPLACE(Narration, '''', '''''') + '''', 'null') + ', ' + CASE WHEN Void = 1 THEN 'true' ELSE 'false' END + ', ' + COALESCE('''' + REPLACE(VoidReason, '''', '''''') + '''', 'null') + ', ' + CASE WHEN Printed = 1 THEN 'true' ELSE 'false' END + ', ' + CAST(VoucherType AS Nvarchar(36)) + ', ' + CAST(KotID AS Nvarchar(36)) + ');' FROM Test.dbo.Vouchers;"
call:copyQuery q-Kots "SELECT 'INSERT INTO kots(id, voucher_id, code, food_table_id, date, user_id) VALUES (''' + CAST(KotID AS Nvarchar(36)) + ''', ' + '''' + CAST(VoucherID AS Nvarchar(36)) + '''' + ', ' + CAST(Code AS Nvarchar(36)) + ', ' + '''' + CAST(TableID AS Nvarchar(36)) + '''' + ', ' + '''' + CONVERT(Nvarchar(36), Date, 126) + ''', (SELECT id from users limit 1));' FROM Test.dbo.Kots;"
call:copyQuery r-Inventories "SELECT 'INSERT INTO inventories(id, kot_id, product_id, sort_order, quantity, price, is_happy_hour, tax_rate, tax_id, discount) VALUES (''' + CAST(InventoryID AS Nvarchar(36)) + ''', ' + '''' + CAST(KotID AS Nvarchar(36)) + '''' + ', ' + '''' + CAST(ProductID AS Nvarchar(36)) + '''' + ', ' + CAST(SortOrder AS Nvarchar(36)) + ', ' + CAST(Quantity AS Nvarchar(36)) + ', ' + CAST(Price AS Nvarchar(36)) + ', ' + CASE WHEN IsHappyHour = 1 THEN 'true' ELSE 'false' END + ', ' + CAST(VatRate AS Nvarchar(36)) + ', ' + '''' + CAST(VatID AS Nvarchar(36)) + '''' + ', ' + CAST(Discount AS Nvarchar(36)) + ');' FROM Test.dbo.Inventories;"
call:copyQuery s-InventoryModifiers "SELECT 'INSERT INTO inventory_modifiers(id, inventory_id, modifier_id, price) VALUES (''' + CAST(InventoryModifierID AS Nvarchar(36)) + ''', ' + '''' + CAST(InventoryID AS Nvarchar(36)) + '''' + ', ' + '''' + CAST(ModifierID AS Nvarchar(36)) + '''' + ', 0);' FROM Test.dbo.InventoryModifiers;"
call:copyQuery t-Overview "SELECT 'INSERT INTO overview(id, voucher_id, food_table_id, status) VALUES (''' + CAST(newid() AS Nvarchar(36)) + ''', ' + '''' + CAST(VoucherID AS Nvarchar(36)) + ''', ' + '''' + CAST(FoodTableID AS Nvarchar(36)) + ''', ' + '''' + Status + ''');' FROM Test.dbo.FoodTables WHERE VoucherID IS NOT NULL;"
call:copyQuery u-ProductGroupModifiers "SELECT 'INSERT INTO product_group_modifiers(id, product_group_id, modifier_id, show_automatically) VALUES (''' + CAST(ProductGroupModifierID AS Nvarchar(36)) + ''', ' + COALESCE('''' + CAST(ProductGroupID AS Nvarchar(36)) + '''','null') + ', ' + COALESCE('''' + CAST(ModifierID AS Nvarchar(36)) + '''','null') + ', ' + CASE WHEN ShowAutomatically = 1 THEN 'true' ELSE 'false' END + ');' FROM Test.dbo.ProductGroupModifiers;"
call:copyQuery v-Reprints "SELECT 'INSERT INTO reprints(id, user_id, date, voucher_id) VALUES (''' + CAST(ReprintID AS Nvarchar(36)) + ''', ' + '''' + CAST(UserID AS Nvarchar(36)) + '''' + ', ' + '''' + CONVERT(Nvarchar(36), Date, 126) + '''' + ', ' + '''' + CAST(VoucherID AS Nvarchar(36)) + '''' + ');' FROM Test.dbo.Reprints;"
call:copyQuery w-Settings "SELECT 'INSERT INTO public.settings(id, name, data) VALUES (''' + CAST(SettingID AS Nvarchar(36)) + ''', ' + '''' + REPLACE(Name, '''', '''''') + '''' + ', ' + '''' + REPLACE(Details, '''', '''''') + '''' + ');' FROM Test.dbo.Settings;"
@ -30,5 +32,5 @@ goto:eof
:copyQuery - here starts my function identified by it's label
echo.
echo. Copying %~1
bcp "%~2" queryout Data\%~1.sql -c -t',' -S sovereign -U sa -P 123456
bcp "%~2" queryout Data\%~1.sql -c -t',' -S . -U sa -P 123456
goto:eof

View File

@ -19,7 +19,7 @@ def main(global_config, **settings):
settings['sqlalchemy.url'] = DB_URI
SECRET_KEY = os.environ.get('SECRET_KEY', settings.get('secret_key', ''))
session_factory = SignedCookieSessionFactory(SECRET_KEY)
session_factory = SignedCookieSessionFactory(SECRET_KEY, timeout=None)
config = Configurator(
settings=settings,

View File

@ -347,6 +347,9 @@ def includeme(config):
permission="Authenticated",
)
config.add_route("v1_vouchers_new", "/v1/vouchers/new")
config.add_route("v1_vouchers_id", "/v1/vouchers/{id}")
# Done till here
config.add_route("customer", "/Customer.json")
@ -390,8 +393,6 @@ def includeme(config):
config.add_route("sa_st", "/SaleAnalysis/ServiceTax.json")
config.add_route("sa_vat", "/SaleAnalysis/Vat.json")
config.add_route("voucher", "/Voucher.json")
config.add_route("voucher_id", "/Voucher/{id}.json")
config.add_route("voucher_reprint", "/ReprintVoucher/{id}.json")
config.add_route("voucher_settle", "/Settle/{id}.json")
config.add_route("voucher_split", "/Split/{id}.json")

View File

@ -3,10 +3,7 @@ import sys
import uuid
import transaction
from pyramid.paster import (
get_appsettings,
setup_logging,
)
from pyramid.paster import get_appsettings, setup_logging
from pyramid.scripts.common import parse_vars
from barker.models import (
@ -19,13 +16,18 @@ from barker.models import (
get_session_factory,
get_tm_session,
SettleOption,
Role, Section, ModifierCategory)
Role,
Section,
ModifierCategory,
)
def usage(argv):
cmd = os.path.basename(argv[0])
print('usage: %s <config_uri> [var=value]\n'
'(example: "%s development.ini")' % (cmd, cmd))
print(
"usage: %s <config_uri> [var=value]\n"
'(example: "%s development.ini")' % (cmd, cmd)
)
sys.exit(1)
@ -43,64 +45,108 @@ def main(argv=sys.argv):
with transaction.manager:
dbsession = get_tm_session(session_factory, transaction.manager)
permissions = [Permission('Accounts Audit', uuid.UUID('f30fd1fb-df09-46f5-8c5d-181fd46f38de')),
Permission('Beer Consumption', uuid.UUID('efbb8f31-9631-4491-92f4-17cc98e6a0c0')),
Permission('Bill Details', uuid.UUID('612bb529-b50d-4653-a1c0-ebb725c7d728')),
Permission('Cashier Checkout', uuid.UUID('a86f8bcf-66f4-4c44-89e1-b714488b8331')),
Permission('Change Rate', uuid.UUID('10c63aae-0e48-4e54-b3b8-dd8a80b88fbf')),
Permission('Customers', uuid.UUID('e5fef133-cdbe-441f-bb54-1f0db0c5db79')),
Permission('Discount', uuid.UUID('1f66f131-0105-4466-8f8e-21e0ccc2ac27')),
Permission('Discount Report', uuid.UUID('0d8ba1d5-6731-417c-ab0e-be03cfdc96db')),
Permission('Edit Printed Bill', uuid.UUID('4ff6cb0f-93cb-4760-8219-4de280eaa957')),
Permission('Edit Printed Product', uuid.UUID('959713be-d753-4e14-8ecd-e27f33587499')),
Permission('Guest Book', uuid.UUID('7669dfc9-cc75-4e48-b267-145c8832a83c')),
Permission('Machines', uuid.UUID('f12b573f-edcb-490d-91c3-fa76f6502ffd')),
Permission('Merge Kots', uuid.UUID('bed774e9-4857-43b0-a4af-40230c9eb5db')),
Permission('Merge Tables', uuid.UUID('dfc493fb-ac14-4602-8596-f93f47b617de')),
Permission('Modifiers', uuid.UUID('9dc82529-1e86-41b4-a152-eaea9f775fea')),
Permission('Move Kot to New Table', uuid.UUID('5ed5796a-ca99-437f-8f67-483b1ade81ed')),
Permission('Move Table', uuid.UUID('cfdb69c9-d37a-40af-bef2-e29c04602543')),
Permission('NC Product', uuid.UUID('54263587-773e-4cbb-b1e4-4e814141158e')),
Permission('Open Bill', uuid.UUID('5811d233-a1ae-4d32-af52-cebbf46d274a')),
Permission('Owner', uuid.UUID('6d109b66-8452-42aa-bbe9-d4cef440b7a1')),
Permission('Print Bill', uuid.UUID('92242eae-bd38-4223-829b-2f981933b7f2')),
Permission('Print Kot', uuid.UUID('0eef56fb-7741-49fd-8b84-5069cccae767')),
Permission('Products', uuid.UUID('f1f892ed-34aa-4c50-be12-dbaf48be7d4c')),
Permission('Roles', uuid.UUID('d39f86f6-14e4-4fc3-b07e-01e2501a6f65')),
Permission('Sales', uuid.UUID('92ba45c4-2d34-4cbd-b5b8-d9164c3595d5')),
Permission('Sales Analysis', uuid.UUID('0c1acb7c-9116-46e2-a3be-9d632e811330')),
Permission('Sales Detail', uuid.UUID('e6476396-ef83-4c47-bc20-9f3b936813f9')),
Permission('Settle Bill', uuid.UUID('9f7b658a-25bc-4a53-8560-2dde1c7a188a')),
Permission('Split Bill', uuid.UUID('0a8cfaf4-624e-478f-be65-c3b6392078c7')),
Permission('Tables', uuid.UUID('ac4512e8-efdd-429e-a7ae-a34d18782663')),
Permission('Tax Analysis', uuid.UUID('bab36396-53dd-44ea-ab3c-426efa7830c8')),
Permission('Taxes', uuid.UUID('5c8fcdde-460d-4047-810f-e34fb899fadc')),
Permission('Users', uuid.UUID('243447b8-b403-47e6-8b3d-8e76f4df44a9')),
Permission('Void Bill', uuid.UUID('e3c76262-adc0-4936-8b4d-217c6292298b')),
Permission('Void or Reprinted Bill Report', uuid.UUID('30c8e743-c710-42d7-843a-0b75543b3516')),
Permission('Printers', uuid.UUID('5b66c6f6-003a-4ef8-ba28-49b8ff1ac33c')),
Permission('Sections', uuid.UUID('c973f32c-a37b-496a-8dc5-60d2e4c39e97'))]
permissions = [
Permission(
"Accounts Audit", uuid.UUID("f30fd1fb-df09-46f5-8c5d-181fd46f38de")
),
Permission(
"Beer Consumption", uuid.UUID("efbb8f31-9631-4491-92f4-17cc98e6a0c0")
),
Permission(
"Bill Details", uuid.UUID("612bb529-b50d-4653-a1c0-ebb725c7d728")
),
Permission(
"Cashier Checkout", uuid.UUID("a86f8bcf-66f4-4c44-89e1-b714488b8331")
),
Permission(
"Change Rate", uuid.UUID("10c63aae-0e48-4e54-b3b8-dd8a80b88fbf")
),
Permission("Customers", uuid.UUID("e5fef133-cdbe-441f-bb54-1f0db0c5db79")),
Permission("Discount", uuid.UUID("1f66f131-0105-4466-8f8e-21e0ccc2ac27")),
Permission(
"Discount Report", uuid.UUID("0d8ba1d5-6731-417c-ab0e-be03cfdc96db")
),
Permission(
"Edit Printed Bill", uuid.UUID("4ff6cb0f-93cb-4760-8219-4de280eaa957")
),
Permission(
"Edit Printed Product",
uuid.UUID("959713be-d753-4e14-8ecd-e27f33587499"),
),
Permission("Guest Book", uuid.UUID("7669dfc9-cc75-4e48-b267-145c8832a83c")),
Permission("Machines", uuid.UUID("f12b573f-edcb-490d-91c3-fa76f6502ffd")),
Permission("Merge Kots", uuid.UUID("bed774e9-4857-43b0-a4af-40230c9eb5db")),
Permission(
"Merge Tables", uuid.UUID("dfc493fb-ac14-4602-8596-f93f47b617de")
),
Permission("Modifiers", uuid.UUID("9dc82529-1e86-41b4-a152-eaea9f775fea")),
Permission(
"Move Kot to New Table",
uuid.UUID("5ed5796a-ca99-437f-8f67-483b1ade81ed"),
),
Permission("Move Table", uuid.UUID("cfdb69c9-d37a-40af-bef2-e29c04602543")),
Permission("NC Product", uuid.UUID("54263587-773e-4cbb-b1e4-4e814141158e")),
Permission("Open Bill", uuid.UUID("5811d233-a1ae-4d32-af52-cebbf46d274a")),
Permission("Owner", uuid.UUID("6d109b66-8452-42aa-bbe9-d4cef440b7a1")),
Permission("Print Bill", uuid.UUID("92242eae-bd38-4223-829b-2f981933b7f2")),
Permission("Print Kot", uuid.UUID("0eef56fb-7741-49fd-8b84-5069cccae767")),
Permission("Products", uuid.UUID("f1f892ed-34aa-4c50-be12-dbaf48be7d4c")),
Permission("Roles", uuid.UUID("d39f86f6-14e4-4fc3-b07e-01e2501a6f65")),
Permission("Sales", uuid.UUID("92ba45c4-2d34-4cbd-b5b8-d9164c3595d5")),
Permission(
"Sales Analysis", uuid.UUID("0c1acb7c-9116-46e2-a3be-9d632e811330")
),
Permission(
"Sales Detail", uuid.UUID("e6476396-ef83-4c47-bc20-9f3b936813f9")
),
Permission(
"Settle Bill", uuid.UUID("9f7b658a-25bc-4a53-8560-2dde1c7a188a")
),
Permission("Split Bill", uuid.UUID("0a8cfaf4-624e-478f-be65-c3b6392078c7")),
Permission("Tables", uuid.UUID("ac4512e8-efdd-429e-a7ae-a34d18782663")),
Permission(
"Tax Analysis", uuid.UUID("bab36396-53dd-44ea-ab3c-426efa7830c8")
),
Permission("Taxes", uuid.UUID("5c8fcdde-460d-4047-810f-e34fb899fadc")),
Permission("Users", uuid.UUID("243447b8-b403-47e6-8b3d-8e76f4df44a9")),
Permission("Void Bill", uuid.UUID("e3c76262-adc0-4936-8b4d-217c6292298b")),
Permission(
"Void or Reprinted Bill Report",
uuid.UUID("30c8e743-c710-42d7-843a-0b75543b3516"),
),
Permission("Printers", uuid.UUID("5b66c6f6-003a-4ef8-ba28-49b8ff1ac33c")),
Permission("Sections", uuid.UUID("c973f32c-a37b-496a-8dc5-60d2e4c39e97")),
]
for permission in permissions:
dbsession.add(permission)
roles = [Role('Owner', uuid.UUID('06ec0ddb-949c-4357-aefb-65e5e55a9ae7')),
Role('Accountant', uuid.UUID('57d4538c-257a-4bf4-9a42-342992cb6af3')),
Role('Bar Captain', uuid.UUID('5a8ebb05-4817-45a5-866f-e523c30bfa25')),
Role('Captain', uuid.UUID('8db7001f-0964-4607-84f5-b6f4d9183fef')),
Role('Cashier', uuid.UUID('f1f0b112-1404-4b55-b121-f07ee6e08d12')),
Role('Controller', uuid.UUID('d9a5a478-1fe4-4847-84da-63cfba1a094a')),
Role('Manager', uuid.UUID('90ea7b14-9057-4bfd-a7cf-0ee7a3bb2463')),
Role('Senior Captain', uuid.UUID('d9b1b433-1ed5-4109-8ab2-cbd48ff010cd')),
Role('Server', uuid.UUID('6b378b71-f091-4485-a589-8db94ff1d6a4'))]
roles = [
Role("Owner", uuid.UUID("06ec0ddb-949c-4357-aefb-65e5e55a9ae7")),
Role("Accountant", uuid.UUID("57d4538c-257a-4bf4-9a42-342992cb6af3")),
Role("Bar Captain", uuid.UUID("5a8ebb05-4817-45a5-866f-e523c30bfa25")),
Role("Captain", uuid.UUID("8db7001f-0964-4607-84f5-b6f4d9183fef")),
Role("Cashier", uuid.UUID("f1f0b112-1404-4b55-b121-f07ee6e08d12")),
Role("Controller", uuid.UUID("d9a5a478-1fe4-4847-84da-63cfba1a094a")),
Role("Manager", uuid.UUID("90ea7b14-9057-4bfd-a7cf-0ee7a3bb2463")),
Role("Senior Captain", uuid.UUID("d9b1b433-1ed5-4109-8ab2-cbd48ff010cd")),
Role("Server", uuid.UUID("6b378b71-f091-4485-a589-8db94ff1d6a4")),
]
roles[0].permissions = permissions
roles[1].permissions = list(permissions[i] for i in [2, 3, 11, 18, 24, 25, 26, 30, 34])
roles[1].permissions = list(
permissions[i] for i in [2, 3, 11, 18, 24, 25, 26, 30, 34]
)
roles[2].permissions = list(permissions[i] for i in [26])
roles[3].permissions = list(permissions[i] for i in [16])
roles[4].permissions = list(permissions[i] for i in [20, 24, 27])
roles[5].permissions = list(permissions[i] for i in [0, 2, 7, 11, 18, 22, 24, 25, 26, 34])
roles[6].permissions = list(permissions[i] for i in [2, 3, 4, 5, 6, 8, 11, 14, 18, 22, 25, 26, 28, 29, 33, 34])
roles[5].permissions = list(
permissions[i] for i in [0, 2, 7, 11, 18, 22, 24, 25, 26, 34]
)
roles[6].permissions = list(
permissions[i]
for i in [2, 3, 4, 5, 6, 8, 11, 14, 18, 22, 25, 26, 28, 29, 33, 34]
)
roles[7].permissions = list(permissions[i] for i in [9, 12, 13, 15, 16])
roles[8].permissions = list(permissions[i] for i in [21, 24])
@ -111,40 +157,80 @@ def main(argv=sys.argv):
admin.roles.append(roles[0])
dbsession.add(admin)
main_section = Section("Main")
main_section = Section(
"Main", uuid.UUID("3f13f6e7-dc76-4fca-8fdb-b2bbf29b35df")
)
dbsession.add(main_section)
mcs = [ModifierCategory("Bar Instructions", 0, 0, True, 0, uuid.UUID("b572f401-3c2f-48b9-8973-ada5a6e4d3a6")),
ModifierCategory("Delivery", 0, 0, True, 0, uuid.UUID("caa72832-5034-405e-8442-68a8cc12ace9")),
ModifierCategory("Kitchen Instructions", 0, 0, True, 0, uuid.UUID("d6a0595f-e209-42e4-bb12-b7499f9a9c4d")),
ModifierCategory("Mixers", 0, 0, True, 0, uuid.UUID("60ca9122-adc5-463b-ad5f-33a68df8c3ae")),
ModifierCategory("Pasta Sauce", 0, 0, True, 0, uuid.UUID("ef5b1a0b-5eb1-45ff-bd82-3209c8b888df"))]
mcs = [
ModifierCategory(
"Bar Instructions",
0,
0,
True,
0,
uuid.UUID("b572f401-3c2f-48b9-8973-ada5a6e4d3a6"),
),
ModifierCategory(
"Delivery",
0,
0,
True,
0,
uuid.UUID("caa72832-5034-405e-8442-68a8cc12ace9"),
),
ModifierCategory(
"Kitchen Instructions",
0,
0,
True,
0,
uuid.UUID("d6a0595f-e209-42e4-bb12-b7499f9a9c4d"),
),
ModifierCategory(
"Mixers",
0,
0,
True,
0,
uuid.UUID("60ca9122-adc5-463b-ad5f-33a68df8c3ae"),
),
ModifierCategory(
"Pasta Sauce",
0,
0,
True,
0,
uuid.UUID("ef5b1a0b-5eb1-45ff-bd82-3209c8b888df"),
),
]
for item in mcs:
dbsession.add(item)
for name in range(1, 20):
ft = FoodTable(str(name), 0, main_section.id, True)
ft.section = main_section
dbsession.add(ft)
options = [
SettleOption('Unsettled', False, 1, True, 1),
SettleOption('Cash', True, 2, False, 2),
SettleOption('Credit Card', True, 2, True, 3),
SettleOption('No Charge', True, 3, True, 4),
SettleOption('Bill To Company', True, 2, True, 5),
SettleOption('Tip', True, 2, True, 6),
SettleOption('Round Off', False, 1, False, 7),
SettleOption('Amount', False, 1, False, 8),
SettleOption('Void', True, 1, True, 9),
SettleOption('Staff', True, 4, True, 10),
SettleOption("Unsettled", False, 1, True, 1),
SettleOption("Cash", True, 2, False, 2),
SettleOption("Credit Card", True, 2, True, 3),
SettleOption("No Charge", True, 3, True, 4),
SettleOption("Bill To Company", True, 2, True, 5),
SettleOption("Tip", True, 2, True, 6),
SettleOption("Round Off", False, 1, False, 7),
SettleOption("Amount", False, 1, False, 8),
SettleOption("Void", True, 1, True, 9),
SettleOption("Staff", True, 4, True, 10),
]
for option in options:
dbsession.add(option)
dbsession.add(Customer("", "Cash", "", "", uuid.UUID('2c716f4b-0736-429a-ad51-610d7c47cb5e')))
dbsession.add(DbSetting(
uuid.UUID('fb738ba2-a3c9-40ed-891c-b930e6454974'),
'Header',
{'Text': """ Hops n Grains
dbsession.add(
Customer(
"", "Cash", "", "", uuid.UUID("2c716f4b-0736-429a-ad51-610d7c47cb5e")
)
)
dbsession.add(
DbSetting(
uuid.UUID("fb738ba2-a3c9-40ed-891c-b930e6454974"),
"Header",
{
"Text": """ Hops n Grains
The Microbrewery
SCO 358, Sector 9, Panchkula
A Unit of Peitho Foods Pvt. Ltd.
@ -152,10 +238,14 @@ def main(argv=sys.argv):
(Reg Add: Plot No. 907, Indl Area II, Chd)
TIN: 06592507323
Service Tax: AAFCP5097GSD001
"""}
))
dbsession.add(DbSetting(
uuid.UUID('f7799871-d16e-4c4d-9b57-2299a5839acb'),
'Footer',
{'Text': "Call: 0172-4026666, 8054923853, 8054923856"}
))
"""
},
)
)
dbsession.add(
DbSetting(
uuid.UUID("f7799871-d16e-4c4d-9b57-2299a5839acb"),
"Footer",
{"Text": "Call: 0172-4026666, 8054923853, 8054923856"},
)
)

View File

@ -14,10 +14,10 @@ class PermissionAuthorizationPolicy(object):
return False
def check(self, principals, permission):
if permission == 'Authenticated':
permission = 'system.Authenticated'
if permission == 'Everyone':
permission = 'system.Everyone'
if permission == "Authenticated":
permission = "system.Authenticated"
if permission == "Everyone":
permission = "system.Everyone"
allowed = permission in principals
return allowed

View File

@ -128,23 +128,32 @@ def show_list(request):
active = request.GET.get("a", None)
list_ = request.dbsession.query(FoodTable)
if active is not None:
active = active == "true"
list_ = list_.filter(FoodTable.is_active == active)
list_ = list_.order_by(FoodTable.sort_order).all()
food_tables = []
for item in list_:
food_tables.append(
{
ft = {
"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,
"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
}
)
if item.status is None:
ft["status"] = ""
else:
ft["status"] = item.status.status
if item.status.voucher is not None:
ft["voucherId"] = item.status.voucher_id
ft["pax"] = item.status.voucher.pax
ft["date"] = item.status.voucher.date.strftime("%d-%b-%Y %H:%M")
ft["amount"] = 12345
if item.status.guest is not None:
ft["name"] = item.status.guest.customer.name
food_tables.append(ft)
return food_tables

View File

@ -185,7 +185,7 @@ def show_list(request):
request_param="p",
permission="Authenticated",
)
def show_for_pg(request):
def show_for_product(request):
product_id = uuid.UUID(request.GET["p"])
product = request.dbsession.query(Product).filter(Product.id == product_id).first()
@ -197,7 +197,7 @@ def show_for_pg(request):
"maximum": item.maximum,
"isActive": item.is_active,
"modifiers": [
{"id": m.id, "name": m.name, "prince": m.price}
{"id": m.id, "name": m.name, "price": m.price}
for m in item.modifiers
if m.is_active == True
],

View File

@ -1,509 +0,0 @@
import re
import uuid
from datetime import datetime
from decimal import Decimal
import transaction
from pyramid.httpexceptions import HTTPForbidden
from pyramid.view import view_config
from sqlalchemy import func
from barker.exceptions import ValidationFailure
from barker.models import (
Inventory,
InventoryModifier,
Kot,
Settlement,
SettleOption,
Voucher,
Overview,
VoucherType,
)
@view_config(request_method="PUT", route_name="voucher", renderer="json", trans=True)
def save(request):
update_table = request.GET["u"]
json = request.json_body
if not json["Printed"] and "Print Kot" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print a kot")
if json["Printed"] and "Print Bill" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print bill")
item = save_voucher(json, request.dbsession)
if update_table:
status = "printed" if item.is_printed else "running"
item.status = Overview(
voucher_id=None, food_table_id=item.food_table_id, status=status
)
request.dbsession.add(item.status)
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)
@view_config(
request_method="POST", route_name="voucher_id", renderer="json", trans=True
)
def update(request):
now = datetime.now()
update_table = request.GET["u"]
json = request.json_body
id = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id).first()
if not json["Printed"] and "Print Kot" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print a kot")
if json["Printed"] and "Print Bill" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print bill")
if item.is_printed and "Edit Printed Bill" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to edit a printed bill")
if item.is_printed and not json["Printed"]:
transaction.abort()
raise ValidationFailure("This Bill is already printed\nCannot add a Kot to it.")
if item.is_void:
transaction.abort()
raise ValidationFailure(
"This Bill is already void.\nReason: {0}".format(item.void_reason)
)
if item.is_printed and not json["Printed"]:
transaction.abort()
raise ValidationFailure("This Bill is already printed\nCannot add a Kot to it.")
item.pax = json["Pax"]
item.food_table_id = json["Table"]["FoodTableID"]
item.customer_id = json["Customer"]["CustomerID"]
item.voucher_type = json["VoucherType"]
if not item.is_printed and json["Printed"]:
item.date = now
type = [1, 3] if item.voucher_type in [1, 3] else [item.voucher_type]
item.bill_id = (
request.dbsession.query(func.coalesce(func.max(Voucher.bill_id), 0) + 1)
.filter(Voucher.voucher_type.in_(type))
.scalar()
)
item.is_printed = item.is_printed or json["Printed"]
item.user_id = json["User"]["UserID"]
item.last_edit_date = now
for k in item.kots:
for i in k.inventories:
i.service_tax_rate, i.vat_rate = get_st_vat(
i.service_tax_rate, i.vat_rate, item.voucher_type
)
i.discount = next(
Decimal(inv["Discount"])
for ko in json["Kots"]
for inv in ko["Inventories"]
if uuid.UUID(inv["InventoryID"]) == i.id
)
for k in (
k for k in json["Kots"] if k["KotID"] == "00000000-0000-0000-0000-000000000000"
):
kot = Kot(
item.id,
item.food_table_id,
item.date,
item.user_id,
dbsession=request.dbsession,
)
item.kots.append(kot)
request.dbsession.add(kot)
for index, i in enumerate(k["Inventories"]):
st, vat = get_st_vat(i["ServiceTaxRate"], i["VatRate"], json["VoucherType"])
inv = Inventory(
kot.id,
uuid.UUID(i["ProductID"]),
i["Quantity"],
i["Price"],
i["Discount"],
i["IsHappyHour"],
i["ServiceTaxID"],
st,
i["VatID"],
vat,
index,
)
kot.inventories.append(inv)
request.dbsession.add(inv)
for m in i["Modifiers"]:
mod = InventoryModifier(None, uuid.UUID(m["ModifierID"]), 0)
inv.modifiers.append(mod)
request.dbsession.add(mod)
get_settlements(item, request.dbsession)
if update_table:
vft = (
request.dbsession.query(Overview)
.filter(Overview.voucher_id == item.id)
.first()
)
status = "printed" if item.is_printed else "running"
if vft is None:
item.status = Overview(
voucher_id=None, food_table_id=item.food_table_id, status=status
)
request.dbsession.add(item.status)
else:
vft.status = status
vft.food_table_id = item.food_table_id
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)
@view_config(
request_method="POST",
route_name="voucher_settle",
renderer="json",
permission="Settle Bill",
trans=False,
)
def settle_voucher(request):
update_table = request.GET["u"]
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
allowed = [
SettleOption.AMOUNT(),
SettleOption.ROUND_OFF(),
SettleOption.UNSETTLED(),
]
for i in (j for j in json if j["Amount"] != 0):
amount = i["Amount"]
so = i["Settled"]
so_settled = [s for s in item.settlements if s.settled == so]
if len(so_settled) == 1:
so_settled[0].amount = amount
else:
s = Settlement(item.id, so, amount)
item.settlements.append(s)
request.dbsession.add(s)
allowed.append(so)
for i in (s for s in item.settlements if s.settled not in allowed):
item.settlements.remove(i)
request.dbsession.delete(i)
unsettled = get_settlements(item, request.dbsession)
if unsettled == 0 and update_table:
request.dbsession.query(Overview).filter(
Overview.voucher_id == item.id
).delete()
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)
@view_config(
request_method="POST",
route_name="voucher_reprint",
renderer="json",
permission="Edit Printed Bill",
trans=True,
) # Permission error
def voucher_change(request):
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = save_voucher(json, request.dbsession)
old = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
old.void = True
old.void_reason = "Bill Discounted / Changed. New Bill ID is {0}".format(
item.full_bill_id
)
# TODO: Set the Void Settlement
if old.status is None:
item.status = Overview(
voucher_id=None, food_table_id=item.food_table_id, status="printed"
)
request.dbsession.add(item.status)
else:
request.dbsession.query(Overview).filter(Overview.voucher_id == old.id).update(
{Overview.voucher_id: item.id}
)
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)
@view_config(
request_method="POST",
route_name="voucher_void",
renderer="json",
permission="Void Bill",
trans=True,
)
def void_voucher(request):
update_table = request.GET["u"]
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
item.void = True
item.void_reason = json["Reason"]
amount = round(-1 * sum(i.amount for k in item.kots for i in k.inventories), 5) * -1
s = Settlement(item.id, SettleOption.VOID(), amount)
item.settlements.append(s)
request.dbsession.add(s)
allowed = [
SettleOption.AMOUNT(),
SettleOption.ROUND_OFF(),
SettleOption.UNSETTLED(),
SettleOption.VOID(),
]
for i in (s for s in item.settlements if s.settled not in allowed):
item.settlements.remove(i)
request.dbsession.delete(i)
get_settlements(item, request.dbsession)
if update_table:
request.dbsession.delete(item.status)
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)
@view_config(
request_method="POST",
route_name="voucher_split",
renderer="json",
permission="Split Bill",
trans=True,
)
def split_voucher(request):
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
item.void = True
item.void_reason = "Bill Split"
# TODO: Set the Void Settlement
new_one = save_voucher(json["One"], request.dbsession)
new_two = save_voucher(json["Two"], request.dbsession)
status = "printed" if item.is_printed else "running"
new_one.status = Overview(
voucher_id=None, food_table_id=new_one.food_table_id, status=status
)
request.dbsession.add(new_one.status)
request.dbsession.query(Overview).filter(Overview.voucher_id == item.id).update(
{Overview.voucher_id: new_two.id}
)
transaction.commit()
@view_config(
request_method="GET",
route_name="voucher_id",
renderer="json",
permission="Authenticated",
)
def show_id(request):
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
return voucher_info(item)
@view_config(
request_method="GET",
route_name="voucher",
request_param="b",
renderer="json",
permission="Authenticated",
)
def show(request):
bill_id = request.GET["b"]
item = request.dbsession.query(Voucher)
if re.compile("^\d{2,}-\d{4}$").match(bill_id):
item = item.filter(
Voucher.bill_id == int(bill_id.replace("-", "")),
Voucher.voucher_type.in_([1, 3]),
)
elif re.compile("^NC-\d+$").match(bill_id):
item = item.filter(
Voucher.bill_id == int(bill_id.replace("NC-", "")),
Voucher.voucher_type == 2,
)
elif re.compile("^ST-\d+$").match(bill_id):
item = item.filter(
Voucher.bill_id == int(bill_id.replace("ST-", "")),
Voucher.voucher_type == 4,
)
item = item.first()
if item is None:
return {}
return voucher_info(item)
def voucher_info(item):
return {
"id": item.id,
"date": item.date.strftime("%d-%b-%Y %H:%M:%S"),
"pax": item.pax,
"user": {"id": item.user_id, "name": item.user.name},
"creationDate": item.creation_date.strftime("%d-%b-%Y %H:%M:%S"),
"lastEditDate": item.last_edit_date.strftime("%d-%b-%Y %H:%M:%S"),
"billId": item.bill_id,
"table": {"id": item.food_table_id, "name": item.food_table.name},
"customer": {"id": item.customer_id, "name": item.customer.name},
"settlements": [],
"narration": item.narration,
"void": item.is_void,
"voidReason": item.void_reason,
"printed": item.is_printed,
"voucherType": item.voucher_type,
"kotId": item.kot_id,
"kots": [
{
"id": k.id,
"code": k.code,
"date": k.date.strftime("%d-%b-%Y %H:%M:%S"),
"user": {"id": k.user_id, "name": k.user.name},
"inventories": [
{
"id": i.id,
"sortOrder": i.sort_order,
"product": {
"id": i.product_id,
"name": i.product.name,
"units": i.product.units,
"menuCategory": {
"id": i.product.menu_category_id,
"name": i.product.menu_category.name,
"discountLimit": i.product.menu_category.discount_limit,
},
"saleCategory": {
"id": i.product.sale_category_id,
"name": i.product.sale_category.name
},
},
"quantity": i.quantity,
"price": i.price,
"isHappyHour": i.is_happy_hour,
"taxRate": i.tax_rate,
"tax": {"id": i.vat_id, "name": i.vat.name},
"discount": i.discount,
"inventoryModifier": [
{
"modifier": {
"id": m.modifier.id,
"name": m.modifier.name,
"showInBill": m.modifier.show_in_bill,
},
"price": m.price,
}
for m in i.modifiers
],
}
for i in k.inventories
],
}
for k in item.kots
],
"reprints": [],
}
def get_st_vat(st, vat, voucher_type):
if voucher_type == VoucherType.STAFF.value:
return 0, 0
elif voucher_type == VoucherType.NO_CHARGE.value:
return 0, 0
else: # voucher_type in [REGULAR_BILL, TAKE_AWAY]:
return st, vat
def get_settlements(voucher, dbsession):
amount = round(
-1 * sum(sum(i.amount for i in k.inventories) for k in voucher.kots), 5
)
so_amount = [s for s in voucher.settlements if s.settled == SettleOption.AMOUNT()]
if len(so_amount) == 1:
so_amount[0].amount = amount
else:
s = Settlement(voucher.id, SettleOption.AMOUNT(), amount)
voucher.settlements.append(s)
dbsession.add(s)
round_off = round(amount) - amount
so_round_off = [
s for s in voucher.settlements if s.settled == SettleOption.ROUND_OFF()
]
if len(so_round_off) == 1 and round_off != 0:
so_round_off[0].amount = round_off
elif len(so_round_off) == 1 and round_off == 0:
voucher.settlements.remove(so_round_off[0])
dbsession.delete(so_round_off[0])
elif len(so_round_off) == 0 and round_off != 0:
s = Settlement(voucher.id, SettleOption.ROUND_OFF(), round_off)
voucher.settlements.append(s)
dbsession.add(s)
unsettled = sum(
s.amount for s in voucher.settlements if s.settled != SettleOption.UNSETTLED()
)
so_unsettled = [
s for s in voucher.settlements if s.settled == SettleOption.UNSETTLED()
]
if len(so_unsettled) == 1 and unsettled != 0:
so_unsettled[0].amount = unsettled
elif len(so_unsettled) == 1 and unsettled == 0:
voucher.settlements.remove(so_unsettled[0])
dbsession.delete(so_unsettled[0])
elif len(so_unsettled) == 0 and unsettled != 0:
s = Settlement(voucher.id, SettleOption.UNSETTLED(), unsettled)
voucher.settlements.append(s)
dbsession.add(s)
return unsettled
def save_voucher(json, dbsession):
item = Voucher(
json["Pax"],
json["Table"]["FoodTableID"],
json["Customer"]["CustomerID"],
json["Printed"],
json["VoucherType"],
json["User"]["UserID"],
dbsession,
)
dbsession.add(item)
for k in json["Kots"]:
kot = Kot(
item.id, item.food_table_id, item.date, item.user_id, dbsession=dbsession
)
item.kots.append(kot)
dbsession.add(kot)
for index, i in enumerate(k["Inventories"]):
st, vat = get_st_vat(i["ServiceTaxRate"], i["VatRate"], json["VoucherType"])
inv = Inventory(
kot.id,
uuid.UUID(i["ProductID"]),
i["Quantity"],
i["Price"],
i["Discount"],
i["IsHappyHour"],
i["ServiceTaxID"],
st,
i["VatID"],
vat,
index,
)
kot.inventories.append(inv)
dbsession.add(inv)
for m in i["Modifiers"]:
mod = InventoryModifier(None, uuid.UUID(m["ModifierID"]), 0)
inv.modifiers.append(mod)
dbsession.add(mod)
get_settlements(item, dbsession)
return item

View File

@ -0,0 +1,77 @@
# import re
# import uuid
# from datetime import datetime
# from decimal import Decimal
#
# import transaction
# from pyramid.httpexceptions import HTTPForbidden
# from pyramid.view import view_config
# from sqlalchemy import func
#
# from barker.exceptions import ValidationFailure
# from barker.models import (
# Inventory,
# InventoryModifier,
# Kot,
# Settlement,
# SettleOption,
# Voucher,
# Overview,
# VoucherType,
# )
from barker.models import VoucherType, Settlement, SettleOption
def get_st_vat(st, vat, voucher_type):
if voucher_type == VoucherType.STAFF.value:
return 0, 0
elif voucher_type == VoucherType.NO_CHARGE.value:
return 0, 0
else: # voucher_type in [REGULAR_BILL, TAKE_AWAY]:
return st, vat
def get_settlements(voucher, dbsession):
amount = round(
-1 * sum(sum(i.amount for i in k.inventories) for k in voucher.kots), 5
)
so_amount = [s for s in voucher.settlements if s.settled == SettleOption.AMOUNT()]
if len(so_amount) == 1:
so_amount[0].amount = amount
else:
s = Settlement(voucher.id, SettleOption.AMOUNT(), amount)
voucher.settlements.append(s)
dbsession.add(s)
round_off = round(amount) - amount
so_round_off = [
s for s in voucher.settlements if s.settled == SettleOption.ROUND_OFF()
]
if len(so_round_off) == 1 and round_off != 0:
so_round_off[0].amount = round_off
elif len(so_round_off) == 1 and round_off == 0:
voucher.settlements.remove(so_round_off[0])
dbsession.delete(so_round_off[0])
elif len(so_round_off) == 0 and round_off != 0:
s = Settlement(voucher.id, SettleOption.ROUND_OFF(), round_off)
voucher.settlements.append(s)
dbsession.add(s)
unsettled = sum(
s.amount for s in voucher.settlements if s.settled != SettleOption.UNSETTLED()
)
so_unsettled = [
s for s in voucher.settlements if s.settled == SettleOption.UNSETTLED()
]
if len(so_unsettled) == 1 and unsettled != 0:
so_unsettled[0].amount = unsettled
elif len(so_unsettled) == 1 and unsettled == 0:
voucher.settlements.remove(so_unsettled[0])
dbsession.delete(so_unsettled[0])
elif len(so_unsettled) == 0 and unsettled != 0:
s = Settlement(voucher.id, SettleOption.UNSETTLED(), unsettled)
voucher.settlements.append(s)
dbsession.add(s)
return unsettled

View File

@ -0,0 +1,42 @@
import uuid
import transaction
from pyramid.view import view_config
from barker.models import Voucher, Overview
from barker.views.voucher.save import save_voucher
from barker.views.voucher.show import voucher_info
@view_config(
request_method="POST",
route_name="voucher_reprint",
renderer="json",
permission="Edit Printed Bill",
trans=True,
) # Permission error
def voucher_change(request):
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = save_voucher(json, request.dbsession)
old = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
old.void = True
old.void_reason = "Bill Discounted / Changed. New Bill ID is {0}".format(
item.full_bill_id
)
# TODO: Set the Void Settlement
if old.status is None:
item.status = Overview(
voucher_id=None, food_table_id=item.food_table_id, status="printed"
)
request.dbsession.add(item.status)
else:
request.dbsession.query(Overview).filter(Overview.voucher_id == old.id).update(
{Overview.voucher_id: item.id}
)
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)

View File

@ -0,0 +1,74 @@
import uuid
import transaction
from pyramid.httpexceptions import HTTPForbidden
from pyramid.view import view_config
from barker.models import Overview, Voucher, Kot, Inventory, InventoryModifier
from barker.views.voucher import get_st_vat, get_settlements
from barker.views.voucher.show import voucher_info
@view_config(request_method="PUT", route_name="v1_vouchers_new", renderer="json", trans=True)
def save(request):
update_table = request.GET["u"]
json = request.json_body
if not json["Printed"] and "Print Kot" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print a kot")
if json["Printed"] and "Print Bill" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print bill")
item = save_voucher(json, request.dbsession)
if update_table:
status = "printed" if item.is_printed else "running"
item.status = Overview(
voucher_id=None, food_table_id=item.food_table_id, status=status
)
request.dbsession.add(item.status)
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)
def save_voucher(json, dbsession):
item = Voucher(
json["Pax"],
json["Table"]["FoodTableID"],
json["Customer"]["CustomerID"],
json["Printed"],
json["VoucherType"],
json["User"]["UserID"],
dbsession,
)
dbsession.add(item)
for k in json["Kots"]:
kot = Kot(
item.id, item.food_table_id, item.date, item.user_id, dbsession=dbsession
)
item.kots.append(kot)
dbsession.add(kot)
for index, i in enumerate(k["Inventories"]):
st, vat = get_st_vat(i["ServiceTaxRate"], i["VatRate"], json["VoucherType"])
inv = Inventory(
kot.id,
uuid.UUID(i["ProductID"]),
i["Quantity"],
i["Price"],
i["Discount"],
i["IsHappyHour"],
i["ServiceTaxID"],
st,
i["VatID"],
vat,
index,
)
kot.inventories.append(inv)
dbsession.add(inv)
for m in i["Modifiers"]:
mod = InventoryModifier(None, uuid.UUID(m["ModifierID"]), 0)
inv.modifiers.append(mod)
dbsession.add(mod)
get_settlements(item, dbsession)
return item

View File

@ -0,0 +1,53 @@
import uuid
import transaction
from pyramid.view import view_config
from barker.models import SettleOption, Voucher, Settlement, Overview
from barker.views.voucher import get_settlements
from barker.views.voucher.show import voucher_info
@view_config(
request_method="POST",
route_name="voucher_settle",
renderer="json",
permission="Settle Bill",
trans=False,
)
def settle_voucher(request):
update_table = request.GET["u"]
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
allowed = [
SettleOption.AMOUNT(),
SettleOption.ROUND_OFF(),
SettleOption.UNSETTLED(),
]
for i in (j for j in json if j["Amount"] != 0):
amount = i["Amount"]
so = i["Settled"]
so_settled = [s for s in item.settlements if s.settled == so]
if len(so_settled) == 1:
so_settled[0].amount = amount
else:
s = Settlement(item.id, so, amount)
item.settlements.append(s)
request.dbsession.add(s)
allowed.append(so)
for i in (s for s in item.settlements if s.settled not in allowed):
item.settlements.remove(i)
request.dbsession.delete(i)
unsettled = get_settlements(item, request.dbsession)
if unsettled == 0 and update_table:
request.dbsession.query(Overview).filter(
Overview.voucher_id == item.id
).delete()
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)

View File

@ -0,0 +1,160 @@
import re
import uuid
from pyramid.view import view_config
from barker.exceptions import ValidationFailure
from barker.models import Voucher, Overview, FoodTable, GuestBook
@view_config(
request_method="GET",
route_name="v1_vouchers_id",
renderer="json",
permission="Authenticated",
)
def show_id(request):
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
return voucher_info(item)
@view_config(
request_method="GET",
route_name="v1_vouchers_new",
request_param="b",
renderer="json",
permission="Authenticated",
)
def show(request):
bill_id = request.GET["b"]
item = request.dbsession.query(Voucher)
if re.compile("^\d{2,}-\d{4}$").match(bill_id):
item = item.filter(
Voucher.bill_id == int(bill_id.replace("-", "")),
Voucher.voucher_type.in_([1, 3]),
)
elif re.compile("^NC-\d+$").match(bill_id):
item = item.filter(
Voucher.bill_id == int(bill_id.replace("NC-", "")),
Voucher.voucher_type == 2,
)
elif re.compile("^ST-\d+$").match(bill_id):
item = item.filter(
Voucher.bill_id == int(bill_id.replace("ST-", "")),
Voucher.voucher_type == 4,
)
item = item.first()
if item is None:
return {}
return voucher_info(item)
@view_config(
request_method="GET",
route_name="v1_vouchers_new",
request_param="t",
renderer="json",
permission="Authenticated",
)
def show_for_table(request):
table_id = uuid.UUID(request.GET["t"])
voucher_id = request.GET.get("v", None)
guest_id = request.GET.get("g", None)
if voucher_id is not None:
item = (
request.dbsession.query(Overview)
.filter(
Overview.voucher_id == uuid.UUID(voucher_id),
Overview.food_table_id == table_id,
)
.first()
)
if item is None:
raise ValidationFailure("Bill Not Found")
else:
return voucher_info(item.voucher)
table = request.dbsession.query(FoodTable).filter(FoodTable.id == table_id).first()
if guest_id is not None:
guest = request.dbsession.query(GuestBook).filter(GuestBook.id == guest_id).first()
return voucher_blank(table, guest)
def voucher_info(item):
return {
"id": item.id,
"date": item.date.strftime("%d-%b-%Y %H:%M:%S"),
"pax": item.pax,
"user": {"id": item.user_id, "name": item.user.name},
"creationDate": item.creation_date.strftime("%d-%b-%Y %H:%M:%S"),
"lastEditDate": item.last_edit_date.strftime("%d-%b-%Y %H:%M:%S"),
"billId": item.bill_id,
"table": {"id": item.food_table_id, "name": item.food_table.name},
"customer": {"id": item.customer_id, "name": item.customer.name},
"settlements": [],
"narration": item.narration,
"void": item.is_void,
"voidReason": item.void_reason,
"printed": item.is_printed,
"voucherType": item.voucher_type,
"kotId": item.kot_id,
"kots": [
{
"id": k.id,
"code": k.code,
"date": k.date.strftime("%d-%b-%Y %H:%M:%S"),
"user": {"id": k.user_id, "name": k.user.name},
"inventories": [
{
"id": i.id,
"sortOrder": i.sort_order,
"product": {
"id": i.product_id,
"name": i.product.name,
"units": i.product.units,
"menuCategory": {
"id": i.product.menu_category_id,
"name": i.product.menu_category.name,
"discountLimit": i.product.menu_category.discount_limit,
},
"saleCategory": {
"id": i.product.sale_category_id,
"name": i.product.sale_category.name,
},
},
"quantity": i.quantity,
"price": i.price,
"isHappyHour": i.is_happy_hour,
"taxRate": i.tax_rate,
"tax": {"id": i.tax_id, "name": i.tax.name},
"discount": i.discount,
"inventoryModifier": [
{
"modifier": {
"id": m.modifier.id,
"name": m.modifier.name,
"showInBill": m.modifier.show_in_bill,
},
"price": m.price,
}
for m in i.modifiers
],
}
for i in k.inventories
],
}
for k in item.kots
],
"reprints": [],
}
def voucher_blank(table, guest):
return {
"pax": table.seats if guest is None else guest.pax,
"table": {"id": table.id, "name": table.name},
"customer": {"id": guest.customer_id, "name": guest.customer.name},
"kots": []
}

View File

@ -0,0 +1,40 @@
import uuid
import transaction
from pyramid.view import view_config
from barker.models import Voucher, Overview
from barker.views.voucher.save import save_voucher
@view_config(
request_method="POST",
route_name="voucher_split",
renderer="json",
permission="Split Bill",
trans=True,
)
def split_voucher(request):
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
item.void = True
item.void_reason = "Bill Split"
# TODO: Set the Void Settlement
new_one = save_voucher(json["One"], request.dbsession)
new_two = save_voucher(json["Two"], request.dbsession)
status = "printed" if item.is_printed else "running"
new_one.status = Overview(
voucher_id=None, food_table_id=new_one.food_table_id, status=status
)
request.dbsession.add(new_one.status)
request.dbsession.query(Overview).filter(Overview.voucher_id == item.id).update(
{Overview.voucher_id: new_two.id}
)
transaction.commit()

View File

@ -0,0 +1,129 @@
import datetime
import uuid
from decimal import Decimal
import transaction
from pyramid.httpexceptions import HTTPForbidden
from pyramid.view import view_config
from sqlalchemy import func
from barker.exceptions import ValidationFailure
from barker.models import Voucher, Kot, Inventory, InventoryModifier, Overview
from barker.views.voucher import get_st_vat, get_settlements
from barker.views.voucher.show import voucher_info
@view_config(
request_method="POST", route_name="v1_vouchers_id", renderer="json", trans=True
)
def update(request):
now = datetime.now()
update_table = request.GET["u"]
json = request.json_body
id = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id).first()
if not json["Printed"] and "Print Kot" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print a kot")
if json["Printed"] and "Print Bill" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print bill")
if item.is_printed and "Edit Printed Bill" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to edit a printed bill")
if item.is_printed and not json["Printed"]:
transaction.abort()
raise ValidationFailure("This Bill is already printed\nCannot add a Kot to it.")
if item.is_void:
transaction.abort()
raise ValidationFailure(
"This Bill is already void.\nReason: {0}".format(item.void_reason)
)
if item.is_printed and not json["Printed"]:
transaction.abort()
raise ValidationFailure("This Bill is already printed\nCannot add a Kot to it.")
item.pax = json["Pax"]
item.food_table_id = json["Table"]["FoodTableID"]
item.customer_id = json["Customer"]["CustomerID"]
item.voucher_type = json["VoucherType"]
if not item.is_printed and json["Printed"]:
item.date = now
type = [1, 3] if item.voucher_type in [1, 3] else [item.voucher_type]
item.bill_id = (
request.dbsession.query(func.coalesce(func.max(Voucher.bill_id), 0) + 1)
.filter(Voucher.voucher_type.in_(type))
.scalar()
)
item.is_printed = item.is_printed or json["Printed"]
item.user_id = json["User"]["UserID"]
item.last_edit_date = now
for k in item.kots:
for i in k.inventories:
i.service_tax_rate, i.vat_rate = get_st_vat(
i.service_tax_rate, i.vat_rate, item.voucher_type
)
i.discount = next(
Decimal(inv["Discount"])
for ko in json["Kots"]
for inv in ko["Inventories"]
if uuid.UUID(inv["InventoryID"]) == i.id
)
for k in (
k for k in json["Kots"] if k["KotID"] == "00000000-0000-0000-0000-000000000000"
):
kot = Kot(
item.id,
item.food_table_id,
item.date,
item.user_id,
dbsession=request.dbsession,
)
item.kots.append(kot)
request.dbsession.add(kot)
for index, i in enumerate(k["Inventories"]):
st, vat = get_st_vat(i["ServiceTaxRate"], i["VatRate"], json["VoucherType"])
inv = Inventory(
kot.id,
uuid.UUID(i["ProductID"]),
i["Quantity"],
i["Price"],
i["Discount"],
i["IsHappyHour"],
i["ServiceTaxID"],
st,
i["VatID"],
vat,
index,
)
kot.inventories.append(inv)
request.dbsession.add(inv)
for m in i["Modifiers"]:
mod = InventoryModifier(None, uuid.UUID(m["ModifierID"]), 0)
inv.modifiers.append(mod)
request.dbsession.add(mod)
get_settlements(item, request.dbsession)
if update_table:
vft = (
request.dbsession.query(Overview)
.filter(Overview.voucher_id == item.id)
.first()
)
status = "printed" if item.is_printed else "running"
if vft is None:
item.status = Overview(
voucher_id=None, food_table_id=item.food_table_id, status=status
)
request.dbsession.add(item.status)
else:
vft.status = status
vft.food_table_id = item.food_table_id
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)

View File

@ -0,0 +1,48 @@
import uuid
import transaction
from pyramid.view import view_config
from barker.models import Voucher, SettleOption, Settlement
from barker.views.voucher import get_settlements
from barker.views.voucher.show import voucher_info
@view_config(
request_method="POST",
route_name="voucher_void",
renderer="json",
permission="Void Bill",
trans=True,
)
def void_voucher(request):
update_table = request.GET["u"]
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
item.void = True
item.void_reason = json["Reason"]
amount = round(-1 * sum(i.amount for k in item.kots for i in k.inventories), 5) * -1
s = Settlement(item.id, SettleOption.VOID(), amount)
item.settlements.append(s)
request.dbsession.add(s)
allowed = [
SettleOption.AMOUNT(),
SettleOption.ROUND_OFF(),
SettleOption.UNSETTLED(),
SettleOption.VOID(),
]
for i in (s for s in item.settlements if s.settled not in allowed):
item.settlements.remove(i)
request.dbsession.delete(i)
get_settlements(item, request.dbsession)
if update_table:
request.dbsession.delete(item.status)
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)

View File

@ -6,4 +6,5 @@ export class Table {
seats: number;
section: Section;
isActive: boolean;
voucherId?: string;
}

View File

@ -1,37 +1,54 @@
import { Injectable } from '@angular/core';
import { MatDialog } from '@angular/material';
import { BehaviorSubject } from "rxjs";
import { Product } from '../core/product';
import { ModifiersComponent } from './modifiers/modifiers.component';
import { MatDialog } from '@angular/material';
import { ModifierCategoryService } from '../modifier-categories/modifier-category.service';
import {Subject} from "rxjs";
import {Modifier} from "../core/modifier";
import { ModifierCategory } from "../core/modifier-category";
import {isNotNullOrUndefined} from "codelyzer/util/isNotNullOrUndefined";
@Injectable()
export class BillService {
public dataObs = new Subject<any[]>();
public data = [];
public dataObs;
public data;
constructor(
private dialog: MatDialog,
private modifierCategoryService: ModifierCategoryService
) { }
) {
this.data = [];
this.dataObs = new BehaviorSubject<any[]>(this.data);
}
addProduct(product: Product) {
loadData(d: any): void {
console.log("data loaded");
this.data = d;
this.data.push({isKot: true, newKot: true, info: "== New Kot =="})
this.dataObs.next(this.data);
}
addProduct(product: Product): void {
let old = this.data.find(x=> !x.isKot && x.productId == product.id && x.isHappyHour == product.hasHappyHour);
if (old !== undefined) {
old.quantity += 1;
} else {
let item = {
isKot: false,
product: product,
productId: product.id,
isHappyHour: product.hasHappyHour,
info: `${product.name} (${product.units}) @ ${product.price}`,
quantity: 1,
modifiers: []
};
this.data.push(item);
this.modifierCategoryService.listIsActiveOfProduct(product.id).subscribe(result => {
if (result.reduce((a: any, c: ModifierCategory) => {return a + c.minimum}, 0)) {
if (result.reduce((a: any, c: ModifierCategory) => {
return a + c.minimum
}, 0)) {
this.showModifier(item);
}
});
}
this.dataObs.next(this.data);
}
@ -48,7 +65,7 @@ export class BillService {
});
dialogRef.afterClosed().subscribe(result => {
if (isNotNullOrUndefined(result)) {
if (result !== undefined) {
item.modifiers = result;
}
});

View File

@ -1,19 +1,21 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs/internal/Observable';
import {TableService} from '../../tables/table.service';
import { VoucherService } from "./voucher.service";
import { Bill } from "./bill";
@Injectable({
providedIn: 'root'
})
export class BillResolver implements Resolve<any[]> {
export class BillResolver implements Resolve<Bill> {
constructor(private ser: TableService, private router: Router) {
constructor(private ser: VoucherService, private router: Router) {
}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any[]> {
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Bill> {
const tableId = route.queryParamMap.get('table');
const guestId = route.queryParamMap.get('guest');
return this.ser.list();
const voucherId = route.queryParamMap.get('voucher');
return this.ser.getFromTable(tableId, voucherId, guestId);
}
}

View File

@ -15,7 +15,7 @@ export class Inventory {
taxRate: number;
tax: Tax;
discount: number;
modifiers: Modifier;
modifiers: Modifier[];
}
export class Kot {

View File

@ -1,6 +1,11 @@
.kot {
background-color: red;
font-weight: bold;
background-color: hotpink;
}
.printed {
background-color: lightpink;
}
.new-kot {
background-color: lightblue;
}
.square-button {

View File

@ -6,7 +6,7 @@
<mat-table #table [dataSource]="dataSource" aria-label="Elements">
<!-- Info Column -->
<ng-container matColumnDef="info">
<mat-cell *matCellDef="let row" fxLayout="column" fxLayoutAlign="space-around start" [class.kot]="row.isKot">
<mat-cell *matCellDef="let row" fxLayout="column" fxLayoutAlign="start space-between end">
<span>
{{row.info}}
</span>
@ -19,26 +19,27 @@
<ng-container matColumnDef="quantity">
<mat-header-cell *matHeaderCellDef>Quantity</mat-header-cell>
<mat-cell *matCellDef="let row">
<button mat-icon-button (click)="subtractOne(row)">
<button mat-icon-button (click)="subtractOne(row)" [disabled]="row.isPrinted" *ngIf="!row.isKot">
<mat-icon class="del">indeterminate_check_box</mat-icon>
</button>
<button mat-icon-button (click)="quantity(row)">
<button mat-icon-button (click)="quantity(row)" [disabled]="row.isPrinted" *ngIf="!row.isKot">
{{row.quantity}}
</button>
<button mat-icon-button (click)="addOne(row)">
<button mat-icon-button (click)="addOne(row)" [disabled]="row.isPrinted" *ngIf="!row.isKot">
<mat-icon class="del">control_point</mat-icon>
</button>
<button mat-icon-button (click)="removeItem(row)">
<button mat-icon-button (click)="removeItem(row)" [disabled]="row.isPrinted" *ngIf="!row.isKot">
<mat-icon class="del">cancel</mat-icon>
</button>
<button mat-icon-button (click)="modifier(row)">
<button mat-icon-button (click)="modifier(row)" [disabled]="row.isPrinted" *ngIf="!row.isKot">
<mat-icon class="del">assignment</mat-icon>
</button>
</mat-cell>
</ng-container>
<mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
<mat-row *matRowDef="let row; columns: displayedColumns;" [class.kot]="row.isKot" [class.new-kot]="row.newKot"
[class.printed]="row.isPrinted"></mat-row>
</mat-table>
</mat-card-content>
</mat-card>

View File

@ -1,7 +1,6 @@
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import {Bill, Inventory, Kot} from './bill';
import {ModifierCategoryListDatasource} from '../../modifier-categories/modifier-category-list/modifier-category-list-datasource';
import {BillsDataSource} from './bills-datasource';
import {BillService} from "../bill.service";
@ -13,7 +12,6 @@ import {BillService} from "../bill.service";
export class BillsComponent implements OnInit {
dataSource: BillsDataSource;
item: Bill;
view: any[];
/** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */
displayedColumns: string[] = ['info', 'quantity'];
@ -24,18 +22,35 @@ export class BillsComponent implements OnInit {
}
ngOnInit() {
console.log("ds set")
this.dataSource = new BillsDataSource(this.bs.dataObs);
this.route.data
.subscribe((data: { item: Bill }) => {
this.updateView(data.item);
});
this.dataSource = new BillsDataSource(this.bs.dataObs);
}
updateView(item) {
this.item = item;
// this.view = item.kots.reduce((p: Kot, c:Kot) => {
//
// }, [])
let view = item.kots.map(k => {
return [{
isKot: true,
}, ...k.inventories.map(i => {
return {
id: i.id,
isKot: false,
product: i.product,
productId: i.product.id,
isHappyHour: i.isHappyHour,
isPrinted: true,
info: `${i.product.name} (${i.product.units}) @ ${i.price}`,
quantity: 1,
modifiers: i.modifiers
}
})]
});
view = view.reduce((a, c) => {return a.concat(c)} , []);
this.bs.loadData(view);
}
addOne(item: any): void {

View File

@ -0,0 +1,70 @@
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/internal/Observable';
import { catchError } from 'rxjs/operators';
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
import { ErrorLoggerService } from '../../core/error-logger.service';
import {Bill} from "./bill";
const httpOptions = {
headers: new HttpHeaders({'Content-Type': 'application/json'})
};
const url = '/v1/vouchers';
const serviceName = 'VoucherService';
@Injectable({providedIn: 'root'})
export class VoucherService {
constructor(private http: HttpClient, private log: ErrorLoggerService) {
}
get(id: string): Observable<Bill> {
return <Observable<Bill>>this.http.get<Bill>(`${url}/${id}`)
.pipe(
catchError(this.log.handleError(serviceName, `get id=${id}`))
);
}
getFromTable(tableId: string, voucherId: string, guestId: string): Observable<Bill> {
let params = new HttpParams();
if (tableId !== null) {
params = params.set('t', tableId);
}
if (voucherId !== null) {
params = params.set('v', voucherId);
}
if (guestId !== null) {
params = params.set('g', guestId);
}
return <Observable<Bill>>this.http.get<Bill>(`${url}/new`, {params: params})
.pipe(
catchError(this.log.handleError(
serviceName,
`getFromTable tableId=${tableId} voucherId=${voucherId} guestId=${guestId}`
))
);
}
save(voucher: Bill): Observable<Bill> {
return <Observable<Bill>>this.http.post<Bill>(`${url}/new`, voucher, httpOptions)
.pipe(
catchError(this.log.handleError(serviceName, 'save'))
);
}
update(voucher: Bill): Observable<Bill> {
return <Observable<Bill>>this.http.put<Bill>(`${url}/${voucher.id}`, voucher, httpOptions)
.pipe(
catchError(this.log.handleError(serviceName, 'update'))
);
}
saveOrUpdate(voucher: Bill): Observable<Bill> {
if (!voucher.id) {
return this.save(voucher);
} else {
return this.update(voucher);
}
}
}

View File

@ -13,6 +13,6 @@ export class RunningTablesResolver implements Resolve<Table[]> {
}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Table[]> {
return this.ser.list();
return this.ser.running();
}
}

View File

@ -1,5 +1,23 @@
.running {
background-color: green;
}
.printed {
background-color: firebrick;
}
.square-button {
min-width: 150px;
max-width: 150px;
min-height: 150px;
max-height: 150px;
margin: 20px;
}
.item-name {
text-align: center;
padding: 0.5rem;
}
.center {
text-align: center;
}

View File

@ -3,7 +3,13 @@
<mat-card-title>Running Tables</mat-card-title>
</mat-card-title-group>
<mat-card-content fxLayout="row wrap" fxLayoutGap="grid 20px">
<button mat-raised-button class="square-button"
*ngFor="let table of list" [routerLink]="['../bill']" [queryParams]="{table: table.id}" queryParamsHandling="merge">{{table.name}}</button>
<mat-card fxLayout="column" class="square-button"
*ngFor="let table of list" (click)="navigateToBill(table)"
[class.running]="table.status === 'running'" [class.printed]="table.status === 'printed'">
<h3 class="item-name">{{table.name}}</h3>
<span class="center">{{table.pax || 0}} / {{table.seats}} Seats</span>
<span class="center" *ngIf="table.date">{{table.date}}</span>
<span class="center" *ngIf="table.amount">{{table.amount}}</span>
</mat-card>
</mat-card-content>
</mat-card>

View File

@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { ActivatedRoute, NavigationExtras, Router } from '@angular/router';
import { Table } from '../../core/table';
@Component({
@ -10,7 +10,7 @@ import { Table } from '../../core/table';
export class RunningTablesComponent implements OnInit {
list: Table[];
constructor(private route: ActivatedRoute) {
constructor(private router: Router, private route: ActivatedRoute) {
}
ngOnInit() {
@ -19,4 +19,17 @@ export class RunningTablesComponent implements OnInit {
this.list = data.list;
});
}
navigateToBill(table: Table): void {
let qp = {table: table.id};
if (table.voucherId) {
qp["voucher"] = table.voucherId;
}
let navigationExtras: NavigationExtras = {
queryParams: qp,
queryParamsHandling: 'merge',
preserveFragment: true
};
this.router.navigate(['/sales', 'bill'], navigationExtras);
}
}

View File

@ -43,7 +43,7 @@ const routes: Routes = [
permission: 'Guest Book'
},
resolve: {
list: BillResolver
item: BillResolver
},
children: [
{

View File

@ -34,6 +34,14 @@ export class TableService {
);
}
running(): Observable<Table[]> {
const options = {params: new HttpParams().set('a', 'true')};
return <Observable<Table[]>>this.http.get<Table[]>(url, options)
.pipe(
catchError(this.log.handleError(serviceName, 'running'))
);
}
save(tables: Table): Observable<Table> {
return <Observable<Table>>this.http.post<Table>(`${url}/new`, tables, httpOptions)
.pipe(