Podstawy modelu danych faktury GST: minimalne pola, obsługa HSN oraz ekrany administracyjne potrzebne do generowania zgodnych faktur i upraszczania uzgadniania.

Większość problemów z fakturami GST to nie „złożona logika podatkowa”, lecz brakujące lub niespójne dane. Audyt kończy się niepowodzeniem, gdy faktury nie da się jednoznacznie powiązać z tym, co sprzedano, komu, gdzie dostarczono i jak policzono podatek.
Częstym wyzwalaczem jest brak HSN, przestarzały kod lub przypisanie HSN na niewłaściwym poziomie. Zespół może przechowywać HSN w produkcie, ale linia faktury jest tworzona z innej nazwy SKU lub wariantu, więc HSN nie trafia na dokument końcowy. Innym częstym problemem jest błędny podział podatku: naliczanie IGST zamiast CGST+SGST (lub odwrotnie), ponieważ „miejsce dostawy” wywnioskowano ze adresu wysyłki bez zapisu kodów stanów użytych do decyzji.
Zespoły finansowe odczuwają to natychmiast. Uzgadnianie staje się codziennym sprzątaniem: sumy faktur nie zgadzają się z zamówieniem, zamówienie nie zgadza się z rozliczeniem bramki płatności, a zwroty wymagają łańcucha ręcznych notatek. Nawet drobne różnice zaokrągleń między pozycjami mogą spowodować niezgodności między PDF faktury, raportami GST i księgą.
Oto wzorce, które powodują najwięcej problemów z niezgodnościami:
Celem modelu danych faktury GST jest proste: przechowywać minimalny zestaw pól zamówienia, produktu, stron, podatku, faktury i not korygujących, aby każdą liczbę dało się później odtworzyć i wytłumaczyć. Utrzymaj model niewielki, ale nie pomijaj prawnie istotnych pól decydujących o rodzaju podatku, stawce i raportowaniu.
Jeśli chcesz, aby faktury GST były łatwe do wygenerowania i późniejszego uzgadniania, zacznij od małego zestawu obiektów i spraw, by każdy z nich robił jedną rzecz. Czysty model danych faktury GST to mniej liczba tabel, a więcej stabilność faktów w czasie.
Oto podstawowe rekordy, których większość zespołów potrzebuje od dnia pierwszego:
Faktura powinna być oddzielna od zamówienia. Zamówienia mogą się zmieniać (edytowany adres, anulowane pozycje, częściowa realizacja). Faktury nie powinny. Potrzebują stabilnej numeracji, dat i sum, które nigdy nie „dryfują” z powodu późniejszych zmian zamówienia.
Punktem odniesienia dla dokładności podatku są pozycje (Line Items). Każda pozycja zamówienia (a później każda pozycja faktury) powinna zawierać dokładną ilość, cenę jednostkową, rabat i rozbicie podatku dla tej pozycji. To tam stosuje się HSN/SAC i stawki GST.
Szczegół, który ratuje zespoły finansowe: przechowuj snapshoty. Gdy generujesz fakturę, skopiuj opis produktu, HSN/SAC, stawkę podatku i ceny do pozycji faktury. Nie polegaj na aktualnym katalogu produktów, bo stawki i nazwy się zmieniają.
Opcjonalnie, ale często warto dodać wcześnie: Zwroty, Refundy i Noty korygujące jako oddzielne rekordy. Przykład: jeśli klient zwraca jeden przedmiot z zamówienia dwu-pozycyjnego, chcesz noty korygującej odnoszącej się do oryginalnej linii faktury, podczas gdy zapis zwrotu płatności odnosi się do transakcji bramki. Trzymanie tych obiektów explicite zapobiega ręcznym poprawkom w rejestrach GST na koniec miesiąca.
Jeśli budujesz to w Koder.ai, traktuj każdy obiekt najpierw jako prosty ekran (utwórz, pokaż, edytuj), a generowanie faktury dodaj dopiero po wdrożeniu snapshotów i pól na poziomie linii.
HSN (dla towarów) i SAC (dla usług) nie są tylko „szczegółami faktury”. Zaczynają się w definicji produktu/usługi, a następnie są kopiowane na każdą linię faktury w momencie wystawienia. To utrzymuje poprawność koszyków mieszanych i ułatwia audyt, bo każda linia jest samodzielna.
Praktyczny minimalny model danych to:
Umieszczenie HSN/SAC w produkcie ułatwia adminowi utrzymanie w jednym miejscu. Skopiowanie go do InvoiceLine to to, co sprawia, że przeszłe faktury są stabilne. Nawet jeśli produkt później się zmieni, faktura pokazuje, co było prawdą w chwili sprzedaży. To sedno modelu danych faktury GST, który nie zawodzi przy uzgadnianiu.
Dla przechowywania HSN trzymaj to proste: kod jest wymagany, opis opcjonalny, a effective_from date opcjonalny jeśli chcesz historię zmian. Większość zespołów nie potrzebuje opisu na każdej pozycji, ale może on pomóc przy wyjątkach sprawdzanych przez finanse.
Mieszane koszyki są normalne: jedna faktura może mieć wiele pozycji i zatem wiele kodów HSN/SAC. Nie próbuj narzucać jednego kodu na fakturę. Sumy agregują się na poziomie nagłówka faktury, klasyfikacja pozostaje na poziomie linii.
Zarządzanie zmianami to miejsce, gdzie ludzie popełniają błędy. Użyj prostego zestawu reguł:
W panelu administracyjnym wystarczy jedno miejsce do edycji pól podatkowych Produktu oraz widok tylko do odczytu na linii faktury, by potwierdzić, co zostało zarejestrowane w momencie wystawienia. Jeśli budujesz te ekrany szybko, narzędzia takie jak Koder.ai mogą wygenerować podstawowe strony CRUD i tabele danych z tego modelu przy minimalnym wysiłku.
Model danych faktury GST najczęściej zawodzi na detalach stron. Jeśli tożsamość nabywcy lub sprzedawcy jest choćby trochę niepoprawna, faktura może być ważna na papierze, ale kłopotliwa w zwrotach i uzgadnianiu.
Zacznij od traktowania „sprzedawcy”, „nabywcy” i „ship-to” jako osobnych stron, nawet jeśli to ta sama osoba. Zapobiega to późniejszym obejściom, gdy klient doda inny adres wysyłki lub gdy sprzedajesz z więcej niż jednej rejestracji GST.
Trzymaj pola nudne i jawne. To te, które zwykle trafiają na fakturę i do raportów:
Przechowuj stan zarówno jako czytelny tekst, jak i kod stanu, ponieważ raportowanie i zasady miejsca dostawy często opierają się na kodzie.
Zapisz zarówno adres rozliczeniowy, jak i wysyłkowy na zamówieniu, nie tylko w profilu klienta. Profile się zmieniają; faktury nie powinny.
Miejsce dostawy powinno być zapisane jako konkretny kod stanu na fakturze (skopiowany z zamówienia w momencie wystawienia). Nie „przeliczaj” go później. Jeśli twoją regułą jest „stan docelowy wysyłki”, zapisz wynik tej decyzji oraz stan użyty do podjęcia jej. To ułatwia audyty i spory.
Dla B2B GSTIN nabywcy jest zwykle wymagany i powinien być walidowany pod względem długości i formatu przy wprowadzaniu. Dla B2C GSTIN może zostać pusty, ale nadal potrzebujesz pełnego adresu i stanu, aby określić, czy obowiązuje CGST/SGST czy IGST.
Prosta zasada działająca w większości systemów: jeśli GSTIN nabywcy jest obecny, traktuj jako B2B; jeśli nie, traktuj jako B2C. Jeśli potrzebujesz wyjątków, przechowuj pole customer_type.
Jeśli masz oddziały lub jednostki biznesowe z różnymi rejestracjami GST, modeluj „Seller Entity” jako własny rekord z własnym GSTIN i adresem. Każde zamówienie powinno odnosić się dokładnie do jednego podmiotu sprzedawcy, a każda faktura powinna skopiować te dane, aby historyczne faktury pozostały poprawne nawet po zmianie adresu sprzedawcy.
Narzędzia takie jak Koder.ai mogą szybko wygenerować formularze administracyjne dla tych rekordów, ale kluczowa jest struktura: oddzielny podmiot sprzedawcy, snapshoty w czasie zamówienia i jawny kod stanu miejsca dostawy.
Najczęstszy podział jest prosty: jeśli miejsce dostawy leży w tym samym stanie co dostawca, podatek to CGST + SGST. Jeśli jest inny stan, podatek to IGST. System nie powinien „przeliczać ponownie później z sum”, ponieważ drobne różnice (zaokrąglenia, rabaty, wysyłka) są tym, co powoduje niezgodności.
Przynajmniej przechowuj kwoty podatku na poziomie linii faktury, nie tylko w nagłówku. W ten sposób możesz wyjaśnić każdą złotówkę na fakturze i odnieść ją do produktu, HSN i przychodu.
Praktyczne minimum na poziomie linii faktury wygląda tak:
Rabat to miejsce, gdzie systemy się komplikują. Zdecyduj jedną regułę i przechowuj ją jawnie. Jeśli rabaty obniżają cenę przed podatkiem (typowe dla rabatów pozycyjnych i kuponów), przechowuj oryginalną kwotę brutto, kwotę rabatu i wynikającą wartość opodatkowaną. Jeśli masz kupon na poziomie zamówienia, alokuj go po liniach (zwykle proporcjonalnie do przedrabatowej wartości każdej linii) i przechowuj alokowany rabat na linii, aby rachunki podatkowe były wytłumaczalne.
Zaokrąglanie powinno być spójne i zapisane. Wybierz, czy zaokrąglasz na poziomie linii, czy tylko na poziomie faktury, a następnie zapisuj zaokrąglone wyniki, które wydrukowałeś. Wiele zespołów liczy podatek po linii, zaokrągla do 2 miejsc, sumuje, a potem dodaje pole invoice_rounding_adjustment, by dojść do dokładnej kwoty do zapłaty.
Koszty wysyłki i obsługi nie powinny być ukrytym dodatkiem. Traktuj je jako oddzielną pozycję faktury z własnym kodem HSN/usługi i regułami podatkowymi. Przykładowo, zamówienie z dwoma produktami i opłatą za wysyłkę staje się trzema liniami, każda z przechowywaną wartością opodatkowaną i składnikami podatku, co ułatwia uzgadnianie finansów.
Gdy podatek jest policzony, faktura nadal potrzebuje pól „dokumentu”, które czynią ją ważną, audytowalną i łatwą do uzgodnienia później. W modelu danych faktury GST traktuj nagłówek faktury jak zapis prawny: powinien być stabilny, nawet jeśli dane produktu lub klienta zmienią się w przyszłości.
Zacznij od podstaw nagłówka: numer faktury, data wystawienia (data na fakturze), typ faktury (tax invoice, eksport, B2B, B2C itp.) i waluta. Nawet jeśli głównie fakturujesz w INR, przechowywanie waluty unika kłopotliwych przypadków przy eksporcie lub marketplace'ach wielowalutowych.
Numeracja to miejsce, gdzie zespoły się spalają. Trzymaj serię lub przedrostek (np. „FY25-INV-”), przechowuj rok finansowy i egzekwuj unikalność na poziomie bazy danych. Przechowuj też kontrolę „następnego numeru” na serię w panelu admina, aby dwóch administratorów nie mogło wystawić tego samego numeru jednocześnie.
Sumy powinny być przechowane jawnie, a nie tylko wyliczane. Zapisz subtotal (wartość opodatkowaną), całkowity podatek, sumę brutto i oddzielne zaokrąglenie. Jeśli przeliczysz później z pozycji, drobna zmiana reguły może sprawić, że stare faktury przestaną się zgadzać z złożonymi deklaracjami.
Statusy powinny odzwierciedlać rzeczywiste życie dokumentu i blokować rekordy, gdy to potrzebne:
Na koniec przechowuj metadane artefaktów: wersję szablonu PDF, znacznik czasu wygenerowania i identyfikator pliku. Hash jest opcjonalny, ale przydatny, jeśli musisz udowodnić, że PDF nie został zmieniony.
Przykład: jeśli agent wsparcia wygeneruje PDF ponownie po aktualizacji szablonu, sumy i numer faktury powinny pozostać identyczne, ale przechowywana wersja szablonu wyjaśnia, dlaczego układ PDF wygląda inaczej.
Jeśli chcesz czystych faktur GST, nie zaczynaj od ekranu faktury. Zacznij od stron administracyjnych, które ją zasilają. Dobry model danych faktury GST pozostaje niewielki, gdy wejścia są kontrolowane i spójne.
Katalog produktów to miejsce, gdzie zaczyna się większość przyszłych niezgodności, więc trzymaj go rygorystycznie. Każde SKU powinno mieć dokładnie jeden domyślny HSN (lub SAC dla usług), domyślną stawkę GST i ewentualne wyjątki obowiązujące tylko w określonych datach.
Praktyczny ekran produktu zwykle potrzebuje:
Unikaj UI typu „kalkulator”. Zamiast tego przechowuj dane wejściowe, które system może stosować konsekwentnie: tabele stawek, reguły miejsca dostawy, i sposób decydowania o intra-state vs inter-state (zwykle przez porównanie stanu dostawcy i stanu wysyłki).
Utrzymaj ekran podatkowy skoncentrowany na: stawce podatku wg kategorii/grupy HSN, datach obowiązywania i co zrobić, gdy nabywca poda ważny GSTIN vs gdy go nie poda.
Ekran klienta powinien uchwycić GSTIN i jego status walidacji oraz domyślne adresy rozliczeniowe i wysyłkowe. Nie pozwól użytkownikom wpisywać stanów dowolnym tekstem; używaj kontrolowanej listy, aby „KA” i „Karnataka” nie stały się dwiema różnymi wartościami.
Ekran profilu firmy jest równie ważny: nazwa prawna, GSTIN, adres siedziby i ustawienia serii numerów faktur (prefiks, następny numer i granice roku finansowego). Ogranicz dostęp z uprawnieniami, bo zmiany wpływają na wszystkie przyszłe dokumenty.
Nie potrzebujesz skomplikowanego systemu, ale potrzebujesz śladu. Loguj kto zmienił HSN/SAC, stawki GST, ustawienia serii faktur lub GSTIN firmy, wraz ze starą wartością, nową, znacznikiem czasu i powodem.
Jeśli budujesz te ekrany w narzędziu takim jak Koder.ai, traktuj logi audytu i daty obowiązywania jako pola pierwszej klasy od pierwszego dnia. Kosztują niewiele, a ratują godziny przy przeglądach finansów.
Zgodna faktura to mniej kwestia ozdobnego formatu, a więcej blokowania właściwych faktów we właściwym momencie. Jeśli zaprojektujesz model danych faktury GST wokół tego przepływu, praca finansów stanie się prostym dopasowaniem, a nie cotygodniowym śledztwem.
Zanim policzysz podatek, zablokuj snapshot zamówienia: pozycje, ilości, ceny jednostkowe, rabaty, opłaty za wysyłkę/obsługę, GSTIN klienta (jeśli jest), adresy rozliczeniowe i wysyłkowe oraz sygnały miejsca dostawy. Snapshot nie powinien się zmieniać nawet jeśli cena produktu lub mapowanie HSN zmieni się później.
Oblicz podatki i wygeneruj linie faktury ze snapshotu. Każda linia faktury powinna skopiować HSN/SAC, stawkę podatku, wartość opodatkowaną i użyte kwoty podatku w danym momencie, zamiast pobierać je na żywo później.
Przypisz numer faktury i datę wystawienia, a następnie oznacz fakturę jako wystawioną. Od tego momentu zablokuj edycję cen, stawek podatku, kodów HSN i adresów na rekordzie faktury. Jeśli coś trzeba dopuścić, ogranicz to do notatek nie finansowych i wewnętrznych tagów.
Wygeneruj PDF/widok do druku z wystawionej faktury, a następnie zapisz ostateczne sumy, które będziesz raportować: wartość opodatkowana, sumy CGST/SGST/IGST, zaokrąglenie i sumę brutto. Jeśli chcesz dodatkowego bezpieczeństwa, zapisz wersję dokumentu lub sumę kontrolną, aby udowodnić, że wydruk zgadza się z zapisanymi liczbami.
Po wystawieniu zmiany powinny następować zgodnie z regułami, a nie przez edycje:
Jeśli wdrożysz ten przepływ w panelach administracyjnych (tryb planowania Koder.ai pomaga mapować kroki przed budową), zespół może szybko generować faktury bez łamania uzgadniania później.
Uzgadnianie się komplikuje, gdy płatności są traktowane jako pojedyncza flaga „opłacone/nieopłacone” przy zamówieniu. Trzymaj płatności i refundy jako oddzielne rekordy wskazujące na zamówienie i fakturę, aby finanse mogły dopasować rozliczenia bankowe bez przepisywania historii.
Zgodna faktura powinna pozostać stabilna po jej wystawieniu. Jeśli klient płaci w częściach lub zwracasz środki później, zapisz to jako wpis płatności lub zwrotu, a nie jako zmianę sum faktury.
Minimalne pola, które ułatwiają uzgadnianie:
Jeśli klient zwraca jedną pozycję, nie „zmniejszaj faktury”. Wydaj notę korygującą i powiąż ją z oryginalną fakturą. Rejestr faktur pozostaje czysty, a zwrot powiązuje się z notą korygującą.
Daj finansom jeden ekran, który odpowiada: co zostało wystawione, co zostało zapłacone, co jest nadal otwarte i co zostało cofnięte. Uwzględnij przedziały zaległości (0-7, 8-30, 31-60, 60+ dni) i możliwość przejścia do powiązanych wpisów płatności oraz zwrotów.
Eksporty, których zespoły potrzebują co miesiąc:
Przykład: zamówienie ma wartość 10 000 Rs, dziś zapłacono 6 000 Rs, a 4 000 Rs następnego tygodnia. Faktura pozostaje na 10 000 Rs. Widok finansów pokazuje saldo 4 000 Rs dopóki nie nadejdzie drugie rozliczenie, potem oznacza jako w pełni zapłacone bez zmiany wystawionego dokumentu.
Większość problemów z fakturami GST to nie „logika podatkowa”, lecz prowadzenie rejestrów: liczby na PDF nie zgadzają się z eksportami finansów, albo faktury nie da się wytłumaczyć po miesiącach.
Pierwsza pułapka to liczenie GST tylko w widoku. Jeśli obliczasz CGST/SGST/IGST za każdym razem, gdy ktoś otwiera fakturę, w końcu otrzymasz różne wyniki po zmianie stawki, reguły zaokrągleń lub po naprawie błędu. Przechowuj obliczone rozbicie podatku użyte przy wystawieniu faktury, nawet jeśli zapisujesz też dane wejściowe.
Druga pułapka to pozwalanie na edycje wystawionej faktury. Gdy faktura jest finalna, zmiany powinny następować przez notę korygującą lub przepływ zastępczy z zapisem audytu. W przeciwnym razie zobaczysz spory typu „dlaczego PDF klienta różni się od ksiąg?”.
Oto wzorce niezgodności, które pojawiają się najczęściej w modelu danych faktury GST:
Szybki przykład: sprzedajesz klientowi w Karnataka, ale adres wysyłki jest w Maharashtra. Jeśli system wybierze stan rozliczeniowy przypadkowo, możesz pobrać CGST+SGST zamiast IGST. Jeśli dodatkowo przeliczysz podatki na żywo, błąd może się „naprawić” później, pozostawiając finanse z liczbami, które nie pasują do wystawionego dokumentu.
Gdy budujesz ekrany administracyjne (czy to custom, czy przez Koder.ai), dodaj małe zabezpieczenia: blokuj wystawione faktury, pokazuj obok siebie wejścia miejsca dostawy i obliczony typ podatku, oraz przechowuj niemodyfikowalny snapshot HSN, stawki i zaokrągleń użytych przy wystawieniu.
Zanim wyślesz fakturę do klienta lub oznaczysz ją jako „wystawioną”, wykonaj szybki zestaw kontroli. To miejsce, gdzie większość drobnych błędów przeradza się później w duże problemy z uzgadnianiem. Jeśli budujesz model danych faktury GST, warto wbudować te kontrole zarówno w reguły walidacji, jak i w interfejs admina.
Prosty przykład: klient zmienia adres wysyłki po płatności i zmienia się stan. Jeśli ponownie wystawisz tę samą fakturę z nowym podatkiem, rejestry i zapisy płatności przestaną się zgadzać. Bezpieczniejsze jest zachowanie oryginalnej faktury jako niezmiennej i stworzenie dokumentu korygującego.
Kolejne kroki: zaimplementuj ekrany i walidacje najpierw, potem iteruj. W Koder.ai zacznij od Planning Mode, aby naszkicować rekordy i ekrany administracyjne (produkty z mapowaniem HSN/SAC, dane klientów/GSTIN, reguły podatkowe i faktury). Wygeneruj aplikację, przetestuj kilka rzeczywistych zamówień end-to-end, a potem użyj snapshotów i rollbacku, aby bezpiecznie dopracować przepływ. Gdy będziesz potrzebować głębszych modyfikacji, eksportuj kod źródłowy i rozwijaj dalej w zwykłym procesie.