001// -------------------------------------------------------------------------------- 002// Copyright 2002-2026 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.tax.server.logic; 018 019import com.echothree.control.user.tax.common.spec.TaxClassificationUniversalSpec; 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.geo.server.control.GeoControl; 025import com.echothree.model.control.tax.common.exception.DuplicateTaxClassificationNameException; 026import com.echothree.model.control.tax.common.exception.UnknownDefaultTaxClassificationException; 027import com.echothree.model.control.tax.common.exception.UnknownTaxClassificationNameException; 028import com.echothree.model.control.tax.server.control.TaxControl; 029import com.echothree.model.data.core.server.entity.MimeType; 030import com.echothree.model.data.geo.server.entity.GeoCode; 031import com.echothree.model.data.party.server.entity.Language; 032import com.echothree.model.data.tax.server.entity.TaxClassification; 033import com.echothree.model.data.tax.server.value.TaxClassificationDetailValue; 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.validation.ParameterUtils; 040import javax.enterprise.context.ApplicationScoped; 041import javax.inject.Inject; 042 043@ApplicationScoped 044public class TaxClassificationLogic 045 extends BaseLogic { 046 047 @Inject 048 GeoControl geoControl; 049 050 @Inject 051 TaxControl taxControl; 052 053 @Inject 054 EntityInstanceLogic entityInstanceLogic; 055 056 protected TaxClassificationLogic() { 057 super(); 058 } 059 060 public TaxClassification createTaxClassification(final ExecutionErrorAccumulator eea, final GeoCode countryGeoCode, 061 final String taxClassificationName, final Boolean isDefault, final Integer sortOrder, final Language language, 062 final String description, final MimeType overviewMimeType, final String overview, final BasePK createdBy) { 063 var taxClassification = taxControl.getTaxClassificationByName(countryGeoCode, taxClassificationName); 064 065 if(taxClassification == null) { 066 taxClassification = taxControl.createTaxClassification(countryGeoCode, taxClassificationName, isDefault, sortOrder, createdBy); 067 068 if(description != null) { 069 taxControl.createTaxClassificationTranslation(taxClassification, language, description, overviewMimeType, overview, createdBy); 070 } 071 } else { 072 handleExecutionError(DuplicateTaxClassificationNameException.class, eea, ExecutionErrors.DuplicateTaxClassificationName.name(), 073 countryGeoCode.getLastDetail().getGeoCodeName(), taxClassificationName); 074 } 075 076 return taxClassification; 077 } 078 079 public TaxClassification getTaxClassificationByName(final ExecutionErrorAccumulator eea, final GeoCode countryGeoCode, 080 final String taxClassificationName, final EntityPermission entityPermission) { 081 var taxClassification = entityPermission == EntityPermission.READ_WRITE 082 ? taxControl.getTaxClassificationByNameForUpdate(countryGeoCode, taxClassificationName) 083 : taxControl.getTaxClassificationByName(countryGeoCode, taxClassificationName); 084 085 if(taxClassification == null) { 086 handleExecutionError(UnknownTaxClassificationNameException.class, eea, ExecutionErrors.UnknownTaxClassificationName.name(), 087 countryGeoCode.getLastDetail().getGeoCodeName(), taxClassificationName); 088 } 089 090 return taxClassification; 091 } 092 093 public TaxClassification getTaxClassificationByName(final ExecutionErrorAccumulator eea, final GeoCode countryGeoCode, 094 final String taxClassificationName) { 095 return getTaxClassificationByName(eea, countryGeoCode, taxClassificationName, EntityPermission.READ_ONLY); 096 } 097 098 public TaxClassification getTaxClassificationByNameForUpdate(final ExecutionErrorAccumulator eea, final GeoCode countryGeoCode, 099 final String taxClassificationName) { 100 return getTaxClassificationByName(eea, countryGeoCode, taxClassificationName, EntityPermission.READ_WRITE); 101 } 102 103 public TaxClassification getTaxClassificationByUniversalSpec(final ExecutionErrorAccumulator eea, 104 final TaxClassificationUniversalSpec universalSpec, final boolean allowDefault, 105 final EntityPermission entityPermission) { 106 var countryName = universalSpec.getCountryName(); 107 var taxClassificationName = universalSpec.getTaxClassificationName(); 108 var nameParameterCount = ParameterUtils.getInstance().countNonNullParameters(countryName, taxClassificationName); 109 TaxClassification taxClassification = null; 110 var parameterCount = nameParameterCount + entityInstanceLogic.countPossibleEntitySpecs(universalSpec); 111 112 switch(parameterCount) { 113 case 1 -> { 114 if(nameParameterCount == 0) { 115 var entityInstance = entityInstanceLogic.getEntityInstance(eea, universalSpec, 116 ComponentVendors.ECHO_THREE.name(), EntityTypes.TaxClassification.name()); 117 118 if(eea == null || !eea.hasExecutionErrors()) { 119 taxClassification = taxControl.getTaxClassificationByEntityInstance(entityInstance, entityPermission); 120 } 121 } else if(countryName != null && allowDefault) { 122 var countryGeoCode = geoControl.getCountryByAlias(countryName); 123 124 if(countryGeoCode == null) { 125 handleExecutionError(null, eea, ExecutionErrors.UnknownGeoCodeName.name(), countryName); 126 } else { 127 taxClassification = entityPermission == EntityPermission.READ_WRITE 128 ? taxControl.getDefaultTaxClassificationForUpdate(countryGeoCode) 129 : taxControl.getDefaultTaxClassification(countryGeoCode); 130 131 if(taxClassification == null) { 132 handleExecutionError(UnknownDefaultTaxClassificationException.class, eea, 133 ExecutionErrors.UnknownDefaultTaxClassification.name()); 134 } 135 } 136 } else { 137 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 138 } 139 } 140 case 2 -> { 141 if(nameParameterCount == 2) { 142 var countryGeoCode = geoControl.getCountryByAlias(countryName); 143 144 if(countryGeoCode == null) { 145 handleExecutionError(null, eea, ExecutionErrors.UnknownGeoCodeName.name(), countryName); 146 } else { 147 taxClassification = getTaxClassificationByName(eea, countryGeoCode, taxClassificationName, entityPermission); 148 } 149 } else { 150 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 151 } 152 } 153 default -> 154 handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name()); 155 } 156 157 return taxClassification; 158 } 159 160 public TaxClassification getTaxClassificationByUniversalSpec(final ExecutionErrorAccumulator eea, 161 final TaxClassificationUniversalSpec universalSpec, final boolean allowDefault) { 162 return getTaxClassificationByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_ONLY); 163 } 164 165 public TaxClassification getTaxClassificationByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, 166 final TaxClassificationUniversalSpec universalSpec, final boolean allowDefault) { 167 return getTaxClassificationByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_WRITE); 168 } 169 170 public void updateTaxClassificationFromValue(final TaxClassificationDetailValue taxClassificationDetailValue, final BasePK updatedBy) { 171 taxControl.updateTaxClassificationFromValue(taxClassificationDetailValue, updatedBy); 172 } 173 174 public void deleteTaxClassification(final ExecutionErrorAccumulator eea, final TaxClassification taxClassification, final BasePK deletedBy) { 175 taxControl.deleteTaxClassification(taxClassification, deletedBy); 176 } 177 178}