This commit is contained in:
2026-03-23 12:32:36 +01:00
parent 0cfb6ba674
commit 1739f354d1
10 changed files with 1601 additions and 0 deletions

3
.env Normal file
View File

@@ -0,0 +1,3 @@
url: https://softra.com.pl:8444/rent2www-ci-tst
username: ci938221
password: a29ZkiYEvKnjcK2

View File

@@ -0,0 +1,95 @@
# Softra Rent API - Transkrypcja: Wst?p i zasady
> ?r?d?o: "Oferta 37 Softra_Rent_API - zaaczni k Specyfikacja_Rent_RESTAPI_1_15.pdf"
Specyfikacja serwisu wymiany danych
SOFTRA_RENT_API
Wersja 1.15
Data utworzenia: 2023-03-20
Data ostatniej modyfikacji: 2025-12-10
Spis treści
Przedmiot opracowania ............................................................................................................. 4
Technologia ................................................................................................................................ 4
Architektura ................................................................................................................................ 4
Bezpieczeństwo .......................................................................................................................... 4
Opis metod ................................................................................................................................. 5
1. Generowanie tokena JWT .............................................................................................. 5
2. Pobranie listy oddziałów ................................................................................................ 6
3. Pobranie listy dostępnych klas pojazdów ...................................................................... 7
4. Pobranie listy dostępnych marek i modeli w danej klasie i oddziale ............................. 7
5. Pobranie cen ................................................................................................................... 8
6. Utworzenie klienta ....................................................................................................... 11
7. Pobranie danych klienta ............................................................................................... 14
8. Aktualizacja danych klienta .......................................................................................... 16
9. Utworzenie rezerwacji.................................................................................................. 16
10. Dodanie klienta do istniejącej rezerwacji................................................................... 20
11. Potwierdzenie rezerwacji ........................................................................................... 20
12. Anulowanie rezerwacji ............................................................................................... 21
13. Pobieranie listy faktur dla rezerwacji ......................................................................... 21
14. Pobieranie listy faktur związanych z klientem ........................................................... 22
15. Pobieranie dokumentu faktury .................................................................................. 22
16. Sprawdzenie poświadczeń klienta ............................................................................. 23
17. Tworzenie tokena do zmiany hasła konta klienta ...................................................... 23
18. Zmiana hasła konta klienta......................................................................................... 24
19. Podsumowanie opłat przed złożeniem rezerwacji..................................................... 25
20. Pobieranie listy wynajmów i rezerwacji klienta ......................................................... 27
21. Pobieranie definicji oświadczeń/zgód marketingowych ............................................ 28
22. Sprawdzenie czy istnieje konto dla podanego loginu ................................................ 28
23. Dodawanie wpłat i kaucji do rezerwacji ..................................................................... 29
24. Pobieranie listy opłat dodatkowych dla podanej rezerwacji / wynajmu ................... 30
25. Pobieranie listy wpłat dla podanej rezerwacji / wynajmu ......................................... 30
26. Dodawanie płatnika .................................................................................................... 31
27. Wysłanie tokenu potwierdzający email dla podanego loginu klienta ....................... 32
28. Potwierdzenie adresu email klienta ........................................................................... 33
29. Pobieranie wszystkich symboli klas ............................................................................ 33
30. Pobieranie wszystkich modeli pojazdów.................................................................... 34
31. Pobieranie listy opłat zadeklarowanych w systemie ................................................. 34
32. Przykład uzgodnień wdrożeniowych .......................................................................... 35
Przedmiot opracowania
Specyfikacja określa API do systemu Flota Rent o nazwie „Softra_Rent_API”.
Interface udostępniać będzie szereg funkcji służących do realizacji współpracy stron
internetowych wypożyczalni samochodów z bazą danych systemu zarządzania wypożyczalnią
„Flota Rent” produkcji firmy Softra Systemy Informatyczne.
Uwaga : Niemniejsze opracowanie stanowi utwór w rozumieniu prawa autorskiego. Prawa
autorskie do niniejszego opracowania przysługują Wojciechowi Lewandowskiemu Softra
Systemy Informatyczne.
Opracowanie może być wykorzystywane tylko w celu uzgodnienia oferty składanej przez
Softra oraz jej realizacji.
Wykorzystywanie niniejszego opracowania w całości lub części bez zgody autora nie jest
dozwolone.
Zakres i sposób realizacji funkcji API Softra_Rent_API stanowi tajemnicę przedsiębiorstwa
Softra Systemy Informatyczne.
Technologia
Serwis tworzony jest w technologii REST API. Fomat wymiany danych - JSON
Architektura
Architektura API uwzględnia zakłada utworzenie serwera usługi REST po stronie
systemu Flota Rent oraz klienta usługi wykorzystywanego po stronie strony internetowej
wypożyczalni. Oznacza to, że wywołanie metod odbywa się zawsze po stronie klienta.
Bezpieczeństwo
Zastosowano mechanizm uwierzytelniania JWT (Json Web Token). Zalecane jest
ograniczenie dostępu do usługi do wskazanych przez klienta adresów IP.
Warianty odpowiedzi - statusy HTTP:
Status Opis
200 Prawidłowa odpowiedź - zwrócony obiekt odpowiadający danej metodzie
400 Błędne dane w wysyłanym żądaniu ( brak wymaganych danych, dane
niekompletne )
401 Błąd autoryzacji / token nieaktualny.
403 Nieautoryzowany dostęp
500 Błąd wewnętrzny usługi
Opis metod

View File

