https://github.com/johnzuk/GusApi
https://api.stat.gov.pl/Home/RegonApi
https://github.com/johnzuk/GusApi
https://api.stat.gov.pl/Home/RegonApi
validateNip($nip) - Sprawdza poprawność - Invoice::validateNip('1234567890') → true normalizeNip($nip) - Usuwa myślniki, spacje - Invoice::normalizeNip('123-456-78-90') → '1234567890' formatNip($nip) - Formatuje XXX-XXX-XX-XX - Invoice::formatNip('1234567890') → '123-456-78-90' generateRandomNip() - Generuje losowy - NIP - Invoice::generateRandomNip() → '857-234-19-23' getTestNip() - Stały NIP testowy - Invoice::getTestNip() → '123-456-78-16' isForeignNip($nip) - Czy NIP zagraniczny - Invoice::isForeignNip('9912345678') → true getNipInfo($nip) - Debug info Zwraca tablicę z detailami seller_nip_formatted - Virtual field - $invoice->seller_nip_formatted → '123-456-78-90' buyer_nip_formatted - Virtual field - $invoice->buyer_nip_formatted → '123-456-78-90'
cd /var/www/biznes
Assety zainstalowane za pomocą npm i skopiowane do webroot/
# cd /var/www/biznes # mkdir webroot/css/vendor # mkdir webroot/js/vendor
Poprawne NIPy
5261040828 ✓ (poprawna suma kontrolna)
1234563218 ✓ (poprawna suma kontrolna)
7010416109 ✓ (poprawna suma kontrolna)
5261040567 ✓ (poprawna suma kontrolna)
Ministerstwo Finansów: 5260250274
'App' => [
'defaultTimezone' => 'UTC',
// ...
],
// wyświetlanie
$date->i18nFormat('yyyy-MM-dd HH:mm', 'Europe/Warsaw');
Dodawanie nowej domeny – katalog, konfiguracja Apache2, certbot
# certbot --apache - dodaje certyfikat wskazany z listy # certbot renew # certbot delete -d domena.pl # certbot certificates - lista certyfikatów # certbot certonly --webroot -w /var/www/html/MYAPP/webroot -d MYDOMAIN.pl
SELECT invoice_number, invoice_hash, seller_address, payment_method, sale_date, COUNT(*) OVER() as total FROM purchase_invoices;
-- ABC/123/2026 | bUkGCk34... | ul. Testowa 4 | Przelew | 2026-01-24 | 1
WIN+R – okno wyszukiwania
– wpisz komendę:
netplwiz - konta użytkowników - zalogowani - usunięcie
# adduser nowy_user // User nowy_user dodany do grupy sudo - uprawnienia roota # usermod -aG sudo nowy_user
Różne operacje na certyfikatach:
1. Wgrywamy wszystkie wymagane certyfikaty do /tmp/gus-cert 2. Przygotowujemy tylko certyfikaty w formacie PEM 3. Mogą mieć rozszerzenia .pem lub .crt 4. Zamieniamy rozszerzenia na .crt
# dos2unix gus-verify-certs.sh // LUB jeśli nie masz dos2unix: # sed -i 's/\r$//' gus-verify-certs.sh
https://claude.ai/chat/4cc1d3ee-fca7-47c3-ae8e-069e207e025c
W: Failed to fetch https://packages.sury.org/php/dists/bullseye/InRelease 503 certificate has expired [IP: 146.75.63.52 443]
W: Some index files failed to download. They have been ignored, or old ones used instead.
Linux install:
SELECT * FROM trs WHERE brand_id = 1 AND EXTRACT(YEAR FROM data) = EXTRACT(YEAR FROM CURRENT_DATE) AND EXTRACT(MONTH FROM data) = EXTRACT(MONTH FROM CURRENT_DATE) ORDER BY data DESC;
https://web2tr-ksef.mf.gov.pl/web/ – strona logowania
– uwierzytelnienie za pomocą podpisu zaufanego, podpisanie dokumentu
// ============================================ // KROK 2: IMPLEMENTACJA KSEFCLIENT I AUTORYZACJA // ============================================ // // W KSeF API 2.0 proces uwierzytelniania składa się z 3 kroków: // 1. Pobranie challenge (POST /auth/challenge) // 2. Przygotowanie żądania autoryzacyjnego z tokenem i challenge // 3. Uzyskanie JWT accessToken // ============================================ // Plik: src/KSeF/KSeFClient.php // ============================================
# composer require guzzlehttp/guzzle: ^7.10 # composer require phpseclib/phpseclib:~3.0
Upewnij się że PHP ma włączone rozszerzenie OpenSSL: # php -m | grep openssl (powinno pokazać "openssl")
token|timestampMs (bez challenge)credentials)Teraz mamy accessToken i możemy przejść do wysyłania faktur!
Krok 3 będzie obejmował:
Moduł wysyłania faktur!
To będzie obejmowało:
FakturaBuilder do tworzenia XML FA(3)W modelu Table nie można użyć metody $this->fetchTable(„Projects”) – ta metoda dostępna jest tylko dla Controllers.
src/Model/Table/InvoicesTable.php
use Cake\ORM\TableRegistry; class InvoicesTable extends Table { public function getProjects() { $projects = TableRegistry::getTableLocator()->get('Projects') ->find() ->where(['is_active' => 1]) ->all(); .... } // getProjects() ... } // class
Szuka pliku od katalogu roboczego (aktualnego) i we wszystkich podkatalogach
find . -name "5060bc35b695a2fd90320afca920f32a"
Wszystkie pliki i podkatalogi /home/john/my_app/ zostaną wgrane do roboczego katalogu .
# rsync -av johnny@194.127.230.100:/home/johnny/my_app/ .
Backup zostanie wgrany ze zdalnego systemu do katalogu roboczego
# rsync -av johnny@194.137.231.100:/home/johnny/backup/myapp-20251120.sql .
$this->Form->create($article); // Article controls. echo $this->Form->control('title'); // Author controls (belongsTo) echo $this->Form->control('author.id'); echo $this->Form->control('author.first_name'); echo $this->Form->control('author.last_name'); // Author profile (belongsTo + hasOne) echo $this->Form->control('author.profile.id'); echo $this->Form->control('author.profile.username'); // Tags controls (belongsToMany) // as separate inputs echo $this->Form->control('tags.0.id'); echo $this->Form->control('tags.0.name'); echo $this->Form->control('tags.1.id'); echo $this->Form->control('tags.1.name'); // Inputs for the joint table (articles_tags) echo $this->Form->control('tags.0._joinData.starred'); echo $this->Form->control('tags.1._joinData.starred'); // Comments controls (hasMany) echo $this->Form->control('comments.0.id'); echo $this->Form->control('comments.0.comment'); echo $this->Form->control('comments.1.id'); echo $this->Form->control('comments.1.comment'); $this->Form->end();
JSON – brak RequestHandlera zamiast tego JsonView
Plugin PDF – WkHtmlToPdf rekomendowany silnik
# composer require friendsofcake/cakepdf
Plugin CSV – instalacja w katalogu aplikacji
# composer require friendsofcake/cakephp-csvview
Zmieniło się: typowanie, json, fetchTable
Kopiowanie plików przez sieć, przenoszenie bazy, certyfikaty,
https://claude.ai/chat/b62ab800-58cd-4c56-96ea-c9d9937b03f4
https://claude.ai/chat/f46e500d-d53c-4f3f-8d6f-70df53d31673