# Instructions - Following Playwright test failed. - Explain why, be concise, respect Playwright best practices. - Provide a snippet of code with the fix, if possible. # Test info - Name: src/manager/tests/e2e/booking/booking-create.spec.ts >> rejects a sepa booking over the payment amount limit - Location: src/manager/tests/e2e/booking/booking-create.spec.ts:989:5 # Error details ``` Error: expect(locator).toBeVisible() failed Locator: locator('.v-snackbar').filter({ hasText: 'Max billing amount exceeded for payment method type' }) Expected: visible Timeout: 30000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 30000ms - waiting for locator('.v-snackbar').filter({ hasText: 'Max billing amount exceeded for payment method type' }) ``` ```yaml - navigation: - link: - /url: / - text: KINNOVIS Manager - button: - img - list: - text: Dashboard - link "Tasks": - /url: /tasks - img - text: Tasks - link "Facility maps": - /url: /facility-map - link "Analytics": - /url: /dashboard - text: Sales - link "Bookings": - /url: /bookings - link "Customers": - /url: /customers - link "Invoices": - /url: /invoices - link "Credit notes": - /url: /credit-notes - img - text: Credit notes - link "Units": - /url: /units - text: Site management - link "Locations": - /url: /locations - link "Unit types": - /url: /unit-types - link "Protection Plans": - /url: /insurances - link "Deposits": - /url: /deposits - link "Products": - /url: /products - link "Discounts": - /url: /discounts - option "Emails" - link "Document templates": - /url: /document-templates - text: Admin - link "Integrations": - /url: /connected-apps - link "User & Roles": - /url: /users - option "Booking Portal" - option "JaneAI" - text: Feedback - link "Voting Portal": - /url: /voting-portal - button "AS Andreas Stadler andreas.stadler@storeroom.at" - button - main: - text: Bookings - link "Create booking": - /url: /bookings/create - button - button "Filters Reset filters": - heading "Filters" [level=3] - button "Reset filters" - text: Search - textbox "Search" - combobox: - text: Location - combobox "Location" - combobox: - text: Status - combobox "Status" - combobox: - text: ID verification status - combobox "ID verification status" - combobox: - text: Access status - combobox "Access status" - combobox: - text: Unit type - combobox "Unit type" - text: Created at - textbox "Created at" - button "Select all" - button "Price adjustment" [disabled]: - img - text: Price adjustment - button "Remove price adjustment" [disabled] - button: - img - table: - rowgroup: - row "Booking number Location Status Customer Unit type Unit Booking plan Next invoice Created at Move-in Move-out": - columnheader: - checkbox - columnheader "Booking number": - button "Booking number" - columnheader "Location": - button "Location" - columnheader "Status": - button "Status" - columnheader "Customer": - button "Customer" - columnheader "Unit type" - columnheader "Unit": - button "Unit" - columnheader "Booking plan": - button "Booking plan" - columnheader "Next invoice": - button "Next invoice" - columnheader "Created at": - button "Created at" - columnheader "Move-in": - button "Move-in" - columnheader "Move-out": - button "Move-out" - row: - columnheader - rowgroup: - row "5975-7658-5992-998 Vienna South Active Natasha Frami-Kulas Small Box wAl7dv Unit u7n6pL Basic (1 week) 30 Aug 2026 23 Aug 2026 23 Aug 2026": - cell: - checkbox - cell "5975-7658-5992-998": - link "5975-7658-5992-998": - /url: /bookings/597576585992998 - cell "Vienna South": - link "Vienna South": - /url: /bookings/597576585992998 - cell "Active": - link "Active": - /url: /bookings/597576585992998 - cell "Natasha Frami-Kulas": - link "Natasha Frami-Kulas": - /url: /bookings/597576585992998 - cell "Small Box wAl7dv": - link "Small Box wAl7dv": - /url: /bookings/597576585992998 - cell "Unit u7n6pL": - link "Unit u7n6pL": - /url: /bookings/597576585992998 - cell "Basic (1 week)": - link "Basic (1 week)": - /url: /bookings/597576585992998 - cell "30 Aug 2026": - link "30 Aug 2026": - /url: /bookings/597576585992998 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/597576585992998 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/597576585992998 - cell: - link: - /url: /bookings/597576585992998 - row "5975-7688-9256-945 Vienna South Active Perry Stanton Incredible Box FJqrAU Unit Kzx08q Basic (1 week) 30 Aug 2026 23 Aug 2026 23 Aug 2026": - cell: - checkbox - cell "5975-7688-9256-945": - link "5975-7688-9256-945": - /url: /bookings/597576889256945 - cell "Vienna South": - link "Vienna South": - /url: /bookings/597576889256945 - cell "Active": - link "Active": - /url: /bookings/597576889256945 - cell "Perry Stanton": - link "Perry Stanton": - /url: /bookings/597576889256945 - cell "Incredible Box FJqrAU": - link "Incredible Box FJqrAU": - /url: /bookings/597576889256945 - cell "Unit Kzx08q": - link "Unit Kzx08q": - /url: /bookings/597576889256945 - cell "Basic (1 week)": - link "Basic (1 week)": - /url: /bookings/597576889256945 - cell "30 Aug 2026": - link "30 Aug 2026": - /url: /bookings/597576889256945 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/597576889256945 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/597576889256945 - cell: - link: - /url: /bookings/597576889256945 - row "5975-7668-3487-654 Vienna South Active Brendon Brekke-Predovic Intelligent Box ccRB3H Unit bG1LJV Basic (1 week) 30 Aug 2026 23 Aug 2026 23 Aug 2026": - cell: - checkbox - cell "5975-7668-3487-654": - link "5975-7668-3487-654": - /url: /bookings/597576683487654 - cell "Vienna South": - link "Vienna South": - /url: /bookings/597576683487654 - cell "Active": - link "Active": - /url: /bookings/597576683487654 - cell "Brendon Brekke-Predovic": - link "Brendon Brekke-Predovic": - /url: /bookings/597576683487654 - cell "Intelligent Box ccRB3H": - link "Intelligent Box ccRB3H": - /url: /bookings/597576683487654 - cell "Unit bG1LJV": - link "Unit bG1LJV": - /url: /bookings/597576683487654 - cell "Basic (1 week)": - link "Basic (1 week)": - /url: /bookings/597576683487654 - cell "30 Aug 2026": - link "30 Aug 2026": - /url: /bookings/597576683487654 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/597576683487654 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/597576683487654 - cell: - link: - /url: /bookings/597576683487654 - row "7217-1881-2119-825 Vienna South Active Tonya Harber Licensed Box l1cdNm Unit M1WyMP Basic (1 month) 23 Sep 2026 23 Aug 2026 23 Aug 2026": - cell: - checkbox - cell "7217-1881-2119-825": - link "7217-1881-2119-825": - /url: /bookings/721718812119825 - cell "Vienna South": - link "Vienna South": - /url: /bookings/721718812119825 - cell "Active": - link "Active": - /url: /bookings/721718812119825 - cell "Tonya Harber": - link "Tonya Harber": - /url: /bookings/721718812119825 - cell "Licensed Box l1cdNm": - link "Licensed Box l1cdNm": - /url: /bookings/721718812119825 - cell "Unit M1WyMP": - link "Unit M1WyMP": - /url: /bookings/721718812119825 - cell "Basic (1 month)": - link "Basic (1 month)": - /url: /bookings/721718812119825 - cell "23 Sep 2026": - link "23 Sep 2026": - /url: /bookings/721718812119825 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/721718812119825 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/721718812119825 - cell: - link: - /url: /bookings/721718812119825 - row "6586-8442-8321-185 Vienna South Active Nathan Price Oriental Box uQ04Aq Unit 8RL2r3 Basic (1 month) 13 Sep 2026 23 Aug 2026 13 Aug 2026": - cell: - checkbox - cell "6586-8442-8321-185": - link "6586-8442-8321-185": - /url: /bookings/658684428321185 - cell "Vienna South": - link "Vienna South": - /url: /bookings/658684428321185 - cell "Active": - link "Active": - /url: /bookings/658684428321185 - cell "Nathan Price": - link "Nathan Price": - /url: /bookings/658684428321185 - cell "Oriental Box uQ04Aq": - link "Oriental Box uQ04Aq": - /url: /bookings/658684428321185 - cell "Unit 8RL2r3": - link "Unit 8RL2r3": - /url: /bookings/658684428321185 - cell "Basic (1 month)": - link "Basic (1 month)": - /url: /bookings/658684428321185 - cell "13 Sep 2026": - link "13 Sep 2026": - /url: /bookings/658684428321185 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/658684428321185 - cell "13 Aug 2026": - link "13 Aug 2026": - /url: /bookings/658684428321185 - cell: - link: - /url: /bookings/658684428321185 - row "5975-7679-9628-647 Vienna South Active Vernice Howe Handmade Box Oa3alP Unit 5q2ziP Basic (1 month) 23 Sep 2026 23 Aug 2026 23 Aug 2026": - cell: - checkbox - cell "5975-7679-9628-647": - link "5975-7679-9628-647": - /url: /bookings/597576799628647 - cell "Vienna South": - link "Vienna South": - /url: /bookings/597576799628647 - cell "Active": - link "Active": - /url: /bookings/597576799628647 - cell "Vernice Howe": - link "Vernice Howe": - /url: /bookings/597576799628647 - cell "Handmade Box Oa3alP": - link "Handmade Box Oa3alP": - /url: /bookings/597576799628647 - cell "Unit 5q2ziP": - link "Unit 5q2ziP": - /url: /bookings/597576799628647 - cell "Basic (1 month)": - link "Basic (1 month)": - /url: /bookings/597576799628647 - cell "23 Sep 2026": - link "23 Sep 2026": - /url: /bookings/597576799628647 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/597576799628647 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/597576799628647 - cell: - link: - /url: /bookings/597576799628647 - row "2342-4753-9498-852 Vienna South Active Carla Kilback Awesome Box pJqMTG Unit qWQ7Nm Basic (1 month) 23 Sep 2026 23 Aug 2026 23 Aug 2026": - cell: - checkbox - cell "2342-4753-9498-852": - link "2342-4753-9498-852": - /url: /bookings/234247539498852 - cell "Vienna South": - link "Vienna South": - /url: /bookings/234247539498852 - cell "Active": - link "Active": - /url: /bookings/234247539498852 - cell "Carla Kilback": - link "Carla Kilback": - /url: /bookings/234247539498852 - cell "Awesome Box pJqMTG": - link "Awesome Box pJqMTG": - /url: /bookings/234247539498852 - cell "Unit qWQ7Nm": - link "Unit qWQ7Nm": - /url: /bookings/234247539498852 - cell "Basic (1 month)": - link "Basic (1 month)": - /url: /bookings/234247539498852 - cell "23 Sep 2026": - link "23 Sep 2026": - /url: /bookings/234247539498852 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/234247539498852 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/234247539498852 - cell: - link: - /url: /bookings/234247539498852 - row "9829-2516-9938-8 Vienna South Active Nicole Wisozk Sleek Box 237Lfd Unit 8SNIkc Basic (1 week) 30 Aug 2026 23 Aug 2026 23 Aug 2026": - cell: - checkbox - cell "9829-2516-9938-8": - link "9829-2516-9938-8": - /url: /bookings/9829251699388 - cell "Vienna South": - link "Vienna South": - /url: /bookings/9829251699388 - cell "Active": - link "Active": - /url: /bookings/9829251699388 - cell "Nicole Wisozk": - link "Nicole Wisozk": - /url: /bookings/9829251699388 - cell "Sleek Box 237Lfd": - link "Sleek Box 237Lfd": - /url: /bookings/9829251699388 - cell "Unit 8SNIkc": - link "Unit 8SNIkc": - /url: /bookings/9829251699388 - cell "Basic (1 week)": - link "Basic (1 week)": - /url: /bookings/9829251699388 - cell "30 Aug 2026": - link "30 Aug 2026": - /url: /bookings/9829251699388 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/9829251699388 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/9829251699388 - cell: - link: - /url: /bookings/9829251699388 - row "6586-8433-9934-231 Vienna South Active Nicole Wisozk Licensed Box EPPf2z Unit pqtkAi Basic (1 week) 30 Aug 2026 23 Aug 2026 23 Aug 2026": - cell: - checkbox - cell "6586-8433-9934-231": - link "6586-8433-9934-231": - /url: /bookings/658684339934231 - cell "Vienna South": - link "Vienna South": - /url: /bookings/658684339934231 - cell "Active": - link "Active": - /url: /bookings/658684339934231 - cell "Nicole Wisozk": - link "Nicole Wisozk": - /url: /bookings/658684339934231 - cell "Licensed Box EPPf2z": - link "Licensed Box EPPf2z": - /url: /bookings/658684339934231 - cell "Unit pqtkAi": - link "Unit pqtkAi": - /url: /bookings/658684339934231 - cell "Basic (1 week)": - link "Basic (1 week)": - /url: /bookings/658684339934231 - cell "30 Aug 2026": - link "30 Aug 2026": - /url: /bookings/658684339934231 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/658684339934231 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/658684339934231 - cell: - link: - /url: /bookings/658684339934231 - row "7217-1819-8114-982 Vienna South Active Brooklyn Crist Oriental Box NbG6GW Unit 9RuRAO Advanced (4 weeks) 20 Sep 2026 23 Aug 2026 23 Aug 2026": - cell: - checkbox - cell "7217-1819-8114-982": - link "7217-1819-8114-982": - /url: /bookings/721718198114982 - cell "Vienna South": - link "Vienna South": - /url: /bookings/721718198114982 - cell "Active": - link "Active": - /url: /bookings/721718198114982 - cell "Brooklyn Crist": - link "Brooklyn Crist": - /url: /bookings/721718198114982 - cell "Oriental Box NbG6GW": - link "Oriental Box NbG6GW": - /url: /bookings/721718198114982 - cell "Unit 9RuRAO": - link "Unit 9RuRAO": - /url: /bookings/721718198114982 - cell "Advanced (4 weeks)": - link "Advanced (4 weeks)": - /url: /bookings/721718198114982 - cell "20 Sep 2026": - link "20 Sep 2026": - /url: /bookings/721718198114982 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/721718198114982 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/721718198114982 - cell: - link: - /url: /bookings/721718198114982 - text: "Items per page:" - combobox: - text: "10" - combobox "Items per page:": "10" - text: 1-10 of 124 - button [disabled] - button [disabled] - button - button - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - dialog: - button - heading "Create booking" [level=2] - button "Save" - separator - group "General": - heading "General" [level=3] - combobox: - text: Ernestine Vandervort (jerald96@hotmail.com) - combobox "Customer *" - text: Customer * - alert - combobox: - text: Vienna South - combobox "Location *" - text: Location * - alert - textbox "Move-in date *": - /placeholder: dd/mm/yyyy - text: 23/08/2026 - text: Move-in date * - alert - text: Note - textbox "Note" - alert - group "Products": - heading "Products" [level=3] - table: - rowgroup: - row "Recurring Booking Period Quantity Price VAT Amount": - columnheader "Recurring" - columnheader "Booking Period" - columnheader "Quantity" - columnheader "Price" - columnheader "VAT" - columnheader "Amount" - rowgroup: - row "€11,000.00 17% €11,000.00": - cell: - combobox: - text: Small Box zH4p4V - combobox "Unit type *" - text: Unit type * - alert - combobox: - text: Unit yNA9lc - combobox "Unit *" - text: Unit * - alert - cell: - combobox: - text: Basic (1 month) - combobox "Booking plan *" - text: Booking plan * - alert - cell - cell "€11,000.00" - cell "17%" - cell "€11,000.00" - table: - rowgroup: - row: - cell: - combobox: - text: Protection plan - combobox "Protection plan" - alert - cell - cell - cell - cell - cell - table - button "Add recurring product" [disabled] - table: - rowgroup: - row "One time Quantity Price VAT Amount": - columnheader "One time" - columnheader - columnheader "Quantity" - columnheader "Price" - columnheader "VAT" - columnheader "Amount" - button "Add one-time product" - table: - rowgroup: - row "Deposit Quantity Price VAT Amount": - columnheader "Deposit" - columnheader - columnheader "Quantity" - columnheader "Price" - columnheader "VAT" - columnheader "Amount" - rowgroup: - row: - cell: - combobox: - text: Deposit - combobox "Deposit" - alert - cell - cell - cell - cell - cell - table: - rowgroup: - row "Discount Terms Price Amount": - columnheader "Discount" - columnheader "Terms" - columnheader - columnheader "Price" - columnheader - columnheader "Amount" - button "Add discount" [disabled] - text: Total excl.VAT €11,000.00 VAT €1,870.00 Total incl.VAT €12,870.00 - group "Payment": - heading "Payment" [level=3] - radio "Customer will be charged automatically (after 1st invoice) CARD ONLY" - text: Customer will be charged automatically (after 1st invoice) CARD ONLY - radio "Automatically charge with existing payment method" [checked] - text: Automatically charge with existing payment method - button "SEPA via Stripe IBAN •••• 3201": - img "SEPA via Stripe" - text: IBAN •••• 3201 - button - alert - button "Add payment method" - radio "Customer pays each invoice manually via payment-link" - text: Customer pays each invoice manually via payment-link - alert - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip - tooltip ``` # Test source ```ts 929 | createCustomer, 930 | createUnitType, 931 | createUnit, 932 | createDeposit, 933 | bookingCreateDialog, 934 | trackBookingForTeardown, 935 | }) => { 936 | const [customer, deposit] = await Promise.all([ 937 | createCustomer(getCustomerCreateData()), 938 | createDeposit(getDepositCreateData()), 939 | ]); 940 | const unitType = await createUnitType(getUnitTypeCreateData({ deposit })); 941 | const unit = await createUnit(getUnitCreateData(unitType)); 942 | const data = getBookingCreateData( 943 | { customer, unitType, unit, deposit }, 944 | { chargeDepositUpfront: true, moveInDaysInTheFuture: 10 } 945 | ); 946 | const depositAmount = formatCurrency(deposit.priceExclVat, data.location.currency); 947 | const today = formatDate(new Date(), data.location.timezone); 948 | const dueDate = formatDate(getFutureDate(data.location.invoiceDaysUntilDue, 'day'), data.location.timezone); 949 | 950 | await bookingCreateDialog.goto(); 951 | 952 | const detailsPage = await test.step('create booking', () => bookingCreateDialog.create(data)); 953 | 954 | trackBookingForTeardown(detailsPage.getBookingId()); 955 | 956 | await test.step('verify booking invoices', async () => { 957 | // scheduled, so no first-period invoice yet — only the upfront deposit invoice 958 | await verifyBookingInvoiceCount(detailsPage, 1); 959 | 960 | // the upfront-deposit invoice is not tied to a unit, so its unit cell is left empty 961 | await verifyBookingInvoice( 962 | detailsPage, 963 | { 964 | status: 'Open', 965 | paymentOption: 'Manual', 966 | amount: depositAmount, 967 | amountDue: depositAmount, 968 | issueDate: today, 969 | dueDate, 970 | }, 971 | 'Deposit' 972 | ); 973 | }); 974 | 975 | await test.step('verify booking payments', async () => { 976 | await verifyBookingPaymentCount(detailsPage, 1); 977 | 978 | await verifyBookingPayment( 979 | detailsPage, 980 | { amount: depositAmount, status: 'Not paid yet', date: today }, 981 | await getBookingDepositInvoiceNumber(detailsPage.invoicesCard.dataTable) 982 | ); 983 | }); 984 | 985 | // Reloads, so run last: the deposit field links its amount to the upfront deposit invoice. 986 | await test.step('verify deposit on details page', () => verifyBookingDepositInvoiceLink(detailsPage, depositAmount)); 987 | }); 988 | 989 | test('rejects a sepa booking over the payment amount limit', async ({ 990 | createCustomer, 991 | createUnitType, 992 | createUnit, 993 | bookingCreateDialog, 994 | }) => { 995 | const [customer, unitType] = await Promise.all([ 996 | createCustomer(getCustomerCreateData()), 997 | createUnitType( 998 | getUnitTypeCreateData({ 999 | bookingPlans: [ 1000 | { 1001 | period: 'monthly', 1002 | amount: 1, 1003 | priceExclVat: 11000, 1004 | discount: undefined, 1005 | publish: true, 1006 | name: 'Basic', 1007 | shortDescription: { EN: 'Basic description' }, 1008 | }, 1009 | ], 1010 | }) 1011 | ), 1012 | ]); 1013 | const unit = await createUnit(getUnitCreateData(unitType)); 1014 | // a sepa subscription over the SEPA per-transaction limit is rejected on submit with an error snackbar 1015 | // (no booking is created, so nothing to tear down). 1016 | const data = getBookingCreateData( 1017 | { customer, unitType, unit }, 1018 | { paymentOption: 'charge_automatically', paymentMethod: getDefaultSepaPayment() } 1019 | ); 1020 | 1021 | await bookingCreateDialog.goto(); 1022 | 1023 | await test.step('submit booking', async () => { 1024 | await bookingCreateDialog.fill(data); 1025 | await bookingCreateDialog.submit(); 1026 | }); 1027 | 1028 | await test.step('verify the payment limit error', async () => { > 1029 | await expect(bookingCreateDialog.paymentLimitSnackbar).toBeVisible(); | ^ Error: expect(locator).toBeVisible() failed 1030 | }); 1031 | }); 1032 | 1033 | test('rejects a booking without all required fields', async ({ bookingCreateDialog }) => { 1034 | await bookingCreateDialog.goto(); 1035 | 1036 | await test.step('submit invalid booking create form', () => bookingCreateDialog.submit()); 1037 | 1038 | await test.step('verify errors on form', async () => { 1039 | await expect(bookingCreateDialog.errors).toHaveCountGreaterThan(0); 1040 | }); 1041 | }); 1042 | ```