Aplikacja od śledzenia czasu do faktury: od wpisów do spersonalizowanych PDF-ów
Zbuduj aplikację od śledzenia czasu do fakturowania, która rejestruje godziny projektowe, zamienia je w faktury i generuje spersonalizowane pliki PDF dla klientów.

Co budujesz i dlaczego to ważne
Aplikacja od śledzenia czasu do fakturowania rozwiązuje powszechny bałagan: godziny rozproszone są po kalendarzach, czatach i notatkach. Gdy nadchodzi dzień wystawiania faktur, ktoś musi odtworzyć miesiąc ręcznie. Wtedy pojawiają się błędy: pominięte czasochłonne pozycje, złe stawki, zdublowane linie albo sumy, które się nie zgadzają.
Ta aplikacja jest dla każdego, kto rozlicza się godzinowo i chce powtarzalnego procesu: freelancerów obsługujących wielu klientów, agencji, w których kilka osób loguje czas do tego samego projektu, oraz zespołów wewnętrznych, które fakturują czas klientom lub działom.
Cel jest praktyczny: rejestrować wpisy czasu według projektu, zwinąć je w rekord faktury i wygenerować spersonalizowany PDF zrozumiały dla klienta. Gdy ten przepływ działa niezawodnie, fakturowanie przestaje być miesięcznym chaosem.
Zasada „najpierw prosto” zwykle oznacza:
- Jeden sposób rejestrowania czasu (data, projekt, godziny, notatka)
- Jedna reguła stawek (na projekt lub na osobę)
- Jedna faktura na klienta za okres
- Jeden układ PDF z twoim logo i danymi firmy
- Jasne statusy (Szkic, Gotowe, Wysłane, Opłacone)
Mały scenariusz: dwuosobowe studio śledzi czas dla „Client A - Website Updates”. Każda osoba zapisuje wpisy w ciągu tygodnia. W piątek tworzysz fakturę dla tego projektu i zakresu dat, aplikacja zamienia wpisy w pozycje faktury, a PDF jest gotowy do wysłania bez przepisywania czegokolwiek.
Jeśli używasz platformy no-code takiej jak AppMaster, najpierw uporządkuj dane i przepływ, zanim dodasz dodatkowe funkcje jak paragony, wielowalutowość, rabaty czy zatwierdzenia. Łatwiej je dodać, gdy podstawowy przepływ jest szybki, dokładny i odporny na błędy.
Główne funkcje do uwzględnienia (i co pominąć na start)
Mała pierwsza wersja pozwala szybciej wysyłać „wysyłalne faktury”. Skup się na trzech rzeczach: rejestrowaniu czasu, przekształcaniu czasu w jasne pozycje faktury i wygenerowaniu PDF, który klient zrozumie bez pytań.
Zacznij od kilku kluczowych rekordów (możesz później zmienić nazwy, ale struktura ma znaczenie): Client, Project, Time Entry, Invoice i Invoice Line.
Utrzymaj prosty przepływ faktury z jednym polem statusu w rekordzie Invoice. Szkic, Gotowe i Opłacone wystarczą dla większości zespołów przez długi czas.
Twoje obowiązkowe akcje powinny odpowiadać temu, co dzieje się co tydzień:
- Logowanie czasu (ręczny wpis jest zwykle najszybszy do zbudowania i najłatwiejszy do poprawienia)
- Zatwierdzanie czasu (nawet jako prosty status „Zatwierdzone”)
- Tworzenie faktury z zatwierdzonego czasu
- Eksport PDF
„Spersonalizowane” nie znaczy wymyślne. To oznacza spójność i wiarygodność: logo, dane firmy, numer i daty faktury, jasne sumy i instrukcje płatności.
Co pominąć na start: podatki, rabaty, wiele walut i załączniki. Są przydatne, ale wprowadzają przypadki brzegowe (zaokrąglanie, przepisy jurysdykcji, kursy walutowe, przechowywanie plików), które spowalniają pierwsze wydanie.
Model danych: rekordy, których potrzebujesz i pola, które się liczą
Aplikacja od śledzenia czasu do fakturowania stoi i upada na modelu danych. Utrzymaj go małym i przewidywalnym, aby sumy zawsze zgadzały się z tym, co obiecałeś klientowi.
Minimalny zestaw tabel zazwyczaj wygląda tak:
- Client: nazwa, e-mail do rozliczeń, adres rozliczeniowy, domyślna waluta, warunki płatności (np. Net 14)
- Project: client_id, nazwa projektu, domyślna stawka godzinowa (opcjonalnie), flaga aktywności
- Time entry: project_id, osoba (nazwa lub user_id), data, czas trwania (godziny), opis, rate_at_time, rozliczalne (tak/nie), invoiced_invoice_id (puste aż do zafakturowania)
- Invoice: client_id, project_id (opcjonalnie), numer faktury, data wystawienia, termin płatności, status, subtotal, podatek, total
Stawki to miejsce, gdzie aplikacje się komplikują. Wybierz jedno podejście i trzymaj się go: stawka na projekt, stawka na osobę lub stała stawka za zadanie/usługę.
Nawet jeśli przechowujesz domyślną stawkę w projekcie lub na osobie, skopiuj faktyczną stawkę do każdego wpisu czasu jako rate_at_time w momencie tworzenia (lub zatwierdzenia) wpisu. Zapobiegnie to niespodziankom, gdy stawki zmienią się później. Faktury powinny odzwierciedlać to, co było prawdą podczas wykonywania pracy.
Dla wpisów czasu często można pominąć osobny status i polegać na tym, czy invoiced_invoice_id jest puste, czy nie. Dla faktur trzymaj statusy wąsko: Szkic, Gotowe, Wysłane, Opłacone (dodaj Unieważnione, jeśli potrzebujesz czystego stanu anulowania).
W AppMaster Data Designer mapuje się czysto na PostgreSQL i ułatwia utrzymanie przejrzystych relacji bez duplikowania pól wszędzie.
Rejestrowanie wpisów czasu według projektu (prosty UX)
Rejestracja czasu decyduje, czy aplikacja jest bezwysiłkowa, czy jest ignorowana. Utrzymaj pierwszą wersję nudną i szybką: jeden ekran, jedna główna akcja i jak najmniej wyborów.
Wybierz jedną metodę rejestracji na start. Ręczny wpis zwykle wygrywa na początku, bo działa dla każdego i łatwo go przeglądać. Timer możesz dodać później, gdy poznasz, jak ludzie faktycznie rejestrują dzień. Jeśli dodasz timer, nadal pozwól na ręczne poprawki dla pominiętych zatrzymań.
Uczyń pola, które chronią jakość rozliczeń, obowiązkowymi:
- Projekt (lub klient + projekt)
- Data
- Czas trwania (godziny i minuty)
- Krótki opis (co klient rozpozna)
- Osoba (jeśli więcej niż jedna osoba loguje czas)
Zdecyduj z wyprzedzeniem o regułach zaokrąglania, bo wpływają one na zaufanie i sumy. Popularne podejście to 6-minutowe kroki (0.1 godziny). Jasne określenie, czy zaokrąglasz każdy wpis, czy sumę dzienną. Zaokrąglanie każdego wpisu jest prostsze do wyjaśnienia i audytu.
Jeśli więcej niż jedna osoba ma wpływ na rozliczenia, dodaj lekkie zatwierdzenie. Praktyczna zasada: po zatwierdzeniu wpisy są domyślnie zablokowane do edycji. Jeśli coś trzeba zmienić, wymagaj roli menedżera, aby ponownie je otworzyć i zapisać, kto i dlaczego zmienił.
Przekształcanie czasu w pozycje faktury (reguły agregacji)
Agregacja to moment, gdy surowe logi stają się pozycjami faktury, które klient zrozumie. Trzymaj reguły proste i powtarzalne, aby ufać każdej wygenerowanej fakturze.
Zacznij od jednej akcji: wybierz klienta i zakres dat, a następnie pobierz tylko nieopłacone wpisy czasu, które pasują. Ten filtr jest zabezpieczeniem przed podwójnym fakturowaniem. Jeśli wpis nie ma przypisanego klienta lub projektu, traktuj go jako „niegotowy do fakturowania” i nie uwzględniaj go w agregacji, dopóki nie zostanie poprawiony.
Jak grupować wpisy w pozycje faktury
Grupowanie określa, ile linii powstanie i jak łatwo klient je sprawdzi. Wybierz domyślną opcję i dodaj jeden przełącznik opcjonalny, jeśli potrzebujesz elastyczności.
Popularne opcje grupowania:
- Według projektu
- Według osoby (przydatne, gdy stawki się różnią)
- Według dnia lub tygodnia
- Według zadania/kategorii (Design vs Development)
Cokolwiek wybierzesz, każda pozycja powinna pokazywać: czytelną etykietę, łączną liczbę godzin, stawkę i kwotę linii. Jeśli stawki mogą się zmieniać, używaj rate_at_time zapisanego w każdym wpisie (lub tabeli stawek z datami obowiązywania), a nie jednej „aktualnej stawki”.
Oznaczanie jako zafakturowane (ale bez zamykania drogi do poprawek)
Gdy dodasz wpisy do faktury, zapisz ID faktury na każdym wpisie czasu. To tworzy ślad audytu i zapobiega ponownemu pobraniu tego samego wpisu.
Korekty się zdarzają. Jeśli usuniesz linię z faktury, nie kasuj historii. Odłącz dotknięte wpisy czasu (wyczyść invoice ID), przelicz sumy i zapisz krótką notatkę typu „Usunięto 2.0h, błędny projekt.”
W AppMaster można to zrealizować jako jeden proces biznesowy: zapytaj nieopłacone wpisy, pogrupuj je, utwórz pozycje faktury, a następnie zaktualizuj każdy wpis referencją do faktury.
Rekordy faktury: sumy, numeracja i status
Rekord faktury jest pojemnikiem, który możesz wysłać, śledzić i później audytować. Powinien pozostać stabilny, nawet jeśli ktoś edytuje nazwę projektu lub zmienia domyślną stawkę.
Praktyczny nagłówek faktury zawiera:
- Numer faktury (unikalny, czytelny dla człowieka)
- Data wystawienia i termin płatności
- Dane odbiorcy (nazwa klienta, adres rozliczeniowy, NIP jeśli potrzebny)
- Notatki (instrukcje płatności, krótkie podziękowanie)
- Waluta (opcjonalnie zapisana stawka wymiany jeśli fakturujesz międzynarodowo)
Trzymaj sumy przewidywalne. Subtotal to suma pozycji faktury. Następnie zastosuj rabat (kwotowo lub procentowo), oblicz podatek (często od zredukowanego subtotalu) i zapisz ostateczną kwotę. Zachowaj dokładną stawkę podatku i wartości rabatu użyte, aby móc odtworzyć fakturę później.
Numeracja faktur nie musi być wyszukana. Wybierz wzór i trzymaj się go: sekwencyjny (000123), roczny (2026-00123) lub prefiks klienta plus numer (ACME-014). Spójność jest ważniejsza niż perfekcja.
Status powinien koncentrować się na komunikacji i kontroli wewnętrznej:
- Szkic (edytowalny, niewysłany)
- Gotowe (suma zablokowana)
- Wysłane (udostępnione klientowi)
- Opłacone (płatność potwierdzona)
- Zaległe (po terminie płatności)
- Unieważnione (anulowane, zachowane w historii)
Generowanie spersonalizowanego PDF-a czytelnego dla klienta
Dobry PDF faktury szybko odpowiada na dwa pytania: co jest fakturowane i jak zapłacić. Generuj PDF z rekordu faktury (nie z surowych wpisów czasu), aby dokument zawsze zgadzał się z numerem faktury, sumami i statusem.
Większość klientów oczekuje tych samych bloków za każdym razem:
- Nagłówek z nazwą twojej firmy, numerem faktury i datą
- Dane klienta (firma, osoba kontaktowa, adres rozliczeniowy, NIP jeśli potrzeby)
- Pozycje (opis, ilość lub godziny, stawka, kwota linii)
- Sumy (subtotal, podatek, rabat, suma końcowa)
- Warunki płatności (termin, akceptowane metody, nota o odsetkach jeśli stosujesz)
Branding ma znaczenie, ale czytelność jest ważniejsza. Użyj jednego koloru akcentowego, czytelnej czcionki i spraw, by sumy były łatwe do szybkiego odczytania.
Problemy układu ujawniają się przy prawdziwych danych. Testuj z długimi opisami i fakturami 30+ pozycji. Upewnij się, że nagłówki kolumn powtarzają się na nowych stronach i blok sum pozostaje zwarte.
Jeśli generujesz PDF-y w AppMaster, traktuj PDF jako artefakt faktury: zapisz plik (lub referencję do storage) w rekordzie faktury z wygenerowanym znacznikiem czasu i wersją. Ułatwia to ponowne wysłanie dokładnego dokumentu, który klient otrzymał.
Plan budowy krok po kroku (no-code)
Zdecyduj, co jest „źródłem prawdy”. Wpisy czasu to surowe fakty. Faktury to migawka, którą możesz wysłać i później audytować.
1) Najpierw zaprojektuj model danych
Utwórz tabele i relacje, a potem dodaj kilka pól jakościowych, gdy podstawy są stabilne:
- Clients
- Projects
- Time Entries
- Invoices
- Invoice Lines
2) Zbuduj dwa proste ekrany
Utrzymaj UI minimalny:
- Formularz wpisu czasu: projekt, data, czas trwania, notatki, zapisz
- Przegląd faktury: klient, okres, pozycje, sumy, status
Interfejs web zwykle wystarcza do administrowania i przeglądu. Dodaj ekrany mobilne później, jeśli ludzie będą logować czas w drodze.
3) Zautomatyzuj logikę agregacji
Zbuduj przepływ: wybierz klienta + zakres dat, pobierz nieopłacone wpisy, pogrupuj je, utwórz pozycje faktury. Oznacz wpisy jako zafakturowane dopiero po zatwierdzeniu faktury lub przeniesieniu jej do Gotowe.
4) Generuj i zapisuj PDF
Dodaj akcję „Generuj PDF”, która pobiera nagłówek faktury, dane klienta i pozycje do szablonu, a następnie zapisuje wynik w rekordzie faktury.
Przykład: od tygodniowych logów czasu do faktury gotowej dla klienta
Agencja 3-osobowa ma jednego klienta, Northstar Co, i fakturuje dwa projekty w ciągu dwóch tygodni: Website Refresh i Monthly Support. Zespół to Alex (design), Priya (dev) i Sam (PM). Wszyscy logują czas codziennie, wybierając klienta, projekt, datę i krótki opis.
Każdego dnia wpisy są zapisywane jako Szkic. W piątek Sam otwiera ekran przeglądu filtrowany na „Ten tydzień, Northstar Co”. Poprawia dwie notatki („Homepage hero” zamiast „Hero”), potwierdza które są rozliczalne, a następnie blokuje tydzień.
Oto próbka wpisów z tygodnia:
| Date | Person | Project | Hours | Note |
|---|---|---|---|---|
| Mon | Priya | Website Refresh | 2.5 | Header layout fixes |
| Tue | Alex | Website Refresh | 3.0 | New homepage mock |
| Tue | Sam | Monthly Support | 1.0 | Client call |
| Wed | Priya | Website Refresh | 4.0 | Contact form logic |
| Thu | Alex | Monthly Support | 1.5 | Banner update |
| Thu | Priya | Monthly Support | 2.0 | Email template tweak |
| Fri | Sam | Website Refresh | 1.0 | QA and handoff |
Gdy Sam kliknie „Utwórz fakturę”, aplikacja agreguje wpisy w pozycje faktury używając prostych reguł: grupuj według projektu i stawki, sumuj godziny i przenieś krótki opis. Faktura kończy się trzema pozycjami:
| Line | Description | Qty | Rate | Amount |
|---|---|---|---|---|
| 1 | Website Refresh (Design) | 3.0 hrs | $120 | $360 |
| 2 | Website Refresh (Development/PM) | 7.5 hrs | $140 | $1,050 |
| 3 | Monthly Support | 4.5 hrs | $110 | $495 |
System przypisuje numer faktury (np. NS-2026-014), oblicza subtotal i podatek, i ustawia status na Gotowe. Jeszcze jedno kliknięcie generuje spersonalizowany PDF (logo, adres klienta, szczegóły linii, sumy, instrukcje płatności). Po wysłaniu status zmienia się na Wysłane, a powiązane wpisy czasu są oznaczane jako zafakturowane, aby nie mogły być ponownie obciążone.
Najczęstsze błędy i jak ich unikać
Większość problemów to nie problemy matematyczne, a problemy z przepływem pracy.
Nieblokowanie zafakturowanych wpisów czasu. Jeśli ludzie mogą edytować lub ponownie wybierać te same wpisy do nowej faktury, w końcu zdarzy się podwójne fakturowanie. Rozwiąż to, dodając referencję faktury w każdym wpisie czasu i ukrywając zafakturowane wpisy z widoku „gotowe do fakturowania”.
Przepisywanie historii po zmianie stawek. Jeśli liczysz tylko z użyciem „aktualnej” stawki projektu lub użytkownika, zmiana tej stawki zmieni stare faktury. Skopiuj efektywną stawkę do rate_at_time w każdym wpisie.
Edycja zatwierdzonego czasu bez śladu audytu. Dodaj „Zatwierdzone przez”, „Zatwierdzone o” i krótką notatkę o zmianie dla edycji po zatwierdzeniu.
PDF-y, które psują się przy prawdziwych danych. Długie opisy, wiele pozycji i duże liczby obciążają szablon.
Szybkie poprawki, które zapobiegają większości problemów układu:
- Ustal maksymalną długość opisu i przenieś nadmiar do sekcji notatek
- Pozwól na zawijanie tekstu i testuj z 30+ wierszami
- Trzymaj nagłówek kompaktowy, aby tabela miała miejsce
- Używaj spójnych formatów liczb (waluta, miejsca po przecinku)
Niewyraźny przepływ statusów. Bez jasnych reguł faktury są wysyłane dwukrotnie lub nigdy.
Prosty, bezpieczny przepływ to: Szkic -> Gotowe -> Wysłane -> Opłacone. Pozwalaj na agregację tylko w Szkicu i generowanie PDF tylko, gdy sumy są zablokowane.
Krótka lista kontrolna i praktyczne następne kroki
Zanim wyślesz fakturę, zrób szybki przegląd. Zapobiega to najczęstszym problemom: złym sumom, brakującym danym i PDF-om, które wyglądają dobrze na ekranie, ale psują się przy druku.
Lista kontrolna przed wysyłką:
- Dane klienta są kompletne (nazwa prawna, adres rozliczeniowy, właściwy kontakt)
- Okres faktury jest poprawny (daty początkowa i końcowa zgadzają się z pracą)
- Sumy są spójne (subtotal, podatek, suma końcowa zgadzają się z wpisami, stawkami i zaokrągleniami)
- Żaden czas nie został pominięty ani zdublowany (nic nie zostało nieopłacone, nic nie jest uwzględnione dwukrotnie)
- Pola operacyjne są czyste (unikalny numer faktury, poprawny status, PDF zapisany w rekordzie faktury)
Następnie przejrzyj PDF „jak do druku”. Sprawdź położenie logo, długie adresy, zawijanie tabel i podziały stron. Testuj zarówno krótką fakturę (1–2 pozycje), jak i długą (20+ pozycji).
Kolejne kroki po ustabilizowaniu podstaw:
- Wysyłaj faktury e-mailem z jednolitym szablonem
- Dodaj płatności Stripe i oznaczaj faktury jako Opłacone automatycznie
- Dodaj uprawnienia, żeby tylko właściwe role mogły edytować stawki, zatwierdzać czas lub zmieniać statusy
Jeśli chcesz szybko budować i iterować bez pisania wszystkiego od zera, AppMaster (appmaster.io) jest praktyczną opcją do stworzenia aplikacji fakturującej bez kodu z prawdziwą bazą danych, logiką biznesową i generowaniem PDF, a potem regenerowania czystego kodu źródłowego w miarę zmiany wymagań.
Jeśli poprawisz tylko jedną rzecz w tym tygodniu, spraw, by „nieopłacony czas” był niemożliwy do przeoczenia. To samo w sobie oszczędza godziny i chroni przychody.
FAQ
Rozpocznij od upewnienia się, że każdy wpis czasu ma przypisany projekt, datę, czas trwania i krótki opis. Następnie utwórz fakturę wybierając klienta i zakres dat, pobierając tylko nieopłacone wpisy, grupując je w pozycje faktury i generując PDF z migawki faktury.
Użyj pięciu rekordów: Client, Project, Time Entry, Invoice i Invoice Line. Utrzymuj pola minimalne, ale dodaj rate_at_time w każdym wpisie czasu oraz referencję invoiced_invoice_id, aby historia rozliczeń pozostała spójna i zapobiec podwójnemu fakturowaniu.
Zapisuj stawkę używaną w momencie wykonania pracy w każdym wpisie czasu (na przykład rate_at_time). Domyślne stawki mogą być na poziomie projektu lub osoby, ale faktury powinny zawsze liczyć z użyciem zapisanej stawki, żeby stare faktury się nie zmieniały po aktualizacji stawek.
Wybierz jedną regułę zaokrąglania i trzymaj się jej, a następnie uwidocznij ją w procesie. Popularne podejście to zaokrąglanie każdego wpisu do 6-minutowych kroków (0.1 godziny), bo jest łatwe do audytu i utrzymuje przewidywalne sumy faktur.
Użyj jednego pola statusu na fakturach i trzymaj je proste: Szkic, Gotowe, Wysłane, Opłacone (dodaj Unieważnione tylko jeśli potrzebujesz anulowań). Ustal jasne reguły, na przykład „agregacja tylko w Szkicu” i „zablokuj sumy w Gotowe”, żeby ludzie nie zmieniali tego, co już wysłano.
Filtrowanie tworzenia faktury tak, aby pobierało tylko wpisy czasu, gdzie invoiced_invoice_id jest puste, i ustawienie tego pola natychmiast po przypisaniu wpisów do faktury. Dodatkowo ukryj zafakturowane wpisy z widoku „gotowe do fakturowania”, aby ten sam czas nie mógł zostać wybrany ponownie.
Generuj PDF z rekordu faktury, a nie z surowych wpisów czasu, żeby dokument zawsze zgadzał się z numerem faktury, sumami i statusem. Dodaj jasny nagłówek, dane klienta, pozycje, sumy i instrukcje płatności. Testuj z długimi opisami i fakturami z 30+ pozycjami, aby wychwycić problemy układu.
Nie usuwać historii. Odłącz dotknięte wpisy czasu od faktury (wyczyść referencję faktury), wygeneruj ponownie pozycje faktury i sumy, oraz zapisz krótki notatkę korygującą, aby móc później wyjaśnić, co się zmieniło, bez utraty audytu.
Zacznij od ręcznego wpisywania czasu, ponieważ jest to szybkie do zbudowania i łatwe do poprawienia. Timer dodaje problemy brzegowe (przypadki pominiętych zatrzymań, edycji, problemy z urządzeniem), więc najlepiej dodać go dopiero gdy podstawowy przepływ niezawodnie produkuje poprawne faktury.
Zbuduj najpierw podstawowy przepływ: rejestrację wpisów czasu, zatwierdzanie/blokowanie, tworzenie faktury z nieopłaconego czasu oraz generowanie PDF. Początkowo odsuń podatki, wielowalutowość, rabaty i załączniki, bo wprowadzają przypadki brzegowe, które spowalniają rozwój i komplikują obliczenia.


