# 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:954: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 "6586-8423-4498-698 Vienna South Active Karli Hamill Rustic Box VClEmj Unit tr8JFY Basic (1 month) 18 Sep 2026 18 Aug 2026 18 Aug 2026": - cell: - checkbox - cell "6586-8423-4498-698": - link "6586-8423-4498-698": - /url: /bookings/658684234498698 - cell "Vienna South": - link "Vienna South": - /url: /bookings/658684234498698 - cell "Active": - link "Active": - /url: /bookings/658684234498698 - cell "Karli Hamill": - link "Karli Hamill": - /url: /bookings/658684234498698 - cell "Rustic Box VClEmj": - link "Rustic Box VClEmj": - /url: /bookings/658684234498698 - cell "Unit tr8JFY": - link "Unit tr8JFY": - /url: /bookings/658684234498698 - cell "Basic (1 month)": - link "Basic (1 month)": - /url: /bookings/658684234498698 - cell "18 Sep 2026": - link "18 Sep 2026": - /url: /bookings/658684234498698 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/658684234498698 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/658684234498698 - cell: - link: - /url: /bookings/658684234498698 - row "5975-7688-5857-636 Vienna South Active Joana Gleason Gorgeous Box TE0ZMc Unit mnoyC8 Basic (1 month) 8 Sep 2026 18 Aug 2026 8 Aug 2026": - cell: - checkbox - cell "5975-7688-5857-636": - link "5975-7688-5857-636": - /url: /bookings/597576885857636 - cell "Vienna South": - link "Vienna South": - /url: /bookings/597576885857636 - cell "Active": - link "Active": - /url: /bookings/597576885857636 - cell "Joana Gleason": - link "Joana Gleason": - /url: /bookings/597576885857636 - cell "Gorgeous Box TE0ZMc": - link "Gorgeous Box TE0ZMc": - /url: /bookings/597576885857636 - cell "Unit mnoyC8": - link "Unit mnoyC8": - /url: /bookings/597576885857636 - cell "Basic (1 month)": - link "Basic (1 month)": - /url: /bookings/597576885857636 - cell "8 Sep 2026": - link "8 Sep 2026": - /url: /bookings/597576885857636 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/597576885857636 - cell "8 Aug 2026": - link "8 Aug 2026": - /url: /bookings/597576885857636 - cell: - link: - /url: /bookings/597576885857636 - row "3163-6261-3671-371 Vienna South Active Keara Rippin Frozen Box D95BHg Unit qHrFBk Basic (1 month) 18 Sep 2026 18 Aug 2026 18 Aug 2026": - cell: - checkbox - cell "3163-6261-3671-371": - link "3163-6261-3671-371": - /url: /bookings/316362613671371 - cell "Vienna South": - link "Vienna South": - /url: /bookings/316362613671371 - cell "Active": - link "Active": - /url: /bookings/316362613671371 - cell "Keara Rippin": - link "Keara Rippin": - /url: /bookings/316362613671371 - cell "Frozen Box D95BHg": - link "Frozen Box D95BHg": - /url: /bookings/316362613671371 - cell "Unit qHrFBk": - link "Unit qHrFBk": - /url: /bookings/316362613671371 - cell "Basic (1 month)": - link "Basic (1 month)": - /url: /bookings/316362613671371 - cell "18 Sep 2026": - link "18 Sep 2026": - /url: /bookings/316362613671371 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/316362613671371 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/316362613671371 - cell: - link: - /url: /bookings/316362613671371 - row "1451-5355-4875-649 Vienna South Active Sergio Gleason Tasty Box K8ujOL Unit SOxOmD Basic (1 month) 18 Sep 2026 18 Aug 2026 18 Aug 2026": - cell: - checkbox - cell "1451-5355-4875-649": - link "1451-5355-4875-649": - /url: /bookings/145153554875649 - cell "Vienna South": - link "Vienna South": - /url: /bookings/145153554875649 - cell "Active": - link "Active": - /url: /bookings/145153554875649 - cell "Sergio Gleason": - link "Sergio Gleason": - /url: /bookings/145153554875649 - cell "Tasty Box K8ujOL": - link "Tasty Box K8ujOL": - /url: /bookings/145153554875649 - cell "Unit SOxOmD": - link "Unit SOxOmD": - /url: /bookings/145153554875649 - cell "Basic (1 month)": - link "Basic (1 month)": - /url: /bookings/145153554875649 - cell "18 Sep 2026": - link "18 Sep 2026": - /url: /bookings/145153554875649 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/145153554875649 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/145153554875649 - cell: - link: - /url: /bookings/145153554875649 - row "1451-5315-1442-677 Vienna South Active Delbert Barrows Practical Box g6rO7O Unit QilRsZ Basic (1 week) 25 Aug 2026 18 Aug 2026 18 Aug 2026": - cell: - checkbox - cell "1451-5315-1442-677": - link "1451-5315-1442-677": - /url: /bookings/145153151442677 - cell "Vienna South": - link "Vienna South": - /url: /bookings/145153151442677 - cell "Active": - link "Active": - /url: /bookings/145153151442677 - cell "Delbert Barrows": - link "Delbert Barrows": - /url: /bookings/145153151442677 - cell "Practical Box g6rO7O": - link "Practical Box g6rO7O": - /url: /bookings/145153151442677 - cell "Unit QilRsZ": - link "Unit QilRsZ": - /url: /bookings/145153151442677 - cell "Basic (1 week)": - link "Basic (1 week)": - /url: /bookings/145153151442677 - cell "25 Aug 2026": - link "25 Aug 2026": - /url: /bookings/145153151442677 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/145153151442677 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/145153151442677 - cell: - link: - /url: /bookings/145153151442677 - row "2342-4777-9785-113 Vienna South Active Yvonne Olson-Collier Awesome Box N3Uu3D Unit SHFyGx Basic (1 week) 25 Aug 2026 18 Aug 2026 18 Aug 2026": - cell: - checkbox - cell "2342-4777-9785-113": - link "2342-4777-9785-113": - /url: /bookings/234247779785113 - cell "Vienna South": - link "Vienna South": - /url: /bookings/234247779785113 - cell "Active": - link "Active": - /url: /bookings/234247779785113 - cell "Yvonne Olson-Collier": - link "Yvonne Olson-Collier": - /url: /bookings/234247779785113 - cell "Awesome Box N3Uu3D": - link "Awesome Box N3Uu3D": - /url: /bookings/234247779785113 - cell "Unit SHFyGx": - link "Unit SHFyGx": - /url: /bookings/234247779785113 - cell "Basic (1 week)": - link "Basic (1 week)": - /url: /bookings/234247779785113 - cell "25 Aug 2026": - link "25 Aug 2026": - /url: /bookings/234247779785113 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/234247779785113 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/234247779785113 - cell: - link: - /url: /bookings/234247779785113 - row "7217-1833-3158-771 Vienna South Scheduled Madilyn Kirlin Oriental Box it85Xj Unit vB4Wdh Basic (1 week) 23 Aug 2026 18 Aug 2026 23 Aug 2026": - cell: - checkbox - cell "7217-1833-3158-771": - link "7217-1833-3158-771": - /url: /bookings/721718333158771 - cell "Vienna South": - link "Vienna South": - /url: /bookings/721718333158771 - cell "Scheduled": - link "Scheduled": - /url: /bookings/721718333158771 - cell "Madilyn Kirlin": - link "Madilyn Kirlin": - /url: /bookings/721718333158771 - cell "Oriental Box it85Xj": - link "Oriental Box it85Xj": - /url: /bookings/721718333158771 - cell "Unit vB4Wdh": - link "Unit vB4Wdh": - /url: /bookings/721718333158771 - cell "Basic (1 week)": - link "Basic (1 week)": - /url: /bookings/721718333158771 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/721718333158771 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/721718333158771 - cell "23 Aug 2026": - link "23 Aug 2026": - /url: /bookings/721718333158771 - cell: - link: - /url: /bookings/721718333158771 - row "2342-4749-9282-139 Vienna South Active Tony Gorczany Handcrafted Box 7lVvMg Unit j6ajQi Basic (1 week) 25 Aug 2026 18 Aug 2026 18 Aug 2026": - cell: - checkbox - cell "2342-4749-9282-139": - link "2342-4749-9282-139": - /url: /bookings/234247499282139 - cell "Vienna South": - link "Vienna South": - /url: /bookings/234247499282139 - cell "Active": - link "Active": - /url: /bookings/234247499282139 - cell "Tony Gorczany": - link "Tony Gorczany": - /url: /bookings/234247499282139 - cell "Handcrafted Box 7lVvMg": - link "Handcrafted Box 7lVvMg": - /url: /bookings/234247499282139 - cell "Unit j6ajQi": - link "Unit j6ajQi": - /url: /bookings/234247499282139 - cell "Basic (1 week)": - link "Basic (1 week)": - /url: /bookings/234247499282139 - cell "25 Aug 2026": - link "25 Aug 2026": - /url: /bookings/234247499282139 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/234247499282139 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/234247499282139 - cell: - link: - /url: /bookings/234247499282139 - row "3163-6288-8497-342 Vienna South Active Justin Labadie Generic Box H5ibMo Unit CtlLfn Basic (1 week) 25 Aug 2026 18 Aug 2026 18 Aug 2026": - cell: - checkbox - cell "3163-6288-8497-342": - link "3163-6288-8497-342": - /url: /bookings/316362888497342 - cell "Vienna South": - link "Vienna South": - /url: /bookings/316362888497342 - cell "Active": - link "Active": - /url: /bookings/316362888497342 - cell "Justin Labadie": - link "Justin Labadie": - /url: /bookings/316362888497342 - cell "Generic Box H5ibMo": - link "Generic Box H5ibMo": - /url: /bookings/316362888497342 - cell "Unit CtlLfn": - link "Unit CtlLfn": - /url: /bookings/316362888497342 - cell "Basic (1 week)": - link "Basic (1 week)": - /url: /bookings/316362888497342 - cell "25 Aug 2026": - link "25 Aug 2026": - /url: /bookings/316362888497342 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/316362888497342 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/316362888497342 - cell: - link: - /url: /bookings/316362888497342 - row "8738-3983-2845-938 Vienna South Active Unique Dooley Licensed Box 8ypVHU Unit 7hzMJE Basic (1 week) 25 Aug 2026 18 Aug 2026 18 Aug 2026": - cell: - checkbox - cell "8738-3983-2845-938": - link "8738-3983-2845-938": - /url: /bookings/873839832845938 - cell "Vienna South": - link "Vienna South": - /url: /bookings/873839832845938 - cell "Active": - link "Active": - /url: /bookings/873839832845938 - cell "Unique Dooley": - link "Unique Dooley": - /url: /bookings/873839832845938 - cell "Licensed Box 8ypVHU": - link "Licensed Box 8ypVHU": - /url: /bookings/873839832845938 - cell "Unit 7hzMJE": - link "Unit 7hzMJE": - /url: /bookings/873839832845938 - cell "Basic (1 week)": - link "Basic (1 week)": - /url: /bookings/873839832845938 - cell "25 Aug 2026": - link "25 Aug 2026": - /url: /bookings/873839832845938 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/873839832845938 - cell "18 Aug 2026": - link "18 Aug 2026": - /url: /bookings/873839832845938 - cell: - link: - /url: /bookings/873839832845938 - text: "Items per page:" - combobox: - text: "10" - combobox "Items per page:": "10" - text: 1-10 of 125 - 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: Susanna Mitchell (jackeline.lowe@gmail.com) - combobox "Customer *" - text: Customer * - alert - combobox: - text: Vienna South - combobox "Location *" - text: Location * - alert - textbox "Move-in date *": - /placeholder: dd/mm/yyyy - text: 18/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: Rustic Box VzGiHR - combobox "Unit type *" - text: Unit type * - alert - combobox: - text: Unit lRhJOJ - 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 892 | // Reloads, so run last: the deposit field links its amount to the upfront deposit invoice. 893 | await test.step('verify deposit on details page', () => verifyBookingDepositInvoiceLink(detailsPage, depositAmount)); 894 | }); 895 | 896 | test.fixme('issues only a deposit invoice for a scheduled upfront-deposit booking', async ({ 897 | createCustomer, 898 | createUnitType, 899 | createUnit, 900 | createDeposit, 901 | bookingCreateDialog, 902 | trackBookingForTeardown, 903 | }) => { 904 | const customer = await createCustomer(getCustomerCreateData()); 905 | const deposit = await createDeposit(getDepositCreateData()); 906 | const unitType = await createUnitType(getUnitTypeCreateData({ deposit })); 907 | const unit = await createUnit(getUnitCreateData(unitType)); 908 | const data = getBookingCreateData( 909 | { customer, unitType, unit, deposit }, 910 | { chargeDepositUpfront: true, moveInDaysInTheFuture: 10 } 911 | ); 912 | const depositAmount = formatCurrency(deposit.priceExclVat, data.location.currency); 913 | const today = formatDate(new Date(), data.location.timezone); 914 | 915 | await bookingCreateDialog.goto(); 916 | 917 | const detailsPage = await test.step('create booking', () => bookingCreateDialog.create(data)); 918 | 919 | trackBookingForTeardown(detailsPage.getBookingId()); 920 | 921 | await test.step('verify booking invoices', async () => { 922 | // scheduled, so no first-period invoice yet — only the upfront deposit invoice 923 | await verifyBookingInvoiceCount(detailsPage, 1); 924 | 925 | // the upfront-deposit invoice is not tied to a unit, so its unit cell is left empty 926 | await verifyBookingInvoice( 927 | detailsPage, 928 | { 929 | status: 'Open', 930 | paymentOption: 'Manual', 931 | amount: depositAmount, 932 | amountDue: depositAmount, 933 | issueDate: today, 934 | dueDate: formatDate(getFutureDate(data.location.invoiceDaysUntilDue, 'day'), data.location.timezone), 935 | }, 936 | 'Deposit' 937 | ); 938 | }); 939 | 940 | await test.step('verify booking payments', async () => { 941 | await verifyBookingPaymentCount(detailsPage, 1); 942 | 943 | await verifyBookingPayment( 944 | detailsPage, 945 | { amount: depositAmount, status: 'Not paid yet', date: today }, 946 | await getBookingDepositInvoiceNumber(detailsPage.invoicesCard.dataTable) 947 | ); 948 | }); 949 | 950 | // Reloads, so run last: the deposit field links its amount to the upfront deposit invoice. 951 | await test.step('verify deposit on details page', () => verifyBookingDepositInvoiceLink(detailsPage, depositAmount)); 952 | }); 953 | 954 | test('rejects a sepa booking over the payment amount limit', async ({ 955 | createCustomer, 956 | createUnitType, 957 | createUnit, 958 | bookingCreateDialog, 959 | }) => { 960 | const customer = await createCustomer(getCustomerCreateData()); 961 | const unitType = await createUnitType( 962 | getUnitTypeCreateData({ 963 | bookingPlans: [ 964 | { 965 | period: 'monthly', 966 | amount: 1, 967 | priceExclVat: 11000, 968 | discount: undefined, 969 | publish: true, 970 | name: 'Basic', 971 | shortDescription: { EN: 'Basic description' }, 972 | }, 973 | ], 974 | }) 975 | ); 976 | const unit = await createUnit(getUnitCreateData(unitType)); 977 | // a sepa subscription over the SEPA per-transaction limit is rejected on submit with an error snackbar 978 | // (no booking is created, so nothing to tear down). 979 | const data = getBookingCreateData( 980 | { customer, unitType, unit }, 981 | { paymentOption: 'charge_automatically', paymentMethod: getDefaultSepaPayment() } 982 | ); 983 | 984 | await bookingCreateDialog.goto(); 985 | 986 | await test.step('submit booking', async () => { 987 | await bookingCreateDialog.fill(data); 988 | await bookingCreateDialog.submit(); 989 | }); 990 | 991 | await test.step('verify the payment limit error', async () => { > 992 | await expect(bookingCreateDialog.paymentLimitSnackbar).toBeVisible(); | ^ Error: expect(locator).toBeVisible() failed 993 | }); 994 | }); 995 | 996 | test('rejects a booking without all required fields', async ({ bookingCreateDialog }) => { 997 | await bookingCreateDialog.goto(); 998 | 999 | await test.step('submit invalid booking create form', () => bookingCreateDialog.submit()); 1000 | 1001 | await test.step('verify errors on form', async () => { 1002 | await expect(bookingCreateDialog.errors).toHaveCountGreaterThan(0); 1003 | }); 1004 | }); 1005 | ```