@@ -0,0 +1,229 @@
# Softra Rent API - Transkrypcja: Autoryzacja i flota
> ?r?d?o: "Oferta 37 Softra_Rent_API - zaaczni k Specyfikacja_Rent_RESTAPI_1_15.pdf"
1. Generowanie tokena JWT
Opis: Generuje token za JWT dla przesłanego loginu i hasła
URL : /account/auth
Typ metody : POST
Nagłówki: Brak
Parametry JSON Object
Nazwa pola Opis pola Typ danych Uwagi
login Identyfikator użytkownika String Parametr
wymagany
password hasło String Parametr
wymagany
Odpowiedź : Obiekt LoginResponse
Obiekt LoginResponse
Nazwa pola Opis pola Typ danych Uwagi
token token JWT String ważny 1h
2. Pobranie listy oddziałów
Opis: pobiera listę dostępnych odziałów
Url : /branch/list
Typ metody : GET
Nagłówki:
"Authorization: Bearer [token]"
Parametry:
Brak
Odpowiedź : Obiekt typu List<Branch>
Obiekt Branch
Nazwa pola Opis pola Typ danych Uwagi
name symbol oddziału String
description opis oddziału String
zipCode kod pocztowy String
street ulica String
city miejscowość String
voivodeship województwo String
openingTime godziny otwarcia - dni robocze String
closingTime godziny zamknięcia dni robocze String
isVirtual czy oddział wirtualny Boolean
email adres email oddziału String
phoneNo numer telefonu odziału String
relatedBranchName symbol oddziału powiązanego String
openingTimeSaturday godziny otwarcia - soboty String
closingTimeSaturday godziny zamknięcia - soboty String
openingTimeSunday godziny otwarcia - niedziele String
closingTimeSunday godziny zamknięcia - niedziele String
3. Pobranie listy dostępnych klas pojazdów
Opis: zwraca listę kategorii pojazdów dostępnych we wskazanym oddziale i okresie
spełniających określone warunki klienta ( np. rodzaj skrzyni biegów)
URL : /car/class/list
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Nazwa Opis pola Typ danych Wymagalność
dateFrom data początku wynajmu w
formacie w formacie YYYY-MM-
DDTHHT24:MI:SS np 2014-10-
10T00:00:00
String TAK
dateTo data końca wynajmu w formacie
YYYY-MM-DDTHH24:MI:SS np
2014-10-10T00:00:00
String TAK
branchName symbol oddziału String TAK
fuelType rodzaj paliwa 'DIESEL', 'NPB', 'LPG' String NIE
carBodyType rodzaj pojazdu String NIE
Odpowiedź : Obiekt typu List< String > , gdzie każdy element to symbol klasy pojazdu
4. Pobranie listy dostępnych marek i modeli w danej klasie i
oddziale
Opis: zwraca listę dostępnych marek i modeli w danej klasie pojazdów w danym oddziale na
podany dzień początku najmu spełniających określone warunki klienta
URL : /car/model/list
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Paremetry GET: includeBrandDetails true/false (opcjonalny)
Parametry JSON Object
Nazwa Opis pola Typ danych Wymagalność
dateFrom data początku wynajmu w
formacie w formacie YYYY-MM-
DDTHH24:MI:SS np 2014-10-
10T00:00:00
String TAK
dateTo data końca wynajmu w formacie
YYYY-MM-DDTHH24:MI:SS np
2014-10-10T00:00:00
String TAK
branchName symbol oddziału String TAK
category kategoria pojazdu, - empty string
zwróci listę dostępnych modeli dla
wszystkich klas pojazdów
String NIE
fuelType rodzaj paliwa 'DIESEL', 'NPB', 'LPG' String NIE
carBodyType rodzaj pojazdu String NIE
Odpowiedź : Obiekt typu List< CarModel >
Obiekt CarModel
Nazwa pola Opis pola Typ danych Uwagi
branchName symbol oddziału String
bodyType rodzaj nadwozia String
category kategoria String
doorCount ilość drzwi Integer
gearboxType rodzaj skrzyni biegów String
seatCount ilość miejsc Integer
fuelType rodzaj paliwa String
bagCount Ilosć walizek Integer
brandDesc Opis marki String Zwracany gdy
includeBrandDetails
=true
modelDesc Opis modelu String Zwracany gdy
includeBrandDetails
=true
5. Pobranie cen
Opis: zwraca ceny dla wskazanej kategorii pojazdów w raz z listą dostępnych dodatków i ich
cenami dla podanego okresu wynajmu
URL : /pricelist/list
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Nazwa Opis pola Typ danych Wymagalność
category kategoria pojazdu, empty string
wróci listę dostępnych cenników
dla wszystkich klas pojazdów
String NIE
dateFrom data początku najmu w formacie
YYYY-MM-DDTHHT24:MI:SS
String TAK
dateTo data końca najmu w formacie
YYYY-MM-DDTHHT24:MI:SS
String TAK
pickUpLocation miejsce wydania (symbol odziału) String TAK
language język String TAK
currency Waluta String TAK
Odpowiedź : Obiekt typu List< PriceList >
Obiekt PriceList
Nazwa pola Opis pola Typ danych Uwagi
id identyfikator cennika String
dateFrom data początku
obowiązywania cennika
String
dateTo data końca obowiązywania
cennika
String
kind rodzaj cennika String ['standard',
'weekend',
'specjalny']
name nazwa cennika String
carCategory kategoria pojazdu String
group grupa cennikowa String
odoLimit limit dzienny kilometrów BigDecmial
notes uwagi String
currency symbol waluty np. PLN, EUR String
type rodzaj kalkulacji Netto/Brutto String
number numer cennika String
isRes czy zaznaczona opcja okresu
rezerwacji
Boolean
resDateFrom data od kiedy dopuszczalna
rezerwacja
String
resDateTo data do kiedy dopuszczalna
rezerwacja
String
depositValue wysokość kaucji BigDecmial
milageOverLimitCost koszt kilometra nadprzebiegu BigDecmial
fuelLackCost koszt niedotankowanego
paliwa za litr
BigDecmial
returnDelayCost koszt opoźnienia zwrotu za
dobę
BigDecmial
carDamageFullValue opłata za szkodę całkowitą BigDecmial
carDamagePartlyValue opłata za szkodę częściową BigDecmial
rentPrice Opłata za dobę wynajmu BigDecmial
rentMinPrice Minimalna opłata za dobę
wynajmu
BigDecmial
rentDescription Opis usługi najmu String
rentUnit jednostka miary String
additionalItems lista zadeklarowanych
elementów dodatkowych
wraz z ceną
List<AddItem>
Obiekt AddItem:
Nazwa pola Opis pola Typ danych Uwagi
id identyfikator usługi dodatkowej String
name nazwa usługi dodatkowej String
unit jednostka miary String
price cena jednostkowa BigDecmial
minPrice minimalna cena jednostkowa BigDecmial
maxQuanityOnPrincing maksymalna ilość dodatków na
wycenie
Integer
code Symbol opłaty String

View File

