All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.commerce.pricing.web.internal.display.context.CommerceDiscountDisplayContext Maven / Gradle / Ivy

The newest version!
/**
 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
 */

package com.liferay.commerce.pricing.web.internal.display.context;

import com.liferay.commerce.currency.model.CommerceCurrency;
import com.liferay.commerce.currency.service.CommerceCurrencyLocalService;
import com.liferay.commerce.currency.util.CommercePriceFormatter;
import com.liferay.commerce.discount.constants.CommerceDiscountActionKeys;
import com.liferay.commerce.discount.constants.CommerceDiscountConstants;
import com.liferay.commerce.discount.model.CommerceDiscount;
import com.liferay.commerce.discount.model.CommerceDiscountRule;
import com.liferay.commerce.discount.rule.type.CommerceDiscountRuleType;
import com.liferay.commerce.discount.rule.type.CommerceDiscountRuleTypeRegistry;
import com.liferay.commerce.discount.service.CommerceDiscountRuleService;
import com.liferay.commerce.discount.service.CommerceDiscountService;
import com.liferay.commerce.discount.target.CommerceDiscountTarget;
import com.liferay.commerce.discount.target.CommerceDiscountTargetRegistry;
import com.liferay.commerce.frontend.model.HeaderActionModel;
import com.liferay.commerce.percentage.PercentageFormatter;
import com.liferay.commerce.pricing.constants.CommercePricingPortletKeys;
import com.liferay.commerce.pricing.model.CommercePricingClass;
import com.liferay.commerce.pricing.web.internal.constants.CommerceDiscountScreenNavigationConstants;
import com.liferay.commerce.product.model.CPDefinition;
import com.liferay.frontend.data.set.model.FDSActionDropdownItem;
import com.liferay.frontend.taglib.clay.servlet.taglib.util.CreationMenu;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.portlet.LiferayWindowState;
import com.liferay.portal.kernel.portlet.PortletProvider;
import com.liferay.portal.kernel.portlet.PortletProviderUtil;
import com.liferay.portal.kernel.portlet.url.builder.PortletURLBuilder;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.security.permission.resource.ModelResourcePermission;
import com.liferay.portal.kernel.security.permission.resource.PortletResourcePermission;
import com.liferay.portal.kernel.service.WorkflowDefinitionLinkLocalServiceUtil;
import com.liferay.portal.kernel.util.Constants;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.Portal;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.taglib.util.CustomAttributesUtil;

import java.math.BigDecimal;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Objects;

import javax.portlet.ActionRequest;
import javax.portlet.PortletRequest;
import javax.portlet.PortletURL;
import javax.portlet.WindowStateException;

import javax.servlet.http.HttpServletRequest;

/**
 * @author Alessio Antonio Rendina
 */
public class CommerceDiscountDisplayContext extends BasePricingDisplayContext {

	public CommerceDiscountDisplayContext(
		CommerceCurrencyLocalService commerceCurrencyLocalService,
		ModelResourcePermission
			commerceDiscountModelResourcePermission,
		CommerceDiscountService commerceDiscountService,
		CommerceDiscountRuleService commerceDiscountRuleService,
		CommerceDiscountRuleTypeRegistry commerceDiscountRuleTypeRegistry,
		CommerceDiscountTargetRegistry commerceDiscountTargetRegistry,
		CommercePriceFormatter commercePriceFormatter,
		PercentageFormatter percentageFormatter,
		HttpServletRequest httpServletRequest, Portal portal) {

		super(httpServletRequest);

		_commerceCurrencyLocalService = commerceCurrencyLocalService;
		_commerceDiscountModelResourcePermission =
			commerceDiscountModelResourcePermission;
		_commerceDiscountService = commerceDiscountService;
		_commerceDiscountRuleService = commerceDiscountRuleService;
		_commerceDiscountRuleTypeRegistry = commerceDiscountRuleTypeRegistry;
		_commerceDiscountTargetRegistry = commerceDiscountTargetRegistry;
		_commercePriceFormatter = commercePriceFormatter;
		_percentageFormatter = percentageFormatter;
		this.portal = portal;
	}

