001// -------------------------------------------------------------------------------- 002// Copyright 2002-2024 Echo Three, LLC 003// 004// Licensed under the Apache License, Version 2.0 (the "License"); 005// you may not use this file except in compliance with the License. 006// You may obtain a copy of the License at 007// 008// http://www.apache.org/licenses/LICENSE-2.0 009// 010// Unless required by applicable law or agreed to in writing, software 011// distributed under the License is distributed on an "AS IS" BASIS, 012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013// See the License for the specific language governing permissions and 014// limitations under the License. 015// -------------------------------------------------------------------------------- 016 017package com.echothree.model.control.payment.server.logic; 018 019import com.echothree.control.user.payment.common.spec.PaymentProcessorTransactionUniversalSpec; 020import com.echothree.model.control.core.common.ComponentVendors; 021import com.echothree.model.control.core.common.EntityTypes; 022import com.echothree.model.control.core.common.exception.InvalidParameterCountException; 023import com.echothree.model.control.core.server.logic.EntityInstanceLogic; 024import com.echothree.model.control.payment.common.exception.DuplicatePaymentProcessorTransactionNameException; 025import com.echothree.model.control.payment.common.exception.UnknownPaymentProcessorTransactionNameException; 026import com.echothree.model.control.payment.server.control.PaymentProcessorTransactionControl; 027import com.echothree.model.control.sequence.common.SequenceTypes; 028import com.echothree.model.control.sequence.server.logic.SequenceGeneratorLogic; 029import com.echothree.model.data.core.server.entity.EntityInstance; 030import com.echothree.model.data.payment.server.entity.PaymentProcessor; 031import com.echothree.model.data.payment.server.entity.PaymentProcessorActionType; 032import com.echothree.model.data.payment.server.entity.PaymentProcessorResultCode; 033import com.echothree.model.data.payment.server.entity.PaymentProcessorTransaction; 034import com.echothree.util.common.message.ExecutionErrors; 035import com.echothree.util.common.persistence.BasePK; 036import com.echothree.util.server.control.BaseLogic; 037import com.echothree.util.server.message.ExecutionErrorAccumulator; 038import com.echothree.util.server.persistence.EntityPermission; 039import com.echothree.util.server.persistence.Session; 040 041public class PaymentProcessorTransactionLogic 042 extends BaseLogic { 043 044 private PaymentProcessorTransactionLogic() { 045 super(); 046 } 047 048 private static class PaymentProcessorTransactionLogicHolder { 049 static PaymentProcessorTransactionLogic instance = new PaymentProcessorTransactionLogic(); 050 } 051 052 public static PaymentProcessorTransactionLogic getInstance() { 053 return PaymentProcessorTransactionLogicHolder.instance; 054 } 055 056 public PaymentProcessorTransaction createPaymentProcessorTransaction(final ExecutionErrorAccumulator eea, String paymentProcessorTransactionName, 057 final PaymentProcessor paymentProcessor, final PaymentProcessorActionType paymentProcessorActionType, 058 final PaymentProcessorResultCode paymentProcessorResultCode, final BasePK createdBy) { 059 PaymentProcessorTransaction paymentProcessorTransaction = null; 060 061 if(paymentProcessorTransactionName == null) { 062 paymentProcessorTransactionName = SequenceGeneratorLogic.getInstance().getNextSequenceValue(eea, SequenceTypes.PAYMENT_PROCESSOR_TRANSACTION.name()); 063 } 064 065 if(!eea.hasExecutionErrors()) { 066 var paymentProcessorTransactionControl = Session.getModelController(PaymentProcessorTransactionControl.class); 067 068 paymentProcessorTransaction = paymentProcessorTransactionControl.getPaymentProcessorTransactionByName(paymentProcessorTransactionName); 069 if(paymentProcessorTransaction == null) { 070 paymentProcessorTransaction = paymentProcessorTransactionControl.createPaymentProcessorTransaction(paymentProcessorTransactionName, 071 paymentProcessor, paymentProcessorActionType, paymentProcessorResultCode, createdBy); 072 } else { 073 handleExecutionError(DuplicatePaymentProcessorTransactionNameException.class, eea, ExecutionErrors.DuplicatePaymentProcessorTransactionName.name(), paymentProcessorTransactionName); 074 } 075 } 076 077 return paymentProcessorTransaction; 078 } 079 080 public PaymentProcessorTransaction getPaymentProcessorTransactionByName(final ExecutionErrorAccumulator eea, final String paymentProcessorTransactionName, 081 final EntityPermission entityPermission) { 082 var paymentProcessorTransactionControl = Session.getModelController(PaymentProcessorTransactionControl.class); 083 PaymentProcessorTransaction paymentProcessorTransaction = paymentProcessorTransactionControl.getPaymentProcessorTransactionByName(paymentProcessorTransactionName, entityPermission); 084 085 if(paymentProcessorTransaction == null) { 086 handleExecutionError(UnknownPaymentProcessorTransactionNameException.class, eea, ExecutionErrors.UnknownPaymentProcessorTransactionName.name(), paymentProcessorTransactionName); 087 } 088 089 return paymentProcessorTransaction; 090 } 091 092 public PaymentProcessorTransaction getPaymentProcessorTransactionByName(final ExecutionErrorAccumulator eea, final String paymentProcessorTransactionName) { 093 return getPaymentProcessorTransactionByName(eea, paymentProcessorTransactionName, EntityPermission.READ_ONLY); 094 } 095 096 public PaymentProcessorTransaction getPaymentProcessorTransactionByNameForUpdate(final ExecutionErrorAccumulator eea, final String paymentProcessorTransactionName) { 097 return getPaymentProcessorTransactionByName(eea, paymentProcessorTransactionName, EntityPermission.READ_WRITE); 098 } 099 100 public PaymentProcessorTransaction getPaymentProcessorTransactionByUniversalSpec(final ExecutionErrorAccumulator eea, 101 final PaymentProcessorTransactionUniversalSpec universalSpec, final EntityPermission entityPermission) { 102 PaymentProcessorTransaction paymentProcessorTransaction = null; 103 var paymentProcessorTransactionControl = Session.getModelController(PaymentProcessorTransactionControl.class); 104 String paymentProcessorTransactionName = universalSpec.getPaymentProcessorTransactionName(); 105 var parameterCount = (paymentProcessorTransactionName == null ? 0 : 1) + EntityInstanceLogic.getInstance().countPossibleEntitySpecs(universalSpec); 106 107 switch(parameterCount) { 108 case 1: 109 if(paymentProcessorTransactionName == null) { 110 var entityInstance = EntityInstanceLogic.getInstance().getEntityInstance(eea, universalSpec, 111 ComponentVendors.ECHO_THREE.name(), EntityTypes.PaymentProcessorTransaction.name()); 112 113 if(!eea.hasExecutionErrors()) { 114 paymentProcessorTransaction = paymentProcessorTransactionControl.getPaymentProcessorTransactionByEntityInstance(entityInstance, entityPermission); 115 } 116 } else { 117 paymentProcessorTransaction = getPaymentProcessorTransactionByName(eea, paymentProcessorTransactionName, entityPermission); 118 } 119 break; 120 default: 121 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 122 break; 123 } 124 125 return paymentProcessorTransaction; 126 } 127 128 public PaymentProcessorTransaction getPaymentProcessorTransactionByUniversalSpec(final ExecutionErrorAccumulator eea, 129 final PaymentProcessorTransactionUniversalSpec universalSpec) { 130 return getPaymentProcessorTransactionByUniversalSpec(eea, universalSpec, EntityPermission.READ_ONLY); 131 } 132 133 public PaymentProcessorTransaction getPaymentProcessorTransactionByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, 134 final PaymentProcessorTransactionUniversalSpec universalSpec) { 135 return getPaymentProcessorTransactionByUniversalSpec(eea, universalSpec, EntityPermission.READ_WRITE); 136 } 137 138 public void deletePaymentProcessorTransaction(final ExecutionErrorAccumulator eea, final PaymentProcessorTransaction paymentProcessorTransaction, 139 final BasePK deletedBy) { 140 var paymentProcessorTransactionControl = Session.getModelController(PaymentProcessorTransactionControl.class); 141 142 paymentProcessorTransactionControl.deletePaymentProcessorTransaction(paymentProcessorTransaction, deletedBy); 143 } 144}