Для связывания дебетовых транзакций и кредитных операций вам нужна таблица соединений. Что-то вроде этого:
CREATE TABLE debit_credit_map (
debit_id INT NOT NULL,
credit_id INT NOT NULL,
amount DECIMAL(14,2) NOT NULL,
applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY(debit_id, credit_id),
KEY(credit_id)
)ENGINE=InnoDB;
Если вы хотите использовать кредит против дебет вы первый пост кредит, захватить его идентификатор, а затем начать цикл - проверить, сколько из кредита Непримененное (изначально равна нулю, из курс), выбрав сумму (сумму), где credit_id = текущая кредитная транзакция, которую вы обрабатываете, вычитается из общей суммы кредита.
Затем найдите самый старый дебет с суммой в таблице карт, которая меньше суммы дебетовой транзакции или вообще не имеет записей.
Применять столько кредитов к этой транзакции, как это подходит для этой транзакции, создавая строку в новой таблице, перекрестно ссылающуюся на дебетовую транзакцию с кредитной транзакцией и сумму кредита, применяемую к дебету.
Повторяйте до тех пор, пока кредит не будет исчерпан или нет более дебетовых транзакций, которые еще не полностью финансируются.
Использование этой логики позволяет легко распределять долги по кредитам или кредитам через дебет и дает вам то, что, я считаю, вы ищете.
Ответ на вопрос, выплачивается ли дебет, частично или полностью, определяется ли сумма записей в новой таблице для этой транзакции равна 0, меньше суммы транзакции или равна сумме транзакции. Не сохраняйте этот статус в самой транзакции, а скорее вычисляйте ее по требованию, а левой - эту таблицу и группу по дебету.
Эта схема работает, если дебетовые и кредитные ресурсы хранятся в одной таблице или двух разных таблицах. При необходимости добавьте внешние ключи в идентификаторы.
Бонусные баллы:
Использование триггеров для блокировки удаления и обновления таблицы перехода. Эти записи представляют собой статические исторические факты, которые нельзя отменить. Их следует считать непреложными, потому что иначе вы переписываете историю.
Используйте триггер для вставки в таблицу соединений, чтобы предотвратить вставку, которая по сравнению с существующими соответствующими строками в таблице соединений приведет к тому, что общая сумма, выделенная для текущего дебетования или кредита, превысит фактическую общую сумму дебетование или кредит.Это остановит ошибку приложения при внесении потенциально дорогостоящих математических ошибок.
@Salmon благодарит за ответ, но я не думаю, что он будет работать для миллионов записей? –
Можно ли добавить дату выхлопа? –
Как бы вы показали полную оплату, которая состояла из n Part Paids? Или часть Платная, которая состояла из n Part Paids? –