	public String getAddCommerceDiscountRenderURL() throws Exception {
		return PortletURLBuilder.createRenderURL(
			commercePricingRequestHelper.getLiferayPortletResponse()
		).setMVCRenderCommandName(
			"/commerce_discount/add_commerce_discount"
		).setWindowState(
			LiferayWindowState.POP_UP
		).buildString();
	}

	public String getAddCommerceDiscountRuleRenderURL() throws Exception {
		return PortletURLBuilder.createRenderURL(
			commercePricingRequestHelper.getLiferayPortletResponse()
		).setMVCRenderCommandName(
			"/commerce_discount/add_commerce_discount_rule"
		).setParameter(
			"commerceDiscountId", getCommerceDiscountId()
		).setWindowState(
			LiferayWindowState.POP_UP
		).buildString();
	}

	public CommerceDiscount getCommerceDiscount() throws PortalException {
		if (_commerceDiscount != null) {
			return _commerceDiscount;
		}

		long commerceDiscountId = ParamUtil.getLong(
			commercePricingRequestHelper.getRequest(), "commerceDiscountId");

		if (commerceDiscountId > 0) {
			_commerceDiscount = _commerceDiscountService.getCommerceDiscount(
				commerceDiscountId);
		}

		return _commerceDiscount;
	}

	public String getCommerceDiscountAmount(Locale locale)
		throws PortalException {

		CommerceDiscount commerceDiscount = getCommerceDiscount();

		if (commerceDiscount == null) {
			return null;
		}

		if (Objects.equals(
				commerceDiscount.getLevel(),
				CommerceDiscountConstants.LEVEL_L1)) {

			return _getCommerceDiscountAmount(commerceDiscount.getLevel1());
		}

		if (Objects.equals(
				commerceDiscount.getLevel(),
				CommerceDiscountConstants.LEVEL_L2)) {

			return _getCommerceDiscountAmount(commerceDiscount.getLevel2());
		}

		if (Objects.equals(
				commerceDiscount.getLevel(),
				CommerceDiscountConstants.LEVEL_L3)) {

			return _getCommerceDiscountAmount(commerceDiscount.getLevel3());
		}

		if (Objects.equals(
				commerceDiscount.getLevel(),
				CommerceDiscountConstants.LEVEL_L4)) {

			return _getCommerceDiscountAmount(commerceDiscount.getLevel4());
		}

		return _getCommerceDiscountAmount(BigDecimal.ZERO);
	}

	public long getCommerceDiscountId() throws PortalException {
		CommerceDiscount commerceDiscount = getCommerceDiscount();

		if (commerceDiscount == null) {
			return 0;
		}

		return commerceDiscount.getCommerceDiscountId();
	}

	public CommerceDiscountRule getCommerceDiscountRule()
		throws PortalException {

		if (_commerceDiscountRule != null) {
			return _commerceDiscountRule;
		}

		long commerceDiscountRuleId = ParamUtil.getLong(
			commercePricingRequestHelper.getRequest(),
			"commerceDiscountRuleId");

		if (commerceDiscountRuleId > 0) {
			_commerceDiscountRule =
				_commerceDiscountRuleService.getCommerceDiscountRule(
					commerceDiscountRuleId);
		}

		return _commerceDiscountRule;
	}

	public List getCommerceDiscountRuleTypes() {
		return _commerceDiscountRuleTypeRegistry.getCommerceDiscountRuleTypes();
	}

	public List getCommerceDiscountTargets() {
		return _commerceDiscountTargetRegistry.getCommerceDiscountTargets();
	}

	public String getDefaultCommerceCurrencyCode() {
		CommerceCurrency commerceCurrency =
			_commerceCurrencyLocalService.fetchPrimaryCommerceCurrency(
				commercePricingRequestHelper.getCompanyId());

		if (commerceCurrency == null) {
			return StringPool.BLANK;
		}

		return commerceCurrency.getCode();
	}

	public String getDiscountCategoriesApiURL() throws PortalException {
		return "/o/headless-commerce-admin-pricing/v2.0/discounts/" +
			getCommerceDiscountId() +
				"/discount-categories?nestedFields=category";
	}

