Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: ciekawe pytanie o schemat bazy danych na faktury
Forum PHP.pl > Forum > Bazy danych
wiewiorek
Mam problem z zaprojektowaniem schematu bazy danych na faktury. Chodzi o to, ze jeżeli klient kupił np. 20 klawiatur i 5 myszek i została mu wystawiona faktura, a po jakimś czasie zwrócił 5 klawiatur to trzeba mu wystawić fakturę korygującą na której będzie napisane coś w stylu:
POZYCJE KORYGOWANE
klawiatura | 20 | ....

POZYCJE PO KOREKCIE
klawiatura | 15 | .....

Tutaj macie jakąś przykładową znalezioną w google fakturę korygującą żeby to jakoś obrazowo pokazać: http://gusoft.com.pl/faktorzysta/graph/fak...kladowa_kor.pdf

Oczywiście nie można w związku z tym zmienić ilości zamówionych klawiatur w tabeli POZYCJE_ZAMOWIENIA bo potem przy tworzeniu faktury nie byłoby skąd wziąć pierwotnej liczby zamówionych klawiatur, a na fakturze muszą być pierwotne i ostateczne wartości.

W związku z tym zaprojektowałem taki schemat bazy danych:


Tabela POSITIONS_ORDER_CORRECTION - czyli pozycje zamówienia, które uległy zmianie - tabela ta jest niemal kopią tabeli POSITIONS_ORDER - czy w związku z tym ten schemat jest ok ? Bo innego sposobu na to chyba nie ma ?
JohnnyB
faktura i faktura korygujące to dwa osobne dokumenty, wprowadzając fakturę korygującą nie możesz nic zmieniać na dokumencie oryginalnym (oprócz pól 'pomocniczych', np. oznaczyć, że do danej faktury istnieje faktura korygująca).
Osobiście to bym rozszerzył tabele faktury i pozycji na zamówieniu tak, aby zawierały także dane potrzebne do faktury korygującej oraz dodał pole 'typ' aby odróżnić je od siebie - łatwiej będzie wtedy robić np. sumowanie obrotów.

Przy okazji, widzę, że masz połączenie z danymi klientów poprzez customers_id - co zamierzasz zrobisz jeśli po wystawieniu faktury dane klienta ulegną zmianie (np. zmieni się adres), a ktoś będzie chciał wydrukować 'starą' fakturę, np. w celu wystawienia duplikatu?
Pytam bo sam się nad tym ostatnio zastanawiałem
http://forum.php.pl/index.php?showtopic=14...mp;#entry744708
wiewiorek
To znaczy dodałbyś kolumne TYP typu BOOL - gdzie 0 oznaczałoby pozycję przed korektą a 1 pozycję po korekcie do tabeli POZYCJE_ZAMOWIENIA ? Ale wtedy na fakturze korygującej wypisałbyś wszystkie pozycje danego zamówienia gdzie typ = 0 czyli wypisałbyś także pozycje, które nie uległy zmianie - w omawianym przypadku wypisałbyś jako pozycje przed korektą nie tylko klawiatury, ale także myszki - których ilość się nie zmieniła, a tymczasem niestety na fakturze korygującej trzeba podawać TYLKO pozycje, które uległy zmianie.
JohnnyB
Cytat
TYP typu BOOL - gdzie 0 oznaczałoby pozycję przed korektą a 1 pozycję po korekcie do tabeli POZYCJE_ZAMOWIENIA


nie, do tabeli faktury żeby nie robić osobnej tabeli na faktury 'zwykłe' osobnej na korygujące. A do tabeli 'pozycje na zamówieniu' dodałbym pole 'ilość korygowana', które normalnie nie byłoby używane.

Cytat
Ale wtedy na fakturze korygującej wypisałbyś wszystkie pozycje danego zamówienia


faktura korygująca to osobny dokument, z oddzielnym id
wiewiorek
Zrobiłem w ten sposób - dzięki takiej strukturze nie będę mieć problemu z danymi na fakturze gdy dane klienta ulegną zmianie, gdy ilość, cena czy rabat na fakturze korygującej uległy zmianie itp. bo w tabeli pozycje_faktury mam kolumne 'korekta' typu BOOL specjalnie dla pozycji zamówień faktur korygujących, w omawianym przypadku faktura korygująca miałaby w tabeli pozycje_faktury 2. rekordy - klawiatura z ilością = 20 i korekta = 0 oraz klawiatura z ilością 15 i korekta = 1 i koniec problemów aarambo.gif

JohnnyB
moim zdaniem teraz wygląda całkiem nieźle,
można by dodać jeszcze jakieś szczegóły, np. id_faktury_korygowanej do tablicy faktur aby mieć możliwość śledzenia która korekta jest do jakiej faktury (kiedyś w jednej firmie widziałem fakturę, do której było 5 faktur korygujących czyli była korekta korekty itd), ale to zależy czy chcesz mieć taką funkcjonalność.
Jeszcze taka uwaga - jeśli będziesz potrzebował jakichś sumowań (np. ile sprzedano towarów w danych okresie), to warto od razu zastanowić się jaki wpływ na to będą miały faktury korygujące, np. takie wyrażenie

sum(ilosc) from pozycje_faktury;

zadziała prawidłowo bez faktur korygujących, ale z fakturami korygującymi już niekoniecznie. Ja to rozwiązuje w ten sposób, że w przypadku faktur korygujących do kolumny ilość wpisuję różnicę pomiędzy tym ile powinno być a ile było.
Przykład (tabela pozycje_faktury):

ilosc ile_bylo ile_powinno_byc
20 NULL NULL // zwykła faktura
-5 20 15 // faktura korygująca

teraz sumowanie działa prawidłowo - faktycznie sprzedano 15 szt.
wiewiorek
ok dzieki smile.gif
spolprog
a czy ta baza jest dobrze napisana ? bo jakoś dziwne selecty mi wyświetla
przemosk
A może jeszcze warto gdzieś wrzucić tabele odnośnie sprzedawcy ? chyba że będziesz wpisywał za każdym razem ręcznie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.