Задний план
Я создал приложение электронной коммерции, которое подключается к платежному шлюзу Authorize.net. Администраторы могут обрабатывать кредитные карты следующими способами:
- «Захват» транзакции, когда администратор немедленно списывает средства с кредитной карты клиента.
- Транзакция «только для аутентификации», при которой администратор авторизует $X с кредитной карты, а затем фактически фиксирует сумму позже (см. номер 3 ниже).
- Транзакция «Prior-Auth-Capture», когда администратор фиксирует сумму, равную или меньшую, чем сумма, ранее полученная из транзакции «Auth-Only».
Этот вопрос относится к тому, как эти типы транзакций должны храниться в базе данных. У меня есть следующая схема в моей таблице «Платежи»:
Когда производится новый платеж, я сохраняю информацию о способе оплаты в поле PaymentAmount (например, кредитная карта, чек, наличные).
Если PaymentType — «Кредитная карта», я сохраняю TransactionType (например, Capture, Auth-Only, Prior-Auth-Capture).
Столбец PaymentAmount содержит сумму платежа (если TransactionType имеет значение "capture" или "preor-auth-capture". Если TrandactionType имеет значение "Auth-Only", я сохраняю сумма в столбце AuthorizedAmount и отслеживайте дату, на которую разрешена сумма авторизации, в AuthExpDate.
Поля, связанные с транзакционными/справочными данными Authorize.net, хранятся в столбцах ApprovalCode и TransactionID.
Вернуться к вопросу
Теперь, когда у вас есть небольшая предыстория, давайте углубимся в детали моего вопроса: должна ли каждая транзакция иметь свою собственную запись в этой таблице? Или мне следует обновить существующие транзакции для транзакций «только для аутентификации», когда я получаю от них средства?
Примеры:
Новая запись для каждого действия: если пользователь совершает транзакцию «только для авторизации», я создам новую запись в таблице «Платежи». Если пользователь позже запускает транзакцию «pre-auth-capture» в исходной транзакции, должен ли я создать вторую строку в базе данных или обновить исходную транзакцию и добавить полученную сумму в столбец PaymentAmount?
PaymentsID TransactionID PaymentType PaymentAmount AuthorizedAmount ------------------------------------------------------------------------ 1 ABC123 Auth 0.00 100.00 2 ABC123 Auth-Capture 100.00 0.00
Одна строка для каждого TransactionID и обновление исходной транзакции при каждом автоматическом захвате.
PaymentsID TransactionID PaymentType PaymentAmount AuthorizedAmount ------------------------------------------------------------------------ 1 ABC123 Auth 100.00 100.00
Логически я вижу аргументы для обоих случаев. С одной стороны, если я создам новую строку с каждой транзакцией, я смогу увидеть хорошую историю каждого обращения к каждой транзакции «только для авторизации». Недостатком является то, что в обстоятельствах, когда вы выполняете несколько транзакций «до аутентификации» против одной транзакции «только для аутентификации», потому что, чтобы выяснить, сколько у вас осталось, вам нужно написать немного более сложный запрос (присоединение таблицы к самой себе). и группировка по TransactionID для получения суммы PaymentAmount).
Если я создам одну строку для каждого TransactionID, я смогу легко обновить PaymentAmount и вычислить сумму, оставшуюся в авторизации, используя простой расчет (AuthorizedAmount - PaymentAmount = AuthorizedBalance). Этот подход также делает вещи чище, поскольку TransactionID, ApprovalCode, информация о платеже и почти все остальное останутся прежними, поэтому у вас будет меньше избыточных данных в таблице. Кроме того, с точки зрения отчетности большинство пользователей просто хотят видеть одну строку для каждой транзакции для простоты.
Я хотел бы услышать ваши мысли о правильном подходе к этой проблеме.