	public List
			getDiscountCategoryFDSActionDropdownItems()
		throws PortalException {

		return ListUtil.fromArray(
			new FDSActionDropdownItem(
				null, "trash", "delete",
				LanguageUtil.get(httpServletRequest, "delete"), "delete",
				"delete", "headless"));
	}

	public String getDiscountCPDefinitionApiURL() throws PortalException {
		return "/o/headless-commerce-admin-pricing/v2.0/discounts/" +
			getCommerceDiscountId() + "/discount-products?nestedFields=product";
	}

	public List
			getDiscountCPDefinitionFDSActionDropdownItems()
		throws PortalException {

		return getFDSActionTemplates(
			PortletURLBuilder.create(
				PortletProviderUtil.getPortletURL(
					httpServletRequest, CPDefinition.class.getName(),
					PortletProvider.Action.MANAGE)
			).setMVCRenderCommandName(
				"/cp_definitions/edit_cp_definition"
			).setRedirect(
				commercePricingRequestHelper.getCurrentURL()
			).setParameter(
				"cpDefinitionId", "{product.id}"
			).setParameter(
				"screenNavigationCategoryKey", "details"
			).buildString(),
			false);
	}

	public String getDiscountCPInstanceAPIURL() throws PortalException {
		return "/o/headless-commerce-admin-pricing/v2.0/discounts/" +
			getCommerceDiscountId() + "/discount-skus?nestedFields=sku";
	}

	public List
			getDiscountCPInstanceFDSActionDropdownItems()
		throws PortalException {

		return getFDSActionTemplates(
			PortletURLBuilder.create(
				PortletProviderUtil.getPortletURL(
					httpServletRequest, CPDefinition.class.getName(),
					PortletProvider.Action.MANAGE)
			).setMVCRenderCommandName(
				"/cp_definitions/edit_cp_definition"
			).setRedirect(
				commercePricingRequestHelper.getCurrentURL()
			).setParameter(
				"cpDefinitionId", "{productId}"
			).setParameter(
				"cpInstanceId", "{sku.id}"
			).setParameter(
				"screenNavigationCategoryKey", "skus"
			).buildString(),
			false);
	}

	public CreationMenu getDiscountCreationMenu() throws Exception {
		CreationMenu creationMenu = new CreationMenu();

		if (hasAddPermission()) {
			creationMenu.addDropdownItem(
				dropdownItem -> {
					dropdownItem.setHref(getAddCommerceDiscountRenderURL());
					dropdownItem.setLabel(
						LanguageUtil.get(
							commercePricingRequestHelper.getRequest(),
							"add-discount"));
					dropdownItem.setTarget("modal");
				});
		}

		return creationMenu;
	}

	public List getDiscountFDSActionDropdownItems()
		throws PortalException {

		return ListUtil.fromArray(
			new FDSActionDropdownItem(
				PortletURLBuilder.create(
					PortletProviderUtil.getPortletURL(
						httpServletRequest, CommerceDiscount.class.getName(),
						PortletProvider.Action.MANAGE)
				).setMVCRenderCommandName(
					"/commerce_discount/edit_commerce_discount"
				).setRedirect(
					commercePricingRequestHelper.getCurrentURL()
				).setParameter(
					"commerceDiscountId", "{id}"
				).setParameter(
					"screenNavigationCategoryKey",
					CommerceDiscountScreenNavigationConstants.
						CATEGORY_KEY_DETAILS
				).setParameter(
					"usePercentage", "{usePercentage}"
				).buildString(),
				"pencil", "edit", LanguageUtil.get(httpServletRequest, "edit"),
				"get", null, null),
			new FDSActionDropdownItem(
				null, "trash", "delete",
				LanguageUtil.get(httpServletRequest, "delete"), "delete",
				"delete", "headless"),
			new FDSActionDropdownItem(
				_getManageDiscountPermissionsURL(), null, "permissions",
				LanguageUtil.get(httpServletRequest, "permissions"), "get",
				"permissions", "modal-permissions"));
	}

	public String getDiscountPricingClassesApiURL() throws PortalException {
		return "/o/headless-commerce-admin-pricing/v2.0/discounts/" +
			getCommerceDiscountId() +
				"/discount-product-groups?nestedFields=productGroup";
	}

