feat: Add IntegrationRepository and ShopProClient for managing integrations and fetching products from shopPRO API

This commit is contained in:
2026-02-23 23:28:55 +01:00
parent b312dc56e3
commit 18d0019c28
54 changed files with 10397 additions and 393 deletions

View File

@@ -19,6 +19,7 @@ return [
'navigation' => [
'main_menu' => 'Menu glowne',
'users' => 'Uzytkownicy',
'products' => 'Produkty',
'dashboard' => 'Dashboard',
'settings' => 'Ustawienia',
],
@@ -68,6 +69,203 @@ return [
'email_taken' => 'Ten adres email jest juz zajety.',
'password_min' => 'Haslo musi miec co najmniej 8 znakow.',
],
'filters' => [
'search' => 'Szukaj (imie, email)',
'sort' => 'Sortowanie',
'direction' => 'Kierunek',
'per_page' => 'Na strone',
],
],
'products' => [
'title' => 'Produkty',
'description' => 'Lokalna baza produktow orderPRO przygotowana pod przyszly sync kanalowy.',
'empty' => 'Brak produktow. Dodaj pierwszy produkt.',
'flash' => [
'created' => 'Produkt zostal dodany.',
'updated' => 'Produkt zostal zaktualizowany.',
'deleted' => 'Produkt zostal usuniety.',
'delete_failed' => 'Nie udalo sie usunac produktu.',
'not_found' => 'Nie znaleziono wskazanego produktu.',
],
'actions' => [
'add' => 'Dodaj produkt',
'import_shoppro' => 'Import z shopPRO',
'preview' => 'Podglad',
'links' => 'Powiazania',
'edit' => 'Edytuj',
'delete' => 'Usun',
'save' => 'Zapisz',
'back' => 'Wroc do listy',
'filter' => 'Filtruj',
'reset' => 'Resetuj',
],
'tabs' => [
'details' => 'Szczegoly',
'links' => 'Powiazania',
],
'confirm' => [
'delete' => 'Czy na pewno usunac produkt #:id?',
],
'fields' => [
'name' => 'Nazwa',
'type' => 'Typ',
'status' => 'Status',
'promoted' => 'Promowany',
'vat' => 'VAT (%)',
'weight' => 'Waga',
'quantity' => 'Stan',
'price_input_mode' => 'Tryb ceny',
'price_brutto' => 'Cena brutto',
'price_netto' => 'Cena netto',
'price_brutto_promo' => 'Cena brutto promo',
'price_netto_promo' => 'Cena netto promo',
'short_description' => 'Krotki opis',
'description' => 'Opis',
'meta_title' => 'Meta title',
'meta_description' => 'Meta description',
'meta_keywords' => 'Meta keywords',
'seo_link' => 'SEO link',
'updated_at' => 'Data modyfikacji',
'actions' => 'Akcje',
],
'status' => [
'active' => 'Aktywny',
'inactive' => 'Nieaktywny',
],
'promoted' => [
'yes' => 'Tak',
'no' => 'Nie',
],
'type' => [
'simple' => 'Prosty',
'variant_parent' => 'Wariantowy',
],
'price_mode' => [
'brutto' => 'Wpisuje brutto',
'netto' => 'Wpisuje netto',
],
'filters' => [
'title' => 'Filtry i sortowanie',
'search' => 'Szukaj (nazwa, SKU, EAN)',
'status' => 'Status',
'type' => 'Typ',
'sort' => 'Sortowanie',
'direction' => 'Kierunek',
'per_page' => 'Na strone',
'any' => 'Wszystkie',
],
'pagination' => [
'summary' => 'Lacznie rekordow: :total',
],
'create' => [
'title' => 'Dodaj produkt',
'description' => 'Utworz lokalny produkt w orderPRO (bez eksportu).',
],
'edit' => [
'title' => 'Edycja produktu #:id',
'description' => 'Aktualizuj dane produktu i zapisuj zmiany w logu.',
],
'show' => [
'title' => 'Podglad produktu #:id',
'description' => 'Widok tylko do odczytu wszystkich danych produktu.',
'details' => 'Szczegoly produktu',
],
'links' => [
'title' => 'Powiazania',
'page_title' => 'Powiazania produktu #:id',
'description' => 'Mapowanie produktu orderPRO do ofert zewnetrznych (shopPRO / marketplace).',
'current_links' => 'Aktualne powiazania',
'search_title' => 'Wyszukiwarka ofert',
'empty_links' => 'Brak powiazan dla tego produktu.',
'empty_offers' => 'Brak ofert do wyswietlenia. Wybierz integracje, wpisz filtr lub wykonaj import ofert.',
'integration_placeholder' => '-- wybierz integracje --',
'search_placeholder' => 'Szukaj po nazwie, SKU, EAN lub external_product_id',
'fields' => [
'integration' => 'Instancja',
'channel' => 'Kanal',
'search' => 'Fraza',
'offer_name' => 'Oferta',
'external_product_id' => 'External product ID',
'external_variant_id' => 'External variant ID',
'external_variant_id_optional' => 'Opcjonalny variant ID',
'link_type' => 'Typ',
'confidence' => 'Confidence',
'link_status' => 'Status',
'updated_at' => 'Ostatnia zmiana',
'history' => 'Historia',
'match_hint' => 'Dopasowanie',
'actions' => 'Akcje',
],
'actions' => [
'search' => 'Szukaj ofert',
'link' => 'Powiaz',
'relink' => 'Przepnij',
'unlink' => 'Odlacz',
],
'confirm' => [
'title' => 'Potwierdzenie',
'unlink_message' => 'Czy na pewno odlaczyc to powiazanie?',
'relink_message' => 'Czy na pewno przepiac powiazanie na nowe ID zewnetrzne?',
'yes' => 'Potwierdz',
'no' => 'Anuluj',
],
'flash' => [
'linked' => 'Powiazanie zostalo zapisane.',
'relinked' => 'Powiazanie zostalo przepiete.',
'unlinked' => 'Powiazanie zostalo odlaczone.',
'link_failed' => 'Nie udalo sie zapisac powiazania.',
'relink_failed' => 'Nie udalo sie przepiac powiazania.',
'unlink_failed' => 'Nie udalo sie odlaczyc powiazania.',
],
],
'images' => [
'title' => 'Zdjecia',
'description' => 'Aktualne zdjecia produktu. Mozesz usunac wybrane, dodac nowe i wskazac glowne.',
'empty' => 'Brak zapisanych zdjec.',
'remove' => 'Usun to zdjecie',
'add_new' => 'Dodaj nowe zdjecia',
'set_main' => 'Ustaw jako glowne',
'main' => 'Glowne',
'main_hint' => 'Jesli nie wybierzesz recznie zdjecia glownego, system ustawi pierwsze dostepne.',
'uploading' => 'Wysylanie zdjec...',
'uploaded_ok' => 'Zdjecia zostaly dodane.',
'confirm_title' => 'Potwierdzenie',
'confirm_delete' => 'Czy na pewno usunac to zdjecie?',
'confirm_yes' => 'Usun',
'confirm_no' => 'Anuluj',
],
'variants' => [
'title' => 'Warianty produktu',
'empty' => 'Brak wariantow dla tego produktu.',
'attributes' => 'Atrybuty',
'import_warning_title' => 'Ostrzezenie po imporcie wariantow',
'import_warning_date' => 'Data ostrzezenia',
],
'import' => [
'title' => 'Import produktow z shopPRO',
'close' => 'Zamknij',
'integration' => 'Integracja',
'integration_placeholder' => '-- wybierz integracje --',
'mode' => 'Zakres importu',
'mode_all' => 'Wszystkie produkty',
'mode_single' => 'Pojedynczy produkt',
'external_id' => 'ID produktu w shopPRO',
'with_variants' => 'Importuj warianty produktu',
'with_variants_hint' => 'Opcja nadpisze lokalna liste wariantow dla importowanego produktu danymi z shopPRO.',
'no_integrations' => 'Brak aktywnych integracji shopPRO z kluczem API. Skonfiguruj je w Ustawienia -> Integracje shopPRO.',
'submit' => 'Uruchom import',
'flash' => [
'failed' => 'Import produktow zakonczyl sie bledem.',
'integration_required' => 'Wybierz integracje do importu.',
'integration_not_found' => 'Nie znaleziono wskazanej integracji.',
'api_key_missing' => 'Wybrana integracja nie ma zapisanego klucza API.',
'single_id_required' => 'Dla importu pojedynczego podaj ID produktu.',
'mode_invalid' => 'Niepoprawny tryb importu.',
'no_products' => 'Brak produktow do importu po stronie shopPRO.',
'single_ok' => 'Import zakonczony. shopPRO #:external_id -> lokalny produkt #:local_id.',
'all_done' => 'Import zakonczony. Zaimportowano: :imported, bledy: :failed.',
],
],
],
'settings' => [
'title' => 'Ustawienia',
@@ -98,5 +296,77 @@ return [
'failed' => 'Nie udalo sie wykonac migracji. Sprawdz log i polaczenie bazy.',
],
],
'integrations' => [
'title' => 'Integracje shopPRO',
'list_title' => 'Integracje shopPRO',
'create_title' => 'Dodaj integracje',
'edit_title' => 'Edytuj integracje',
'empty' => 'Brak skonfigurowanych integracji.',
'fields' => [
'name' => 'Nazwa',
'base_url' => 'Base URL',
'api_key' => 'API Key',
'timeout_seconds' => 'Timeout (sekundy)',
'active' => 'Aktywna',
'active_checkbox' => 'Integracja aktywna',
'last_test' => 'Ostatni test',
'actions' => 'Akcje',
],
'actions' => [
'save' => 'Zapisz integracje',
'edit' => 'Edytuj',
'test' => 'Test polaczenia',
'test_now' => 'Sprawdz teraz',
'import_offers_cache' => 'Importuj oferty',
'new' => 'Nowa integracja',
],
'active' => [
'yes' => 'Tak',
'no' => 'Nie',
],
'test_status' => [
'never' => 'Nie testowano',
'ok' => 'OK',
'error' => 'Blad',
],
'logs_title' => 'Ostatnie testy polaczenia',
'logs' => [
'fields' => [
'tested_at' => 'Data testu',
'status' => 'Status',
'http_code' => 'HTTP',
'message' => 'Komunikat',
],
],
'api_key_placeholder_edit' => 'Zostaw puste, aby zachowac obecny klucz',
'api_key_saved' => 'Klucz API jest zapisany.',
'api_key_missing' => 'Brak zapisanego klucza API.',
'validation' => [
'name_min' => 'Nazwa integracji musi miec co najmniej 2 znaki.',
'base_url_invalid' => 'Podaj poprawny adres URL (http lub https).',
'api_key_required' => 'Podaj klucz API dla integracji.',
'name_taken' => 'Integracja o tej nazwie juz istnieje.',
],
'flash' => [
'created' => 'Integracja zostala dodana.',
'updated' => 'Integracja zostala zapisana.',
'not_found' => 'Nie znaleziono wskazanej integracji.',
'failed' => 'Nie udalo sie zapisac integracji.',
'test_ok' => 'Test polaczenia zakonczony powodzeniem.',
'test_failed' => 'Test polaczenia zakonczyl sie bledem.',
'import_offers_ok' => 'Import cache ofert zakonczony. Przetworzone rekordy: :imported, bledy: :failed, strony API: :pages.',
'import_offers_failed' => 'Import cache ofert zakonczyl sie bledem.',
'import_ok' => 'Import produktu zakonczony. shopPRO #:external_id -> lokalny produkt #:local_id. Kanaly: shopPRO=wystawiony, Allegro=nieustalone, Erli=niedostepny.',
'import_failed' => 'Import produktu zakonczyl sie bledem.',
'import_no_products' => 'Brak aktywnych produktow do importu po stronie shopPRO.',
],
'import' => [
'title' => 'Import testowy produktu',
'description' => 'Importuje jeden produkt z shopPRO. Mozesz podac ID produktu albo zostawic puste, aby pobrac pierwszy aktywny.',
'external_product_id' => 'ID produktu shopPRO (opcjonalnie)',
'external_product_id_placeholder' => 'np. 123',
'action' => 'Importuj 1 produkt',
],
],
],
];