@@ -0,0 +1,431 @@
# Softra Rent API - Transkrypcja: Klienci i konta
> ?r?d?o: "Oferta 37 Softra_Rent_API - zaaczni k Specyfikacja_Rent_RESTAPI_1_15.pdf"
6. Utworzenie klienta
Opis: Tworzy obiekt klienta
URL : /customer/add
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Nazwa Opis pola Typ danych Wymagalność
name pełna nazwa klienta String(180) TAK
address Adres zamieszkania CustomerAddress TAK
bankAccount Nazwa banku I nr
konta bankowego
CustomerBank NIE
nip numer nip String(13) TAK -gdy
isCompany =
true
nipKind rodzaj nip jeden z
elementów
String NIE ['krajowy',
'unijny',
'pozaunijny']
nipCountry kraj w formacie ISO String(2) NIE
regon numer regon String(12) NIE
pesel nr PESEL String(11) TAK* gdy -gdy
isCompany =
false
krs numer krs String(20) NIE
country Kraj I kod kraju CustomerCountry NIE
phone nr telefonu
stacjonarnego
String(60) NIE
email adres email String(50) NIE
www adres strony www String(60) NIE
paymentMethod metoda płatności String(10) TAK
[ 'GOTÓWKA',
'PRZELEW',
'KARTA PL.' ]
paymentDays ilość dni zapłaty Integer TAK -gdy
payment
metod =
PRZELEW
notes uwagi String(255) NIE
phoneMobile telefon komórkowy String(20) NIE
discountGroup nazwa grupy
rabatowej
String(10) NIE
isForeign czy klient
zagraniczny
Boolean NIE [T, N]
domyślna
wartość N
isCompany czy klient to firma Boolean TAK [T, N]
priceListGroup grup cennikowa
klienta
String(10) NIE
firstName imię String(20) TAK* gdy -gdy
isCompany =
false
lastName nazwisko String(30) TAK* gdy -gdy
isCompany =
false
idCard Dowod osobisty CustomerIdDoc TAK* gdy -gdy
isCompany =
false
correspAddress Adres
korespondencyjny
CustomerAddress NIE
birthDate data urodzenia nie
wymagane w
formacie YYYY-MM-
DDTHH24:MI:SS np
2014-10-
10T00:00:00
String NIE
birthCity miejsce urodzenia String(30) NIE
creditCard Dane karty
kredytowej
CustomerCreditCard NIE
passportNo numer paszportu String(20) TAK* gdy -gdy
isCompany =
false
driveLicence Prawo jazdy CustomerDriveLicence NIE
groupCode kod grupy klienta String(10) NIE
account Login I hasło klienta CustomerAccount TAK
bookKeeping Dane dot.
ksiegowości
CustomerBookKeeping NIE
skipAccountCreate tworzy klienta z
flagą klient
niezarejestrowany
( nie zostanie
utworzone konto
klienta )
Boolean NIE [T N]
domyślnie N
emailVerified Zweryfikowany
email
Boolean TAK
extCustomerId identyfikator klienta
z systemu
zewnętrznego
Integer NIE
language kod językowy pl,
en, ru itp
String(2) NIE
*W przypadku klienta będącego osobą ficzyną (isCompany = false) wymgane uzupełnienie
jednego z pól pesel, passport_no, id_card
CustomerAddress
Nazwa Opis pola Typ danych
zipCode kod pocztowy String(10) TAK
city miejscowość String(30) TAK
street ulica String(60) TAK
homeNo Nr domu/ mieszkania String(20) TAK
CustomerBank
Nazwa Opis pola Typ danych
bankName nazwa banku String(60) NIE
bankAccountNo numer konta bankowego String(60) NIE
CustomerCountry
Nazwa Opis pola Typ danych
countryName nazwa kraju Strnig(40) NIE
countryCode kod kraju String(2) NIE
CustomerIdDoc
Nazwa Opis pola Typ danych
idCardNo nr dowodu osobistego String(20) TAK* gdy -gdy
isCompany =
false
idCardReleasedBy jednostka wydająca d.o. String(50) NIE
CustomerCreditCard
Nazwa Opis pola Typ danych
cardIssuer nazwa karty kredytowej (VISA,
MASTERCARD)
String(20) NIE
cardNo numer karty kredytowej (numer
wraz z separatorami)
String(20) NIE
cardValidTo miesiąc I rok ważdności MM/RR String(5) NIE
CustomerDriveLicence
Nazwa Opis pola Typ danych
licenceNo numer prawa jazdy String(20) NIE
licenceReleasedBy organ wydający prawo jazdy String(50) NIE
licenceCategory kategoria prawa jazdy String(10) NIE
CustomerAccount
Nazwa Opis pola Typ danych
login login do konta String(100) TAK
password Hasło do konta String(100) TAK
CustomerBookKeeping
Nazwa Opis pola Typ danych
name nazwa firmy prowadzącej
księgowość
String(120) NIE
zipCode kod pocztowy firmy prowadzącej
księgowość
String(10) NIE
city miejscowość firmy prowadzącej
księgowość
String(30) NIE
street ulica firmy prowadzącej
księgowość
String(60) NIE
Odpowiedź : Obiekt typu NewCustomerResponse
Nazwa Opis pola Typ danych
customerId identyfikator klienta String
7. Pobranie danych klienta
Opis: Pobiera dane klienta dla wskazanego identyfikatora klienta
URL : /customer/item/{id}
Typ metody : GET
Nagłówki:
"Authorization: Bearer [token]"
Parametry:
Nazwa Opis pola Typ danych
id identyfikator klienta z
systemu FLOTA
String
Odpowiedź : Obiekt typu Customer
Nazwa Opis pola Typ danych
id Id w systemie Flota String
name pełna nazwa klienta String(180)
address Adres zamieszkania CustomerAddress
bankAccount Nazwa banku I nr konta
bankowego
CustomerBank
nip numer nip String(13)
nipKind rodzaj nip jeden z
elementów
String
nipCountry kraj w formacie ISO String(2)
regon numer regon String(12)
pesel nr PESEL String(11)
krs numer krs String(20)
country Kraj I kod kraju CustomerCountry
phone nr telefonu
stacjonarnego
String(60)
email adres email String(50)
www adres strony www String(60)
paymentMethod metoda płatności String(10)
paymentDays ilość dni zapłaty Integer
notes uwagi String(255)
phoneMobile telefon komórkowy String(20)
discountGroup nazwa grupy rabatowej String(10)
isForeign czy klient zagraniczny Boolean
isCompany czy klient to firma Boolean
priceListGroup grup cennikowa klienta String(10)
firstName imię String(20)
lastName nazwisko String(30)
idCard Dowod osobisty CustomerIdDoc
correspAddress Adres korespondencyjny CustomerAddress
birthDate data urodzenia nie
wymagane w formacie
YYYY-MM-
DDTHH24:MI:SS np
2014-10-10T00:00:00
String
birthCity miejsce urodzenia String(30)
creditCard Dane karty kredytowej CustomerCreditCard
passportNo numer paszportu String(20)
driveLicence Prawo jazdy CustomerDriveLicence
groupCode kod grupy klienta String(10)
account Login I hasło klienta CustomerAccount
bookKeeping Dane dot. ksiegowości CustomerBookKeeping
skipAccountCreate tworzy klienta z flagą
klient niezarejestrowany
( nie zostanie utworzone
konto klienta )
Boolean
emailVerified Zweryfikowany email Boolean
extCustomerId identyfikator klienta z
systemu zewnętrznego
Integer
language kod językowy pl, en, ru
itp
String(2)
8. Aktualizacja danych klienta
Opis: Aktualizuje dane istniejącego klienta
URL : /customer/update
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Obiekt typu Customer
Zalecana strategia: pobieramy obiekt istniejącego klienta metodą GetCustomer ,
aktualizujemy jego właściwości i przekazujemy do metody UpdateCustomer
16. Sprawdzenie poświadczeń klienta
Opis: Metoda sprawdza czy dane do logowanie są prawidłowe
URL : /customer/account/check
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Nazwa Opis pola Typ danych Wymagalność
login login do konta klienta String TAK
password hasło do konta klienta String TAK
Odpowiedź : Obiekt typu AcountCheckResult
Nazwa pola Opis pola Typ danych Uwagi
success Sukces/Błąd Boolean
customerId Id klienta String
emailVerified Email zweryfikowany Boolean
17. Tworzenie tokena do zmiany hasła konta klienta
Opis: Metoda tworzy token niezbędny do zmiany hasła
URL : /customer/account/password/token
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Nazwa Opis pola Typ danych Wymagalność
login login do konta klienta String TAK
Odpowiedź : Obiekt typu RestPwdToken
Obiekt RestPwdToken
Nazwa pola Opis pola Typ danych Uwagi
success Sukces/Błąd Boolean
rejectReason Przyczyna niepowodzenia String
token Token String Ważny 30
minut
18. Zmiana hasła konta klienta
Opis: Metoda zmienia hasło konta klienta przy pomocy wcześniej utworzonego tokenu
URL : /customer/account/password/change
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Nazwa pola Opis pola Typ danych Wymagalność
token tokenValue otrzymany z
metody
/customer/account/password/token
String TAK
newPassword nowe hasło String TAK
Odpowiedź :
Nazwa pola Opis pola Typ danych Uwagi
success Sukces/Błąd Boolean
rejectReason Przyczyna niepowodzenia String
21. Pobieranie definicji oświadczeń/zgód marketingowych
Opis: Metoda zwraca listę definicji zgód marketingowych/oświadczeń
URL : /agreement/def/list
Typ metody : GET
Nagłówki:
"Authorization: Bearer [token]"
Odpowiedź : Obiekt typu List<AgrementDefItem>
Obiekt AgrementDefItem
Nazwa pola Opis pola Typ danych Uwagi
id id oświadczenia String
isRequired czy wymagana Boolean
description treść zgody String
22. Sprawdzenie czy istnieje konto dla podanego loginu
Opis: Sprawdza czy istnieje konto klienta dla podanego loginu
URL : /customer/account/check/exists
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Przyjmowane parametry:
Nazwa Opis pola Typ
danych
Wymagalność
login login do konta klienta String TAK
Odpowiedź :
Nazwa pola Opis pola Typ danych Uwagi
success Sukces/Błąd Boolean
rejectReason Przyczyna niepowodzenia String
27. Wysłanie tokenu potwierdzający email dla podanego loginu
klienta
Opis: Wysyła token potwierdzający email dla podanego loginu klienta
URL : /customer/account/email/sendConfirmToken
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Przyjmowane parametry:
Nazwa Opis pola Typ danych Wymagalność
customerId id klienta String TAK
Odpowiedź :
Nazwa pola Opis pola Typ danych Uwagi
success Sukces/Błąd Boolean
rejectReason Przyczyna niepowodzenia String
28. Potwierdzenie adresu email klienta
Opis: Ustawia flagę potwierdząjącą adres email klienta
URL : /customer/account/email/confirm
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Przyjmowane parametry:
Nazwa Opis pola Typ danych Wymagalność
token token klienta String TAK
Odpowiedź :
Nazwa pola Opis pola Typ danych Uwagi
success Sukces/Błąd Boolean
rejectReason Przyczyna niepowodzenia String