	public List
			getDiscountPricingClassFDSActionDropdownItems()
		throws PortalException {

		return getFDSActionTemplates(
			PortletURLBuilder.create(
				PortletProviderUtil.getPortletURL(
					httpServletRequest, CommercePricingClass.class.getName(),
					PortletProvider.Action.MANAGE)
			).setMVCRenderCommandName(
				"/commerce_pricing_classes/edit_commerce_pricing_class"
			).setRedirect(
				commercePricingRequestHelper.getCurrentURL()
			).setParameter(
				"commercePricingClassId", "{productGroupId}"
			).setParameter(
				"screenNavigationCategoryKey", "details"
			).buildString(),
			false);
	}

	public CreationMenu getDiscountRuleCreationMenu() throws Exception {
		CreationMenu creationMenu = new CreationMenu();

		if (hasPermission(ActionKeys.UPDATE)) {
			creationMenu.addDropdownItem(
				dropdownItem -> {
					dropdownItem.setHref(getAddCommerceDiscountRuleRenderURL());
					dropdownItem.setLabel(
						LanguageUtil.get(
							commercePricingRequestHelper.getRequest(),
							"add-discount-rule"));
					dropdownItem.setTarget("modal");
				});
		}

		return creationMenu;
	}

	public String getDiscountRulesApiURL() throws PortalException {
		return "/o/headless-commerce-admin-pricing/v2.0/discounts/" +
			getCommerceDiscountId() + "/discount-rules";
	}

	public List getDiscountRulesFDSActionDropdownItem()
		throws PortalException {

		PortletURL portletURL = PortletURLBuilder.create(
			PortletProviderUtil.getPortletURL(
				httpServletRequest, CommerceDiscount.class.getName(),
				PortletProvider.Action.EDIT)
		).setMVCRenderCommandName(
			"/commerce_discount/edit_commerce_discount_rule"
		).setRedirect(
			commercePricingRequestHelper.getCurrentURL()
		).setParameter(
			"commerceDiscountRuleId", "{id}"
		).setParameter(
			"screenNavigationCategoryKey",
			CommerceDiscountScreenNavigationConstants.CATEGORY_KEY_DETAILS
		).buildPortletURL();

		try {
			portletURL.setWindowState(LiferayWindowState.POP_UP);
		}
		catch (WindowStateException windowStateException) {
			_log.error(windowStateException);
		}

		return getFDSActionTemplates(portletURL.toString(), true);
	}

	public String getEditCommerceDiscountActionURL() throws Exception {
		CommerceDiscount commerceDiscount = getCommerceDiscount();

		if (commerceDiscount == null) {
			return StringPool.BLANK;
		}

		return PortletURLBuilder.create(
			portal.getControlPanelPortletURL(
				commercePricingRequestHelper.getRequest(),
				CommercePricingPortletKeys.COMMERCE_DISCOUNT,
				PortletRequest.ACTION_PHASE)
		).setActionName(
			"/commerce_discount/edit_commerce_discount"
		).setCMD(
			Constants.UPDATE
		).setParameter(
			"commerceDiscountId", commerceDiscount.getCommerceDiscountId()
		).setWindowState(
			LiferayWindowState.POP_UP
		).buildString();
	}

	public PortletURL getEditCommerceDiscountRenderURL() {
		return PortletURLBuilder.create(
			portal.getControlPanelPortletURL(
				commercePricingRequestHelper.getRequest(),
				CommercePricingPortletKeys.COMMERCE_DISCOUNT,
				PortletRequest.RENDER_PHASE)
		).setMVCRenderCommandName(
			"/commerce_discount/edit_commerce_discount"
		).buildPortletURL();
	}

