Temat: [Oracle] pewien rodzaj grupowania, sumowania, tylko jaki?
To o czym piszesz to według mnie rozwiązanie na trzy tabele a nie na dwie. Obrazowo (PostreSQL):
CREATE TABLE platnosci(
id_platnosci SERIAL PRIMARY KEY,
id_dokumentu_kasowego INT,
kwota_platnosci FLOAT
);
CREATE TABLE wplaty(
id_wplaty SERIAL PRIMARY KEY,
kwota_wplaty FLOAT
);
CREATE TABLE platnosci_wplaty(
id_platnosci INT,
id_wplaty INT,
kwota_parowania FLOAT,
PRIMARY KEY (id_platnosci, id_wplaty)
FOREIGN KEY (id_platnosci) REFERENCES platnosci (id_platnosci)
MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (id_wplaty) REFRENCES wplaty(id_wplaty)
MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE
);
Masz tabele z płatnościami, wpłatami oraz pamiętającą parowania i kwoty parowań. Zakładam tu, że parowanie płatności z wpłatą może nastąpić tylko raz oraz do jednej płatności może być wiele parowań a jedna wpłata może być rozbita na kilka płatności.
Teraz wypadałoby założyć trigger on insert oraz update na tabeli wpłaty, który uruchomi funkcję według algorytmu:
1. Szukaj wpłat które nie zostały w całości rozłożone na płatności i oblicz dla każdej wpłaty kwotę do rozbicia
2. Szukaj płatności które nie zostały w całości zapłacone
3. Jeżeli nowa wpłata (insert)
a) Dodaj kwoty parowania dla płatności niezapłaconych posortowanych po terminie płatności począwszy od najstarszej.
b) Powtarzaj 3a tak długo aż kwota wpłaty będzie 0 albo kwota płatności do zapłaty będzie 0 a następnie zakończ działanie
4. Jeżeli zmiana istniejącej wpłaty (update) i zmiana kwoty wpłaty na większą
a) Wyszukaj wszystkie płatności do których są parowania z wpłaty a następnie sprawdź czy te płatności są do zapłaty.
b) Jeżeli są parowania i dla tych parowań są płatności jeszcze do zapłaty to skasuj te parowania i wykonaj nowe według pkt 3 (ale tylko dla płatności sparowanych ze zmienianą wpłatą)
c) Jeżeli są parowania i dla tych parowań nie ma płatności do zapłaty to wykonaj nowe parowania według pkt3
5. Jeżeli zmiana istniejącej wpłaty (update) i zmiana kwoty wpłaty na mniejszą
a) Wyszukaj parowania dla zmienianej wpłaty a następnie zmniejszaj kwoty parowań dla płatności z najpóźniejszym terminem płatności.
b) Jeżeli kwota zmniejszanego parowania jest 0 to usuń parowanie.
Analogicznie trzeba zrobić na tabeli płatności bo każda zmiana płatności może spowodować nadpłatę lub niedopłatę.
Trochę skomplikowane ale wyciąganie dokumentów kasowych oraz wyliczanie do nich kwot do zapłaty/nadpłaty albo jest wtedy proste. Tak samo obliczanie salda czy sprawdzanie niezgodności.