View File

@@ -0,0 +1,422 @@
# Softra Rent API - Transkrypcja: Rezerwacje i p?atno?ci
> ?r?d?o: "Oferta 37 Softra_Rent_API - zaaczni k Specyfikacja_Rent_RESTAPI_1_15.pdf"
9. Utworzenie rezerwacji
Opis: Rezerwacja wstępna pojazdu na X minut dla wybranej kategorii pojazdu, okresu najmu,
określonych warunków klienta ewentualnie podanej marki i modelu pojazdu, wraz podaną
listą dodatków wyposażenia. Zwraca numer rezerwacji.
URL : /rent/makebooking
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Nazwa Opis pola Typ danych Wymagalność
dateFrom data początku najmu YYYY-
MM-DDTHH24:MI:SS
String TAK
dateTo data końca najmu YYYY-MM-
DDTHH24:MI:SS
String TAK
customerId identyfikator klienta String TAK
payerId identyfikator płatnika String NIE
pickUpLocation Miejsce/adres wydania
pojazdu
RentLocation TAK
pickUpComments uwagi dot. podstawienia String(50) NIE
pickUpCommentsEx uwagi dot. faktycznego
podstawienia
String(255) NIE
returnLocation Miejsce/adres odbiotu
pojazdu
RentLocation TAK
returnComments uwagi dot. odbioru String(50) NIE
returnCommentsEx uwagi dot. faktycznego
odbioru
String(255) NIE
carParameters Parametry pojazdu CarParameters TAK
priceListId identyfikator cennika String TAK
depositValue wysokość kaucji BigDecimal NIE
validTime ilość minut określająća czas
po którym rezerwacja
zostanie anulowana w
systuacji gdy nie zostanie
dokonana płatność (nie
nastąpi wywołanie meotdy
rent/confirm). API cyklicznie
(co 5 minut) sprawdza i
anuluje nie opłacone
rezerwacje po przekroczeniu
limitu określonego przez
parametr valid_time
Integer TAK
priceItems lista usług dodatkowych List<BookingPriceItem> NIE
drivers lista kierowców List<DriverItem> NIE
agreementItems lista zgód
marketingowych/oświadczeń
zaznaczonych przez klienta
List<AgreementItem> NIE
comments Uwagi do rezerwacji String(500) NIE
Obiekt RentLocation:
Nazwa pola Opis pola Typ danych Uwagi
branchName Symbol oddziału String(10) TAK
outOfBranch jedna z wartości: [N, A, P]
'N' - brak podstawienia/zwrotu pod
adres,
String(1) TAK
'A' podstawienie/zwrot pod
adres,
'P' - punkt z listy oddziałów
address Podstawienei/zwrot pod adres String(100) TAK/NIE
pointName Podstawienie/zwrot do puktu.
Punkt
String(10) TAK/NIE
Obiekt CarParameters:
Nazwa pola Opis pola Typ danych Wymagalność
brand Marka pojazdu String(40) NIE
model Model pojazdu String(40) NIE
categoryName Klasa pojazdu String(10) TAK
gearBoxType Rodzaj skrzyni biegów String(10) NIE
bodyType Rodzaj nadwozia String(10) NIE
seatCount Ilość miejsc Integer NIE
doorCount Ilość drzwi Integer NIE
bagCount Ilość walizek Integer NIE
drivingGearType Rodzaj napędu String(10) NIE
fuelType Rodzaj paliwa String(10) NIE
group Grupa modelowa pojazdu String(10) NIE
Obiekt BookingPriceItem:
Nazwa pola Opis pola Typ danych Wymagalność
id idetyfikator elementu usługi
dodatkowej
String TAK
name nazwa usługi dodatkowej String(50) TAK
unit jednostka miary usługi
dodatkowej
String(10) TAK
amount ilość BigDecmial TAK
priceBeforeDiscount cena przed rabatem BigDecmial TAK
discount wysokosc rabatu BigDecmial TAK
priceAfterDiscount cena po rabacie BigDecmial TAK
Obiekt DriverItem:
Nazwa pola Opis pola Typ danych Wyamgalność
firstName imię String(20) TAK
lastName nazwisko String(30) TAK
address adres DriverAddress TAK
pesel PESEL String(11) TAK
phone telefon String(60) NIE
phoneMobile telefon kom. String(60) NIE
email e-mail String(50) NIE
idCard dane dot.
dowodu os.
CustomerIdDoc NIE
passportNo numer paszportu String(20) NIE
driveLicence dane dot prawa
jazdy
CustomerDriveLicence NIE
country kraj String(10) NIE
birthDate data urodzenia
format YYYY-
MM-DD
HH24:MI:SS
String NIE
birthCity miejsce
urodzenia
String(30) NIE
Obiekt DriverAddress:
Nazwa pola Opis pola Typ danych Uwagi
city miejscowość String(30) TAK
zipCode kod pocztowy String(10) TAK
street ulica String(60) TAK
Obiekt AgreementItem:
Nazwa pola Opis pola Typ danych Uwagi
id dentyfiaktor oświadczenia (patrz
metoda GetAgreementsDefList)
String TAK
value Zgoda /brak zgody Boolean TAK
Odpowiedź : Obiekt typu BookingResult
Obiekt BookingResult
Nazwa pola Opis pola Typ danych Uwagi
success Sukces/Bąd Boolean
rejectReason Przyczyna niepowodzenia String CAR_NOT_FOUND
reservationId identyfikator rezerwacji String
reservationNo numer rezerwacji String
grossValue wartość brutto rezerwacji wraz z
kaucją
BigDecimal
10. Dodanie klienta do istniejącej rezerwacji
Opis: Dodaje klienta do istniejącej rezerwacji ( przypadek z rezerwacją na klienta
anonimowego)
URL : /customer/addToReservation
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Nazwa Opis pola Typ danych Wymagalność
customerId identyfikator klienta z systermu
Flota. Parametr customer_id
otrzymujemy metodą GetCustomer
lub AddCustomer
String TAK
reservationId identyfikator rezerwacji String TAK
Odpowiedź :
Nazwa pola Opis pola Typ danych Uwagi
success Sukces/Błąd Boolean
rejectReason Przyczyna niepowodzenia String
11. Potwierdzenie rezerwacji
Opis: Zmienia rezerwację na potwierdzoną
URL : /rent/confirm
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Nazwa Opis pola Typ danych Wymagalność
reservationId identyfikator rezerwacji String TAK
Odpowiedź : Obiekt typu ConfirmResult
Nazwa pola Opis pola Typ danych Uwagi
success Sukces/Błąd Boolean
rejectReason Przyczyna niepowodzenia String
12. Anulowanie rezerwacji
Opis: Anuluje rezerwację dla podanego identyfikatora rezerwacji
URL : /rent/cancel
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Nazwa pola Opis pola Typ danych Wymagalność
reservationId id wynajmu/rezerwacji String TAK
reason przyczyna anulowania String(255) TAK
Odpowiedź : Obiekt typu CancelBookingResponse
Obiekt CancelBookingResponse
Nazwa pola Opis pola Typ danych Uwagi
success Sukces/Błąd Boolean
rejectReason Przyczyna niepowodzenia String
19. Podsumowanie opłat przed złożeniem rezerwacji
Opis: Metoda zwraca podsumowanie rezerwacji z elementami wyceny. W zwróconej
odpowiedzi mogą pojawiać się elementy dodatkowe - np. doliczona opłata za zwrot w innym
oddziale, opłata za obsługę po godzinach pracy itp.
URL : /rent/princingSummary
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Przyjmowane parametry:
Nazwa Opis pola Typ danych Wymagalność
dateFrom data początku najmu String TAK
dateTo data końca najmu String TAK
customerId identyfikator klienta String TAK
payerId identyfikator płatnika String NIE
pickUpLocation Miejsce/adres
wydania pojazdu
RentLocation TAK
returnLocation Miejsce/adres odbiotu
pojazdu
RentLocation TAK
carParameters Parametry pojazdu CarParameters TAK
priceListId identyfikator cennika String TAK
depositValue wysokość kaucji BigDecimal NIE
priceItems lista usług
dodatkowych
List<BookingPriceItem> NIE
Obiekt BookingPriceItem:
Nazwa pola Opis pola Typ danych Wymagalność
id idetyfikator elementu usługi
dodatkowej
String TAK
name nazwa usługi dodatkowej String(50) TAK
unit jednostka miary usługi dodatkowej String(10) TAK
amount ilość BigDecmial TAK
priceBeforeDiscount cena przed rabatem BigDecmial TAK
dicount wysokosc rabatu BigDecmial TAK
priceAfterDiscount cena po rabacie BigDecmial TAK
Odpowiedź : Obiekt typu SummaryResponse
Obiekt SummaryResponse
Nazwa pola Opis pola Typ danych Uwagi
totalNetValue wartość netto rezerwacji BigDecimal
totalVatValue wartość vat rezerwacji BigDecimal
totalGrossValue wartość brutto rezerwacji BigDecimal
pricelist lista elementów wyceny List<PriceItem>
Obiekt PriceItem
Nazwa pola Opis pola Typ danych Uwagi
id id opłaty String
name nazwa opłaty String(50)
code symbol opłaty String
unit jednostka miary String(10)
amount ilość BigDecmial
priceBeforeDiscount cena przed rabatem BigDecmial
dicount wysokosc rabatu % BigDecmial
priceAfterDiscount cena po rabacie BigDecmial
netValue wartosc netto BigDecmial
vatRate stopa vat "23%" String
vatValue wartość vat BigDecmial
grossValue wartość brutto BigDecmial
addedBySystem true oznacza że jest to dodatkowa
opłata doliczona przez system z
automatu
Boolean
systemItemType rodzaj doliczonej automatycznie
opłaty:
1 - opłata za zwrot w innym
oddziale,
2 - wydanie auta po godzinach
pracy
3 - wydanie auta w godzinach
pracy
4 - zdanie auta po godzinach pracy
5 - zdanie auta w godzinach pracy
Integer
23. Dodawanie wpłat i kaucji do rezerwacji
Opis: Pozwala na dodawanie wpłat i kaucji do zamówienia/rezerwacji
URL : /rent/payment/add
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Nazwa pola Opis pola Typ danych Wymagalność
reservationId id zamówienia/rezerwacji String TAK
paymentDate data płatności String TAK
paymentMethod sposób płatności ['GOTÓWKA',
'PRZELEW', 'KARTA PŁ.', 'PREAUTORYZ',
'INNE']
String TAK
paymentType rodzaj płatności
['wpłata','kaucja','preautoryzacja','zaliczka
częściowa','zaliczka całkowita']
String TAK
currency symbol waluty String(3) TAK
grossValue kwota wpłaty w walucie BigDecimal TAK
paymentNo numer płatności String(20) NIE
paymentState „Do pobrania”, „Pobrano”, „Zwrócono” TAK
Odpowiedź : Obiekt typu PaymentAddResponse
Nazwa pola Opis pola Typ danych Uwagi
paymentId Id utworzenego obiektu płatności
String
24. Pobieranie listy opłat dodatkowych dla podanej rezerwacji /
wynajmu
Opis: Zwraca listę opłat dodatkowych dla podanego id wynajmu/rezerwacji
URL : /rent/pricelist/list
Typ metody : GET
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Nazwa Opis pola Typ danych Wymagalność
rentId id wynajmu/rezerwacji String TAK
Odpowiedź : Obiekt typu List< RentAdditionalPriceItem>
Obiekt RentAdditionalPriceItem
Nazwa pola Opis pola Typ danych Uwagi
itemId id opłaty dodatkowej String
name nazwa opłaty dodatkowej String
nameCode symbol nazwy String
vatRate stopa va BigDecimal
symbolVat symbol vat String
amount ilość String
currency waluta String
netPrice cena netto BigDecimal
grossPrice cena brutto BigDecimal
unit jednostka miary String
discountValue wartość rabatu BigDecimal
discountPercent procent rabatu BigDecimal
netValue wartość netto BigDecimal
vatValue wartość vat BigDecimal
grossValue wartość brutto BigDecimal
payerShortName symbol płatnika String
25. Pobieranie listy wpłat dla podanej rezerwacji / wynajmu
Opis: Zwraca listę wpłat dla podanego id wynajmu/rezerwacji
URL : /rent/payment/list
Typ metody : GET
Nagłówki:
"Authorization: Bearer [token]"
Przyjmowane parametry:
Nazwa Opis pola Typ danych Wymagalność
rentId id wynajmu/rezerwacji String TAK
Odpowiedź : Obiekt typu List< RentPaymentItem>
Obiekt RentPaymentItem
Nazwa pola Opis pola Typ danych Uwagi
itemId Id wpłaty String
rentId id wynajmu/rezerwacji Integer
type rodzaj wpłat/kaucja/zaliczka itp String
comments uawgi String
date data wpłaty String
grossValue wartość brutto w walucie BigDecimal
paymentMethod metoda płatności String
paymentDirection Pobrano/Zwrócono/Do pobrania String
currency waluta String
grossPlnValue wartość brutto PLN BigDecimal
payerShortName symbol płatnika String
26. Dodawanie płatnika
Opis: Dodaje klienta (będącego płatnikiem) do kartoteki klientów w systemie Flota Rent
URL : /payer/add
Typ metody : POST
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Przyjmowane parametry:
jak dla metody customer/add
Odpowiedź : taka jak dla metody customer/add

View File

@@ -0,0 +1,96 @@
# Softra Rent API - Transkrypcja: Faktury i historia
> ?r?d?o: "Oferta 37 Softra_Rent_API - zaaczni k Specyfikacja_Rent_RESTAPI_1_15.pdf"
13. Pobieranie listy faktur dla rezerwacji
Opis: Zwraca listę faktur dla podanego identyfikatora zlecenia
URL : /invoice/rent/list
Typ metody : GET
Nagłówki:
"Authorization: Bearer [token]"
Parametry
Nazwa Opis pola Typ danych Wymagalność
reservationId id rezerwacji w systemie Flota String TAK
Odpowiedź : Obiekt typu List<DocItem >
Obiekt DocItem
Nazwa pola Opis pola Typ danych Uwagi
docId identfikator dokumentu String
docDate data wystawienia dokumentu String YYYY-MM-
DDTHH24:MI:SS
docType typ dokumentu: FAKTURA VAT,
KOREKTA VAT
String
docNo nr dokumentu String
docNetValue wartość netto BigDecimal
docVatValue wartość vat BigDecimal
docGrossValue wartość brutto BigDecimal
14. Pobieranie listy faktur związanych z klientem
Opis: Zwraca listę faktur dla podanego identyfikatora klienta
URL : /invoice/customer/list
Typ metody : GET
Nagłówki:
"Authorization: Bearer [token]"
Parametry:
Nazwa Opis pola Typ danych Wymagalność
customerId id klienta w systemie Flota String TAK
Odpowiedź : Obiekt typu List< DocItem> (opisany w metodzie /invoice/rent/list )
15. Pobieranie dokumentu faktury
Opis: Zwraca plik faktury
URL : /invoice/item/{:id}
Typ metody : GET
Nagłówki:
"Authorization: Bearer [token]"
Nazwa Opis pola Typ danych Wymagalność
id id dokumentu w systemie Flota String TAK
Odpowiedź : http 200 ContentType = "application/octet-stream" (plik)
20. Pobieranie listy wynajmów i rezerwacji klienta
Opis: Metoda zwraca listę wydań i rezerwacji wybranego klienta
URL : /customer/rent/list
Typ metody : GET
Nagłówki:
"Authorization: Bearer [token]"
Przyjmowane parametry:
Nazwa Opis pola Typ danych Wymagalność
customerId Id klient w systemie Flota String TAK
Odpowiedź : Obiekt typu List< RentItem>
Obiekt RentItem
Nazwa pola Opis pola Typ danych Uwagi
rentId id wynajmu/rezerwacji String
dateFrom data początku String
dateTo data końca String
carRegNo nr rejestracyjny pojazdu String
carMark marka pojazdu String
carCategory kategoria pojazdu String
orderNo nr zlecenia String
agreementNo nr umowy String
currency waluta String
status Status wynajmu/rezerwacji-
'REZERWACJA', 'REZ. POTW',
'WYDANY', 'ZDANY', 'ODMOWA'
String
pickupLocation miejsce wydania String
returnLocation miejsce zdania String
totalNetValue wartosc netto w walucie BigDecimal
totalVatValue wartość vat BigDecimal
totalGrossValue wartość brutto BigDecimal

View File

@@ -0,0 +1,95 @@
# Softra Rent API - Transkrypcja: S?owniki i uzgodnienia wdro?eniowe
> ?r?d?o: "Oferta 37 Softra_Rent_API - zaaczni k Specyfikacja_Rent_RESTAPI_1_15.pdf"
29. Pobieranie wszystkich symboli klas
Opis: Zwraca wszystkie zdefiniowane klasy pojazdów w systemie
URL : /car/class/listAll
Typ metody : GET
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Przyjmowane parametry: Brak
Odpowiedź : Obiekt typu List< String > , gdzie każdy element to symbol klasy pojazdu
30. Pobieranie wszystkich modeli pojazdów
Opis: Zwraca wszystkie zdefiniowane modele pojazdów w systemie
URL : /car/model/listAll
Typ metody : GET
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Paremetry GET: includeBrandDetails true/false (opcjonalny)
Odpowiedź : Obiekt typu List< CarModel > opisany w pkt 4.
31. Pobieranie listy opłat zadeklarowanych w systemie
Opis: Zwraca wszystkie zdefiniowane opłaty w sytemie które mogą użyte w cennikach
URL : /pricelist/defList
Typ metody : GET
Nagłówki:
"Authorization: Bearer [token]"
Parametry JSON Object
Przyjmowane parametry: Brak
Odpowiedź : Obiekt typu List< PriceItem > ,
Parametry PriceItem
Nazwa pola Opis pola Typ danych Uwagi
code Symbol opłaty String
description Nazwa opłaty String
32. Przykład uzgodnień wdrożeniowych
Przed przystąpieniem do wdrożenia zleceniodawca, wykonawca strony www i Softra
powinni:
- uzgodnić scenariusz obsługi klienta na stronie internetowej
- zweryfikować użycie metod API zgodnie z uzgodnionym scenariuszem
- uzgodnić ewentualne konieczne zmiany w API
Przykładowy scenariusz obsługi klienta na stronie www
Poniżej zamieszczono przykład scenariuszy użycia dla podstawowej wersji interface
SOFTRA_RENT_API.
Scenariusze obsługi klienta mogą być modyfikowane na potrzeby użytkownika systemu.
Poniższy scenariusz należy traktować tylko jako przykład.
Zakłada się dwa scenariusze użycia :
1. Dla nowego klienta
2. Dla klienta zarejestrowanego w systemie.
Fragmenty scenariusz specyficzne dla w/w rodzajów scenariusza zaznaczono kolorem.
1. Potencjalny klient wchodzi na stronę www wypożyczalni i dokonuje podaje okres
wynajmu oraz lokalizacje odbioru i zwrotu pojazdu
2. Następuje sprawdzenie dostępnych klas pojazdów spełniających w/w kreteria i
prezentacja możliwych do wyboru modeli wraz z cenami
3. Potencjalny klient wybiera klasę pojazdu oraz wskazuje opocjonalne elementy
wyposażenia lub usługi (foteliki , pakiety znoszące odpowiedzialnosć itp)
4. Następnie prezentowane jest podsumowanie oraz wybór czy klient chce:
- dokonać rezerwacji bez rejestracji (jako anonim)
- zalogować się na wcześniej utworzone konto
- utworzyć konto
4. Jeżeli klient wskaże ,że jest zarejestrowanym klientem strona www wysyła do
Softra_Rent_API dane uwierzytelniające klienta i następuje weryfikacja konta kloenta.
Softra_Rent_API zwraca potwierdzenie o statusie autoryzacji.
5. Jeśli klient wskaże ,że chce utworzyć konto lub składa rezerwację bez rejestracji to
zostanie proszony jest o wypełnienie formularza rejestracji danych klienta.
6. Klient następnie zatwierdza formularz rezerwacji i następuje złożenie rezerwacji.
7. Jeśli przy próbie rezerwacji system stwierdza brak samochodu następuje zapisanie
zamówienia i zgłoszenie informacji do operatora przez SMS o braku pojazdu.
9. Klient proszony jest o wykonanie płatności za rezerwację. Potwierdzenie wykonania
płatności wysyłane jest do Softra_Rent_API
10. Jeśli płatność została wykonana to status rezerwacji jest zmieniany na „Potwierdzone”
i wysyłany jest SMS oraz e-mail do wskazanego operatora systemu oraz e-mail
potwierdzający przyjęcie rezerwacji do klienta.
11. Jeśli płatność nie została wykonana w ciągu X minut to następuje zmiana statusu
rezerwacji na „Anulowano” powód „z winy klienta” Jeśli klient był zautoryzowany tzn. inny
niżto wysłany zostaje e-mail o anulowaniu rezerwacji.

View File

@@ -0,0 +1,10 @@
# Softra Rent API - Transkrypcja (podzia? na dzia?y)
- [00 - Wst?p i zasady](./rent-api-00-wstep-i-zasady.md)
- [01 - Autoryzacja i flota](./rent-api-01-autoryzacja-i-flota.md)
- [02 - Klienci i konta](./rent-api-02-klienci-i-konta.md)
- [03 - Rezerwacje i p?atno?ci](./rent-api-03-rezerwacje-i-platnosci.md)
- [04 - Faktury i historia](./rent-api-04-faktury-i-historia.md)
- [05 - S?owniki i uzgodnienia](./rent-api-05-slowniki-i-uzgodnienia.md)
Dokument ?r?d?owy: `Oferta 37 Softra_Rent_API - zaaczni k Specyfikacja_Rent_RESTAPI_1_15.pdf`

220
softra-test.php Normal file
View File

@@ -0,0 +1,220 @@
<?php
declare(strict_types=1);
/**
* Softra API smoke test:
* 1) reads credentials from .env (format: "key: value")
* 2) authenticates (/account/auth)
* 3) fetches branches (/branch/list)
* 4) fetches car models (/car/model/list?includeBrandDetails=true)
*
* Usage:
* php softra-test.php
* php softra-test.php branch=BYDGOSZCZ from=2026-03-30T12:00:00 to=2026-04-02T12:00:00 category=
*/
function fail(string $message, int $code = 1): never
{
if (PHP_SAPI !== 'cli') {
http_response_code(500);
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['ok' => false, 'error' => $message], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . PHP_EOL;
exit($code);
}
if (defined('STDERR')) {
fwrite(STDERR, $message . PHP_EOL);
} else {
echo $message . PHP_EOL;
}
exit($code);
}
function parseEnvFile(string $path): array
{
if (!is_file($path)) {
fail("Brak pliku .env: {$path}");
}
$result = [];
$lines = file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
if ($lines === false) {
fail("Nie mogę odczytać pliku .env");
}
foreach ($lines as $line) {
$line = trim($line);
if ($line === '' || str_starts_with($line, '#')) {
continue;
}
// supports:
// key: value
// key=value
$sepPos = strpos($line, ':');
if ($sepPos === false) {
$sepPos = strpos($line, '=');
}
if ($sepPos === false) {
continue;
}
$key = trim(substr($line, 0, $sepPos));
$value = trim(substr($line, $sepPos + 1));
$value = trim($value, "\"'");
if ($key !== '') {
$result[strtolower($key)] = $value;
}
}
return $result;
}
function parseInputArgs(?array $argv = null): array
{
$args = [];
if (PHP_SAPI === 'cli') {
$argv = $argv ?? [];
foreach (array_slice($argv, 1) as $arg) {
$pos = strpos($arg, '=');
if ($pos === false) {
continue;
}
$k = strtolower(trim(substr($arg, 0, $pos)));
$v = trim(substr($arg, $pos + 1));
$args[$k] = $v;
}
return $args;
}
foreach ($_GET as $k => $v) {
if (!is_string($k)) {
continue;
}
$args[strtolower($k)] = is_string($v) ? trim($v) : '';
}
return $args;
}
function requestJson(string $method, string $url, ?array $payload = null, array $headers = []): array
{
$ch = curl_init($url);
if ($ch === false) {
fail('Nie udało się zainicjować cURL');
}
$httpHeaders = array_merge(['Accept: application/json'], $headers);
if ($payload !== null) {
$httpHeaders[] = 'Content-Type: application/json';
}
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => strtoupper($method),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => $httpHeaders,
CURLOPT_TIMEOUT => 30,
CURLOPT_CONNECTTIMEOUT => 15,
]);
if ($payload !== null) {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
}
$raw = curl_exec($ch);
$err = curl_error($ch);
$status = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($raw === false) {
fail("Błąd połączenia cURL: {$err}");
}
$decoded = json_decode($raw, true);
if (!is_array($decoded)) {
$decoded = ['raw' => $raw];
}
return [
'status' => $status,
'body' => $decoded,
'raw' => $raw,
];
}
$env = parseEnvFile(__DIR__ . DIRECTORY_SEPARATOR . '.env');
$args = parseInputArgs($argv ?? null);
$baseUrl = rtrim($env['url'] ?? '', '/');
$username = $env['username'] ?? '';
$password = $env['password'] ?? '';
if ($baseUrl === '' || $username === '' || $password === '') {
fail('W .env muszą być pola: url, username, password');
}
$authRes = requestJson('POST', $baseUrl . '/account/auth', [
'login' => $username,
'password' => $password,
]);
if ($authRes['status'] !== 200 || empty($authRes['body']['token'])) {
fail("Auth nieudany (HTTP {$authRes['status']}): {$authRes['raw']}");
}
$token = (string) $authRes['body']['token'];
$authHeader = ['Authorization: Bearer ' . $token];
$branchesRes = requestJson('GET', $baseUrl . '/branch/list', null, $authHeader);
if ($branchesRes['status'] !== 200 || !is_array($branchesRes['body'])) {
fail("Pobranie oddziałów nieudane (HTTP {$branchesRes['status']}): {$branchesRes['raw']}");
}
$branches = $branchesRes['body'];
if (count($branches) === 0) {
fail('API działa, ale /branch/list zwróciło pustą listę oddziałów');
}
$branch = $args['branch'] ?? ($branches[0]['relatedBranchName'] ?? $branches[0]['name'] ?? '');
if ($branch === '') {
fail('Nie udało się ustalić branchName (podaj ręcznie: branch=NAZWA)');
}
$from = $args['from'] ?? (new DateTimeImmutable('+7 days'))->format('Y-m-d\TH:i:s');
$to = $args['to'] ?? (new DateTimeImmutable('+10 days'))->format('Y-m-d\TH:i:s');
$category = $args['category'] ?? ''; // empty = all categories
$modelsRes = requestJson(
'POST',
$baseUrl . '/car/model/list?includeBrandDetails=true',
[
'dateFrom' => $from,
'dateTo' => $to,
'branchName' => $branch,
'category' => $category,
],
$authHeader
);
if ($modelsRes['status'] !== 200 || !is_array($modelsRes['body'])) {
fail("Pobranie listy aut nieudane (HTTP {$modelsRes['status']}): {$modelsRes['raw']}");
}
$models = $modelsRes['body'];
$result = [
'ok' => true,
'baseUrl' => $baseUrl,
'branch' => $branch,
'dateFrom' => $from,
'dateTo' => $to,
'modelsCount' => count($models),
'models' => $models,
];
if (PHP_SAPI !== 'cli') {
header('Content-Type: application/json; charset=utf-8');
}
echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . PHP_EOL;