From 14fefa3113d86a31d38b61bcdec3f29408d7ac35 Mon Sep 17 00:00:00 2001 From: Kasper Nowak <54978466+kaspernowak@users.noreply.github.com> Date: Sun, 15 Jun 2025 12:32:04 +0200 Subject: [PATCH 1/2] feat: Add positions DTOs and enhance invoicing --- .phpunit.cache/test-results | 2 +- .../AddDefaultPositionDTO.php | 42 +++++++++++ .../CreateEditDefaultPositionDTO.php | 42 +++++++++++ .../DefaultPositions/DefaultPositionDTO.php | 67 +++++++++++++++++ .../AddDiscountPositionDTO.php | 34 +++++++++ .../CreateEditDiscountPositionDTO.php | 34 +++++++++ .../DiscountPositions/DiscountPositionDTO.php | 47 ++++++++++++ src/Dto/Invoices/CreateInvoiceDTO.php | 74 ++++++++++++++++++ src/Dto/Invoices/EditInvoiceDTO.php | 75 +++++++++++++++++++ src/Dto/Invoices/SendInvoiceDTO.php | 34 +++++++++ src/Dto/ItemPositions/AddItemPositionDTO.php | 44 +++++++++++ .../ItemPositions/CreateItemPositionDTO.php | 44 +++++++++++ src/Dto/ItemPositions/EditItemPositionDTO.php | 42 +++++++++++ src/Dto/ItemPositions/ItemPositionDTO.php | 69 +++++++++++++++++ .../AddPagebreakPositionDTO.php | 31 ++++++++ .../CreateEditPagebreakPositionDTO.php | 30 ++++++++ .../PagebreakPositionDTO.php | 45 +++++++++++ .../SubPositions/CreateEditSubPositionDTO.php | 30 ++++++++ src/Dto/SubPositions/SubPositionDTO.php | 55 ++++++++++++++ .../AddSubtotalPositionDTO.php | 30 ++++++++ .../CreateEditSubtotalPositionDTO.php | 28 +++++++ .../SubtotalPositions/SubtotalPositionDTO.php | 49 ++++++++++++ src/Dto/TextPositions/AddTextPositionDTO.php | 32 ++++++++ .../CreateEditTextPositionDTO.php | 32 ++++++++ src/Dto/TextPositions/TextPositionDTO.php | 51 +++++++++++++ .../CreateADefaultPositionRequest.php | 50 +++++++++++++ .../DeleteADefaultPositionRequest.php | 35 +++++++++ .../EditADefaultPositionRequest.php | 51 +++++++++++++ .../FetchADefaultPositionRequest.php | 35 +++++++++ .../FetchAListOfDefaultPositionsRequest.php | 52 +++++++++++++ .../CreateADiscountPositionRequest.php | 47 ++++++++++++ .../DeleteADiscountPositionRequest.php | 32 ++++++++ .../EditADiscountPositionRequest.php | 48 ++++++++++++ .../FetchADiscountPositionRequest.php | 33 ++++++++ .../FetchAListOfDiscountPositionsRequest.php | 48 ++++++++++++ .../Invoices/CreateAnInvoiceRequestNew.php | 55 ++++++++++++++ .../Invoices/EditAnInvoiceRequestNew.php | 50 +++++++++++++ .../Invoices/MarkAnInvoiceAsSentRequest.php | 31 ++++++++ .../Invoices/SendAnInvoiceRequest.php | 52 +++++++++++++ .../CreateAnItemPositionRequest.php | 50 +++++++++++++ .../DeleteAnItemPositionRequest.php | 32 ++++++++ .../EditAnItemPositionRequest.php | 51 +++++++++++++ .../FetchAListOfItemPositionsRequest.php | 48 ++++++++++++ .../FetchAnItemPositionRequest.php | 33 ++++++++ .../CreateAPagebreakPositionRequest.php | 47 ++++++++++++ .../DeleteAPagebreakPositionRequest.php | 32 ++++++++ .../EditAPagebreakPositionRequest.php | 48 ++++++++++++ .../FetchAListOfPagebreakPositionsRequest.php | 48 ++++++++++++ .../FetchAPagebreakPositionRequest.php | 33 ++++++++ .../CreateASubPositionRequest.php | 46 ++++++++++++ .../DeleteASubPositionRequest.php | 32 ++++++++ .../SubPositions/EditASubPositionRequest.php | 47 ++++++++++++ .../FetchAListOfSubPositionsRequest.php | 48 ++++++++++++ .../SubPositions/FetchASubPositionRequest.php | 33 ++++++++ .../CreateASubtotalPositionRequest.php | 47 ++++++++++++ .../DeleteASubtotalPositionRequest.php | 32 ++++++++ .../EditASubtotalPositionRequest.php | 48 ++++++++++++ .../FetchAListOfSubtotalPositionsRequest.php | 48 ++++++++++++ .../FetchASubtotalPositionRequest.php | 33 ++++++++ .../CreateATextPositionRequest.php | 50 +++++++++++++ .../DeleteATextPositionRequest.php | 32 ++++++++ .../EditATextPositionRequest.php | 51 +++++++++++++ .../FetchAListOfTextPositionsRequest.php | 48 ++++++++++++ .../FetchATextPositionRequest.php | 33 ++++++++ .../create-a-default-position.json | 25 +++++++ .../delete-a-default-position.json | 25 +++++++ .../edit-a-default-position.json | 25 +++++++ .../fetch-a-default-position.json | 25 +++++++ .../fetch-a-list-of-default-positions.json | 25 +++++++ .../create-a-discount-position.json | 25 +++++++ .../delete-a-discount-position.json | 25 +++++++ .../edit-a-discount-position.json | 25 +++++++ .../fetch-a-discount-position.json | 25 +++++++ .../fetch-a-list-of-discount-positions.json | 25 +++++++ .../create-an-item-position.json | 25 +++++++ .../delete-an-item-position.json | 25 +++++++ .../ItemPositions/edit-an-item-position.json | 25 +++++++ .../fetch-a-list-of-item-positions.json | 25 +++++++ .../ItemPositions/fetch-an-item-position.json | 25 +++++++ .../create-a-pagebreak-position.json | 25 +++++++ .../delete-a-pagebreak-position.json | 25 +++++++ .../edit-a-pagebreak-position.json | 25 +++++++ .../fetch-a-list-of-pagebreak-positions.json | 25 +++++++ .../fetch-a-pagebreak-position.json | 25 +++++++ .../SubPositions/create-a-sub-position.json | 25 +++++++ .../SubPositions/delete-a-sub-position.json | 25 +++++++ .../SubPositions/edit-a-sub-position.json | 25 +++++++ .../fetch-a-list-of-sub-positions.json | 25 +++++++ .../SubPositions/fetch-a-sub-position.json | 25 +++++++ .../create-a-subtotal-position.json | 25 +++++++ .../delete-a-subtotal-position.json | 25 +++++++ .../edit-a-subtotal-position.json | 25 +++++++ .../fetch-a-list-of-subtotal-positions.json | 25 +++++++ .../fetch-a-subtotal-position.json | 25 +++++++ .../TextPositions/create-a-text-position.json | 25 +++++++ .../TextPositions/delete-a-text-position.json | 25 +++++++ .../TextPositions/edit-a-text-position.json | 25 +++++++ .../fetch-a-list-of-text-positions.json | 25 +++++++ .../TextPositions/fetch-a-text-position.json | 25 +++++++ .../CreateADefaultPositionRequestTest.php | 36 +++++++++ .../DeleteADefaultPositionRequestTest.php | 26 +++++++ .../EditADefaultPositionRequestTest.php | 37 +++++++++ .../FetchADefaultPositionRequestTest.php | 27 +++++++ ...etchAListOfDefaultPositionsRequestTest.php | 28 +++++++ .../CreateADiscountPositionRequestTest.php | 32 ++++++++ .../DeleteADiscountPositionRequestTest.php | 26 +++++++ .../EditADiscountPositionRequestTest.php | 33 ++++++++ .../FetchADiscountPositionRequestTest.php | 27 +++++++ ...tchAListOfDiscountPositionsRequestTest.php | 27 +++++++ .../CreateAnItemPositionRequestTest.php | 37 +++++++++ .../DeleteAnItemPositionRequestTest.php | 26 +++++++ .../EditAnItemPositionRequestTest.php | 37 +++++++++ .../FetchAListOfItemPositionsRequestTest.php | 27 +++++++ .../FetchAnItemPositionRequestTest.php | 27 +++++++ .../CreateAPagebreakPositionRequestTest.php | 30 ++++++++ .../DeleteAPagebreakPositionRequestTest.php | 26 +++++++ .../EditAPagebreakPositionRequestTest.php | 31 ++++++++ ...chAListOfPagebreakPositionsRequestTest.php | 27 +++++++ .../FetchAPagebreakPositionRequestTest.php | 27 +++++++ .../CreateASubPositionRequestTest.php | 31 ++++++++ .../DeleteASubPositionRequestTest.php | 26 +++++++ .../EditASubPositionRequestTest.php | 32 ++++++++ .../FetchAListOfSubPositionsRequestTest.php | 27 +++++++ .../FetchASubPositionRequestTest.php | 27 +++++++ .../CreateASubtotalPositionRequestTest.php | 30 ++++++++ .../DeleteASubtotalPositionRequestTest.php | 26 +++++++ .../EditASubtotalPositionRequestTest.php | 31 ++++++++ ...tchAListOfSubtotalPositionsRequestTest.php | 27 +++++++ .../FetchASubtotalPositionRequestTest.php | 27 +++++++ .../CreateATextPositionRequestTest.php | 31 ++++++++ .../DeleteATextPositionRequestTest.php | 26 +++++++ .../EditATextPositionRequestTest.php | 32 ++++++++ .../FetchAListOfTextPositionsRequestTest.php | 27 +++++++ .../FetchATextPositionRequestTest.php | 27 +++++++ 134 files changed, 4627 insertions(+), 1 deletion(-) create mode 100644 src/Dto/DefaultPositions/AddDefaultPositionDTO.php create mode 100644 src/Dto/DefaultPositions/CreateEditDefaultPositionDTO.php create mode 100644 src/Dto/DefaultPositions/DefaultPositionDTO.php create mode 100644 src/Dto/DiscountPositions/AddDiscountPositionDTO.php create mode 100644 src/Dto/DiscountPositions/CreateEditDiscountPositionDTO.php create mode 100644 src/Dto/DiscountPositions/DiscountPositionDTO.php create mode 100644 src/Dto/Invoices/CreateInvoiceDTO.php create mode 100644 src/Dto/Invoices/EditInvoiceDTO.php create mode 100644 src/Dto/Invoices/SendInvoiceDTO.php create mode 100644 src/Dto/ItemPositions/AddItemPositionDTO.php create mode 100644 src/Dto/ItemPositions/CreateItemPositionDTO.php create mode 100644 src/Dto/ItemPositions/EditItemPositionDTO.php create mode 100644 src/Dto/ItemPositions/ItemPositionDTO.php create mode 100644 src/Dto/PagebreakPositions/AddPagebreakPositionDTO.php create mode 100644 src/Dto/PagebreakPositions/CreateEditPagebreakPositionDTO.php create mode 100644 src/Dto/PagebreakPositions/PagebreakPositionDTO.php create mode 100644 src/Dto/SubPositions/CreateEditSubPositionDTO.php create mode 100644 src/Dto/SubPositions/SubPositionDTO.php create mode 100644 src/Dto/SubtotalPositions/AddSubtotalPositionDTO.php create mode 100644 src/Dto/SubtotalPositions/CreateEditSubtotalPositionDTO.php create mode 100644 src/Dto/SubtotalPositions/SubtotalPositionDTO.php create mode 100644 src/Dto/TextPositions/AddTextPositionDTO.php create mode 100644 src/Dto/TextPositions/CreateEditTextPositionDTO.php create mode 100644 src/Dto/TextPositions/TextPositionDTO.php create mode 100644 src/Requests/DefaultPositions/CreateADefaultPositionRequest.php create mode 100644 src/Requests/DefaultPositions/DeleteADefaultPositionRequest.php create mode 100644 src/Requests/DefaultPositions/EditADefaultPositionRequest.php create mode 100644 src/Requests/DefaultPositions/FetchADefaultPositionRequest.php create mode 100644 src/Requests/DefaultPositions/FetchAListOfDefaultPositionsRequest.php create mode 100644 src/Requests/DiscountPositions/CreateADiscountPositionRequest.php create mode 100644 src/Requests/DiscountPositions/DeleteADiscountPositionRequest.php create mode 100644 src/Requests/DiscountPositions/EditADiscountPositionRequest.php create mode 100644 src/Requests/DiscountPositions/FetchADiscountPositionRequest.php create mode 100644 src/Requests/DiscountPositions/FetchAListOfDiscountPositionsRequest.php create mode 100644 src/Requests/Invoices/CreateAnInvoiceRequestNew.php create mode 100644 src/Requests/Invoices/EditAnInvoiceRequestNew.php create mode 100644 src/Requests/Invoices/MarkAnInvoiceAsSentRequest.php create mode 100644 src/Requests/Invoices/SendAnInvoiceRequest.php create mode 100644 src/Requests/ItemPositions/CreateAnItemPositionRequest.php create mode 100644 src/Requests/ItemPositions/DeleteAnItemPositionRequest.php create mode 100644 src/Requests/ItemPositions/EditAnItemPositionRequest.php create mode 100644 src/Requests/ItemPositions/FetchAListOfItemPositionsRequest.php create mode 100644 src/Requests/ItemPositions/FetchAnItemPositionRequest.php create mode 100644 src/Requests/PagebreakPositions/CreateAPagebreakPositionRequest.php create mode 100644 src/Requests/PagebreakPositions/DeleteAPagebreakPositionRequest.php create mode 100644 src/Requests/PagebreakPositions/EditAPagebreakPositionRequest.php create mode 100644 src/Requests/PagebreakPositions/FetchAListOfPagebreakPositionsRequest.php create mode 100644 src/Requests/PagebreakPositions/FetchAPagebreakPositionRequest.php create mode 100644 src/Requests/SubPositions/CreateASubPositionRequest.php create mode 100644 src/Requests/SubPositions/DeleteASubPositionRequest.php create mode 100644 src/Requests/SubPositions/EditASubPositionRequest.php create mode 100644 src/Requests/SubPositions/FetchAListOfSubPositionsRequest.php create mode 100644 src/Requests/SubPositions/FetchASubPositionRequest.php create mode 100644 src/Requests/SubtotalPositions/CreateASubtotalPositionRequest.php create mode 100644 src/Requests/SubtotalPositions/DeleteASubtotalPositionRequest.php create mode 100644 src/Requests/SubtotalPositions/EditASubtotalPositionRequest.php create mode 100644 src/Requests/SubtotalPositions/FetchAListOfSubtotalPositionsRequest.php create mode 100644 src/Requests/SubtotalPositions/FetchASubtotalPositionRequest.php create mode 100644 src/Requests/TextPositions/CreateATextPositionRequest.php create mode 100644 src/Requests/TextPositions/DeleteATextPositionRequest.php create mode 100644 src/Requests/TextPositions/EditATextPositionRequest.php create mode 100644 src/Requests/TextPositions/FetchAListOfTextPositionsRequest.php create mode 100644 src/Requests/TextPositions/FetchATextPositionRequest.php create mode 100644 tests/Fixtures/Saloon/DefaultPositions/create-a-default-position.json create mode 100644 tests/Fixtures/Saloon/DefaultPositions/delete-a-default-position.json create mode 100644 tests/Fixtures/Saloon/DefaultPositions/edit-a-default-position.json create mode 100644 tests/Fixtures/Saloon/DefaultPositions/fetch-a-default-position.json create mode 100644 tests/Fixtures/Saloon/DefaultPositions/fetch-a-list-of-default-positions.json create mode 100644 tests/Fixtures/Saloon/DiscountPositions/create-a-discount-position.json create mode 100644 tests/Fixtures/Saloon/DiscountPositions/delete-a-discount-position.json create mode 100644 tests/Fixtures/Saloon/DiscountPositions/edit-a-discount-position.json create mode 100644 tests/Fixtures/Saloon/DiscountPositions/fetch-a-discount-position.json create mode 100644 tests/Fixtures/Saloon/DiscountPositions/fetch-a-list-of-discount-positions.json create mode 100644 tests/Fixtures/Saloon/ItemPositions/create-an-item-position.json create mode 100644 tests/Fixtures/Saloon/ItemPositions/delete-an-item-position.json create mode 100644 tests/Fixtures/Saloon/ItemPositions/edit-an-item-position.json create mode 100644 tests/Fixtures/Saloon/ItemPositions/fetch-a-list-of-item-positions.json create mode 100644 tests/Fixtures/Saloon/ItemPositions/fetch-an-item-position.json create mode 100644 tests/Fixtures/Saloon/PagebreakPositions/create-a-pagebreak-position.json create mode 100644 tests/Fixtures/Saloon/PagebreakPositions/delete-a-pagebreak-position.json create mode 100644 tests/Fixtures/Saloon/PagebreakPositions/edit-a-pagebreak-position.json create mode 100644 tests/Fixtures/Saloon/PagebreakPositions/fetch-a-list-of-pagebreak-positions.json create mode 100644 tests/Fixtures/Saloon/PagebreakPositions/fetch-a-pagebreak-position.json create mode 100644 tests/Fixtures/Saloon/SubPositions/create-a-sub-position.json create mode 100644 tests/Fixtures/Saloon/SubPositions/delete-a-sub-position.json create mode 100644 tests/Fixtures/Saloon/SubPositions/edit-a-sub-position.json create mode 100644 tests/Fixtures/Saloon/SubPositions/fetch-a-list-of-sub-positions.json create mode 100644 tests/Fixtures/Saloon/SubPositions/fetch-a-sub-position.json create mode 100644 tests/Fixtures/Saloon/SubtotalPositions/create-a-subtotal-position.json create mode 100644 tests/Fixtures/Saloon/SubtotalPositions/delete-a-subtotal-position.json create mode 100644 tests/Fixtures/Saloon/SubtotalPositions/edit-a-subtotal-position.json create mode 100644 tests/Fixtures/Saloon/SubtotalPositions/fetch-a-list-of-subtotal-positions.json create mode 100644 tests/Fixtures/Saloon/SubtotalPositions/fetch-a-subtotal-position.json create mode 100644 tests/Fixtures/Saloon/TextPositions/create-a-text-position.json create mode 100644 tests/Fixtures/Saloon/TextPositions/delete-a-text-position.json create mode 100644 tests/Fixtures/Saloon/TextPositions/edit-a-text-position.json create mode 100644 tests/Fixtures/Saloon/TextPositions/fetch-a-list-of-text-positions.json create mode 100644 tests/Fixtures/Saloon/TextPositions/fetch-a-text-position.json create mode 100644 tests/Requests/DefaultPositions/CreateADefaultPositionRequestTest.php create mode 100644 tests/Requests/DefaultPositions/DeleteADefaultPositionRequestTest.php create mode 100644 tests/Requests/DefaultPositions/EditADefaultPositionRequestTest.php create mode 100644 tests/Requests/DefaultPositions/FetchADefaultPositionRequestTest.php create mode 100644 tests/Requests/DefaultPositions/FetchAListOfDefaultPositionsRequestTest.php create mode 100644 tests/Requests/DiscountPositions/CreateADiscountPositionRequestTest.php create mode 100644 tests/Requests/DiscountPositions/DeleteADiscountPositionRequestTest.php create mode 100644 tests/Requests/DiscountPositions/EditADiscountPositionRequestTest.php create mode 100644 tests/Requests/DiscountPositions/FetchADiscountPositionRequestTest.php create mode 100644 tests/Requests/DiscountPositions/FetchAListOfDiscountPositionsRequestTest.php create mode 100644 tests/Requests/ItemPositions/CreateAnItemPositionRequestTest.php create mode 100644 tests/Requests/ItemPositions/DeleteAnItemPositionRequestTest.php create mode 100644 tests/Requests/ItemPositions/EditAnItemPositionRequestTest.php create mode 100644 tests/Requests/ItemPositions/FetchAListOfItemPositionsRequestTest.php create mode 100644 tests/Requests/ItemPositions/FetchAnItemPositionRequestTest.php create mode 100644 tests/Requests/PagebreakPositions/CreateAPagebreakPositionRequestTest.php create mode 100644 tests/Requests/PagebreakPositions/DeleteAPagebreakPositionRequestTest.php create mode 100644 tests/Requests/PagebreakPositions/EditAPagebreakPositionRequestTest.php create mode 100644 tests/Requests/PagebreakPositions/FetchAListOfPagebreakPositionsRequestTest.php create mode 100644 tests/Requests/PagebreakPositions/FetchAPagebreakPositionRequestTest.php create mode 100644 tests/Requests/SubPositions/CreateASubPositionRequestTest.php create mode 100644 tests/Requests/SubPositions/DeleteASubPositionRequestTest.php create mode 100644 tests/Requests/SubPositions/EditASubPositionRequestTest.php create mode 100644 tests/Requests/SubPositions/FetchAListOfSubPositionsRequestTest.php create mode 100644 tests/Requests/SubPositions/FetchASubPositionRequestTest.php create mode 100644 tests/Requests/SubtotalPositions/CreateASubtotalPositionRequestTest.php create mode 100644 tests/Requests/SubtotalPositions/DeleteASubtotalPositionRequestTest.php create mode 100644 tests/Requests/SubtotalPositions/EditASubtotalPositionRequestTest.php create mode 100644 tests/Requests/SubtotalPositions/FetchAListOfSubtotalPositionsRequestTest.php create mode 100644 tests/Requests/SubtotalPositions/FetchASubtotalPositionRequestTest.php create mode 100644 tests/Requests/TextPositions/CreateATextPositionRequestTest.php create mode 100644 tests/Requests/TextPositions/DeleteATextPositionRequestTest.php create mode 100644 tests/Requests/TextPositions/EditATextPositionRequestTest.php create mode 100644 tests/Requests/TextPositions/FetchAListOfTextPositionsRequestTest.php create mode 100644 tests/Requests/TextPositions/FetchATextPositionRequestTest.php diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index 42e148f..32330bc 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":"pest_3.7.4","defects":{"P\\Tests\\Requests\\ManualEntries\\AddFileToAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\IbanPayments\\UpdateIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Invoices\\CreateAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":8,"P\\Tests\\Requests\\Contacts\\BuilkCreateContactsRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\QrPayments\\UpdateQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Invoices\\EditAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":8,"P\\Tests\\Requests\\Files\\ShowFileUsageRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\ManualEntries\\CreateManualEntryRequestTest::__pest_evaluable_it_can_perform_the_request":8},"times":{"P\\Tests\\Requests\\Files\\GetAFilePreviewRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\BusinessYears\\FetchAListOfBusinessYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Reports\\JournalRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Payments\\CancelAPaymentTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\DeleteAnAdditonalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactAdditionalAddresses\\SearchContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CalendarYears\\CreateCalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":0.003,"P\\Tests\\Requests\\Salutations\\SearchSalutationsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactAdditionalAddresses\\FetchAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\IbanPayments\\GetIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\DeleteAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.022,"P\\Tests\\Requests\\CalendarYears\\SearchCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Currencies\\EditACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactsGroups\\EditAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0.006,"P\\Tests\\Requests\\ContactsGroups\\CreateContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Salutations\\FetchASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\CreateAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Units\\FetchAListOfUnitsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Payments\\FetchAListOfPaymentsTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\CreateCurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Notes\\FetchAListOfNotesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactsSectors\\SearchContactSectorsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\EditAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactsGroups\\SearchContactGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\QrPayments\\CreateQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\CreateContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactAdditionalAddresses\\EditAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\BusinessYears\\FetchABusinessYearRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactsSectors\\FetchAListOfContactSectorsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ManualEntries\\AddFileToAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ManualEntries\\DeleteFileOfAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\IbanPayments\\UpdateIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\FetchExchangeRatesForCurrenciesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\DocumentSettings\\FetchAListOfDocumentSettingsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\EditAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAListOfAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Notes\\CreateANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CalendarYears\\FetchACalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\CreateAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.004,"P\\Tests\\Requests\\ContactsRelations\\DeleteAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\PaymentTypes\\FetchAListOfPaymentTypesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ManualEntries\\FetchAListOfManualEntriesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\BuilkCreateContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\AccountGroups\\FetchAListOfAccountGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Core\\ArchTest::__pest_evaluable_it_will_not_use_any_debug_function":0.204,"P\\Tests\\Requests\\ContactsRelations\\EditAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\DeleteACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\QrPayments\\UpdateQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactsRelations\\FetchAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactsGroups\\FetchAListOfContactGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\SubPositions\\CreateASubPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Taxes\\FetchAListOfTaxesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\BankAccounts\\FetchASingleBankAccountRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactAdditionalAddresses\\DeleteAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\BankAccounts\\FetchAListOfBankAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\EditAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.006,"P\\Tests\\Requests\\Contacts\\RestoreAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\AdditionalAddresses\\DeleteAnAdditonalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\ShowFileUsageRequestTest::__pest_evaluable_it_can_perform_the_request":0.003,"P\\Tests\\Requests\\Invoices\\DefaultPositions\\CreateADefaultPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CompanyProfiles\\FetchAListOfCompanyProfilesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\SearchTitlesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\FetchAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\SearchFilesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\AdditionalAddresses\\CreateAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Notes\\FetchANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\FetchAListOfInvoicesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Titles\\FetchAListOfTitlesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ManualEntries\\CreateManualEntryRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\EditASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Users\\FetchAListOfUsersRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Accounts\\SearchAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\ShowPdfRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\FetchAListOfFilesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Salutations\\FetchAListOfSalutationsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\FetchAllPossibleCurrencyCodesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\DeleteAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\FetchAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Payments\\DeleteAPaymentTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\EditAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Taxes\\FetchATaxRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\CancelAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Projects\\FetchAListOfPaymentTypesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\FetchATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\GetASingleFileRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactsGroups\\FetchAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactAdditionalAddresses\\FetchAListOfContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\CreateContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactsRelations\\SearchContactRelationsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CalendarYears\\FetchAListOfCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Notes\\DeleteANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\QrPayments\\GetQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\IbanPayments\\CreateIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\SearchAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactsGroups\\DeleteAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\DownloadFIleRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Accounts\\FetchAListOfAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\SearchContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ManualEntries\\FetchFileOfAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ManualEntries\\FetchFilesOfAccountingEntryRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\AdditionalAddresses\\EditAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Taxes\\DeleteATaxRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Notes\\SearchNotesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Notes\\EditANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\FetchACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactsRelations\\FetchAListOfContactRelationsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\FetchAListOfCurrenciesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Salutations\\CreateASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\BusinessActivities\\FetchAListOfBusinessActivitesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Languages\\FetchAListOfLanguagesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Titles\\CreateASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\FetchAListOfContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0.005,"P\\Tests\\Requests\\Salutations\\DeleteASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CompanyProfiles\\FetchACompanyProfileRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\DeleteAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ManualEntries\\GetNextReferenceNumberRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Users\\FetchAuthenticatedUserRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactsRelations\\CreateContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0}} \ No newline at end of file +{"version":"pest_3.8.2","defects":{"P\\Tests\\Requests\\IbanPayments\\UpdateIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\QrPayments\\UpdateQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Contacts\\BuilkCreateContactsRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\ManualEntries\\AddFileToAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Files\\ShowFileUsageRequestTest::__pest_evaluable_it_can_perform_the_request":1},"times":{"P\\Tests\\Requests\\Units\\FetchAListOfUnitsRequestTest::__pest_evaluable_it_can_perform_the_request":0.042,"P\\Tests\\Requests\\ContactsRelations\\EditAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0.016,"P\\Tests\\Requests\\Payments\\FetchAListOfPaymentsTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\DeleteAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\SubPositions\\CreateASubPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.006,"P\\Tests\\Requests\\ManualEntries\\CreateManualEntryRequestTest::__pest_evaluable_it_can_perform_the_request":0.018,"P\\Tests\\Requests\\IbanPayments\\CreateIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Accounts\\SearchAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Users\\FetchAListOfUsersRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Notes\\SearchNotesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactsRelations\\SearchContactRelationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\DeleteAnAdditonalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\SubPositions\\DeleteASubPositionRequestTest::__pest_evaluable_it_can_delete_a_sub_position":0.002,"P\\Tests\\Requests\\SubtotalPositions\\EditASubtotalPositionRequestTest::__pest_evaluable_it_can_edit_a_subtotal_position":0.001,"P\\Tests\\Requests\\Currencies\\EditACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\DeleteASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\DiscountPositions\\CreateADiscountPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactsRelations\\CreateContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\QrPayments\\GetQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactsGroups\\FetchAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\CreateCurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\TextPositions\\FetchATextPositionRequestTest::__pest_evaluable_it_can_fetch_a_text_position":0.001,"P\\Tests\\Requests\\BankAccounts\\FetchAListOfBankAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0.005,"P\\Tests\\Requests\\Invoices\\ShowPdfRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\ContactsGroups\\FetchAListOfContactGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\SearchContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Taxes\\FetchAListOfTaxesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\SearchSalutationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Taxes\\FetchATaxRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\SearchContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\FetchAListOfCurrenciesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CalendarYears\\FetchAListOfCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\CreateAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.008,"P\\Tests\\Requests\\ContactsRelations\\DeleteAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\CreateAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\FetchExchangeRatesForCurrenciesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\SubtotalPositions\\CreateASubtotalPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\FetchAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\DiscountPositions\\FetchAListOfDiscountPositionsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\GetASingleFileRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\DefaultPositions\\FetchAListOfDefaultPositionsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ItemPositions\\FetchAnItemPositionRequestTest::__pest_evaluable_it_can_fetch_an_item_position":0.001,"P\\Tests\\Requests\\Contacts\\FetchAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\SearchAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\FetchACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\SubPositions\\FetchAListOfSubPositionsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\DiscountPositions\\DeleteADiscountPositionRequestTest::__pest_evaluable_it_can_delete_a_discount_position":0.001,"P\\Tests\\Requests\\Payments\\DeleteAPaymentTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\TextPositions\\EditATextPositionRequestTest::__pest_evaluable_it_can_edit_a_text_position":0.001,"P\\Tests\\Requests\\Contacts\\FetchAListOfContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\SubtotalPositions\\FetchAListOfSubtotalPositionsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Taxes\\DeleteATaxRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\DefaultPositions\\DeleteADefaultPositionRequestTest::__pest_evaluable_it_can_delete_a_default_position":0.001,"P\\Tests\\Requests\\ItemPositions\\EditAnItemPositionRequestTest::__pest_evaluable_it_can_edit_an_item_position":0.001,"P\\Tests\\Requests\\Titles\\CreateASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\DiscountPositions\\FetchADiscountPositionRequestTest::__pest_evaluable_it_can_fetch_a_discount_position":0.001,"P\\Tests\\Requests\\Invoices\\DeleteAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\EditAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\SearchTitlesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\DefaultPositions\\CreateADefaultPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Payments\\CancelAPaymentTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\IbanPayments\\UpdateIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.004,"P\\Tests\\Requests\\ContactAdditionalAddresses\\FetchAListOfContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\DownloadFIleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CompanyProfiles\\FetchACompanyProfileRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\GetAFilePreviewRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\EditANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CalendarYears\\CreateCalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\TextPositions\\DeleteATextPositionRequestTest::__pest_evaluable_it_can_delete_a_text_position":0.001,"P\\Tests\\Requests\\Notes\\FetchANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\SubtotalPositions\\FetchASubtotalPositionRequestTest::__pest_evaluable_it_can_fetch_a_subtotal_position":0.001,"P\\Tests\\Requests\\Currencies\\FetchAllPossibleCurrencyCodesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Reports\\JournalRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\SubPositions\\EditASubPositionRequestTest::__pest_evaluable_it_can_edit_a_sub_position":0.001,"P\\Tests\\Requests\\PaymentTypes\\FetchAListOfPaymentTypesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactsRelations\\FetchAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactsSectors\\SearchContactSectorsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\EditAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\RestoreAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\CreateANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Languages\\FetchAListOfLanguagesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\IbanPayments\\GetIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\QrPayments\\CreateQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactsGroups\\CreateContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\QrPayments\\UpdateQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\AdditionalAddresses\\EditAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactsSectors\\FetchAListOfContactSectorsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\DeleteAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\DefaultPositions\\CreateADefaultPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\ManualEntries\\GetNextReferenceNumberRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CompanyProfiles\\FetchAListOfCompanyProfilesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\DeleteFileOfAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactsGroups\\SearchContactGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CalendarYears\\SearchCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\DefaultPositions\\FetchADefaultPositionRequestTest::__pest_evaluable_it_can_fetch_a_default_position":0.001,"P\\Tests\\Requests\\Contacts\\BuilkCreateContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ItemPositions\\FetchAListOfItemPositionsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\EditASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\FetchFileOfAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\DeleteANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CalendarYears\\FetchACalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Users\\FetchAuthenticatedUserRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\CancelAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\FetchAListOfSalutationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\DeleteACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\FetchFilesOfAccountingEntryRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\FetchAListOfInvoicesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAListOfAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\SubPositions\\FetchASubPositionRequestTest::__pest_evaluable_it_can_fetch_a_sub_position":0.001,"P\\Tests\\Requests\\ContactsGroups\\DeleteAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\EditAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\FetchAListOfNotesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\FetchAListOfManualEntriesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\DeleteAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\BusinessYears\\FetchABusinessYearRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\TextPositions\\CreateATextPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactsRelations\\FetchAListOfContactRelationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\CreateASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\EditAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactsGroups\\EditAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Projects\\FetchAListOfPaymentTypesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\DefaultPositions\\EditADefaultPositionRequestTest::__pest_evaluable_it_can_edit_a_default_position":0.001,"P\\Tests\\Requests\\Invoices\\SubPositions\\CreateASubPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\PagebreakPositions\\CreateAPagebreakPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\PagebreakPositions\\FetchAListOfPagebreakPositionsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\SearchFilesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\SubtotalPositions\\DeleteASubtotalPositionRequestTest::__pest_evaluable_it_can_delete_a_subtotal_position":0.001,"P\\Tests\\Requests\\DocumentSettings\\FetchAListOfDocumentSettingsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Accounts\\FetchAListOfAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\PagebreakPositions\\DeleteAPagebreakPositionRequestTest::__pest_evaluable_it_can_delete_a_pagebreak_position":0.001,"P\\Tests\\Requests\\DiscountPositions\\EditADiscountPositionRequestTest::__pest_evaluable_it_can_edit_a_discount_position":0.001,"P\\Tests\\Requests\\BankAccounts\\FetchASingleBankAccountRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\EditAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\PagebreakPositions\\FetchAPagebreakPositionRequestTest::__pest_evaluable_it_can_fetch_a_pagebreak_position":0.001,"P\\Tests\\Requests\\ManualEntries\\AddFileToAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\AdditionalAddresses\\DeleteAnAdditonalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\FetchAListOfTitlesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\ShowFileUsageRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\FetchAListOfFilesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\CreateContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\BusinessActivities\\FetchAListOfBusinessActivitesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AccountGroups\\FetchAListOfAccountGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\FetchATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\PagebreakPositions\\EditAPagebreakPositionRequestTest::__pest_evaluable_it_can_edit_a_pagebreak_position":0.001,"P\\Tests\\Requests\\ItemPositions\\DeleteAnItemPositionRequestTest::__pest_evaluable_it_can_delete_an_item_position":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\FetchAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ItemPositions\\CreateAnItemPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\BusinessYears\\FetchAListOfBusinessYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\CreateContactRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\CreateAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0.003,"P\\Tests\\Core\\ArchTest::__pest_evaluable_it_will_not_use_any_debug_function":0.276,"P\\Tests\\Requests\\Salutations\\FetchASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\TextPositions\\FetchAListOfTextPositionsRequestTest::__pest_evaluable_it_can_perform_the_request":0}} \ No newline at end of file diff --git a/src/Dto/DefaultPositions/AddDefaultPositionDTO.php b/src/Dto/DefaultPositions/AddDefaultPositionDTO.php new file mode 100644 index 0000000..c7b71af --- /dev/null +++ b/src/Dto/DefaultPositions/AddDefaultPositionDTO.php @@ -0,0 +1,42 @@ +failed()) { + throw new Exception('Failed to create DTO from Response'); + } + $data = $response->json(); + return self::fromArray($data); + } + + public static function fromArray(array $data): self + { + if (! $data) { + throw new Exception('Unable to create DTO. Data missing from response.'); + } + return new self( + id: Arr::get($data, 'id'), + amount: Arr::get($data, 'amount'), + unit_id: Arr::get($data, 'unit_id'), + unit_name: Arr::get($data, 'unit_name'), + account_id: Arr::get($data, 'account_id'), + tax_id: Arr::get($data, 'tax_id'), + tax_value: Arr::get($data, 'tax_value'), + text: Arr::get($data, 'text'), + unit_price: Arr::get($data, 'unit_price'), + discount_in_percent: Arr::get($data, 'discount_in_percent'), + position_total: Arr::get($data, 'position_total'), + parent_id: Arr::get($data, 'parent_id'), + type: Arr::get($data, 'type', 'KbPositionCustom'), + pos: Arr::get($data, 'pos'), + internal_pos: Arr::get($data, 'internal_pos'), + is_optional: Arr::get($data, 'is_optional'), + ); + } +} diff --git a/src/Dto/DiscountPositions/AddDiscountPositionDTO.php b/src/Dto/DiscountPositions/AddDiscountPositionDTO.php new file mode 100644 index 0000000..b8cca87 --- /dev/null +++ b/src/Dto/DiscountPositions/AddDiscountPositionDTO.php @@ -0,0 +1,34 @@ +failed()) { + throw new Exception('Failed to create DTO from Response'); + } + $data = $response->json(); + return self::fromArray($data); + } + + public static function fromArray(array $data): self + { + if (! $data) { + throw new Exception('Unable to create DTO. Data missing from response.'); + } + return new self( + id: Arr::get($data, 'id'), + text: Arr::get($data, 'text'), + is_percentual: Arr::get($data, 'is_percentual'), + value: Arr::get($data, 'value'), + discount_total: Arr::get($data, 'discount_total'), + type: Arr::get($data, 'type', 'KbPositionDiscount'), + ); + } +} diff --git a/src/Dto/Invoices/CreateInvoiceDTO.php b/src/Dto/Invoices/CreateInvoiceDTO.php new file mode 100644 index 0000000..8f09e13 --- /dev/null +++ b/src/Dto/Invoices/CreateInvoiceDTO.php @@ -0,0 +1,74 @@ +failed()) { + throw new Exception('Failed to create DTO from Response'); + } + $data = $response->json(); + return self::fromArray($data); + } + + public static function fromArray(array $data): self + { + if (! $data) { + throw new Exception('Unable to create DTO. Data missing from response.'); + } + return new self( + id: Arr::get($data, 'id'), + amount: Arr::get($data, 'amount'), + unit_id: Arr::get($data, 'unit_id'), + unit_name: Arr::get($data, 'unit_name'), + account_id: Arr::get($data, 'account_id'), + tax_id: Arr::get($data, 'tax_id'), + tax_value: Arr::get($data, 'tax_value'), + text: Arr::get($data, 'text'), + unit_price: Arr::get($data, 'unit_price'), + discount_in_percent: Arr::get($data, 'discount_in_percent'), + position_total: Arr::get($data, 'position_total'), + parent_id: Arr::get($data, 'parent_id'), + article_id: Arr::get($data, 'article_id'), + type: Arr::get($data, 'type', 'KbPositionArticle'), + pos: Arr::get($data, 'pos'), + internal_pos: Arr::get($data, 'internal_pos'), + is_optional: Arr::get($data, 'is_optional'), + ); + } +} diff --git a/src/Dto/PagebreakPositions/AddPagebreakPositionDTO.php b/src/Dto/PagebreakPositions/AddPagebreakPositionDTO.php new file mode 100644 index 0000000..1cf0720 --- /dev/null +++ b/src/Dto/PagebreakPositions/AddPagebreakPositionDTO.php @@ -0,0 +1,31 @@ +failed()) { + throw new Exception('Failed to create DTO from Response'); + } + $data = $response->json(); + return self::fromArray($data); + } + + public static function fromArray(array $data): self + { + if (! $data) { + throw new Exception('Unable to create DTO. Data missing from response.'); + } + return new self( + id: Arr::get($data, 'id'), + internal_pos: Arr::get($data, 'internal_pos'), + is_optional: Arr::get($data, 'is_optional'), + type: Arr::get($data, 'type', 'KbPositionPagebreak'), + parent_id: Arr::get($data, 'parent_id'), + ); + } +} diff --git a/src/Dto/SubPositions/CreateEditSubPositionDTO.php b/src/Dto/SubPositions/CreateEditSubPositionDTO.php new file mode 100644 index 0000000..9e99096 --- /dev/null +++ b/src/Dto/SubPositions/CreateEditSubPositionDTO.php @@ -0,0 +1,30 @@ +failed()) { + throw new Exception('Failed to create DTO from Response'); + } + $data = $response->json(); + return self::fromArray($data); + } + + public static function fromArray(array $data): self + { + if (! $data) { + throw new Exception('Unable to create DTO. Data missing from response.'); + } + return new self( + id: Arr::get($data, 'id'), + text: Arr::get($data, 'text'), + pos: Arr::get($data, 'pos'), + internal_pos: Arr::get($data, 'internal_pos'), + show_pos_nr: Arr::get($data, 'show_pos_nr'), + is_optional: Arr::get($data, 'is_optional'), + total_sum: Arr::get($data, 'total_sum'), + show_pos_prices: Arr::get($data, 'show_pos_prices'), + type: Arr::get($data, 'type', 'KbPositionSubposition'), + parent_id: Arr::get($data, 'parent_id'), + ); + } +} diff --git a/src/Dto/SubtotalPositions/AddSubtotalPositionDTO.php b/src/Dto/SubtotalPositions/AddSubtotalPositionDTO.php new file mode 100644 index 0000000..47f5001 --- /dev/null +++ b/src/Dto/SubtotalPositions/AddSubtotalPositionDTO.php @@ -0,0 +1,30 @@ +failed()) { + throw new Exception('Failed to create DTO from Response'); + } + $data = $response->json(); + return self::fromArray($data); + } + + public static function fromArray(array $data): self + { + if (! $data) { + throw new Exception('Unable to create DTO. Data missing from response.'); + } + return new self( + id: Arr::get($data, 'id'), + text: Arr::get($data, 'text'), + value: Arr::get($data, 'value'), + internal_pos: Arr::get($data, 'internal_pos'), + is_optional: Arr::get($data, 'is_optional'), + type: Arr::get($data, 'type', 'KbPositionSubtotal'), + parent_id: Arr::get($data, 'parent_id'), + ); + } +} diff --git a/src/Dto/TextPositions/AddTextPositionDTO.php b/src/Dto/TextPositions/AddTextPositionDTO.php new file mode 100644 index 0000000..749f44e --- /dev/null +++ b/src/Dto/TextPositions/AddTextPositionDTO.php @@ -0,0 +1,32 @@ +failed()) { + throw new Exception('Failed to create DTO from Response'); + } + $data = $response->json(); + return self::fromArray($data); + } + + public static function fromArray(array $data): self + { + if (! $data) { + throw new Exception('Unable to create DTO. Data missing from response.'); + } + return new self( + id: Arr::get($data, 'id'), + text: Arr::get($data, 'text'), + show_pos_nr: Arr::get($data, 'show_pos_nr'), + pos: Arr::get($data, 'pos'), + internal_pos: Arr::get($data, 'internal_pos'), + is_optional: Arr::get($data, 'is_optional'), + type: Arr::get($data, 'type', 'KbPositionText'), + parent_id: Arr::get($data, 'parent_id'), + ); + } +} diff --git a/src/Requests/DefaultPositions/CreateADefaultPositionRequest.php b/src/Requests/DefaultPositions/CreateADefaultPositionRequest.php new file mode 100644 index 0000000..31198ce --- /dev/null +++ b/src/Requests/DefaultPositions/CreateADefaultPositionRequest.php @@ -0,0 +1,50 @@ +kbDocumentType}/{$this->documentId}/kb_position_custom"; + } + + public function defaultBody(): array + { + $body = $this->position; + + if (! $body instanceof CreateEditDefaultPositionDTO) { + $body = CreateEditDefaultPositionDTO::fromArray($body); + } + + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): DefaultPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + return DefaultPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/DefaultPositions/DeleteADefaultPositionRequest.php b/src/Requests/DefaultPositions/DeleteADefaultPositionRequest.php new file mode 100644 index 0000000..f35a898 --- /dev/null +++ b/src/Requests/DefaultPositions/DeleteADefaultPositionRequest.php @@ -0,0 +1,35 @@ +kbDocumentType}/{$this->documentId}/kb_position_custom/{$this->positionId}"; + } + + public function createDtoFromResponse(Response $response): mixed + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + return $response->json(); + } +} diff --git a/src/Requests/DefaultPositions/EditADefaultPositionRequest.php b/src/Requests/DefaultPositions/EditADefaultPositionRequest.php new file mode 100644 index 0000000..fdc1a08 --- /dev/null +++ b/src/Requests/DefaultPositions/EditADefaultPositionRequest.php @@ -0,0 +1,51 @@ +kbDocumentType}/{$this->documentId}/kb_position_custom/{$this->positionId}"; + } + + public function defaultBody(): array + { + $body = $this->position; + + if (! $body instanceof CreateEditDefaultPositionDTO) { + $body = CreateEditDefaultPositionDTO::fromArray($body); + } + + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): DefaultPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + return DefaultPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/DefaultPositions/FetchADefaultPositionRequest.php b/src/Requests/DefaultPositions/FetchADefaultPositionRequest.php new file mode 100644 index 0000000..e01b560 --- /dev/null +++ b/src/Requests/DefaultPositions/FetchADefaultPositionRequest.php @@ -0,0 +1,35 @@ +kbDocumentType}/{$this->documentId}/kb_position_custom/{$this->positionId}"; + } + + public function createDtoFromResponse(Response $response): DefaultPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + return DefaultPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/DefaultPositions/FetchAListOfDefaultPositionsRequest.php b/src/Requests/DefaultPositions/FetchAListOfDefaultPositionsRequest.php new file mode 100644 index 0000000..7cc113b --- /dev/null +++ b/src/Requests/DefaultPositions/FetchAListOfDefaultPositionsRequest.php @@ -0,0 +1,52 @@ +kbDocumentType}/{$this->documentId}/kb_position_custom"; + } + + public function defaultQuery(): array + { + return [ + 'limit' => $this->limit, + 'offset' => $this->offset, + ]; + } + + public function createDtoFromResponse(Response $response): Collection + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + $res = $response->json(); + + $positions = collect(); + + foreach ($res as $position) { + $positions->push(DefaultPositionDTO::fromArray($position)); + } + + return $positions; + } +} diff --git a/src/Requests/DiscountPositions/CreateADiscountPositionRequest.php b/src/Requests/DiscountPositions/CreateADiscountPositionRequest.php new file mode 100644 index 0000000..38c21f0 --- /dev/null +++ b/src/Requests/DiscountPositions/CreateADiscountPositionRequest.php @@ -0,0 +1,47 @@ +kbDocumentType}/{$this->documentId}/kb_position_discount"; + } + + protected function defaultBody(): array + { + $body = $this->position; + if (! $body instanceof CreateEditDiscountPositionDTO) { + $body = CreateEditDiscountPositionDTO::fromArray($body); + } + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): DiscountPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return DiscountPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/DiscountPositions/DeleteADiscountPositionRequest.php b/src/Requests/DiscountPositions/DeleteADiscountPositionRequest.php new file mode 100644 index 0000000..dac8615 --- /dev/null +++ b/src/Requests/DiscountPositions/DeleteADiscountPositionRequest.php @@ -0,0 +1,32 @@ +kbDocumentType}/{$this->documentId}/kb_position_discount/{$this->positionId}"; + } + + public function createDtoFromResponse(Response $response): mixed + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return $response->json(); + } +} diff --git a/src/Requests/DiscountPositions/EditADiscountPositionRequest.php b/src/Requests/DiscountPositions/EditADiscountPositionRequest.php new file mode 100644 index 0000000..22f789a --- /dev/null +++ b/src/Requests/DiscountPositions/EditADiscountPositionRequest.php @@ -0,0 +1,48 @@ +kbDocumentType}/{$this->documentId}/kb_position_discount/{$this->positionId}"; + } + + protected function defaultBody(): array + { + $body = $this->position; + if (! $body instanceof CreateEditDiscountPositionDTO) { + $body = CreateEditDiscountPositionDTO::fromArray($body); + } + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): DiscountPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return DiscountPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/DiscountPositions/FetchADiscountPositionRequest.php b/src/Requests/DiscountPositions/FetchADiscountPositionRequest.php new file mode 100644 index 0000000..a920f7a --- /dev/null +++ b/src/Requests/DiscountPositions/FetchADiscountPositionRequest.php @@ -0,0 +1,33 @@ +kbDocumentType}/{$this->documentId}/kb_position_discount/{$this->positionId}"; + } + + public function createDtoFromResponse(Response $response): DiscountPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return DiscountPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/DiscountPositions/FetchAListOfDiscountPositionsRequest.php b/src/Requests/DiscountPositions/FetchAListOfDiscountPositionsRequest.php new file mode 100644 index 0000000..cda5230 --- /dev/null +++ b/src/Requests/DiscountPositions/FetchAListOfDiscountPositionsRequest.php @@ -0,0 +1,48 @@ +kbDocumentType}/{$this->documentId}/kb_position_discount"; + } + + public function defaultQuery(): array + { + return [ + 'limit' => $this->limit, + 'offset' => $this->offset, + ]; + } + + public function createDtoFromResponse(Response $response): Collection + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + $res = $response->json(); + $positions = collect(); + foreach ($res as $position) { + $positions->push(DiscountPositionDTO::fromArray($position)); + } + return $positions; + } +} diff --git a/src/Requests/Invoices/CreateAnInvoiceRequestNew.php b/src/Requests/Invoices/CreateAnInvoiceRequestNew.php new file mode 100644 index 0000000..99faead --- /dev/null +++ b/src/Requests/Invoices/CreateAnInvoiceRequestNew.php @@ -0,0 +1,55 @@ +invoice; + if (! $body instanceof CreateInvoiceDTO) { + $body = CreateInvoiceDTO::fromArray($body); + } + // Filter out all null values so Bexio does not see e.g. document_nr if null + return array_filter($body->toArray(), fn($v) => $v !== null); + } + + public function createDtoFromResponse(Response $response): InvoiceDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + $res = $response->json(); + + return InvoiceDTO::fromArray($res); + } +} diff --git a/src/Requests/Invoices/EditAnInvoiceRequestNew.php b/src/Requests/Invoices/EditAnInvoiceRequestNew.php new file mode 100644 index 0000000..5fdced2 --- /dev/null +++ b/src/Requests/Invoices/EditAnInvoiceRequestNew.php @@ -0,0 +1,50 @@ +invoice_id}"; + } + + public function defaultBody(): array + { + $body = $this->invoice; + if (! $body instanceof EditInvoiceDTO) { + $body = EditInvoiceDTO::fromArray($body); + } + + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): InvoiceDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + $res = $response->json(); + + return InvoiceDTO::fromArray($res); + } +} diff --git a/src/Requests/Invoices/MarkAnInvoiceAsSentRequest.php b/src/Requests/Invoices/MarkAnInvoiceAsSentRequest.php new file mode 100644 index 0000000..7ee25bb --- /dev/null +++ b/src/Requests/Invoices/MarkAnInvoiceAsSentRequest.php @@ -0,0 +1,31 @@ +invoice_id}/mark_as_sent"; + } + + public function createDtoFromResponse(Response $response): mixed + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + return $response->json(); + } +} diff --git a/src/Requests/Invoices/SendAnInvoiceRequest.php b/src/Requests/Invoices/SendAnInvoiceRequest.php new file mode 100644 index 0000000..608b18d --- /dev/null +++ b/src/Requests/Invoices/SendAnInvoiceRequest.php @@ -0,0 +1,52 @@ +invoice_id}/send"; + } + + protected function defaultBody(): array + { + $body = $this->invoice; + if (! $body instanceof SendInvoiceDTO) { + $body = SendInvoiceDTO::fromArray($body); + } + + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): mixed + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + return $response->json(); + } +} diff --git a/src/Requests/ItemPositions/CreateAnItemPositionRequest.php b/src/Requests/ItemPositions/CreateAnItemPositionRequest.php new file mode 100644 index 0000000..d7b8baa --- /dev/null +++ b/src/Requests/ItemPositions/CreateAnItemPositionRequest.php @@ -0,0 +1,50 @@ +kbDocumentType}/{$this->documentId}/kb_position_article"; + } + + protected function defaultBody(): array + { + $body = $this->position; + + if (! $body instanceof CreateItemPositionDTO) { + $body = CreateItemPositionDTO::fromArray($body); + } + + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): ItemPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + return ItemPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/ItemPositions/DeleteAnItemPositionRequest.php b/src/Requests/ItemPositions/DeleteAnItemPositionRequest.php new file mode 100644 index 0000000..18cf53b --- /dev/null +++ b/src/Requests/ItemPositions/DeleteAnItemPositionRequest.php @@ -0,0 +1,32 @@ +kbDocumentType}/{$this->documentId}/kb_position_article/{$this->positionId}"; + } + + public function createDtoFromResponse(Response $response): mixed + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return $response->json(); + } +} diff --git a/src/Requests/ItemPositions/EditAnItemPositionRequest.php b/src/Requests/ItemPositions/EditAnItemPositionRequest.php new file mode 100644 index 0000000..e8fd604 --- /dev/null +++ b/src/Requests/ItemPositions/EditAnItemPositionRequest.php @@ -0,0 +1,51 @@ +kbDocumentType}/{$this->documentId}/kb_position_article/{$this->positionId}"; + } + + protected function defaultBody(): array + { + $body = $this->position; + + if (! $body instanceof EditItemPositionDTO) { + $body = EditItemPositionDTO::fromArray($body); + } + + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): ItemPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + return ItemPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/ItemPositions/FetchAListOfItemPositionsRequest.php b/src/Requests/ItemPositions/FetchAListOfItemPositionsRequest.php new file mode 100644 index 0000000..f5b0e59 --- /dev/null +++ b/src/Requests/ItemPositions/FetchAListOfItemPositionsRequest.php @@ -0,0 +1,48 @@ +kbDocumentType}/{$this->documentId}/kb_position_article"; + } + + public function defaultQuery(): array + { + return [ + 'limit' => $this->limit, + 'offset' => $this->offset, + ]; + } + + public function createDtoFromResponse(Response $response): Collection + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + $res = $response->json(); + $positions = collect(); + foreach ($res as $position) { + $positions->push(ItemPositionDTO::fromArray($position)); + } + return $positions; + } +} diff --git a/src/Requests/ItemPositions/FetchAnItemPositionRequest.php b/src/Requests/ItemPositions/FetchAnItemPositionRequest.php new file mode 100644 index 0000000..555202f --- /dev/null +++ b/src/Requests/ItemPositions/FetchAnItemPositionRequest.php @@ -0,0 +1,33 @@ +kbDocumentType}/{$this->documentId}/kb_position_article/{$this->positionId}"; + } + + public function createDtoFromResponse(Response $response): ItemPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return ItemPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/PagebreakPositions/CreateAPagebreakPositionRequest.php b/src/Requests/PagebreakPositions/CreateAPagebreakPositionRequest.php new file mode 100644 index 0000000..1823bef --- /dev/null +++ b/src/Requests/PagebreakPositions/CreateAPagebreakPositionRequest.php @@ -0,0 +1,47 @@ +kbDocumentType}/{$this->documentId}/kb_position_pagebreak"; + } + + protected function defaultBody(): array + { + $body = $this->position; + if (! $body instanceof CreateEditPagebreakPositionDTO) { + $body = CreateEditPagebreakPositionDTO::fromArray($body); + } + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): PagebreakPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return PagebreakPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/PagebreakPositions/DeleteAPagebreakPositionRequest.php b/src/Requests/PagebreakPositions/DeleteAPagebreakPositionRequest.php new file mode 100644 index 0000000..9a59f6f --- /dev/null +++ b/src/Requests/PagebreakPositions/DeleteAPagebreakPositionRequest.php @@ -0,0 +1,32 @@ +kbDocumentType}/{$this->documentId}/kb_position_pagebreak/{$this->positionId}"; + } + + public function createDtoFromResponse(Response $response): mixed + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return $response->json(); + } +} diff --git a/src/Requests/PagebreakPositions/EditAPagebreakPositionRequest.php b/src/Requests/PagebreakPositions/EditAPagebreakPositionRequest.php new file mode 100644 index 0000000..34ce97a --- /dev/null +++ b/src/Requests/PagebreakPositions/EditAPagebreakPositionRequest.php @@ -0,0 +1,48 @@ +kbDocumentType}/{$this->documentId}/kb_position_pagebreak/{$this->positionId}"; + } + + protected function defaultBody(): array + { + $body = $this->position; + if (! $body instanceof CreateEditPagebreakPositionDTO) { + $body = CreateEditPagebreakPositionDTO::fromArray($body); + } + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): PagebreakPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return PagebreakPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/PagebreakPositions/FetchAListOfPagebreakPositionsRequest.php b/src/Requests/PagebreakPositions/FetchAListOfPagebreakPositionsRequest.php new file mode 100644 index 0000000..7de7426 --- /dev/null +++ b/src/Requests/PagebreakPositions/FetchAListOfPagebreakPositionsRequest.php @@ -0,0 +1,48 @@ +kbDocumentType}/{$this->documentId}/kb_position_pagebreak"; + } + + public function defaultQuery(): array + { + return [ + 'limit' => $this->limit, + 'offset' => $this->offset, + ]; + } + + public function createDtoFromResponse(Response $response): Collection + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + $res = $response->json(); + $positions = collect(); + foreach ($res as $position) { + $positions->push(PagebreakPositionDTO::fromArray($position)); + } + return $positions; + } +} diff --git a/src/Requests/PagebreakPositions/FetchAPagebreakPositionRequest.php b/src/Requests/PagebreakPositions/FetchAPagebreakPositionRequest.php new file mode 100644 index 0000000..46c97f0 --- /dev/null +++ b/src/Requests/PagebreakPositions/FetchAPagebreakPositionRequest.php @@ -0,0 +1,33 @@ +kbDocumentType}/{$this->documentId}/kb_position_pagebreak/{$this->positionId}"; + } + + public function createDtoFromResponse(Response $response): PagebreakPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return PagebreakPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/SubPositions/CreateASubPositionRequest.php b/src/Requests/SubPositions/CreateASubPositionRequest.php new file mode 100644 index 0000000..d645063 --- /dev/null +++ b/src/Requests/SubPositions/CreateASubPositionRequest.php @@ -0,0 +1,46 @@ +kbDocumentType}/{$this->documentId}/kb_position_subposition"; + } + + protected function defaultBody(): array + { + $body = $this->position; + if (! $body instanceof CreateEditSubPositionDTO) { + $body = CreateEditSubPositionDTO::fromArray($body); + } + return $body->toArray(); + } + + public function createDtoFromResponse($response): SubPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return SubPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/SubPositions/DeleteASubPositionRequest.php b/src/Requests/SubPositions/DeleteASubPositionRequest.php new file mode 100644 index 0000000..d386116 --- /dev/null +++ b/src/Requests/SubPositions/DeleteASubPositionRequest.php @@ -0,0 +1,32 @@ +kbDocumentType}/{$this->documentId}/kb_position_subposition/{$this->positionId}"; + } + + public function createDtoFromResponse(Response $response): mixed + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return $response->json(); + } +} diff --git a/src/Requests/SubPositions/EditASubPositionRequest.php b/src/Requests/SubPositions/EditASubPositionRequest.php new file mode 100644 index 0000000..fac0a3c --- /dev/null +++ b/src/Requests/SubPositions/EditASubPositionRequest.php @@ -0,0 +1,47 @@ +kbDocumentType}/{$this->documentId}/kb_position_subposition/{$this->positionId}"; + } + + protected function defaultBody(): array + { + $body = $this->position; + if (! $body instanceof CreateEditSubPositionDTO) { + $body = CreateEditSubPositionDTO::fromArray($body); + } + return $body->toArray(); + } + + public function createDtoFromResponse($response): SubPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return SubPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/SubPositions/FetchAListOfSubPositionsRequest.php b/src/Requests/SubPositions/FetchAListOfSubPositionsRequest.php new file mode 100644 index 0000000..77d62a2 --- /dev/null +++ b/src/Requests/SubPositions/FetchAListOfSubPositionsRequest.php @@ -0,0 +1,48 @@ +kbDocumentType}/{$this->documentId}/kb_position_subposition"; + } + + public function defaultQuery(): array + { + return [ + 'limit' => $this->limit, + 'offset' => $this->offset, + ]; + } + + public function createDtoFromResponse(Response $response): Collection + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + $res = $response->json(); + $positions = collect(); + foreach ($res as $position) { + $positions->push(SubPositionDTO::fromArray($position)); + } + return $positions; + } +} diff --git a/src/Requests/SubPositions/FetchASubPositionRequest.php b/src/Requests/SubPositions/FetchASubPositionRequest.php new file mode 100644 index 0000000..2781d2a --- /dev/null +++ b/src/Requests/SubPositions/FetchASubPositionRequest.php @@ -0,0 +1,33 @@ +kbDocumentType}/{$this->documentId}/kb_position_subposition/{$this->positionId}"; + } + + public function createDtoFromResponse(Response $response): SubPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return SubPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/SubtotalPositions/CreateASubtotalPositionRequest.php b/src/Requests/SubtotalPositions/CreateASubtotalPositionRequest.php new file mode 100644 index 0000000..2a270f5 --- /dev/null +++ b/src/Requests/SubtotalPositions/CreateASubtotalPositionRequest.php @@ -0,0 +1,47 @@ +kbDocumentType}/{$this->documentId}/kb_position_subtotal"; + } + + protected function defaultBody(): array + { + $body = $this->position; + if (! $body instanceof CreateEditSubtotalPositionDTO) { + $body = CreateEditSubtotalPositionDTO::fromArray($body); + } + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): SubtotalPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return SubtotalPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/SubtotalPositions/DeleteASubtotalPositionRequest.php b/src/Requests/SubtotalPositions/DeleteASubtotalPositionRequest.php new file mode 100644 index 0000000..b436768 --- /dev/null +++ b/src/Requests/SubtotalPositions/DeleteASubtotalPositionRequest.php @@ -0,0 +1,32 @@ +kbDocumentType}/{$this->documentId}/kb_position_subtotal/{$this->positionId}"; + } + + public function createDtoFromResponse(Response $response): mixed + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return $response->json(); + } +} diff --git a/src/Requests/SubtotalPositions/EditASubtotalPositionRequest.php b/src/Requests/SubtotalPositions/EditASubtotalPositionRequest.php new file mode 100644 index 0000000..aa35e5a --- /dev/null +++ b/src/Requests/SubtotalPositions/EditASubtotalPositionRequest.php @@ -0,0 +1,48 @@ +kbDocumentType}/{$this->documentId}/kb_position_subtotal/{$this->positionId}"; + } + + protected function defaultBody(): array + { + $body = $this->position; + if (! $body instanceof CreateEditSubtotalPositionDTO) { + $body = CreateEditSubtotalPositionDTO::fromArray($body); + } + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): SubtotalPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return SubtotalPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/SubtotalPositions/FetchAListOfSubtotalPositionsRequest.php b/src/Requests/SubtotalPositions/FetchAListOfSubtotalPositionsRequest.php new file mode 100644 index 0000000..7ac2ec0 --- /dev/null +++ b/src/Requests/SubtotalPositions/FetchAListOfSubtotalPositionsRequest.php @@ -0,0 +1,48 @@ +kbDocumentType}/{$this->documentId}/kb_position_subtotal"; + } + + public function defaultQuery(): array + { + return [ + 'limit' => $this->limit, + 'offset' => $this->offset, + ]; + } + + public function createDtoFromResponse(Response $response): Collection + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + $res = $response->json(); + $positions = collect(); + foreach ($res as $position) { + $positions->push(SubtotalPositionDTO::fromArray($position)); + } + return $positions; + } +} diff --git a/src/Requests/SubtotalPositions/FetchASubtotalPositionRequest.php b/src/Requests/SubtotalPositions/FetchASubtotalPositionRequest.php new file mode 100644 index 0000000..781aabf --- /dev/null +++ b/src/Requests/SubtotalPositions/FetchASubtotalPositionRequest.php @@ -0,0 +1,33 @@ +kbDocumentType}/{$this->documentId}/kb_position_subtotal/{$this->positionId}"; + } + + public function createDtoFromResponse(Response $response): SubtotalPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return SubtotalPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/TextPositions/CreateATextPositionRequest.php b/src/Requests/TextPositions/CreateATextPositionRequest.php new file mode 100644 index 0000000..9411b02 --- /dev/null +++ b/src/Requests/TextPositions/CreateATextPositionRequest.php @@ -0,0 +1,50 @@ +kbDocumentType}/{$this->documentId}/kb_position_text"; + } + + protected function defaultBody(): array + { + $body = $this->position; + + if (! $body instanceof CreateEditTextPositionDTO) { + $body = CreateEditTextPositionDTO::fromArray($body); + } + + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): TextPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + return TextPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/TextPositions/DeleteATextPositionRequest.php b/src/Requests/TextPositions/DeleteATextPositionRequest.php new file mode 100644 index 0000000..8846e9d --- /dev/null +++ b/src/Requests/TextPositions/DeleteATextPositionRequest.php @@ -0,0 +1,32 @@ +kbDocumentType}/{$this->documentId}/kb_position_text/{$this->positionId}"; + } + + public function createDtoFromResponse(Response $response): mixed + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return $response->json(); + } +} diff --git a/src/Requests/TextPositions/EditATextPositionRequest.php b/src/Requests/TextPositions/EditATextPositionRequest.php new file mode 100644 index 0000000..21e76ae --- /dev/null +++ b/src/Requests/TextPositions/EditATextPositionRequest.php @@ -0,0 +1,51 @@ +kbDocumentType}/{$this->documentId}/kb_position_text/{$this->positionId}"; + } + + protected function defaultBody(): array + { + $body = $this->position; + + if (! $body instanceof CreateEditTextPositionDTO) { + $body = CreateEditTextPositionDTO::fromArray($body); + } + + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): TextPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + return TextPositionDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/TextPositions/FetchAListOfTextPositionsRequest.php b/src/Requests/TextPositions/FetchAListOfTextPositionsRequest.php new file mode 100644 index 0000000..5c0e40e --- /dev/null +++ b/src/Requests/TextPositions/FetchAListOfTextPositionsRequest.php @@ -0,0 +1,48 @@ +kbDocumentType}/{$this->documentId}/kb_position_text"; + } + + public function defaultQuery(): array + { + return [ + 'limit' => $this->limit, + 'offset' => $this->offset, + ]; + } + + public function createDtoFromResponse(Response $response): Collection + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + $res = $response->json(); + $positions = collect(); + foreach ($res as $position) { + $positions->push(TextPositionDTO::fromArray($position)); + } + return $positions; + } +} diff --git a/src/Requests/TextPositions/FetchATextPositionRequest.php b/src/Requests/TextPositions/FetchATextPositionRequest.php new file mode 100644 index 0000000..3d2543e --- /dev/null +++ b/src/Requests/TextPositions/FetchATextPositionRequest.php @@ -0,0 +1,33 @@ +kbDocumentType}/{$this->documentId}/kb_position_text/{$this->positionId}"; + } + + public function createDtoFromResponse(Response $response): TextPositionDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + return TextPositionDTO::fromArray($response->json()); + } +} diff --git a/tests/Fixtures/Saloon/DefaultPositions/create-a-default-position.json b/tests/Fixtures/Saloon/DefaultPositions/create-a-default-position.json new file mode 100644 index 0000000..5bd98a8 --- /dev/null +++ b/tests/Fixtures/Saloon/DefaultPositions/create-a-default-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 201, + "headers": { + "Date": "Sat, 14 Jun 2025 14:17:59 GMT", + "Content-Type": "application\/json", + "Content-Length": "281", + "Connection": "keep-alive", + "ratelimit-remaining": "999", + "ratelimit-reset": "1", + "x-ratelimit-limit-minute": "1000", + "x-ratelimit-remaining-minute": "999", + "ratelimit-limit": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fa744f7f2beb49-CPH" + }, + "data": "{\"id\":10,\"type\":\"KbPositionCustom\",\"amount\":\"1\",\"unit_id\":1,\"account_id\":145,\"unit_name\":\"Stk\",\"tax_id\":29,\"tax_value\":\"8.10\",\"text\":\"Test position\",\"unit_price\":\"100\",\"discount_in_percent\":\"0\",\"position_total\":\"100\",\"pos\":\"4\",\"internal_pos\":4,\"parent_id\":null,\"is_optional\":false}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/DefaultPositions/delete-a-default-position.json b/tests/Fixtures/Saloon/DefaultPositions/delete-a-default-position.json new file mode 100644 index 0000000..fa3a6f6 --- /dev/null +++ b/tests/Fixtures/Saloon/DefaultPositions/delete-a-default-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 16:05:18 GMT", + "Content-Type": "application\/json", + "Content-Length": "16", + "Connection": "keep-alive", + "x-ratelimit-remaining-minute": "998", + "x-ratelimit-limit-minute": "1000", + "ratelimit-remaining": "998", + "ratelimit-reset": "43", + "ratelimit-limit": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb1181b9b72625-CPH" + }, + "data": "{\"success\":true}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/DefaultPositions/edit-a-default-position.json b/tests/Fixtures/Saloon/DefaultPositions/edit-a-default-position.json new file mode 100644 index 0000000..18ad377 --- /dev/null +++ b/tests/Fixtures/Saloon/DefaultPositions/edit-a-default-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 16:05:16 GMT", + "Content-Type": "application\/json", + "Content-Length": "281", + "Connection": "keep-alive", + "ratelimit-limit": "1000", + "x-ratelimit-limit-minute": "1000", + "ratelimit-remaining": "999", + "x-ratelimit-remaining-minute": "999", + "ratelimit-reset": "44", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb117a7b368f62-CPH" + }, + "data": "{\"id\":10,\"type\":\"KbPositionCustom\",\"amount\":\"1\",\"unit_id\":1,\"account_id\":145,\"unit_name\":\"Stk\",\"tax_id\":29,\"tax_value\":\"8.10\",\"text\":\"Test position\",\"unit_price\":\"150\",\"discount_in_percent\":\"0\",\"position_total\":\"150\",\"pos\":\"4\",\"internal_pos\":4,\"parent_id\":null,\"is_optional\":false}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/DefaultPositions/fetch-a-default-position.json b/tests/Fixtures/Saloon/DefaultPositions/fetch-a-default-position.json new file mode 100644 index 0000000..c7048fb --- /dev/null +++ b/tests/Fixtures/Saloon/DefaultPositions/fetch-a-default-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 15:11:07 GMT", + "Content-Type": "application\/json", + "Content-Length": "306", + "Connection": "keep-alive", + "x-ratelimit-remaining-minute": "998", + "ratelimit-limit": "1000", + "ratelimit-remaining": "998", + "ratelimit-reset": "54", + "x-ratelimit-limit-minute": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fac223bf7592f4-CPH" + }, + "data": "{\"id\":9,\"type\":\"KbPositionCustom\",\"amount\":\"1.000000\",\"unit_id\":1,\"account_id\":145,\"unit_name\":\"Stk\",\"tax_id\":29,\"tax_value\":\"8.10\",\"text\":\"Test position\",\"unit_price\":\"100.000000\",\"discount_in_percent\":\"0.0000\",\"position_total\":\"100.000000\",\"pos\":\"3\",\"internal_pos\":3,\"parent_id\":null,\"is_optional\":false}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/DefaultPositions/fetch-a-list-of-default-positions.json b/tests/Fixtures/Saloon/DefaultPositions/fetch-a-list-of-default-positions.json new file mode 100644 index 0000000..f8ccb24 --- /dev/null +++ b/tests/Fixtures/Saloon/DefaultPositions/fetch-a-list-of-default-positions.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 16:12:29 GMT", + "Content-Type": "application\/json", + "Content-Length": "616", + "Connection": "keep-alive", + "x-ratelimit-remaining-minute": "999", + "x-ratelimit-limit-minute": "1000", + "ratelimit-remaining": "999", + "ratelimit-reset": "32", + "ratelimit-limit": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb1c07deb9be4c-CPH" + }, + "data": "[{\"id\":9,\"type\":\"KbPositionCustom\",\"amount\":\"1.000000\",\"unit_id\":1,\"account_id\":145,\"unit_name\":\"Stk\",\"tax_id\":29,\"tax_value\":\"8.10\",\"text\":\"Test position\",\"unit_price\":\"100.000000\",\"discount_in_percent\":\"0.0000\",\"position_total\":\"100.000000\",\"pos\":\"2\",\"internal_pos\":2,\"parent_id\":null,\"is_optional\":false},{\"id\":10,\"type\":\"KbPositionCustom\",\"amount\":\"1.000000\",\"unit_id\":1,\"account_id\":145,\"unit_name\":\"Stk\",\"tax_id\":29,\"tax_value\":\"8.10\",\"text\":\"Test position\",\"unit_price\":\"150.000000\",\"discount_in_percent\":\"0.0000\",\"position_total\":\"150.000000\",\"pos\":\"3\",\"internal_pos\":3,\"parent_id\":null,\"is_optional\":false}]", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/DiscountPositions/create-a-discount-position.json b/tests/Fixtures/Saloon/DiscountPositions/create-a-discount-position.json new file mode 100644 index 0000000..242efa7 --- /dev/null +++ b/tests/Fixtures/Saloon/DiscountPositions/create-a-discount-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 201, + "headers": { + "Date": "Sat, 14 Jun 2025 17:08:52 GMT", + "Content-Type": "application\/json", + "Content-Length": "128", + "Connection": "keep-alive", + "x-ratelimit-remaining-minute": "988", + "ratelimit-limit": "1000", + "ratelimit-remaining": "988", + "ratelimit-reset": "8", + "x-ratelimit-limit-minute": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6ea3b90d92b2-CPH" + }, + "data": "{\"id\":4,\"type\":\"KbPositionDiscount\",\"text\":\"Test discount position\",\"is_percentual\":true,\"value\":\"10\",\"discount_total\":\"56.133\"}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/DiscountPositions/delete-a-discount-position.json b/tests/Fixtures/Saloon/DiscountPositions/delete-a-discount-position.json new file mode 100644 index 0000000..03112d3 --- /dev/null +++ b/tests/Fixtures/Saloon/DiscountPositions/delete-a-discount-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:09:04 GMT", + "Content-Type": "application\/json", + "Content-Length": "16", + "Connection": "keep-alive", + "ratelimit-limit": "1000", + "x-ratelimit-limit-minute": "1000", + "ratelimit-remaining": "992", + "x-ratelimit-remaining-minute": "992", + "ratelimit-reset": "57", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6eeb0bb3a0c8-CPH" + }, + "data": "{\"success\":true}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/DiscountPositions/edit-a-discount-position.json b/tests/Fixtures/Saloon/DiscountPositions/edit-a-discount-position.json new file mode 100644 index 0000000..93a92be --- /dev/null +++ b/tests/Fixtures/Saloon/DiscountPositions/edit-a-discount-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:08:58 GMT", + "Content-Type": "application\/json", + "Content-Length": "125", + "Connection": "keep-alive", + "x-ratelimit-remaining-minute": "981", + "x-ratelimit-limit-minute": "1000", + "ratelimit-remaining": "981", + "ratelimit-reset": "2", + "ratelimit-limit": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6ec9de85ebcd-CPH" + }, + "data": "{\"id\":1,\"type\":\"KbPositionDiscount\",\"text\":\"Test discount position\",\"is_percentual\":true,\"value\":\"50\",\"discount_total\":\"385\"}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/DiscountPositions/fetch-a-discount-position.json b/tests/Fixtures/Saloon/DiscountPositions/fetch-a-discount-position.json new file mode 100644 index 0000000..5e9d2a6 --- /dev/null +++ b/tests/Fixtures/Saloon/DiscountPositions/fetch-a-discount-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:09:01 GMT", + "Content-Type": "application\/json", + "Content-Length": "139", + "Connection": "keep-alive", + "x-ratelimit-remaining-minute": "998", + "ratelimit-limit": "1000", + "ratelimit-remaining": "998", + "ratelimit-reset": "59", + "x-ratelimit-limit-minute": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6ed97f16abda-CPH" + }, + "data": "{\"id\":1,\"type\":\"KbPositionDiscount\",\"text\":\"Test discount position\",\"is_percentual\":true,\"value\":\"50.000000\",\"discount_total\":\"335.000000\"}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/DiscountPositions/fetch-a-list-of-discount-positions.json b/tests/Fixtures/Saloon/DiscountPositions/fetch-a-list-of-discount-positions.json new file mode 100644 index 0000000..25ad5ac --- /dev/null +++ b/tests/Fixtures/Saloon/DiscountPositions/fetch-a-list-of-discount-positions.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:08:55 GMT", + "Content-Type": "application\/json", + "Content-Length": "279", + "Connection": "keep-alive", + "ratelimit-limit": "1000", + "x-ratelimit-limit-minute": "1000", + "ratelimit-remaining": "985", + "x-ratelimit-remaining-minute": "985", + "ratelimit-reset": "5", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6eb71c59ebcd-CPH" + }, + "data": "[{\"id\":1,\"type\":\"KbPositionDiscount\",\"text\":\"Test discount position\",\"is_percentual\":true,\"value\":\"10.000000\",\"discount_total\":\"77.000000\"},{\"id\":2,\"type\":\"KbPositionDiscount\",\"text\":\"Test discount position\",\"is_percentual\":true,\"value\":\"10.000000\",\"discount_total\":\"69.300000\"}]", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/ItemPositions/create-an-item-position.json b/tests/Fixtures/Saloon/ItemPositions/create-an-item-position.json new file mode 100644 index 0000000..e016e5a --- /dev/null +++ b/tests/Fixtures/Saloon/ItemPositions/create-an-item-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 201, + "headers": { + "Date": "Sat, 14 Jun 2025 17:08:46 GMT", + "Content-Type": "application\/json", + "Content-Length": "303", + "Connection": "keep-alive", + "ratelimit-limit": "1000", + "x-ratelimit-limit-minute": "1000", + "ratelimit-remaining": "996", + "x-ratelimit-remaining-minute": "996", + "ratelimit-reset": "14", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6e7c3e58ebc8-CPH" + }, + "data": "{\"id\":5,\"type\":\"KbPositionArticle\",\"amount\":\"1\",\"unit_id\":1,\"account_id\":145,\"unit_name\":\"Stk\",\"tax_id\":29,\"tax_value\":\"8.10\",\"text\":\"Test item position\",\"unit_price\":\"110\",\"discount_in_percent\":\"0\",\"position_total\":\"110\",\"pos\":\"14\",\"internal_pos\":20,\"parent_id\":null,\"is_optional\":false,\"article_id\":1}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/ItemPositions/delete-an-item-position.json b/tests/Fixtures/Saloon/ItemPositions/delete-an-item-position.json new file mode 100644 index 0000000..020e2b9 --- /dev/null +++ b/tests/Fixtures/Saloon/ItemPositions/delete-an-item-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:08:59 GMT", + "Content-Type": "application\/json", + "Content-Length": "16", + "Connection": "keep-alive", + "x-ratelimit-limit-minute": "1000", + "ratelimit-reset": "1", + "x-ratelimit-remaining-minute": "979", + "ratelimit-limit": "1000", + "ratelimit-remaining": "979", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6ecfba38930a-CPH" + }, + "data": "{\"success\":true}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/ItemPositions/edit-an-item-position.json b/tests/Fixtures/Saloon/ItemPositions/edit-an-item-position.json new file mode 100644 index 0000000..8e12571 --- /dev/null +++ b/tests/Fixtures/Saloon/ItemPositions/edit-an-item-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:22:15 GMT", + "Content-Type": "application\/json", + "Content-Length": "308", + "Connection": "keep-alive", + "x-ratelimit-limit-minute": "1000", + "ratelimit-reset": "45", + "x-ratelimit-remaining-minute": "999", + "ratelimit-limit": "1000", + "ratelimit-remaining": "999", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb823b2d47f3b6-CPH" + }, + "data": "{\"id\":1,\"type\":\"KbPositionArticle\",\"amount\":\"1\",\"unit_id\":1,\"account_id\":145,\"unit_name\":\"Stk\",\"tax_id\":29,\"tax_value\":\"8.10\",\"text\":\"Test edited item position\",\"unit_price\":\"100\",\"discount_in_percent\":\"0\",\"position_total\":\"100\",\"pos\":\"4\",\"internal_pos\":4,\"parent_id\":null,\"is_optional\":false,\"article_id\":1}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/ItemPositions/fetch-a-list-of-item-positions.json b/tests/Fixtures/Saloon/ItemPositions/fetch-a-list-of-item-positions.json new file mode 100644 index 0000000..28e15cb --- /dev/null +++ b/tests/Fixtures/Saloon/ItemPositions/fetch-a-list-of-item-positions.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:08:49 GMT", + "Content-Type": "application\/json", + "Content-Length": "657", + "Connection": "keep-alive", + "x-ratelimit-remaining-minute": "991", + "x-ratelimit-limit-minute": "1000", + "ratelimit-remaining": "991", + "ratelimit-reset": "11", + "ratelimit-limit": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6e901bdbebc9-CPH" + }, + "data": "[{\"id\":1,\"type\":\"KbPositionArticle\",\"amount\":\"1.000000\",\"unit_id\":1,\"account_id\":145,\"unit_name\":\"Stk\",\"tax_id\":29,\"tax_value\":\"8.10\",\"text\":\"Test item position\",\"unit_price\":\"100.000000\",\"discount_in_percent\":\"0.0000\",\"position_total\":\"100.000000\",\"pos\":\"4\",\"internal_pos\":4,\"parent_id\":null,\"is_optional\":false,\"article_id\":1},{\"id\":2,\"type\":\"KbPositionArticle\",\"amount\":\"1.000000\",\"unit_id\":1,\"account_id\":145,\"unit_name\":\"Stk\",\"tax_id\":29,\"tax_value\":\"8.10\",\"text\":\"Test item position\",\"unit_price\":\"100.000000\",\"discount_in_percent\":\"0.0000\",\"position_total\":\"100.000000\",\"pos\":\"5\",\"internal_pos\":5,\"parent_id\":null,\"is_optional\":false,\"article_id\":1}]", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/ItemPositions/fetch-an-item-position.json b/tests/Fixtures/Saloon/ItemPositions/fetch-an-item-position.json new file mode 100644 index 0000000..4890bef --- /dev/null +++ b/tests/Fixtures/Saloon/ItemPositions/fetch-an-item-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:22:16 GMT", + "Content-Type": "application\/json", + "Content-Length": "334", + "Connection": "keep-alive", + "x-ratelimit-remaining-minute": "998", + "ratelimit-limit": "1000", + "ratelimit-remaining": "998", + "ratelimit-reset": "44", + "x-ratelimit-limit-minute": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb824189f8930c-CPH" + }, + "data": "{\"id\":1,\"type\":\"KbPositionArticle\",\"amount\":\"1.000000\",\"unit_id\":1,\"account_id\":145,\"unit_name\":\"Stk\",\"tax_id\":29,\"tax_value\":\"8.10\",\"text\":\"Test edited item position\",\"unit_price\":\"100.000000\",\"discount_in_percent\":\"0.0000\",\"position_total\":\"100.000000\",\"pos\":\"4\",\"internal_pos\":4,\"parent_id\":null,\"is_optional\":false,\"article_id\":1}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/PagebreakPositions/create-a-pagebreak-position.json b/tests/Fixtures/Saloon/PagebreakPositions/create-a-pagebreak-position.json new file mode 100644 index 0000000..bdca8dd --- /dev/null +++ b/tests/Fixtures/Saloon/PagebreakPositions/create-a-pagebreak-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 201, + "headers": { + "Date": "Sat, 14 Jun 2025 17:09:03 GMT", + "Content-Type": "application\/json", + "Content-Length": "92", + "Connection": "keep-alive", + "ratelimit-remaining": "994", + "ratelimit-reset": "57", + "x-ratelimit-limit-minute": "1000", + "x-ratelimit-remaining-minute": "994", + "ratelimit-limit": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6ee65cb6eb4a-CPH" + }, + "data": "{\"id\":4,\"type\":\"KbPositionPagebreak\",\"internal_pos\":20,\"parent_id\":null,\"is_optional\":false}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/PagebreakPositions/delete-a-pagebreak-position.json b/tests/Fixtures/Saloon/PagebreakPositions/delete-a-pagebreak-position.json new file mode 100644 index 0000000..115707e --- /dev/null +++ b/tests/Fixtures/Saloon/PagebreakPositions/delete-a-pagebreak-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:08:47 GMT", + "Content-Type": "application\/json", + "Content-Length": "16", + "Connection": "keep-alive", + "x-ratelimit-remaining-minute": "994", + "x-ratelimit-limit-minute": "1000", + "ratelimit-remaining": "994", + "ratelimit-reset": "13", + "ratelimit-limit": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6e82bce8eb52-CPH" + }, + "data": "{\"success\":true}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/PagebreakPositions/edit-a-pagebreak-position.json b/tests/Fixtures/Saloon/PagebreakPositions/edit-a-pagebreak-position.json new file mode 100644 index 0000000..a8e9cfc --- /dev/null +++ b/tests/Fixtures/Saloon/PagebreakPositions/edit-a-pagebreak-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:09:03 GMT", + "Content-Type": "application\/json", + "Content-Length": "91", + "Connection": "keep-alive", + "x-ratelimit-limit-minute": "1000", + "ratelimit-reset": "57", + "x-ratelimit-remaining-minute": "993", + "ratelimit-limit": "1000", + "ratelimit-remaining": "993", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6ee91cd62533-CPH" + }, + "data": "{\"id\":1,\"type\":\"KbPositionPagebreak\",\"internal_pos\":8,\"parent_id\":null,\"is_optional\":false}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/PagebreakPositions/fetch-a-list-of-pagebreak-positions.json b/tests/Fixtures/Saloon/PagebreakPositions/fetch-a-list-of-pagebreak-positions.json new file mode 100644 index 0000000..1d13c1f --- /dev/null +++ b/tests/Fixtures/Saloon/PagebreakPositions/fetch-a-list-of-pagebreak-positions.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:09:04 GMT", + "Content-Type": "application\/json", + "Content-Length": "186", + "Connection": "keep-alive", + "ratelimit-limit": "1000", + "x-ratelimit-limit-minute": "1000", + "ratelimit-remaining": "991", + "x-ratelimit-remaining-minute": "991", + "ratelimit-reset": "56", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6eee0f252c6c-CPH" + }, + "data": "[{\"id\":1,\"type\":\"KbPositionPagebreak\",\"internal_pos\":8,\"parent_id\":null,\"is_optional\":false},{\"id\":3,\"type\":\"KbPositionPagebreak\",\"internal_pos\":10,\"parent_id\":null,\"is_optional\":false}]", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/PagebreakPositions/fetch-a-pagebreak-position.json b/tests/Fixtures/Saloon/PagebreakPositions/fetch-a-pagebreak-position.json new file mode 100644 index 0000000..9abfe7b --- /dev/null +++ b/tests/Fixtures/Saloon/PagebreakPositions/fetch-a-pagebreak-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:26:59 GMT", + "Content-Type": "application\/json", + "Content-Length": "91", + "Connection": "keep-alive", + "x-ratelimit-limit-minute": "1000", + "ratelimit-reset": "1", + "x-ratelimit-remaining-minute": "998", + "ratelimit-limit": "1000", + "ratelimit-remaining": "998", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb892d6dcfebc9-CPH" + }, + "data": "{\"id\":1,\"type\":\"KbPositionPagebreak\",\"internal_pos\":7,\"parent_id\":null,\"is_optional\":false}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/SubPositions/create-a-sub-position.json b/tests/Fixtures/Saloon/SubPositions/create-a-sub-position.json new file mode 100644 index 0000000..cc6a087 --- /dev/null +++ b/tests/Fixtures/Saloon/SubPositions/create-a-sub-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 201, + "headers": { + "Date": "Sat, 14 Jun 2025 17:08:57 GMT", + "Content-Type": "application\/json", + "Content-Length": "190", + "Connection": "keep-alive", + "x-ratelimit-remaining-minute": "982", + "ratelimit-limit": "1000", + "ratelimit-remaining": "982", + "ratelimit-reset": "3", + "x-ratelimit-limit-minute": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6ec2d83592a9-CPH" + }, + "data": "{\"id\":4,\"type\":\"KbPositionSubposition\",\"text\":\"Test sub position\",\"pos\":\"14\",\"internal_pos\":19,\"show_pos_nr\":true,\"parent_id\":null,\"is_optional\":false,\"total_sum\":\"0\",\"show_pos_prices\":true}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/SubPositions/delete-a-sub-position.json b/tests/Fixtures/Saloon/SubPositions/delete-a-sub-position.json new file mode 100644 index 0000000..ca21bcb --- /dev/null +++ b/tests/Fixtures/Saloon/SubPositions/delete-a-sub-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:08:57 GMT", + "Content-Type": "application\/json", + "Content-Length": "16", + "Connection": "keep-alive", + "x-ratelimit-remaining-minute": "983", + "ratelimit-limit": "1000", + "ratelimit-remaining": "983", + "ratelimit-reset": "4", + "x-ratelimit-limit-minute": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6ebf3bf2929a-CPH" + }, + "data": "{\"success\":true}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/SubPositions/edit-a-sub-position.json b/tests/Fixtures/Saloon/SubPositions/edit-a-sub-position.json new file mode 100644 index 0000000..644c674 --- /dev/null +++ b/tests/Fixtures/Saloon/SubPositions/edit-a-sub-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:09:02 GMT", + "Content-Type": "application\/json", + "Content-Length": "202", + "Connection": "keep-alive", + "x-ratelimit-remaining-minute": "995", + "ratelimit-limit": "1000", + "ratelimit-remaining": "995", + "ratelimit-reset": "58", + "x-ratelimit-limit-minute": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6ee10e03ebc6-CPH" + }, + "data": "{\"id\":1,\"type\":\"KbPositionSubposition\",\"text\":\"Test edited sub position\",\"pos\":\"7\",\"internal_pos\":7,\"show_pos_nr\":true,\"parent_id\":null,\"is_optional\":false,\"total_sum\":\"0.000000\",\"show_pos_prices\":true}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/SubPositions/fetch-a-list-of-sub-positions.json b/tests/Fixtures/Saloon/SubPositions/fetch-a-list-of-sub-positions.json new file mode 100644 index 0000000..dbcffe7 --- /dev/null +++ b/tests/Fixtures/Saloon/SubPositions/fetch-a-list-of-sub-positions.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:08:50 GMT", + "Content-Type": "application\/json", + "Content-Length": "394", + "Connection": "keep-alive", + "x-ratelimit-remaining-minute": "990", + "x-ratelimit-limit-minute": "1000", + "ratelimit-remaining": "990", + "ratelimit-reset": "10", + "ratelimit-limit": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6e969e2d8f59-CPH" + }, + "data": "[{\"id\":1,\"type\":\"KbPositionSubposition\",\"text\":\"Test sub position\",\"pos\":\"8\",\"internal_pos\":8,\"show_pos_nr\":true,\"parent_id\":null,\"is_optional\":false,\"total_sum\":\"0.000000\",\"show_pos_prices\":true},{\"id\":2,\"type\":\"KbPositionSubposition\",\"text\":\"Test sub position\",\"pos\":\"9\",\"internal_pos\":10,\"show_pos_nr\":true,\"parent_id\":null,\"is_optional\":false,\"total_sum\":\"0.000000\",\"show_pos_prices\":true}]", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/SubPositions/fetch-a-sub-position.json b/tests/Fixtures/Saloon/SubPositions/fetch-a-sub-position.json new file mode 100644 index 0000000..80a22c9 --- /dev/null +++ b/tests/Fixtures/Saloon/SubPositions/fetch-a-sub-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:09:02 GMT", + "Content-Type": "application\/json", + "Content-Length": "195", + "Connection": "keep-alive", + "x-ratelimit-limit-minute": "1000", + "ratelimit-reset": "58", + "x-ratelimit-remaining-minute": "996", + "ratelimit-limit": "1000", + "ratelimit-remaining": "996", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6edf2e8b92f7-CPH" + }, + "data": "{\"id\":1,\"type\":\"KbPositionSubposition\",\"text\":\"Test sub position\",\"pos\":\"7\",\"internal_pos\":7,\"show_pos_nr\":true,\"parent_id\":null,\"is_optional\":false,\"total_sum\":\"0.000000\",\"show_pos_prices\":true}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/SubtotalPositions/create-a-subtotal-position.json b/tests/Fixtures/Saloon/SubtotalPositions/create-a-subtotal-position.json new file mode 100644 index 0000000..7410a96 --- /dev/null +++ b/tests/Fixtures/Saloon/SubtotalPositions/create-a-subtotal-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 201, + "headers": { + "Date": "Sat, 14 Jun 2025 17:08:59 GMT", + "Content-Type": "application\/json", + "Content-Length": "137", + "Connection": "keep-alive", + "ratelimit-remaining": "980", + "ratelimit-reset": "1", + "x-ratelimit-limit-minute": "1000", + "x-ratelimit-remaining-minute": "980", + "ratelimit-limit": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6eccefef92a9-CPH" + }, + "data": "{\"id\":4,\"type\":\"KbPositionSubtotal\",\"text\":\"Test subtotal position\",\"value\":\"770\",\"internal_pos\":20,\"parent_id\":null,\"is_optional\":false}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/SubtotalPositions/delete-a-subtotal-position.json b/tests/Fixtures/Saloon/SubtotalPositions/delete-a-subtotal-position.json new file mode 100644 index 0000000..7085bd6 --- /dev/null +++ b/tests/Fixtures/Saloon/SubtotalPositions/delete-a-subtotal-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:09:00 GMT", + "Content-Type": "application\/json", + "Content-Length": "16", + "Connection": "keep-alive", + "x-ratelimit-remaining-minute": "999", + "x-ratelimit-limit-minute": "1000", + "ratelimit-remaining": "999", + "ratelimit-reset": "60", + "ratelimit-limit": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6ed53ca9eb55-CPH" + }, + "data": "{\"success\":true}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/SubtotalPositions/edit-a-subtotal-position.json b/tests/Fixtures/Saloon/SubtotalPositions/edit-a-subtotal-position.json new file mode 100644 index 0000000..9e9a6c4 --- /dev/null +++ b/tests/Fixtures/Saloon/SubtotalPositions/edit-a-subtotal-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:09:04 GMT", + "Content-Type": "application\/json", + "Content-Length": "151", + "Connection": "keep-alive", + "x-ratelimit-limit-minute": "1000", + "ratelimit-reset": "56", + "x-ratelimit-remaining-minute": "990", + "ratelimit-limit": "1000", + "ratelimit-remaining": "990", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6ef04eca8f60-CPH" + }, + "data": "{\"id\":1,\"type\":\"KbPositionSubtotal\",\"text\":\"Test edited subtotal position\",\"value\":\"560.000000\",\"internal_pos\":11,\"parent_id\":null,\"is_optional\":false}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/SubtotalPositions/fetch-a-list-of-subtotal-positions.json b/tests/Fixtures/Saloon/SubtotalPositions/fetch-a-list-of-subtotal-positions.json new file mode 100644 index 0000000..64a435b --- /dev/null +++ b/tests/Fixtures/Saloon/SubtotalPositions/fetch-a-list-of-subtotal-positions.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:08:56 GMT", + "Content-Type": "application\/json", + "Content-Length": "291", + "Connection": "keep-alive", + "ratelimit-remaining": "984", + "ratelimit-reset": "4", + "x-ratelimit-limit-minute": "1000", + "x-ratelimit-remaining-minute": "984", + "ratelimit-limit": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6eb989548f5d-CPH" + }, + "data": "[{\"id\":1,\"type\":\"KbPositionSubtotal\",\"text\":\"Test subtotal position\",\"value\":\"660.000000\",\"internal_pos\":13,\"parent_id\":null,\"is_optional\":false},{\"id\":2,\"type\":\"KbPositionSubtotal\",\"text\":\"Test subtotal position\",\"value\":\"660.000000\",\"internal_pos\":14,\"parent_id\":null,\"is_optional\":false}]", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/SubtotalPositions/fetch-a-subtotal-position.json b/tests/Fixtures/Saloon/SubtotalPositions/fetch-a-subtotal-position.json new file mode 100644 index 0000000..c6d1457 --- /dev/null +++ b/tests/Fixtures/Saloon/SubtotalPositions/fetch-a-subtotal-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:08:50 GMT", + "Content-Type": "application\/json", + "Content-Length": "144", + "Connection": "keep-alive", + "x-ratelimit-limit-minute": "1000", + "ratelimit-reset": "10", + "x-ratelimit-remaining-minute": "989", + "ratelimit-limit": "1000", + "ratelimit-remaining": "989", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6e98ea6b92c2-CPH" + }, + "data": "{\"id\":1,\"type\":\"KbPositionSubtotal\",\"text\":\"Test subtotal position\",\"value\":\"660.000000\",\"internal_pos\":13,\"parent_id\":null,\"is_optional\":false}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/TextPositions/create-a-text-position.json b/tests/Fixtures/Saloon/TextPositions/create-a-text-position.json new file mode 100644 index 0000000..d86322e --- /dev/null +++ b/tests/Fixtures/Saloon/TextPositions/create-a-text-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 201, + "headers": { + "Date": "Sat, 14 Jun 2025 17:09:01 GMT", + "Content-Type": "application\/json", + "Content-Length": "146", + "Connection": "keep-alive", + "x-ratelimit-limit-minute": "1000", + "ratelimit-reset": "59", + "x-ratelimit-remaining-minute": "997", + "ratelimit-limit": "1000", + "ratelimit-remaining": "997", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6edb7e1aabc6-CPH" + }, + "data": "{\"id\":11,\"type\":\"KbPositionText\",\"text\":\"Test text position\",\"show_pos_nr\":true,\"pos\":\"14\",\"internal_pos\":19,\"parent_id\":null,\"is_optional\":false}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/TextPositions/delete-a-text-position.json b/tests/Fixtures/Saloon/TextPositions/delete-a-text-position.json new file mode 100644 index 0000000..ced4f65 --- /dev/null +++ b/tests/Fixtures/Saloon/TextPositions/delete-a-text-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:24:53 GMT", + "Content-Type": "application\/json", + "Content-Length": "16", + "Connection": "keep-alive", + "ratelimit-remaining": "997", + "ratelimit-reset": "7", + "x-ratelimit-limit-minute": "1000", + "x-ratelimit-remaining-minute": "997", + "ratelimit-limit": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb861a0bce930c-CPH" + }, + "data": "{\"success\":true}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/TextPositions/edit-a-text-position.json b/tests/Fixtures/Saloon/TextPositions/edit-a-text-position.json new file mode 100644 index 0000000..2bdc58c --- /dev/null +++ b/tests/Fixtures/Saloon/TextPositions/edit-a-text-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:08:48 GMT", + "Content-Type": "application\/json", + "Content-Length": "150", + "Connection": "keep-alive", + "x-ratelimit-remaining-minute": "993", + "ratelimit-limit": "1000", + "ratelimit-remaining": "993", + "ratelimit-reset": "12", + "x-ratelimit-limit-minute": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6e8779ebbe3f-CPH" + }, + "data": "{\"id\":1,\"type\":\"KbPositionText\",\"text\":\"Test edited text position\",\"show_pos_nr\":true,\"pos\":\"1\",\"internal_pos\":1,\"parent_id\":null,\"is_optional\":false}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/TextPositions/fetch-a-list-of-text-positions.json b/tests/Fixtures/Saloon/TextPositions/fetch-a-list-of-text-positions.json new file mode 100644 index 0000000..755e07c --- /dev/null +++ b/tests/Fixtures/Saloon/TextPositions/fetch-a-list-of-text-positions.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:09:00 GMT", + "Content-Type": "application\/json", + "Content-Length": "297", + "Connection": "keep-alive", + "ratelimit-remaining": "978", + "ratelimit-reset": "1", + "x-ratelimit-limit-minute": "1000", + "x-ratelimit-remaining-minute": "978", + "ratelimit-limit": "1000", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6ed25c7f3570-CPH" + }, + "data": "[{\"id\":1,\"type\":\"KbPositionText\",\"text\":\"Test edited text position\",\"show_pos_nr\":true,\"pos\":\"1\",\"internal_pos\":1,\"parent_id\":null,\"is_optional\":false},{\"id\":8,\"type\":\"KbPositionText\",\"text\":\"Test text position\",\"show_pos_nr\":true,\"pos\":\"9\",\"internal_pos\":14,\"parent_id\":null,\"is_optional\":false}]", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/TextPositions/fetch-a-text-position.json b/tests/Fixtures/Saloon/TextPositions/fetch-a-text-position.json new file mode 100644 index 0000000..a8333f0 --- /dev/null +++ b/tests/Fixtures/Saloon/TextPositions/fetch-a-text-position.json @@ -0,0 +1,25 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 14 Jun 2025 17:08:48 GMT", + "Content-Type": "application\/json", + "Content-Length": "150", + "Connection": "keep-alive", + "x-ratelimit-limit-minute": "1000", + "ratelimit-reset": "12", + "x-ratelimit-remaining-minute": "992", + "ratelimit-limit": "1000", + "ratelimit-remaining": "992", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare", + "CF-RAY": "94fb6e89c98ceb49-CPH" + }, + "data": "{\"id\":1,\"type\":\"KbPositionText\",\"text\":\"Test edited text position\",\"show_pos_nr\":true,\"pos\":\"1\",\"internal_pos\":1,\"parent_id\":null,\"is_optional\":false}", + "context": [] +} \ No newline at end of file diff --git a/tests/Requests/DefaultPositions/CreateADefaultPositionRequestTest.php b/tests/Requests/DefaultPositions/CreateADefaultPositionRequestTest.php new file mode 100644 index 0000000..3c7b102 --- /dev/null +++ b/tests/Requests/DefaultPositions/CreateADefaultPositionRequestTest.php @@ -0,0 +1,36 @@ + MockResponse::fixture('DefaultPositions/create-a-default-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new CreateADefaultPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + position: new CreateEditDefaultPositionDTO( + amount: 1, + unit_id: 1, + account_id: 145, + tax_id: 29, + text: 'Test position', + unit_price: 100, + discount_in_percent: '0', + ) + ); + + $response = $connector->send($request); + + $mockClient->assertSent(CreateADefaultPositionRequest::class); + expect($response->dto())->toBeInstanceOf(DefaultPositionDTO::class); +}); diff --git a/tests/Requests/DefaultPositions/DeleteADefaultPositionRequestTest.php b/tests/Requests/DefaultPositions/DeleteADefaultPositionRequestTest.php new file mode 100644 index 0000000..f89208f --- /dev/null +++ b/tests/Requests/DefaultPositions/DeleteADefaultPositionRequestTest.php @@ -0,0 +1,26 @@ + MockResponse::fixture('DefaultPositions/delete-a-default-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new DeleteADefaultPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 2, + ); + + $response = $connector->send($request); + + $mockClient->assertSent(DeleteADefaultPositionRequest::class); + expect($response->dto())->not()->toBeNull(); +}); diff --git a/tests/Requests/DefaultPositions/EditADefaultPositionRequestTest.php b/tests/Requests/DefaultPositions/EditADefaultPositionRequestTest.php new file mode 100644 index 0000000..886b1b5 --- /dev/null +++ b/tests/Requests/DefaultPositions/EditADefaultPositionRequestTest.php @@ -0,0 +1,37 @@ + MockResponse::fixture('DefaultPositions/edit-a-default-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new EditADefaultPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 10, + position: new CreateEditDefaultPositionDTO( + amount: 1, + unit_id: 1, + account_id: 145, + tax_id: 29, + text: 'Test position', + unit_price: 150, + discount_in_percent: '0', + ), + ); + + $response = $connector->send($request); + + $mockClient->assertSent(EditADefaultPositionRequest::class); + expect($response->dto())->toBeInstanceOf(DefaultPositionDTO::class); +}); diff --git a/tests/Requests/DefaultPositions/FetchADefaultPositionRequestTest.php b/tests/Requests/DefaultPositions/FetchADefaultPositionRequestTest.php new file mode 100644 index 0000000..80f9097 --- /dev/null +++ b/tests/Requests/DefaultPositions/FetchADefaultPositionRequestTest.php @@ -0,0 +1,27 @@ + MockResponse::fixture('DefaultPositions/fetch-a-default-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new FetchADefaultPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 9, + ); + + $response = $connector->send($request); + + $mockClient->assertSent(FetchADefaultPositionRequest::class); + expect($response->dto())->toBeInstanceOf(DefaultPositionDTO::class); +}); diff --git a/tests/Requests/DefaultPositions/FetchAListOfDefaultPositionsRequestTest.php b/tests/Requests/DefaultPositions/FetchAListOfDefaultPositionsRequestTest.php new file mode 100644 index 0000000..aa4d681 --- /dev/null +++ b/tests/Requests/DefaultPositions/FetchAListOfDefaultPositionsRequestTest.php @@ -0,0 +1,28 @@ + MockResponse::fixture('DefaultPositions/fetch-a-list-of-default-positions'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $response = $connector->send(new FetchAListOfDefaultPositionsRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + limit: 2, + )); + + $mockClient->assertSent(FetchAListOfDefaultPositionsRequest::class); + + expect($response->dto())->toBeInstanceOf(Collection::class) + ->and($response->dto()->count())->toBe(2); +}); diff --git a/tests/Requests/DiscountPositions/CreateADiscountPositionRequestTest.php b/tests/Requests/DiscountPositions/CreateADiscountPositionRequestTest.php new file mode 100644 index 0000000..7c9df29 --- /dev/null +++ b/tests/Requests/DiscountPositions/CreateADiscountPositionRequestTest.php @@ -0,0 +1,32 @@ + MockResponse::fixture('DiscountPositions/create-a-discount-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new CreateADiscountPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + position: new CreateEditDiscountPositionDTO( + text: 'Test discount position', + is_percentual: true, + value: '10', + ) + ); + + $response = $connector->send($request); + + $mockClient->assertSent(CreateADiscountPositionRequest::class); + expect($response->dto())->toBeInstanceOf(DiscountPositionDTO::class); +}); diff --git a/tests/Requests/DiscountPositions/DeleteADiscountPositionRequestTest.php b/tests/Requests/DiscountPositions/DeleteADiscountPositionRequestTest.php new file mode 100644 index 0000000..356a7bb --- /dev/null +++ b/tests/Requests/DiscountPositions/DeleteADiscountPositionRequestTest.php @@ -0,0 +1,26 @@ + MockResponse::fixture('DiscountPositions/delete-a-discount-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new DeleteADiscountPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 3, + ); + + $response = $connector->send($request); + + $mockClient->assertSent(DeleteADiscountPositionRequest::class); + expect($response->dto())->not()->toBeNull(); +}); diff --git a/tests/Requests/DiscountPositions/EditADiscountPositionRequestTest.php b/tests/Requests/DiscountPositions/EditADiscountPositionRequestTest.php new file mode 100644 index 0000000..6c1be53 --- /dev/null +++ b/tests/Requests/DiscountPositions/EditADiscountPositionRequestTest.php @@ -0,0 +1,33 @@ + MockResponse::fixture('DiscountPositions/edit-a-discount-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new EditADiscountPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 1, + position: new CreateEditDiscountPositionDTO( + text: 'Test discount position', + is_percentual: true, + value: '50', + ), + ); + + $response = $connector->send($request); + + $mockClient->assertSent(EditADiscountPositionRequest::class); + expect($response->dto())->toBeInstanceOf(DiscountPositionDTO::class); +}); diff --git a/tests/Requests/DiscountPositions/FetchADiscountPositionRequestTest.php b/tests/Requests/DiscountPositions/FetchADiscountPositionRequestTest.php new file mode 100644 index 0000000..262f63d --- /dev/null +++ b/tests/Requests/DiscountPositions/FetchADiscountPositionRequestTest.php @@ -0,0 +1,27 @@ + MockResponse::fixture('DiscountPositions/fetch-a-discount-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new FetchADiscountPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 1, + ); + + $response = $connector->send($request); + + $mockClient->assertSent(FetchADiscountPositionRequest::class); + expect($response->dto())->toBeInstanceOf(DiscountPositionDTO::class); +}); diff --git a/tests/Requests/DiscountPositions/FetchAListOfDiscountPositionsRequestTest.php b/tests/Requests/DiscountPositions/FetchAListOfDiscountPositionsRequestTest.php new file mode 100644 index 0000000..5890089 --- /dev/null +++ b/tests/Requests/DiscountPositions/FetchAListOfDiscountPositionsRequestTest.php @@ -0,0 +1,27 @@ + MockResponse::fixture('DiscountPositions/fetch-a-list-of-discount-positions'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $response = $connector->send(new FetchAListOfDiscountPositionsRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + limit: 2, + )); + + $mockClient->assertSent(FetchAListOfDiscountPositionsRequest::class); + expect($response->dto())->toBeInstanceOf(Collection::class) + ->and($response->dto()->count())->toBe(2); +}); diff --git a/tests/Requests/ItemPositions/CreateAnItemPositionRequestTest.php b/tests/Requests/ItemPositions/CreateAnItemPositionRequestTest.php new file mode 100644 index 0000000..3805d9b --- /dev/null +++ b/tests/Requests/ItemPositions/CreateAnItemPositionRequestTest.php @@ -0,0 +1,37 @@ + MockResponse::fixture('ItemPositions/create-an-item-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new CreateAnItemPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + position: new CreateItemPositionDTO( + amount: 1, + unit_id: 1, + account_id: 145, + tax_id: 29, + text: 'Test item position', + unit_price: 110, + discount_in_percent: '0', + article_id: 1, + ) + ); + + $response = $connector->send($request); + + $mockClient->assertSent(CreateAnItemPositionRequest::class); + expect($response->dto())->toBeInstanceOf(ItemPositionDTO::class); +}); diff --git a/tests/Requests/ItemPositions/DeleteAnItemPositionRequestTest.php b/tests/Requests/ItemPositions/DeleteAnItemPositionRequestTest.php new file mode 100644 index 0000000..e178b7e --- /dev/null +++ b/tests/Requests/ItemPositions/DeleteAnItemPositionRequestTest.php @@ -0,0 +1,26 @@ + MockResponse::fixture('ItemPositions/delete-an-item-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new DeleteAnItemPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 3, + ); + + $response = $connector->send($request); + + $mockClient->assertSent(DeleteAnItemPositionRequest::class); + expect($response->dto())->not()->toBeNull(); +}); diff --git a/tests/Requests/ItemPositions/EditAnItemPositionRequestTest.php b/tests/Requests/ItemPositions/EditAnItemPositionRequestTest.php new file mode 100644 index 0000000..d46496c --- /dev/null +++ b/tests/Requests/ItemPositions/EditAnItemPositionRequestTest.php @@ -0,0 +1,37 @@ + MockResponse::fixture('ItemPositions/edit-an-item-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new EditAnItemPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 1, + position: new EditItemPositionDTO( + amount: 1, + unit_id: 1, + account_id: 145, + tax_id: 29, + text: 'Test edited item position', + unit_price: 100, + discount_in_percent: '0', + ), + ); + + $response = $connector->send($request); + + $mockClient->assertSent(EditAnItemPositionRequest::class); + expect($response->dto())->toBeInstanceOf(ItemPositionDTO::class); +}); diff --git a/tests/Requests/ItemPositions/FetchAListOfItemPositionsRequestTest.php b/tests/Requests/ItemPositions/FetchAListOfItemPositionsRequestTest.php new file mode 100644 index 0000000..ae0ab13 --- /dev/null +++ b/tests/Requests/ItemPositions/FetchAListOfItemPositionsRequestTest.php @@ -0,0 +1,27 @@ + MockResponse::fixture('ItemPositions/fetch-a-list-of-item-positions'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $response = $connector->send(new FetchAListOfItemPositionsRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + limit: 2, + )); + + $mockClient->assertSent(FetchAListOfItemPositionsRequest::class); + expect($response->dto())->toBeInstanceOf(Collection::class) + ->and($response->dto()->count())->toBe(2); +}); diff --git a/tests/Requests/ItemPositions/FetchAnItemPositionRequestTest.php b/tests/Requests/ItemPositions/FetchAnItemPositionRequestTest.php new file mode 100644 index 0000000..dcde473 --- /dev/null +++ b/tests/Requests/ItemPositions/FetchAnItemPositionRequestTest.php @@ -0,0 +1,27 @@ + MockResponse::fixture('ItemPositions/fetch-an-item-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new FetchAnItemPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 1, + ); + + $response = $connector->send($request); + + $mockClient->assertSent(FetchAnItemPositionRequest::class); + expect($response->dto())->toBeInstanceOf(ItemPositionDTO::class); +}); diff --git a/tests/Requests/PagebreakPositions/CreateAPagebreakPositionRequestTest.php b/tests/Requests/PagebreakPositions/CreateAPagebreakPositionRequestTest.php new file mode 100644 index 0000000..36839d3 --- /dev/null +++ b/tests/Requests/PagebreakPositions/CreateAPagebreakPositionRequestTest.php @@ -0,0 +1,30 @@ + MockResponse::fixture('PagebreakPositions/create-a-pagebreak-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new CreateAPagebreakPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + position: new CreateEditPagebreakPositionDTO( + pagebreak: true, + ) + ); + + $response = $connector->send($request); + + $mockClient->assertSent(CreateAPagebreakPositionRequest::class); + expect($response->dto())->toBeInstanceOf(PagebreakPositionDTO::class); +}); diff --git a/tests/Requests/PagebreakPositions/DeleteAPagebreakPositionRequestTest.php b/tests/Requests/PagebreakPositions/DeleteAPagebreakPositionRequestTest.php new file mode 100644 index 0000000..d62085d --- /dev/null +++ b/tests/Requests/PagebreakPositions/DeleteAPagebreakPositionRequestTest.php @@ -0,0 +1,26 @@ + MockResponse::fixture('PagebreakPositions/delete-a-pagebreak-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new DeleteAPagebreakPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 2, + ); + + $response = $connector->send($request); + + $mockClient->assertSent(DeleteAPagebreakPositionRequest::class); + expect($response->dto())->not()->toBeNull(); +}); diff --git a/tests/Requests/PagebreakPositions/EditAPagebreakPositionRequestTest.php b/tests/Requests/PagebreakPositions/EditAPagebreakPositionRequestTest.php new file mode 100644 index 0000000..8401ece --- /dev/null +++ b/tests/Requests/PagebreakPositions/EditAPagebreakPositionRequestTest.php @@ -0,0 +1,31 @@ + MockResponse::fixture('PagebreakPositions/edit-a-pagebreak-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new EditAPagebreakPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 1, + position: new CreateEditPagebreakPositionDTO( + pagebreak: false, + ), + ); + + $response = $connector->send($request); + + $mockClient->assertSent(EditAPagebreakPositionRequest::class); + expect($response->dto())->toBeInstanceOf(PagebreakPositionDTO::class); +}); diff --git a/tests/Requests/PagebreakPositions/FetchAListOfPagebreakPositionsRequestTest.php b/tests/Requests/PagebreakPositions/FetchAListOfPagebreakPositionsRequestTest.php new file mode 100644 index 0000000..9222f71 --- /dev/null +++ b/tests/Requests/PagebreakPositions/FetchAListOfPagebreakPositionsRequestTest.php @@ -0,0 +1,27 @@ + MockResponse::fixture('PagebreakPositions/fetch-a-list-of-pagebreak-positions'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $response = $connector->send(new FetchAListOfPagebreakPositionsRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + limit: 2, + )); + + $mockClient->assertSent(FetchAListOfPagebreakPositionsRequest::class); + expect($response->dto())->toBeInstanceOf(Collection::class) + ->and($response->dto()->count())->toBe(2); +}); diff --git a/tests/Requests/PagebreakPositions/FetchAPagebreakPositionRequestTest.php b/tests/Requests/PagebreakPositions/FetchAPagebreakPositionRequestTest.php new file mode 100644 index 0000000..12c8230 --- /dev/null +++ b/tests/Requests/PagebreakPositions/FetchAPagebreakPositionRequestTest.php @@ -0,0 +1,27 @@ + MockResponse::fixture('PagebreakPositions/fetch-a-pagebreak-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new FetchAPagebreakPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 1, + ); + + $response = $connector->send($request); + + $mockClient->assertSent(FetchAPagebreakPositionRequest::class); + expect($response->dto())->toBeInstanceOf(PagebreakPositionDTO::class); +}); diff --git a/tests/Requests/SubPositions/CreateASubPositionRequestTest.php b/tests/Requests/SubPositions/CreateASubPositionRequestTest.php new file mode 100644 index 0000000..ab65b0f --- /dev/null +++ b/tests/Requests/SubPositions/CreateASubPositionRequestTest.php @@ -0,0 +1,31 @@ + MockResponse::fixture('SubPositions/create-a-sub-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new CreateASubPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + position: new CreateEditSubPositionDTO( + text: 'Test sub position', + show_pos_nr: true, + ) + ); + + $response = $connector->send($request); + + $mockClient->assertSent(CreateASubPositionRequest::class); + expect($response->dto())->toBeInstanceOf(SubPositionDTO::class); +}); diff --git a/tests/Requests/SubPositions/DeleteASubPositionRequestTest.php b/tests/Requests/SubPositions/DeleteASubPositionRequestTest.php new file mode 100644 index 0000000..4f2ba5f --- /dev/null +++ b/tests/Requests/SubPositions/DeleteASubPositionRequestTest.php @@ -0,0 +1,26 @@ + MockResponse::fixture('SubPositions/delete-a-sub-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new DeleteASubPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 2, + ); + + $response = $connector->send($request); + + $mockClient->assertSent(DeleteASubPositionRequest::class); + expect($response->dto())->not()->toBeNull(); +}); diff --git a/tests/Requests/SubPositions/EditASubPositionRequestTest.php b/tests/Requests/SubPositions/EditASubPositionRequestTest.php new file mode 100644 index 0000000..2c747d5 --- /dev/null +++ b/tests/Requests/SubPositions/EditASubPositionRequestTest.php @@ -0,0 +1,32 @@ + MockResponse::fixture('SubPositions/edit-a-sub-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new EditASubPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 1, + position: new CreateEditSubPositionDTO( + text: 'Test edited sub position', + show_pos_nr: true, + ), + ); + + $response = $connector->send($request); + + $mockClient->assertSent(EditASubPositionRequest::class); + expect($response->dto())->toBeInstanceOf(SubPositionDTO::class); +}); diff --git a/tests/Requests/SubPositions/FetchAListOfSubPositionsRequestTest.php b/tests/Requests/SubPositions/FetchAListOfSubPositionsRequestTest.php new file mode 100644 index 0000000..8f6b8fb --- /dev/null +++ b/tests/Requests/SubPositions/FetchAListOfSubPositionsRequestTest.php @@ -0,0 +1,27 @@ + MockResponse::fixture('SubPositions/fetch-a-list-of-sub-positions'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $response = $connector->send(new FetchAListOfSubPositionsRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + limit: 2, + )); + + $mockClient->assertSent(FetchAListOfSubPositionsRequest::class); + expect($response->dto())->toBeInstanceOf(Collection::class) + ->and($response->dto()->count())->toBe(2); +}); diff --git a/tests/Requests/SubPositions/FetchASubPositionRequestTest.php b/tests/Requests/SubPositions/FetchASubPositionRequestTest.php new file mode 100644 index 0000000..52abe21 --- /dev/null +++ b/tests/Requests/SubPositions/FetchASubPositionRequestTest.php @@ -0,0 +1,27 @@ + MockResponse::fixture('SubPositions/fetch-a-sub-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new FetchASubPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 1, + ); + + $response = $connector->send($request); + + $mockClient->assertSent(FetchASubPositionRequest::class); + expect($response->dto())->toBeInstanceOf(SubPositionDTO::class); +}); diff --git a/tests/Requests/SubtotalPositions/CreateASubtotalPositionRequestTest.php b/tests/Requests/SubtotalPositions/CreateASubtotalPositionRequestTest.php new file mode 100644 index 0000000..c4afb40 --- /dev/null +++ b/tests/Requests/SubtotalPositions/CreateASubtotalPositionRequestTest.php @@ -0,0 +1,30 @@ + MockResponse::fixture('SubtotalPositions/create-a-subtotal-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new CreateASubtotalPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + position: new CreateEditSubtotalPositionDTO( + text: 'Test subtotal position', + ) + ); + + $response = $connector->send($request); + + $mockClient->assertSent(CreateASubtotalPositionRequest::class); + expect($response->dto())->toBeInstanceOf(SubtotalPositionDTO::class); +}); diff --git a/tests/Requests/SubtotalPositions/DeleteASubtotalPositionRequestTest.php b/tests/Requests/SubtotalPositions/DeleteASubtotalPositionRequestTest.php new file mode 100644 index 0000000..281af18 --- /dev/null +++ b/tests/Requests/SubtotalPositions/DeleteASubtotalPositionRequestTest.php @@ -0,0 +1,26 @@ + MockResponse::fixture('SubtotalPositions/delete-a-subtotal-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new DeleteASubtotalPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 2, + ); + + $response = $connector->send($request); + + $mockClient->assertSent(DeleteASubtotalPositionRequest::class); + expect($response->dto())->not()->toBeNull(); +}); diff --git a/tests/Requests/SubtotalPositions/EditASubtotalPositionRequestTest.php b/tests/Requests/SubtotalPositions/EditASubtotalPositionRequestTest.php new file mode 100644 index 0000000..8952e22 --- /dev/null +++ b/tests/Requests/SubtotalPositions/EditASubtotalPositionRequestTest.php @@ -0,0 +1,31 @@ + MockResponse::fixture('SubtotalPositions/edit-a-subtotal-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new EditASubtotalPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 1, + position: new CreateEditSubtotalPositionDTO( + text: 'Test edited subtotal position', + ), + ); + + $response = $connector->send($request); + + $mockClient->assertSent(EditASubtotalPositionRequest::class); + expect($response->dto())->toBeInstanceOf(SubtotalPositionDTO::class); +}); diff --git a/tests/Requests/SubtotalPositions/FetchAListOfSubtotalPositionsRequestTest.php b/tests/Requests/SubtotalPositions/FetchAListOfSubtotalPositionsRequestTest.php new file mode 100644 index 0000000..5560297 --- /dev/null +++ b/tests/Requests/SubtotalPositions/FetchAListOfSubtotalPositionsRequestTest.php @@ -0,0 +1,27 @@ + MockResponse::fixture('SubtotalPositions/fetch-a-list-of-subtotal-positions'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $response = $connector->send(new FetchAListOfSubtotalPositionsRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + limit: 2, + )); + + $mockClient->assertSent(FetchAListOfSubtotalPositionsRequest::class); + expect($response->dto())->toBeInstanceOf(Collection::class) + ->and($response->dto()->count())->toBe(2); +}); diff --git a/tests/Requests/SubtotalPositions/FetchASubtotalPositionRequestTest.php b/tests/Requests/SubtotalPositions/FetchASubtotalPositionRequestTest.php new file mode 100644 index 0000000..3eff09a --- /dev/null +++ b/tests/Requests/SubtotalPositions/FetchASubtotalPositionRequestTest.php @@ -0,0 +1,27 @@ + MockResponse::fixture('SubtotalPositions/fetch-a-subtotal-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new FetchASubtotalPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 1, + ); + + $response = $connector->send($request); + + $mockClient->assertSent(FetchASubtotalPositionRequest::class); + expect($response->dto())->toBeInstanceOf(SubtotalPositionDTO::class); +}); diff --git a/tests/Requests/TextPositions/CreateATextPositionRequestTest.php b/tests/Requests/TextPositions/CreateATextPositionRequestTest.php new file mode 100644 index 0000000..2cc0b0f --- /dev/null +++ b/tests/Requests/TextPositions/CreateATextPositionRequestTest.php @@ -0,0 +1,31 @@ + MockResponse::fixture('TextPositions/create-a-text-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new CreateATextPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + position: new CreateEditTextPositionDTO( + text: 'Test text position', + show_pos_nr: true, + ) + ); + + $response = $connector->send($request); + + $mockClient->assertSent(CreateATextPositionRequest::class); + expect($response->dto())->toBeInstanceOf(TextPositionDTO::class); +}); diff --git a/tests/Requests/TextPositions/DeleteATextPositionRequestTest.php b/tests/Requests/TextPositions/DeleteATextPositionRequestTest.php new file mode 100644 index 0000000..4b178fb --- /dev/null +++ b/tests/Requests/TextPositions/DeleteATextPositionRequestTest.php @@ -0,0 +1,26 @@ + MockResponse::fixture('TextPositions/delete-a-text-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new DeleteATextPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 1, + ); + + $response = $connector->send($request); + + $mockClient->assertSent(DeleteATextPositionRequest::class); + expect($response->dto())->not()->toBeNull(); +}); diff --git a/tests/Requests/TextPositions/EditATextPositionRequestTest.php b/tests/Requests/TextPositions/EditATextPositionRequestTest.php new file mode 100644 index 0000000..a7ee576 --- /dev/null +++ b/tests/Requests/TextPositions/EditATextPositionRequestTest.php @@ -0,0 +1,32 @@ + MockResponse::fixture('TextPositions/edit-a-text-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new EditATextPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 1, + position: new CreateEditTextPositionDTO( + text: 'Test edited text position', + show_pos_nr: true, + ), + ); + + $response = $connector->send($request); + + $mockClient->assertSent(EditATextPositionRequest::class); + expect($response->dto())->toBeInstanceOf(TextPositionDTO::class); +}); diff --git a/tests/Requests/TextPositions/FetchAListOfTextPositionsRequestTest.php b/tests/Requests/TextPositions/FetchAListOfTextPositionsRequestTest.php new file mode 100644 index 0000000..5bc8839 --- /dev/null +++ b/tests/Requests/TextPositions/FetchAListOfTextPositionsRequestTest.php @@ -0,0 +1,27 @@ + MockResponse::fixture('TextPositions/fetch-a-list-of-text-positions'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $response = $connector->send(new FetchAListOfTextPositionsRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + limit: 2, + )); + + $mockClient->assertSent(FetchAListOfTextPositionsRequest::class); + expect($response->dto())->toBeInstanceOf(Collection::class) + ->and($response->dto()->count())->toBe(2); +}); diff --git a/tests/Requests/TextPositions/FetchATextPositionRequestTest.php b/tests/Requests/TextPositions/FetchATextPositionRequestTest.php new file mode 100644 index 0000000..2697d79 --- /dev/null +++ b/tests/Requests/TextPositions/FetchATextPositionRequestTest.php @@ -0,0 +1,27 @@ + MockResponse::fixture('TextPositions/fetch-a-text-position'), + ]); + + $connector = new BexioConnector; + $connector->withMockClient($mockClient); + + $request = new FetchATextPositionRequest( + kbDocumentType: 'kb_invoice', + documentId: 2, + positionId: 1, + ); + + $response = $connector->send($request); + + $mockClient->assertSent(FetchATextPositionRequest::class); + expect($response->dto())->toBeInstanceOf(TextPositionDTO::class); +}); From 36f299f5f2f0dce26cc677ecce094a0709ccf9d3 Mon Sep 17 00:00:00 2001 From: kaspernowak <54978466+kaspernowak@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:38:12 +0000 Subject: [PATCH 2/2] Fix styling --- src/Dto/DefaultPositions/AddDefaultPositionDTO.php | 1 + src/Dto/DefaultPositions/CreateEditDefaultPositionDTO.php | 1 + src/Dto/DefaultPositions/DefaultPositionDTO.php | 4 +++- src/Dto/DiscountPositions/AddDiscountPositionDTO.php | 1 + src/Dto/DiscountPositions/CreateEditDiscountPositionDTO.php | 1 + src/Dto/DiscountPositions/DiscountPositionDTO.php | 2 ++ src/Dto/Invoices/SendInvoiceDTO.php | 1 - src/Dto/ItemPositions/AddItemPositionDTO.php | 1 + src/Dto/ItemPositions/CreateItemPositionDTO.php | 1 + src/Dto/ItemPositions/EditItemPositionDTO.php | 1 + src/Dto/ItemPositions/ItemPositionDTO.php | 4 +++- src/Dto/PagebreakPositions/AddPagebreakPositionDTO.php | 1 + .../PagebreakPositions/CreateEditPagebreakPositionDTO.php | 1 + src/Dto/PagebreakPositions/PagebreakPositionDTO.php | 4 +++- src/Dto/SubPositions/CreateEditSubPositionDTO.php | 1 + src/Dto/SubPositions/SubPositionDTO.php | 4 +++- src/Dto/SubtotalPositions/AddSubtotalPositionDTO.php | 1 + src/Dto/SubtotalPositions/CreateEditSubtotalPositionDTO.php | 1 + src/Dto/SubtotalPositions/SubtotalPositionDTO.php | 4 +++- src/Dto/TextPositions/AddTextPositionDTO.php | 1 + src/Dto/TextPositions/CreateEditTextPositionDTO.php | 1 + src/Dto/TextPositions/TextPositionDTO.php | 4 +++- .../DefaultPositions/DeleteADefaultPositionRequest.php | 2 -- .../DefaultPositions/FetchADefaultPositionRequest.php | 1 - .../DiscountPositions/CreateADiscountPositionRequest.php | 2 ++ .../DiscountPositions/DeleteADiscountPositionRequest.php | 1 + .../DiscountPositions/EditADiscountPositionRequest.php | 2 ++ .../DiscountPositions/FetchADiscountPositionRequest.php | 1 + .../FetchAListOfDiscountPositionsRequest.php | 1 + src/Requests/Invoices/CreateAnInvoiceRequestNew.php | 3 ++- src/Requests/Invoices/SendAnInvoiceRequest.php | 5 ++--- src/Requests/ItemPositions/DeleteAnItemPositionRequest.php | 1 + .../ItemPositions/FetchAListOfItemPositionsRequest.php | 1 + src/Requests/ItemPositions/FetchAnItemPositionRequest.php | 1 + .../PagebreakPositions/CreateAPagebreakPositionRequest.php | 2 ++ .../PagebreakPositions/DeleteAPagebreakPositionRequest.php | 1 + .../PagebreakPositions/EditAPagebreakPositionRequest.php | 2 ++ .../FetchAListOfPagebreakPositionsRequest.php | 1 + .../PagebreakPositions/FetchAPagebreakPositionRequest.php | 1 + src/Requests/SubPositions/CreateASubPositionRequest.php | 2 ++ src/Requests/SubPositions/DeleteASubPositionRequest.php | 1 + src/Requests/SubPositions/EditASubPositionRequest.php | 2 ++ .../SubPositions/FetchAListOfSubPositionsRequest.php | 1 + src/Requests/SubPositions/FetchASubPositionRequest.php | 1 + .../SubtotalPositions/CreateASubtotalPositionRequest.php | 2 ++ .../SubtotalPositions/DeleteASubtotalPositionRequest.php | 1 + .../SubtotalPositions/EditASubtotalPositionRequest.php | 2 ++ .../FetchAListOfSubtotalPositionsRequest.php | 1 + .../SubtotalPositions/FetchASubtotalPositionRequest.php | 1 + src/Requests/TextPositions/DeleteATextPositionRequest.php | 1 + .../TextPositions/FetchAListOfTextPositionsRequest.php | 1 + src/Requests/TextPositions/FetchATextPositionRequest.php | 1 + .../FetchAListOfDefaultPositionsRequestTest.php | 1 - .../FetchAListOfDiscountPositionsRequestTest.php | 1 - .../ItemPositions/FetchAListOfItemPositionsRequestTest.php | 1 - .../FetchAListOfPagebreakPositionsRequestTest.php | 1 - .../SubPositions/FetchAListOfSubPositionsRequestTest.php | 1 - .../FetchAListOfSubtotalPositionsRequestTest.php | 1 - .../TextPositions/FetchAListOfTextPositionsRequestTest.php | 1 - 59 files changed, 72 insertions(+), 21 deletions(-) diff --git a/src/Dto/DefaultPositions/AddDefaultPositionDTO.php b/src/Dto/DefaultPositions/AddDefaultPositionDTO.php index c7b71af..7c85d4d 100644 --- a/src/Dto/DefaultPositions/AddDefaultPositionDTO.php +++ b/src/Dto/DefaultPositions/AddDefaultPositionDTO.php @@ -28,6 +28,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( amount: Arr::get($data, 'amount'), unit_id: Arr::get($data, 'unit_id'), diff --git a/src/Dto/DefaultPositions/CreateEditDefaultPositionDTO.php b/src/Dto/DefaultPositions/CreateEditDefaultPositionDTO.php index 3f794ab..fc0ae08 100644 --- a/src/Dto/DefaultPositions/CreateEditDefaultPositionDTO.php +++ b/src/Dto/DefaultPositions/CreateEditDefaultPositionDTO.php @@ -28,6 +28,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( amount: Arr::get($data, 'amount'), unit_id: Arr::get($data, 'unit_id'), diff --git a/src/Dto/DefaultPositions/DefaultPositionDTO.php b/src/Dto/DefaultPositions/DefaultPositionDTO.php index 20d5fa6..925d662 100644 --- a/src/Dto/DefaultPositions/DefaultPositionDTO.php +++ b/src/Dto/DefaultPositions/DefaultPositionDTO.php @@ -25,7 +25,7 @@ public function __construct( public ?string $discount_in_percent, public ?string $position_total, public ?int $parent_id, - public ?string $type = 'KbPositionCustom', + public ?string $type, public ?string $pos, public ?string $internal_pos, public ?bool $is_optional, @@ -37,6 +37,7 @@ public static function fromResponse(Response $response): self throw new Exception('Failed to create DTO from Response'); } $data = $response->json(); + return self::fromArray($data); } @@ -45,6 +46,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( id: Arr::get($data, 'id'), amount: Arr::get($data, 'amount'), diff --git a/src/Dto/DiscountPositions/AddDiscountPositionDTO.php b/src/Dto/DiscountPositions/AddDiscountPositionDTO.php index b8cca87..6766c51 100644 --- a/src/Dto/DiscountPositions/AddDiscountPositionDTO.php +++ b/src/Dto/DiscountPositions/AddDiscountPositionDTO.php @@ -24,6 +24,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( text: Arr::get($data, 'text'), is_percentual: Arr::get($data, 'is_percentual'), diff --git a/src/Dto/DiscountPositions/CreateEditDiscountPositionDTO.php b/src/Dto/DiscountPositions/CreateEditDiscountPositionDTO.php index eb69016..bf0eadd 100644 --- a/src/Dto/DiscountPositions/CreateEditDiscountPositionDTO.php +++ b/src/Dto/DiscountPositions/CreateEditDiscountPositionDTO.php @@ -24,6 +24,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( text: Arr::get($data, 'text'), is_percentual: Arr::get($data, 'is_percentual'), diff --git a/src/Dto/DiscountPositions/DiscountPositionDTO.php b/src/Dto/DiscountPositions/DiscountPositionDTO.php index 00d258c..379b338 100644 --- a/src/Dto/DiscountPositions/DiscountPositionDTO.php +++ b/src/Dto/DiscountPositions/DiscountPositionDTO.php @@ -27,6 +27,7 @@ public static function fromResponse(Response $response): self throw new Exception('Failed to create DTO from Response'); } $data = $response->json(); + return self::fromArray($data); } @@ -35,6 +36,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( id: Arr::get($data, 'id'), text: Arr::get($data, 'text'), diff --git a/src/Dto/Invoices/SendInvoiceDTO.php b/src/Dto/Invoices/SendInvoiceDTO.php index 5dbfd84..301ca01 100644 --- a/src/Dto/Invoices/SendInvoiceDTO.php +++ b/src/Dto/Invoices/SendInvoiceDTO.php @@ -4,7 +4,6 @@ use Exception; use Illuminate\Support\Arr; -use Saloon\Http\Response; use Spatie\LaravelData\Data; class SendInvoiceDTO extends Data diff --git a/src/Dto/ItemPositions/AddItemPositionDTO.php b/src/Dto/ItemPositions/AddItemPositionDTO.php index 2ee5813..02161a9 100644 --- a/src/Dto/ItemPositions/AddItemPositionDTO.php +++ b/src/Dto/ItemPositions/AddItemPositionDTO.php @@ -29,6 +29,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( amount: Arr::get($data, 'amount'), unit_id: Arr::get($data, 'unit_id'), diff --git a/src/Dto/ItemPositions/CreateItemPositionDTO.php b/src/Dto/ItemPositions/CreateItemPositionDTO.php index d76c23c..dbaecf6 100644 --- a/src/Dto/ItemPositions/CreateItemPositionDTO.php +++ b/src/Dto/ItemPositions/CreateItemPositionDTO.php @@ -29,6 +29,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( amount: Arr::get($data, 'amount'), unit_id: Arr::get($data, 'unit_id'), diff --git a/src/Dto/ItemPositions/EditItemPositionDTO.php b/src/Dto/ItemPositions/EditItemPositionDTO.php index 90bdcb0..dfd371b 100644 --- a/src/Dto/ItemPositions/EditItemPositionDTO.php +++ b/src/Dto/ItemPositions/EditItemPositionDTO.php @@ -28,6 +28,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( amount: Arr::get($data, 'amount'), unit_id: Arr::get($data, 'unit_id'), diff --git a/src/Dto/ItemPositions/ItemPositionDTO.php b/src/Dto/ItemPositions/ItemPositionDTO.php index 543d592..0e27df0 100644 --- a/src/Dto/ItemPositions/ItemPositionDTO.php +++ b/src/Dto/ItemPositions/ItemPositionDTO.php @@ -26,7 +26,7 @@ public function __construct( public ?string $position_total, public ?int $parent_id, public ?int $article_id, - public ?string $type = 'KbPositionArticle', + public ?string $type, public ?string $pos, public ?string $internal_pos, public ?bool $is_optional, @@ -38,6 +38,7 @@ public static function fromResponse(Response $response): self throw new Exception('Failed to create DTO from Response'); } $data = $response->json(); + return self::fromArray($data); } @@ -46,6 +47,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( id: Arr::get($data, 'id'), amount: Arr::get($data, 'amount'), diff --git a/src/Dto/PagebreakPositions/AddPagebreakPositionDTO.php b/src/Dto/PagebreakPositions/AddPagebreakPositionDTO.php index 1cf0720..db1acae 100644 --- a/src/Dto/PagebreakPositions/AddPagebreakPositionDTO.php +++ b/src/Dto/PagebreakPositions/AddPagebreakPositionDTO.php @@ -23,6 +23,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( pagebreak: Arr::get($data, 'pagebreak'), type: Arr::get($data, 'type', 'KbPositionPagebreak'), diff --git a/src/Dto/PagebreakPositions/CreateEditPagebreakPositionDTO.php b/src/Dto/PagebreakPositions/CreateEditPagebreakPositionDTO.php index b959a9a..829bffb 100644 --- a/src/Dto/PagebreakPositions/CreateEditPagebreakPositionDTO.php +++ b/src/Dto/PagebreakPositions/CreateEditPagebreakPositionDTO.php @@ -22,6 +22,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( pagebreak: Arr::get($data, 'pagebreak'), parent_id: Arr::get($data, 'parent_id'), diff --git a/src/Dto/PagebreakPositions/PagebreakPositionDTO.php b/src/Dto/PagebreakPositions/PagebreakPositionDTO.php index 0904e92..661a46e 100644 --- a/src/Dto/PagebreakPositions/PagebreakPositionDTO.php +++ b/src/Dto/PagebreakPositions/PagebreakPositionDTO.php @@ -16,7 +16,7 @@ public function __construct( public ?int $id, public ?string $internal_pos, public ?bool $is_optional, - public ?string $type = 'KbPositionPagebreak', + public ?string $type, public ?int $parent_id, ) {} @@ -26,6 +26,7 @@ public static function fromResponse(Response $response): self throw new Exception('Failed to create DTO from Response'); } $data = $response->json(); + return self::fromArray($data); } @@ -34,6 +35,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( id: Arr::get($data, 'id'), internal_pos: Arr::get($data, 'internal_pos'), diff --git a/src/Dto/SubPositions/CreateEditSubPositionDTO.php b/src/Dto/SubPositions/CreateEditSubPositionDTO.php index 9e99096..39439bf 100644 --- a/src/Dto/SubPositions/CreateEditSubPositionDTO.php +++ b/src/Dto/SubPositions/CreateEditSubPositionDTO.php @@ -22,6 +22,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( text: Arr::get($data, 'text'), show_pos_nr: Arr::get($data, 'show_pos_nr'), diff --git a/src/Dto/SubPositions/SubPositionDTO.php b/src/Dto/SubPositions/SubPositionDTO.php index de78147..a8fdf52 100644 --- a/src/Dto/SubPositions/SubPositionDTO.php +++ b/src/Dto/SubPositions/SubPositionDTO.php @@ -21,7 +21,7 @@ public function __construct( public ?bool $is_optional, public ?string $total_sum, public ?bool $show_pos_prices, - public ?string $type = 'KbPositionSubposition', + public ?string $type, public ?int $parent_id, ) {} @@ -31,6 +31,7 @@ public static function fromResponse(Response $response): self throw new Exception('Failed to create DTO from Response'); } $data = $response->json(); + return self::fromArray($data); } @@ -39,6 +40,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( id: Arr::get($data, 'id'), text: Arr::get($data, 'text'), diff --git a/src/Dto/SubtotalPositions/AddSubtotalPositionDTO.php b/src/Dto/SubtotalPositions/AddSubtotalPositionDTO.php index 47f5001..fd7ce53 100644 --- a/src/Dto/SubtotalPositions/AddSubtotalPositionDTO.php +++ b/src/Dto/SubtotalPositions/AddSubtotalPositionDTO.php @@ -22,6 +22,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( text: Arr::get($data, 'text'), type: Arr::get($data, 'type', 'KbPositionSubtotal'), diff --git a/src/Dto/SubtotalPositions/CreateEditSubtotalPositionDTO.php b/src/Dto/SubtotalPositions/CreateEditSubtotalPositionDTO.php index a766f9c..16a2922 100644 --- a/src/Dto/SubtotalPositions/CreateEditSubtotalPositionDTO.php +++ b/src/Dto/SubtotalPositions/CreateEditSubtotalPositionDTO.php @@ -21,6 +21,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( text: Arr::get($data, 'text'), ); diff --git a/src/Dto/SubtotalPositions/SubtotalPositionDTO.php b/src/Dto/SubtotalPositions/SubtotalPositionDTO.php index 7601b33..30d94eb 100644 --- a/src/Dto/SubtotalPositions/SubtotalPositionDTO.php +++ b/src/Dto/SubtotalPositions/SubtotalPositionDTO.php @@ -18,7 +18,7 @@ public function __construct( public ?string $value, public ?string $internal_pos, public ?bool $is_optional, - public ?string $type = 'KbPositionSubtotal', + public ?string $type, public ?int $parent_id, ) {} @@ -28,6 +28,7 @@ public static function fromResponse(Response $response): self throw new Exception('Failed to create DTO from Response'); } $data = $response->json(); + return self::fromArray($data); } @@ -36,6 +37,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( id: Arr::get($data, 'id'), text: Arr::get($data, 'text'), diff --git a/src/Dto/TextPositions/AddTextPositionDTO.php b/src/Dto/TextPositions/AddTextPositionDTO.php index 749f44e..9de60bb 100644 --- a/src/Dto/TextPositions/AddTextPositionDTO.php +++ b/src/Dto/TextPositions/AddTextPositionDTO.php @@ -23,6 +23,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( text: Arr::get($data, 'text'), show_pos_nr: Arr::get($data, 'show_pos_nr'), diff --git a/src/Dto/TextPositions/CreateEditTextPositionDTO.php b/src/Dto/TextPositions/CreateEditTextPositionDTO.php index 78cc60b..32daefb 100644 --- a/src/Dto/TextPositions/CreateEditTextPositionDTO.php +++ b/src/Dto/TextPositions/CreateEditTextPositionDTO.php @@ -23,6 +23,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( text: Arr::get($data, 'text'), show_pos_nr: Arr::get($data, 'show_pos_nr'), diff --git a/src/Dto/TextPositions/TextPositionDTO.php b/src/Dto/TextPositions/TextPositionDTO.php index 745fd7d..6d0bdff 100644 --- a/src/Dto/TextPositions/TextPositionDTO.php +++ b/src/Dto/TextPositions/TextPositionDTO.php @@ -19,7 +19,7 @@ public function __construct( public ?string $pos, public ?string $internal_pos, public ?bool $is_optional, - public ?string $type = 'KbPositionText', + public ?string $type, public ?int $parent_id, ) {} @@ -29,6 +29,7 @@ public static function fromResponse(Response $response): self throw new Exception('Failed to create DTO from Response'); } $data = $response->json(); + return self::fromArray($data); } @@ -37,6 +38,7 @@ public static function fromArray(array $data): self if (! $data) { throw new Exception('Unable to create DTO. Data missing from response.'); } + return new self( id: Arr::get($data, 'id'), text: Arr::get($data, 'text'), diff --git a/src/Requests/DefaultPositions/DeleteADefaultPositionRequest.php b/src/Requests/DefaultPositions/DeleteADefaultPositionRequest.php index f35a898..7bdcd80 100644 --- a/src/Requests/DefaultPositions/DeleteADefaultPositionRequest.php +++ b/src/Requests/DefaultPositions/DeleteADefaultPositionRequest.php @@ -2,9 +2,7 @@ namespace CodebarAg\Bexio\Requests\DefaultPositions; -use CodebarAg\Bexio\Dto\DefaultPositions\DefaultPositionDTO; use Exception; -use Saloon\Contracts\Body\HasBody; use Saloon\Enums\Method; use Saloon\Http\Request; use Saloon\Http\Response; diff --git a/src/Requests/DefaultPositions/FetchADefaultPositionRequest.php b/src/Requests/DefaultPositions/FetchADefaultPositionRequest.php index e01b560..73d635e 100644 --- a/src/Requests/DefaultPositions/FetchADefaultPositionRequest.php +++ b/src/Requests/DefaultPositions/FetchADefaultPositionRequest.php @@ -4,7 +4,6 @@ use CodebarAg\Bexio\Dto\DefaultPositions\DefaultPositionDTO; use Exception; -use Saloon\Contracts\Body\HasBody; use Saloon\Enums\Method; use Saloon\Http\Request; use Saloon\Http\Response; diff --git a/src/Requests/DiscountPositions/CreateADiscountPositionRequest.php b/src/Requests/DiscountPositions/CreateADiscountPositionRequest.php index 38c21f0..23be81a 100644 --- a/src/Requests/DiscountPositions/CreateADiscountPositionRequest.php +++ b/src/Requests/DiscountPositions/CreateADiscountPositionRequest.php @@ -34,6 +34,7 @@ protected function defaultBody(): array if (! $body instanceof CreateEditDiscountPositionDTO) { $body = CreateEditDiscountPositionDTO::fromArray($body); } + return $body->toArray(); } @@ -42,6 +43,7 @@ public function createDtoFromResponse(Response $response): DiscountPositionDTO if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return DiscountPositionDTO::fromArray($response->json()); } } diff --git a/src/Requests/DiscountPositions/DeleteADiscountPositionRequest.php b/src/Requests/DiscountPositions/DeleteADiscountPositionRequest.php index dac8615..fd79fce 100644 --- a/src/Requests/DiscountPositions/DeleteADiscountPositionRequest.php +++ b/src/Requests/DiscountPositions/DeleteADiscountPositionRequest.php @@ -27,6 +27,7 @@ public function createDtoFromResponse(Response $response): mixed if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return $response->json(); } } diff --git a/src/Requests/DiscountPositions/EditADiscountPositionRequest.php b/src/Requests/DiscountPositions/EditADiscountPositionRequest.php index 22f789a..a4565a8 100644 --- a/src/Requests/DiscountPositions/EditADiscountPositionRequest.php +++ b/src/Requests/DiscountPositions/EditADiscountPositionRequest.php @@ -35,6 +35,7 @@ protected function defaultBody(): array if (! $body instanceof CreateEditDiscountPositionDTO) { $body = CreateEditDiscountPositionDTO::fromArray($body); } + return $body->toArray(); } @@ -43,6 +44,7 @@ public function createDtoFromResponse(Response $response): DiscountPositionDTO if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return DiscountPositionDTO::fromArray($response->json()); } } diff --git a/src/Requests/DiscountPositions/FetchADiscountPositionRequest.php b/src/Requests/DiscountPositions/FetchADiscountPositionRequest.php index a920f7a..df56838 100644 --- a/src/Requests/DiscountPositions/FetchADiscountPositionRequest.php +++ b/src/Requests/DiscountPositions/FetchADiscountPositionRequest.php @@ -28,6 +28,7 @@ public function createDtoFromResponse(Response $response): DiscountPositionDTO if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return DiscountPositionDTO::fromArray($response->json()); } } diff --git a/src/Requests/DiscountPositions/FetchAListOfDiscountPositionsRequest.php b/src/Requests/DiscountPositions/FetchAListOfDiscountPositionsRequest.php index cda5230..4421897 100644 --- a/src/Requests/DiscountPositions/FetchAListOfDiscountPositionsRequest.php +++ b/src/Requests/DiscountPositions/FetchAListOfDiscountPositionsRequest.php @@ -43,6 +43,7 @@ public function createDtoFromResponse(Response $response): Collection foreach ($res as $position) { $positions->push(DiscountPositionDTO::fromArray($position)); } + return $positions; } } diff --git a/src/Requests/Invoices/CreateAnInvoiceRequestNew.php b/src/Requests/Invoices/CreateAnInvoiceRequestNew.php index 99faead..00b27d3 100644 --- a/src/Requests/Invoices/CreateAnInvoiceRequestNew.php +++ b/src/Requests/Invoices/CreateAnInvoiceRequestNew.php @@ -38,8 +38,9 @@ protected function defaultBody(): array if (! $body instanceof CreateInvoiceDTO) { $body = CreateInvoiceDTO::fromArray($body); } + // Filter out all null values so Bexio does not see e.g. document_nr if null - return array_filter($body->toArray(), fn($v) => $v !== null); + return array_filter($body->toArray(), fn ($v) => $v !== null); } public function createDtoFromResponse(Response $response): InvoiceDTO diff --git a/src/Requests/Invoices/SendAnInvoiceRequest.php b/src/Requests/Invoices/SendAnInvoiceRequest.php index 608b18d..9e040d3 100644 --- a/src/Requests/Invoices/SendAnInvoiceRequest.php +++ b/src/Requests/Invoices/SendAnInvoiceRequest.php @@ -2,14 +2,13 @@ namespace CodebarAg\Bexio\Requests\Invoices; -use Exception; -use CodebarAg\Bexio\Dto\Invoices\InvoiceSentDTO; use CodebarAg\Bexio\Dto\Invoices\SendInvoiceDTO; +use Exception; +use Saloon\Contracts\Body\HasBody; use Saloon\Enums\Method; use Saloon\Http\Request; use Saloon\Http\Response; use Saloon\Traits\Body\HasJsonBody; -use Saloon\Contracts\Body\HasBody; /** * Send an invoice by email diff --git a/src/Requests/ItemPositions/DeleteAnItemPositionRequest.php b/src/Requests/ItemPositions/DeleteAnItemPositionRequest.php index 18cf53b..6838bb7 100644 --- a/src/Requests/ItemPositions/DeleteAnItemPositionRequest.php +++ b/src/Requests/ItemPositions/DeleteAnItemPositionRequest.php @@ -27,6 +27,7 @@ public function createDtoFromResponse(Response $response): mixed if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return $response->json(); } } diff --git a/src/Requests/ItemPositions/FetchAListOfItemPositionsRequest.php b/src/Requests/ItemPositions/FetchAListOfItemPositionsRequest.php index f5b0e59..e7b77ac 100644 --- a/src/Requests/ItemPositions/FetchAListOfItemPositionsRequest.php +++ b/src/Requests/ItemPositions/FetchAListOfItemPositionsRequest.php @@ -43,6 +43,7 @@ public function createDtoFromResponse(Response $response): Collection foreach ($res as $position) { $positions->push(ItemPositionDTO::fromArray($position)); } + return $positions; } } diff --git a/src/Requests/ItemPositions/FetchAnItemPositionRequest.php b/src/Requests/ItemPositions/FetchAnItemPositionRequest.php index 555202f..6cfa259 100644 --- a/src/Requests/ItemPositions/FetchAnItemPositionRequest.php +++ b/src/Requests/ItemPositions/FetchAnItemPositionRequest.php @@ -28,6 +28,7 @@ public function createDtoFromResponse(Response $response): ItemPositionDTO if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return ItemPositionDTO::fromArray($response->json()); } } diff --git a/src/Requests/PagebreakPositions/CreateAPagebreakPositionRequest.php b/src/Requests/PagebreakPositions/CreateAPagebreakPositionRequest.php index 1823bef..e7962ad 100644 --- a/src/Requests/PagebreakPositions/CreateAPagebreakPositionRequest.php +++ b/src/Requests/PagebreakPositions/CreateAPagebreakPositionRequest.php @@ -34,6 +34,7 @@ protected function defaultBody(): array if (! $body instanceof CreateEditPagebreakPositionDTO) { $body = CreateEditPagebreakPositionDTO::fromArray($body); } + return $body->toArray(); } @@ -42,6 +43,7 @@ public function createDtoFromResponse(Response $response): PagebreakPositionDTO if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return PagebreakPositionDTO::fromArray($response->json()); } } diff --git a/src/Requests/PagebreakPositions/DeleteAPagebreakPositionRequest.php b/src/Requests/PagebreakPositions/DeleteAPagebreakPositionRequest.php index 9a59f6f..b6a74f9 100644 --- a/src/Requests/PagebreakPositions/DeleteAPagebreakPositionRequest.php +++ b/src/Requests/PagebreakPositions/DeleteAPagebreakPositionRequest.php @@ -27,6 +27,7 @@ public function createDtoFromResponse(Response $response): mixed if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return $response->json(); } } diff --git a/src/Requests/PagebreakPositions/EditAPagebreakPositionRequest.php b/src/Requests/PagebreakPositions/EditAPagebreakPositionRequest.php index 34ce97a..4328a78 100644 --- a/src/Requests/PagebreakPositions/EditAPagebreakPositionRequest.php +++ b/src/Requests/PagebreakPositions/EditAPagebreakPositionRequest.php @@ -35,6 +35,7 @@ protected function defaultBody(): array if (! $body instanceof CreateEditPagebreakPositionDTO) { $body = CreateEditPagebreakPositionDTO::fromArray($body); } + return $body->toArray(); } @@ -43,6 +44,7 @@ public function createDtoFromResponse(Response $response): PagebreakPositionDTO if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return PagebreakPositionDTO::fromArray($response->json()); } } diff --git a/src/Requests/PagebreakPositions/FetchAListOfPagebreakPositionsRequest.php b/src/Requests/PagebreakPositions/FetchAListOfPagebreakPositionsRequest.php index 7de7426..2e9b6e3 100644 --- a/src/Requests/PagebreakPositions/FetchAListOfPagebreakPositionsRequest.php +++ b/src/Requests/PagebreakPositions/FetchAListOfPagebreakPositionsRequest.php @@ -43,6 +43,7 @@ public function createDtoFromResponse(Response $response): Collection foreach ($res as $position) { $positions->push(PagebreakPositionDTO::fromArray($position)); } + return $positions; } } diff --git a/src/Requests/PagebreakPositions/FetchAPagebreakPositionRequest.php b/src/Requests/PagebreakPositions/FetchAPagebreakPositionRequest.php index 46c97f0..baae86f 100644 --- a/src/Requests/PagebreakPositions/FetchAPagebreakPositionRequest.php +++ b/src/Requests/PagebreakPositions/FetchAPagebreakPositionRequest.php @@ -28,6 +28,7 @@ public function createDtoFromResponse(Response $response): PagebreakPositionDTO if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return PagebreakPositionDTO::fromArray($response->json()); } } diff --git a/src/Requests/SubPositions/CreateASubPositionRequest.php b/src/Requests/SubPositions/CreateASubPositionRequest.php index d645063..a671b71 100644 --- a/src/Requests/SubPositions/CreateASubPositionRequest.php +++ b/src/Requests/SubPositions/CreateASubPositionRequest.php @@ -33,6 +33,7 @@ protected function defaultBody(): array if (! $body instanceof CreateEditSubPositionDTO) { $body = CreateEditSubPositionDTO::fromArray($body); } + return $body->toArray(); } @@ -41,6 +42,7 @@ public function createDtoFromResponse($response): SubPositionDTO if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return SubPositionDTO::fromArray($response->json()); } } diff --git a/src/Requests/SubPositions/DeleteASubPositionRequest.php b/src/Requests/SubPositions/DeleteASubPositionRequest.php index d386116..e7e0b8d 100644 --- a/src/Requests/SubPositions/DeleteASubPositionRequest.php +++ b/src/Requests/SubPositions/DeleteASubPositionRequest.php @@ -27,6 +27,7 @@ public function createDtoFromResponse(Response $response): mixed if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return $response->json(); } } diff --git a/src/Requests/SubPositions/EditASubPositionRequest.php b/src/Requests/SubPositions/EditASubPositionRequest.php index fac0a3c..ff827e2 100644 --- a/src/Requests/SubPositions/EditASubPositionRequest.php +++ b/src/Requests/SubPositions/EditASubPositionRequest.php @@ -34,6 +34,7 @@ protected function defaultBody(): array if (! $body instanceof CreateEditSubPositionDTO) { $body = CreateEditSubPositionDTO::fromArray($body); } + return $body->toArray(); } @@ -42,6 +43,7 @@ public function createDtoFromResponse($response): SubPositionDTO if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return SubPositionDTO::fromArray($response->json()); } } diff --git a/src/Requests/SubPositions/FetchAListOfSubPositionsRequest.php b/src/Requests/SubPositions/FetchAListOfSubPositionsRequest.php index 77d62a2..23fe08d 100644 --- a/src/Requests/SubPositions/FetchAListOfSubPositionsRequest.php +++ b/src/Requests/SubPositions/FetchAListOfSubPositionsRequest.php @@ -43,6 +43,7 @@ public function createDtoFromResponse(Response $response): Collection foreach ($res as $position) { $positions->push(SubPositionDTO::fromArray($position)); } + return $positions; } } diff --git a/src/Requests/SubPositions/FetchASubPositionRequest.php b/src/Requests/SubPositions/FetchASubPositionRequest.php index 2781d2a..368d7a7 100644 --- a/src/Requests/SubPositions/FetchASubPositionRequest.php +++ b/src/Requests/SubPositions/FetchASubPositionRequest.php @@ -28,6 +28,7 @@ public function createDtoFromResponse(Response $response): SubPositionDTO if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return SubPositionDTO::fromArray($response->json()); } } diff --git a/src/Requests/SubtotalPositions/CreateASubtotalPositionRequest.php b/src/Requests/SubtotalPositions/CreateASubtotalPositionRequest.php index 2a270f5..70e65b4 100644 --- a/src/Requests/SubtotalPositions/CreateASubtotalPositionRequest.php +++ b/src/Requests/SubtotalPositions/CreateASubtotalPositionRequest.php @@ -34,6 +34,7 @@ protected function defaultBody(): array if (! $body instanceof CreateEditSubtotalPositionDTO) { $body = CreateEditSubtotalPositionDTO::fromArray($body); } + return $body->toArray(); } @@ -42,6 +43,7 @@ public function createDtoFromResponse(Response $response): SubtotalPositionDTO if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return SubtotalPositionDTO::fromArray($response->json()); } } diff --git a/src/Requests/SubtotalPositions/DeleteASubtotalPositionRequest.php b/src/Requests/SubtotalPositions/DeleteASubtotalPositionRequest.php index b436768..3d3d82f 100644 --- a/src/Requests/SubtotalPositions/DeleteASubtotalPositionRequest.php +++ b/src/Requests/SubtotalPositions/DeleteASubtotalPositionRequest.php @@ -27,6 +27,7 @@ public function createDtoFromResponse(Response $response): mixed if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return $response->json(); } } diff --git a/src/Requests/SubtotalPositions/EditASubtotalPositionRequest.php b/src/Requests/SubtotalPositions/EditASubtotalPositionRequest.php index aa35e5a..111ee0c 100644 --- a/src/Requests/SubtotalPositions/EditASubtotalPositionRequest.php +++ b/src/Requests/SubtotalPositions/EditASubtotalPositionRequest.php @@ -35,6 +35,7 @@ protected function defaultBody(): array if (! $body instanceof CreateEditSubtotalPositionDTO) { $body = CreateEditSubtotalPositionDTO::fromArray($body); } + return $body->toArray(); } @@ -43,6 +44,7 @@ public function createDtoFromResponse(Response $response): SubtotalPositionDTO if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return SubtotalPositionDTO::fromArray($response->json()); } } diff --git a/src/Requests/SubtotalPositions/FetchAListOfSubtotalPositionsRequest.php b/src/Requests/SubtotalPositions/FetchAListOfSubtotalPositionsRequest.php index 7ac2ec0..a507714 100644 --- a/src/Requests/SubtotalPositions/FetchAListOfSubtotalPositionsRequest.php +++ b/src/Requests/SubtotalPositions/FetchAListOfSubtotalPositionsRequest.php @@ -43,6 +43,7 @@ public function createDtoFromResponse(Response $response): Collection foreach ($res as $position) { $positions->push(SubtotalPositionDTO::fromArray($position)); } + return $positions; } } diff --git a/src/Requests/SubtotalPositions/FetchASubtotalPositionRequest.php b/src/Requests/SubtotalPositions/FetchASubtotalPositionRequest.php index 781aabf..6359262 100644 --- a/src/Requests/SubtotalPositions/FetchASubtotalPositionRequest.php +++ b/src/Requests/SubtotalPositions/FetchASubtotalPositionRequest.php @@ -28,6 +28,7 @@ public function createDtoFromResponse(Response $response): SubtotalPositionDTO if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return SubtotalPositionDTO::fromArray($response->json()); } } diff --git a/src/Requests/TextPositions/DeleteATextPositionRequest.php b/src/Requests/TextPositions/DeleteATextPositionRequest.php index 8846e9d..054b3c4 100644 --- a/src/Requests/TextPositions/DeleteATextPositionRequest.php +++ b/src/Requests/TextPositions/DeleteATextPositionRequest.php @@ -27,6 +27,7 @@ public function createDtoFromResponse(Response $response): mixed if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return $response->json(); } } diff --git a/src/Requests/TextPositions/FetchAListOfTextPositionsRequest.php b/src/Requests/TextPositions/FetchAListOfTextPositionsRequest.php index 5c0e40e..7415228 100644 --- a/src/Requests/TextPositions/FetchAListOfTextPositionsRequest.php +++ b/src/Requests/TextPositions/FetchAListOfTextPositionsRequest.php @@ -43,6 +43,7 @@ public function createDtoFromResponse(Response $response): Collection foreach ($res as $position) { $positions->push(TextPositionDTO::fromArray($position)); } + return $positions; } } diff --git a/src/Requests/TextPositions/FetchATextPositionRequest.php b/src/Requests/TextPositions/FetchATextPositionRequest.php index 3d2543e..3d822a2 100644 --- a/src/Requests/TextPositions/FetchATextPositionRequest.php +++ b/src/Requests/TextPositions/FetchATextPositionRequest.php @@ -28,6 +28,7 @@ public function createDtoFromResponse(Response $response): TextPositionDTO if (! $response->successful()) { throw new Exception('Request was not successful. Unable to create DTO.'); } + return TextPositionDTO::fromArray($response->json()); } } diff --git a/tests/Requests/DefaultPositions/FetchAListOfDefaultPositionsRequestTest.php b/tests/Requests/DefaultPositions/FetchAListOfDefaultPositionsRequestTest.php index aa4d681..6fcfd11 100644 --- a/tests/Requests/DefaultPositions/FetchAListOfDefaultPositionsRequestTest.php +++ b/tests/Requests/DefaultPositions/FetchAListOfDefaultPositionsRequestTest.php @@ -1,7 +1,6 @@