Czyli dopiero kliknięcie w oknie klawisza 'Zapisz' zapisuje całość dokumentu do bazy? Trochę to komplikuje całą sytuację. Ogólnie kierowałbym się ku temu, że to jest nie do końca przemyślany pomysł. W przypadku faktur usługowych jeszcze mogę się zgodzić, że tak można robić. Ale w przypadku dokumentów jakie mają powiązanie z magazynem to nie do końca trafiony pomysł. Czasami użytkownik pisze długi dokument, pisze go długo bo w trakcie zadzwonił telefon i zostawił otwarte okno z w połowie wprowadzonym dokumentem na 15 minut. Pech chciał, że zdjął ze stanu magazynowego ostatnie sztuki danej rzeczy. Ale 15 minut nie było go przy komputerze ponieważ rozmawiał przez telefon. W tym czasie ktoś inny pisał kolejny dokument, zapisał go i zdjął wcześniej daną rzecz. Użytkownik nieświadomy wraca do komputera po 15 minutach, pisze kolejne 10 pozycji. Klika zapisz i dowiaduje się, że jednak to co chce sprzedać już nie istnieje na stanie? Trochę średnie rozwiązanie. Nie mniej jednak takie rzeczy zdarzają się w rzeczywistym świecie :D
Ja w opisanej sytuacji nie widzę problemu - można się przed nią na wiele sposobów zabezpieczyć m.in. w momencie zapisywania dokumentu można sprawdzić stan magazynu i w razie czego rzucić wyjątkiem a usera grzecznie poinformować, że nie udało się zapisać dokumentu.
Skoro aplikacja działa poprzez API i masz tak specyficzne wymaganie, to w zasadzie można również w dokumencie jaki przesyłasz po zmianach dać jakiś status pozycji, jak sam wcześniej zauważyłeś. Dodatkowo posłużyć się ID z tabeli w bazie. I taki status może mieć 1 z paru możliwości:
- pozycja usunięta
- pozycja zmodyfikowana
- nowa pozycja
W przypadku 2-ch pierwszych ID musi zostać uzupełnione, bo to pokazuje do jakiego ID odnosi się delete
albo update
w przypadku nowej pozycji to baza danych nada nam ID rekordu więc te pole pozostawiamy puste. Potem jak serwer odbierze takiego JSON'a to modyfikuje/usuwa/dodaje odpowiednie rekordy. Gotowe. To chyba będzie najsensowniejsze rozwiązanie.
Tak, dokładnie o tym samym pisałem wyżej tylko już nie wspomniałem, że ten "status" to Update/Delete/Insert - ale dokładnie to miałem na myśli :-)
Wybacz dygresję, ale czy wystawienie dokumentu (faktury) nie jest tożsame, z jego zatwierdzeniem? np. będąc u notariusza, widziałem, że miał wersję roboczą aktu notarialnego w wordzie, ale nie był to akt notarialny, a jego zapis w wordzie.
Od strony technicznej -> wersja robocza (nie została zatwierdzona), co szkodzi usunąć całość i utworzyć nowy dokument?
np. 1 transakcja:
- usuń dokument
- wstaw dane z pamięci programu
- zatwierdź transakcję
albo inna transakcja:
- usuń / wstaw pozycje
- zmień numerację pozycji
Nie, przed zatwierdzeniem dokumentu masz przeważnie jeszcze coś takiego jak "bufor" - do czasu gdy dokument jest w buforze można go dowolnie edytować w tym usunąć. Przeważnie jest tak, że sam decydujesz kiedy taki dokument zatwierdzić - jedni robią to od razu (po wystawieniu dokumentu), niektórzy czekają z tym do kolejnego miesiąca a jeszcze inni w ogóle tego nie robią - bo jak zatwierdzą, to już nie będzie można nic zmienić.
I ja wiem, że w teorii faktycznie jest tak, że jak dokument trafi do obiegu (zostanie przekazany klientowi) to nie powinno się go modyfikować. Praktyka jest jednak zupełnie inna. Są przeróżne sytuacje, gdzie klienci wolą podmienić dokument lub go "wyjąć z obiegu", niż bawić się w jego korygowanie - szczególnie, że w zależności od systemu pewne zmiany mogą nawet nie być możliwe (z technicznego punktu widzenia - wtedy trzeba sobie radzić np. z wystawianiem korekty w wordzie).
I ja rozumiem wasze dobre intencje i że chcecie się dostosować do panujących przepisów itd, ale bierzecie również pod uwagę, że to tylko głupi dokumentem księgowy, który nawet nie musi być podpisany :). Czasami narzucanie przez program pewnych czynności jest słuszne, ale w wielu sytuacjach tylko iryguje użytkownika, bo ludzie są różni i mają różne potrzeby i podejście do pewnych spraw i dla jednych będzie to miało znaczenie a dla innych nie. Dlatego programy powinny być elastyczne, aby każdy mógł sobie je skonfigurować pod siebie a nie z nimi ciągle walczyć :).