	public List getHeaderActionModels() throws Exception {
		List headerActionModels = new ArrayList<>();

		HeaderActionModel cancelHeaderActionModel = new HeaderActionModel(
			null,
			PortletURLBuilder.createRenderURL(
				liferayPortletResponse
			).buildString(),
			null, "cancel");

		headerActionModels.add(cancelHeaderActionModel);

		String saveButtonLabel = "save";

		CommerceDiscount commerceDiscount = getCommerceDiscount();

		if ((commerceDiscount == null) || commerceDiscount.isDraft() ||
			commerceDiscount.isApproved() || commerceDiscount.isExpired() ||
			commerceDiscount.isScheduled()) {

			saveButtonLabel = "save-as-draft";
		}

		HeaderActionModel saveAsDraftHeaderActionModel = new HeaderActionModel(
			null, liferayPortletResponse.getNamespace() + "fm",
			PortletURLBuilder.createActionURL(
				liferayPortletResponse
			).setActionName(
				"/commerce_discount/edit_commerce_discount"
			).buildString(),
			null, saveButtonLabel);

		headerActionModels.add(saveAsDraftHeaderActionModel);

		String publishButtonLabel = "publish";

		if (WorkflowDefinitionLinkLocalServiceUtil.hasWorkflowDefinitionLink(
				commercePricingRequestHelper.getCompanyId(),
				commercePricingRequestHelper.getScopeGroupId(),
				CommerceDiscount.class.getName())) {

			publishButtonLabel = "submit-for-workflow";
		}

		String additionalClasses = "btn-primary";

		if ((commerceDiscount != null) && commerceDiscount.isPending()) {
			additionalClasses = additionalClasses + " disabled";
		}

		HeaderActionModel publishHeaderActionModel = new HeaderActionModel(
			additionalClasses, liferayPortletResponse.getNamespace() + "fm",
			PortletURLBuilder.createActionURL(
				liferayPortletResponse
			).setActionName(
				"/commerce_discount/edit_commerce_discount"
			).buildString(),
			liferayPortletResponse.getNamespace() + "publishButton",
			publishButtonLabel);

		headerActionModels.add(publishHeaderActionModel);

		return headerActionModels;
	}

	public String getLocalizedPercentage(BigDecimal percentage, Locale locale)
		throws PortalException {

		CommerceCurrency commerceCurrency =
			_commerceCurrencyLocalService.fetchPrimaryCommerceCurrency(
				commercePricingRequestHelper.getCompanyId());

		return StringUtil.removeSubstring(
			_percentageFormatter.getLocalizedPercentage(
				locale, commerceCurrency.getMaxFractionDigits(),
				commerceCurrency.getMinFractionDigits(), percentage),
			StringPool.PERCENT);
	}

	public String getMaximumDiscountAmount() throws PortalException {
		CommerceDiscount commerceDiscount = getCommerceDiscount();

		return _getCommerceDiscountAmount(
			commerceDiscount.getMaximumDiscountAmount());
	}

	public PortletURL getPortletDiscountRuleURL() {
		PortletURL portletURL = liferayPortletResponse.createRenderURL();

		String redirect = ParamUtil.getString(httpServletRequest, "redirect");

		if (Validator.isNotNull(redirect)) {
			portletURL.setParameter("redirect", redirect);
		}

		long commerceDiscountRuleId = ParamUtil.getLong(
			httpServletRequest, "commerceDiscountRuleId");

		if (commerceDiscountRuleId > 0) {
			portletURL.setParameter(
				"commerceDiscountRuleId",
				String.valueOf(commerceDiscountRuleId));
		}

		return portletURL;
	}

	public PortletURL getPortletURL() {
		PortletURL portletURL = liferayPortletResponse.createRenderURL();

		String redirect = ParamUtil.getString(httpServletRequest, "redirect");

		if (Validator.isNotNull(redirect)) {
			portletURL.setParameter("redirect", redirect);
		}

		long commerceDiscountId = ParamUtil.getLong(
			httpServletRequest, "commerceDiscountId");

		if (commerceDiscountId > 0) {
			portletURL.setParameter(
				"commerceDiscountId", String.valueOf(commerceDiscountId));
		}

		return portletURL;
	}

	public boolean getUsePercentage(String commerceDiscountType) {
		if (Objects.equals(
				commerceDiscountType,
				CommerceDiscountConstants.TYPE_PERCENTAGE)) {

			return true;
		}

		return false;
	}

