diff --git a/.env b/.env new file mode 100644 index 0000000..2f6c9f7 --- /dev/null +++ b/.env @@ -0,0 +1,3 @@ +url: https://softra.com.pl:8444/rent2www-ci-tst +username: ci938221 +password: a29ZkiYEvKnjcK2 \ No newline at end of file diff --git a/docs/Oferta 37 Softra_Rent_API - zaaczni k Specyfikacja_Rent_RESTAPI_1_15.pdf b/docs/Oferta 37 Softra_Rent_API - zaaczni k Specyfikacja_Rent_RESTAPI_1_15.pdf new file mode 100644 index 0000000..198b6e0 Binary files /dev/null and b/docs/Oferta 37 Softra_Rent_API - zaaczni k Specyfikacja_Rent_RESTAPI_1_15.pdf differ diff --git a/docs/rent-api-00-wstep-i-zasady.md b/docs/rent-api-00-wstep-i-zasady.md new file mode 100644 index 0000000..6bc5439 --- /dev/null +++ b/docs/rent-api-00-wstep-i-zasady.md @@ -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 diff --git a/docs/rent-api-01-autoryzacja-i-flota.md b/docs/rent-api-01-autoryzacja-i-flota.md new file mode 100644 index 0000000..11741e4 --- /dev/null +++ b/docs/rent-api-01-autoryzacja-i-flota.md @@ -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 + +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 + +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 diff --git a/docs/rent-api-02-klienci-i-konta.md b/docs/rent-api-02-klienci-i-konta.md new file mode 100644 index 0000000..f9fc5dd --- /dev/null +++ b/docs/rent-api-02-klienci-i-konta.md @@ -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 + +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 diff --git a/docs/rent-api-03-rezerwacje-i-platnosci.md b/docs/rent-api-03-rezerwacje-i-platnosci.md new file mode 100644 index 0000000..fdf53cc --- /dev/null +++ b/docs/rent-api-03-rezerwacje-i-platnosci.md @@ -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 NIE +drivers lista kierowców List NIE +agreementItems lista zgód +marketingowych/oświadczeń +zaznaczonych przez klienta +List 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 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 + +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 diff --git a/docs/rent-api-04-faktury-i-historia.md b/docs/rent-api-04-faktury-i-historia.md new file mode 100644 index 0000000..99c35ef --- /dev/null +++ b/docs/rent-api-04-faktury-i-historia.md @@ -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 + +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 diff --git a/docs/rent-api-05-slowniki-i-uzgodnienia.md b/docs/rent-api-05-slowniki-i-uzgodnienia.md new file mode 100644 index 0000000..93c061e --- /dev/null +++ b/docs/rent-api-05-slowniki-i-uzgodnienia.md @@ -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. diff --git a/docs/rent-api-transkrypcja-index.md b/docs/rent-api-transkrypcja-index.md new file mode 100644 index 0000000..a7c0ad0 --- /dev/null +++ b/docs/rent-api-transkrypcja-index.md @@ -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` diff --git a/softra-test.php b/softra-test.php new file mode 100644 index 0000000..732ce94 --- /dev/null +++ b/softra-test.php @@ -0,0 +1,220 @@ + 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;