Matching ausführen

Eine weitere SQL Procedure ip_match_records macht den eigentlichen Zuordnungslauf und kann um weitere Plausibilität erweitert werden (z.B. kann eine Zahlung nicht vor der Rechnungstellung erfolgt sein etc.):

DELIMITER //
CREATE PROCEDURE ip_match_records() BEGIN
  DECLARE done BOOLEAN DEFAULT FALSE;
  DECLARE _InvNo CHAR(16);
  DECLARE _CustNo CHAR(16);
  DECLARE _Amount DEC(11,2);
  DECLARE cur CURSOR FOR SELECT invoice_number,custno,amount FROM ip_open_balance;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;

  OPEN cur;

  RecLoop: LOOP
    FETCH cur INTO _InvNo,_CustNo,_Amount;
    IF done THEN
      LEAVE RecLoop;
    END IF;
    CALL ip_get_matches(_InvNo,_CustNo,_Amount);
  END LOOP RecLoop;

  CLOSE cur;
END//
DELIMITER ;
CALL ip_match_records;

Als Ergebnis sollten wir jetzt valide Zahlungssätze aus der Buchhaltung in der Tabelle ip_matching_records haben, saldieren unsere offenen Posten und löschen Ausgeglichene.

UPDATE ip_open_balance AS ob JOIN ip_matching_records AS m ON ob.invoice_number=m.invoice_number SET ob.amount=ob.amount-m.value;
DELETE FROM ip_open_balance WHERE amount=0;