	public boolean hasAddPermission() throws PortalException {
		PortletResourcePermission portletResourcePermission =
			_commerceDiscountModelResourcePermission.
				getPortletResourcePermission();

		return portletResourcePermission.contains(
			commercePricingRequestHelper.getPermissionChecker(), null,
			CommerceDiscountActionKeys.ADD_COMMERCE_DISCOUNT);
	}

	public boolean hasCustomAttributesAvailable() throws Exception {
		return CustomAttributesUtil.hasCustomAttributes(
			commercePricingRequestHelper.getCompanyId(),
			CommerceDiscount.class.getName(), getCommerceDiscountId(), null);
	}

	public boolean hasPermission(String actionId) throws PortalException {
		return _commerceDiscountModelResourcePermission.contains(
			commercePricingRequestHelper.getPermissionChecker(),
			getCommerceDiscountId(), actionId);
	}

	public BigDecimal round(BigDecimal value) {
		if (value == null) {
			value = BigDecimal.ZERO;
		}

		CommerceCurrency commerceCurrency =
			_commerceCurrencyLocalService.fetchPrimaryCommerceCurrency(
				commercePricingRequestHelper.getCompanyId());

		if (commerceCurrency == null) {
			return value;
		}

		return commerceCurrency.round(value);
	}

	protected List getFDSActionTemplates(
		String portletURL, boolean sidePanel) {

		List fdsActionDropdownItems = new ArrayList<>();

		FDSActionDropdownItem fdsActionDropdownItem = new FDSActionDropdownItem(
			portletURL, "pencil", "edit",
			LanguageUtil.get(httpServletRequest, "edit"), "get", null, null);

		if (sidePanel) {
			fdsActionDropdownItem.setTarget("sidePanel");
		}

		fdsActionDropdownItems.add(fdsActionDropdownItem);

		fdsActionDropdownItems.add(
			new FDSActionDropdownItem(
				null, "trash", "remove",
				LanguageUtil.get(httpServletRequest, "remove"), "delete",
				"delete", "headless"));

		return fdsActionDropdownItems;
	}

	protected final Portal portal;

	private String _getCommerceDiscountAmount(BigDecimal commerceDiscountAmount)
		throws PortalException {

		if (commerceDiscountAmount == null) {
			commerceDiscountAmount = BigDecimal.ZERO;
		}

		return _commercePriceFormatter.format(
			round(commerceDiscountAmount),
			commercePricingRequestHelper.getLocale());
	}

	private String _getManageDiscountPermissionsURL() throws PortalException {
		PortletURL portletURL = PortletURLBuilder.create(
			portal.getControlPanelPortletURL(
				httpServletRequest,
				"com_liferay_portlet_configuration_web_portlet_" +
					"PortletConfigurationPortlet",
				ActionRequest.RENDER_PHASE)
		).setMVCPath(
			"/edit_permissions.jsp"
		).setRedirect(
			commercePricingRequestHelper.getCurrentURL()
		).setParameter(
			"modelResource", CommerceDiscount.class.getName()
		).setParameter(
			"modelResourceDescription", "{name}"
		).setParameter(
			"resourcePrimKey", "{id}"
		).buildPortletURL();

		try {
			portletURL.setWindowState(LiferayWindowState.POP_UP);
		}
		catch (WindowStateException windowStateException) {
			throw new PortalException(windowStateException);
		}

		return portletURL.toString();
	}

	private static final Log _log = LogFactoryUtil.getLog(
		CommerceDiscountDisplayContext.class);

	private final CommerceCurrencyLocalService _commerceCurrencyLocalService;
	private CommerceDiscount _commerceDiscount;
	private final ModelResourcePermission
		_commerceDiscountModelResourcePermission;
	private CommerceDiscountRule _commerceDiscountRule;
	private final CommerceDiscountRuleService _commerceDiscountRuleService;
	private final CommerceDiscountRuleTypeRegistry
		_commerceDiscountRuleTypeRegistry;
	private final CommerceDiscountService _commerceDiscountService;
	private final CommerceDiscountTargetRegistry
		_commerceDiscountTargetRegistry;
	private final CommercePriceFormatter _commercePriceFormatter;
	private final PercentageFormatter _percentageFormatter;

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy