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

com.liferay.commerce.service.impl.CommerceSubscriptionEntryLocalServiceImpl Maven / Gradle / Ivy

/**
 * 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.service.impl;

import com.liferay.commerce.constants.CommerceSubscriptionEntryConstants;
import com.liferay.commerce.constants.CommerceSubscriptionNotificationConstants;
import com.liferay.commerce.exception.CommerceSubscriptionEntryNextIterationDateException;
import com.liferay.commerce.exception.CommerceSubscriptionEntrySubscriptionStatusException;
import com.liferay.commerce.internal.search.CommerceSubscriptionEntryIndexer;
import com.liferay.commerce.model.CommerceOrder;
import com.liferay.commerce.model.CommerceOrderItem;
import com.liferay.commerce.model.CommerceSubscriptionEntry;
import com.liferay.commerce.notification.util.CommerceNotificationHelper;
import com.liferay.commerce.product.util.CPSubscriptionType;
import com.liferay.commerce.product.util.CPSubscriptionTypeRegistry;
import com.liferay.commerce.service.base.CommerceSubscriptionEntryLocalServiceBaseImpl;
import com.liferay.portal.aop.AopService;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.json.JSONUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.messaging.DestinationNames;
import com.liferay.portal.kernel.messaging.Message;
import com.liferay.portal.kernel.messaging.MessageBusUtil;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.search.BaseModelSearchResult;
import com.liferay.portal.kernel.search.Document;
import com.liferay.portal.kernel.search.Field;
import com.liferay.portal.kernel.search.Hits;
import com.liferay.portal.kernel.search.Indexable;
import com.liferay.portal.kernel.search.IndexableType;
import com.liferay.portal.kernel.search.Indexer;
import com.liferay.portal.kernel.search.IndexerRegistry;
import com.liferay.portal.kernel.search.QueryConfig;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.search.SearchException;
import com.liferay.portal.kernel.search.Sort;
import com.liferay.portal.kernel.service.UserLocalService;
import com.liferay.portal.kernel.transaction.TransactionCommitCallbackUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.HashMapBuilder;
import com.liferay.portal.kernel.util.LinkedHashMapBuilder;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.Portal;
import com.liferay.portal.kernel.util.UnicodeProperties;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.uuid.PortalUUIDUtil;

import java.io.Serializable;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

/**
 * @author Alessio Antonio Rendina
 * @author Luca Pellizzon
 */
@Component(
	property = "model.class.name=com.liferay.commerce.model.CommerceSubscriptionEntry",
	service = AopService.class
)
public class CommerceSubscriptionEntryLocalServiceImpl
	extends CommerceSubscriptionEntryLocalServiceBaseImpl {

	/**
	 * @deprecated As of Athanasius (7.3.x)
	 */
	@Deprecated
	@Override
	public CommerceSubscriptionEntry addCommerceSubscriptionEntry(
			long userId, long groupId, long commerceOrderItemId,
			int subscriptionLength, String subscriptionType,
			long maxSubscriptionCycles,
			UnicodeProperties subscriptionTypeSettingsUnicodeProperties)
		throws PortalException {

		return commerceSubscriptionEntryLocalService.
			addCommerceSubscriptionEntry(
				userId, groupId, commerceOrderItemId, subscriptionLength,
				subscriptionType, maxSubscriptionCycles,
				subscriptionTypeSettingsUnicodeProperties, 0, null, 0, null);
	}

	@Indexable(type = IndexableType.REINDEX)
	@Override
	public CommerceSubscriptionEntry addCommerceSubscriptionEntry(
			long userId, long groupId, long commerceOrderItemId,
			int subscriptionLength, String subscriptionType,
			long maxSubscriptionCycles,
			UnicodeProperties subscriptionTypeSettingsUnicodeProperties,
			int deliverySubscriptionLength, String deliverySubscriptionType,
			long deliveryMaxSubscriptionCycles,
			UnicodeProperties deliverySubscriptionTypeSettingsUnicodeProperties)
		throws PortalException {

		User user = _userLocalService.getUser(userId);

		long commerceSubscriptionEntryId = counterLocalService.increment();

		CommerceSubscriptionEntry commerceSubscriptionEntry =
			commerceSubscriptionEntryPersistence.create(
				commerceSubscriptionEntryId);

		commerceSubscriptionEntry.setUuid(PortalUUIDUtil.generate());
		commerceSubscriptionEntry.setGroupId(groupId);
		commerceSubscriptionEntry.setCompanyId(user.getCompanyId());
		commerceSubscriptionEntry.setUserId(user.getUserId());
		commerceSubscriptionEntry.setUserName(user.getFullName());
		commerceSubscriptionEntry.setCommerceOrderItemId(commerceOrderItemId);
		commerceSubscriptionEntry.setSubscriptionLength(subscriptionLength);
		commerceSubscriptionEntry.setSubscriptionType(subscriptionType);
		commerceSubscriptionEntry.setCurrentCycle(1);
		commerceSubscriptionEntry.setMaxSubscriptionCycles(
			maxSubscriptionCycles);
		commerceSubscriptionEntry.setLastIterationDate(new Date());
		commerceSubscriptionEntry.setDeliverySubscriptionLength(
			deliverySubscriptionLength);
		commerceSubscriptionEntry.setDeliverySubscriptionType(
			deliverySubscriptionType);
		commerceSubscriptionEntry.setDeliveryCurrentCycle(1);
		commerceSubscriptionEntry.setDeliveryMaxSubscriptionCycles(
			deliveryMaxSubscriptionCycles);
		commerceSubscriptionEntry.setDeliveryLastIterationDate(new Date());

		CPSubscriptionType cpSubscriptionType =
			_cpSubscriptionTypeRegistry.getCPSubscriptionType(subscriptionType);

		if (cpSubscriptionType != null) {
			commerceSubscriptionEntry.
				setSubscriptionTypeSettingsUnicodeProperties(
					cpSubscriptionType.
						getSubscriptionTypeSettingsUnicodeProperties(
							subscriptionTypeSettingsUnicodeProperties));
			commerceSubscriptionEntry.setSubscriptionStatus(
				CommerceSubscriptionEntryConstants.SUBSCRIPTION_STATUS_ACTIVE);
			commerceSubscriptionEntry.setNextIterationDate(
				cpSubscriptionType.getSubscriptionNextIterationDate(
					user.getTimeZone(), subscriptionLength,
					subscriptionTypeSettingsUnicodeProperties, null));
			commerceSubscriptionEntry.setStartDate(
				cpSubscriptionType.getSubscriptionStartDate(
					user.getTimeZone(),
					subscriptionTypeSettingsUnicodeProperties));
		}
		else {
			commerceSubscriptionEntry.
				setSubscriptionTypeSettingsUnicodeProperties(
					subscriptionTypeSettingsUnicodeProperties);
			commerceSubscriptionEntry.setSubscriptionStatus(
				CommerceSubscriptionEntryConstants.
					SUBSCRIPTION_STATUS_INACTIVE);
		}

		CPSubscriptionType deliveryCPSubscriptionType =
			_cpSubscriptionTypeRegistry.getCPSubscriptionType(
				deliverySubscriptionType);

		if (deliveryCPSubscriptionType != null) {
			commerceSubscriptionEntry.
				setDeliverySubscriptionTypeSettingsUnicodeProperties(
					deliveryCPSubscriptionType.
						getDeliverySubscriptionTypeSettingsUnicodeProperties(
							deliverySubscriptionTypeSettingsUnicodeProperties));
			commerceSubscriptionEntry.setDeliverySubscriptionStatus(
				CommerceSubscriptionEntryConstants.SUBSCRIPTION_STATUS_ACTIVE);
			commerceSubscriptionEntry.setDeliveryNextIterationDate(
				deliveryCPSubscriptionType.getSubscriptionNextIterationDate(
					user.getTimeZone(), deliverySubscriptionLength,
					deliverySubscriptionTypeSettingsUnicodeProperties, null));
			commerceSubscriptionEntry.setDeliveryStartDate(
				deliveryCPSubscriptionType.getSubscriptionStartDate(
					user.getTimeZone(),
					deliverySubscriptionTypeSettingsUnicodeProperties));
		}
		else {
			commerceSubscriptionEntry.
				setDeliverySubscriptionTypeSettingsUnicodeProperties(
					deliverySubscriptionTypeSettingsUnicodeProperties);
			commerceSubscriptionEntry.setDeliverySubscriptionStatus(
				CommerceSubscriptionEntryConstants.
					SUBSCRIPTION_STATUS_INACTIVE);
		}

		return commerceSubscriptionEntryPersistence.update(
			commerceSubscriptionEntry);
	}

	@Override
	public void deleteCommerceSubscriptionEntries(long groupId) {
		List commerceSubscriptionEntries =
			commerceSubscriptionEntryPersistence.findByGroupId(groupId);

		for (CommerceSubscriptionEntry commerceSubscriptionEntry :
				commerceSubscriptionEntries) {

			commerceSubscriptionEntryLocalService.
				deleteCommerceSubscriptionEntry(commerceSubscriptionEntry);
		}
	}

	@Override
	public CommerceSubscriptionEntry
		fetchCommerceSubscriptionEntryByCommerceOrderItemId(
			long commerceOrderItemId) {

		return commerceSubscriptionEntryPersistence.fetchByCommerceOrderItemId(
			commerceOrderItemId);
	}

	@Override
	public List
		getActiveCommerceSubscriptionEntries() {

		return commerceSubscriptionEntryPersistence.findBySubscriptionStatus(
			CommerceSubscriptionEntryConstants.SUBSCRIPTION_STATUS_ACTIVE);
	}

	@Override
	public List getActiveCommerceSubscriptionEntries(
		long commerceAccountId) {

		return commerceSubscriptionEntryFinder.findByA_S(
			commerceAccountId,
			CommerceSubscriptionEntryConstants.SUBSCRIPTION_STATUS_ACTIVE);
	}

	@Override
	public List
		getCommerceDeliverySubscriptionEntriesToRenew() {

		return commerceSubscriptionEntryFinder.findByDeliveryNextIterationDate(
			new Date());
	}

	/**
	 * @deprecated As of Athanasius (7.3.x)
	 */
	@Deprecated
	@Override
	public List getCommerceSubscriptionEntries(
		long companyId, long userId, int start, int end,
		OrderByComparator orderByComparator) {

		return commerceSubscriptionEntryPersistence.findByC_U(
			companyId, userId, start, end, orderByComparator);
	}

	@Override
	public List getCommerceSubscriptionEntries(
		long companyId, long groupId, long userId, int start, int end,
		OrderByComparator orderByComparator) {

		return commerceSubscriptionEntryPersistence.findByG_C_U(
			groupId, companyId, userId, start, end, orderByComparator);
	}

	/**
	 * @deprecated As of Athanasius (7.3.x)
	 */
	@Deprecated
	@Override
	public int getCommerceSubscriptionEntriesCount(
		long companyId, long userId) {

		return commerceSubscriptionEntryPersistence.countByC_U(
			companyId, userId);
	}

	@Override
	public int getCommerceSubscriptionEntriesCount(
		long companyId, long groupId, long userId) {

		return commerceSubscriptionEntryPersistence.countByG_C_U(
			groupId, companyId, userId);
	}

	@Override
	public List
		getCommerceSubscriptionEntriesToRenew() {

		return commerceSubscriptionEntryFinder.findByNextIterationDate(
			new Date());
	}

	@Override
	public CommerceSubscriptionEntry
			incrementCommerceDeliverySubscriptionEntryCycle(
				long commerceSubscriptionEntryId)
		throws PortalException {

		CommerceSubscriptionEntry commerceSubscriptionEntry =
			commerceSubscriptionEntryPersistence.findByPrimaryKey(
				commerceSubscriptionEntryId);

		CPSubscriptionType cpSubscriptionType =
			_cpSubscriptionTypeRegistry.getCPSubscriptionType(
				commerceSubscriptionEntry.getDeliverySubscriptionType());

		if (cpSubscriptionType == null) {
			if (_log.isInfoEnabled()) {
				_log.info(
					"No subscription type found for subscription entry " +
						commerceSubscriptionEntryId);
			}

			return commerceSubscriptionEntry;
		}

		long currentSubscriptionCycle =
			commerceSubscriptionEntry.getDeliveryCurrentCycle();

		commerceSubscriptionEntry.setDeliveryCurrentCycle(
			currentSubscriptionCycle + 1);

		User user = _userLocalService.getUser(
			commerceSubscriptionEntry.getUserId());

		commerceSubscriptionEntry.setDeliveryLastIterationDate(
			commerceSubscriptionEntry.getDeliveryNextIterationDate());

		Date subscriptionNextIterationDate =
			cpSubscriptionType.getSubscriptionNextIterationDate(
				user.getTimeZone(),
				commerceSubscriptionEntry.getDeliverySubscriptionLength(),
				commerceSubscriptionEntry.
					getDeliverySubscriptionTypeSettingsUnicodeProperties(),
				commerceSubscriptionEntry.getDeliveryNextIterationDate());

		commerceSubscriptionEntry.setDeliveryNextIterationDate(
			subscriptionNextIterationDate);

		CommerceSubscriptionEntry updatedSubscriptionEntry =
			commerceSubscriptionEntryPersistence.update(
				commerceSubscriptionEntry);

		// Send user notification

		CommerceOrderItem commerceOrderItem =
			commerceSubscriptionEntry.fetchCommerceOrderItem();

		if (commerceOrderItem != null) {
			CommerceOrder commerceOrder = commerceOrderItem.getCommerceOrder();

			_commerceNotificationHelper.sendNotifications(
				commerceOrder.getGroupId(), commerceOrder.getUserId(),
				CommerceSubscriptionNotificationConstants.SUBSCRIPTION_RENEWED,
				updatedSubscriptionEntry);
		}

		return updatedSubscriptionEntry;
	}

	@Override
	public CommerceSubscriptionEntry incrementCommerceSubscriptionEntryCycle(
			long commerceSubscriptionEntryId)
		throws PortalException {

		CommerceSubscriptionEntry commerceSubscriptionEntry =
			commerceSubscriptionEntryPersistence.findByPrimaryKey(
				commerceSubscriptionEntryId);

		CPSubscriptionType cpSubscriptionType =
			_cpSubscriptionTypeRegistry.getCPSubscriptionType(
				commerceSubscriptionEntry.getSubscriptionType());

		if (cpSubscriptionType == null) {
			if (_log.isInfoEnabled()) {
				_log.info(
					"No subscription type found for subscription entry " +
						commerceSubscriptionEntryId);
			}

			return commerceSubscriptionEntry;
		}

		long currentSubscriptionCycle =
			commerceSubscriptionEntry.getCurrentCycle();

		commerceSubscriptionEntry.setCurrentCycle(currentSubscriptionCycle + 1);

		User user = _userLocalService.getUser(
			commerceSubscriptionEntry.getUserId());

		commerceSubscriptionEntry.setLastIterationDate(
			commerceSubscriptionEntry.getNextIterationDate());

		Date subscriptionNextIterationDate =
			cpSubscriptionType.getSubscriptionNextIterationDate(
				user.getTimeZone(),
				commerceSubscriptionEntry.getSubscriptionLength(),
				commerceSubscriptionEntry.
					getSubscriptionTypeSettingsUnicodeProperties(),
				commerceSubscriptionEntry.getNextIterationDate());

		commerceSubscriptionEntry.setNextIterationDate(
			subscriptionNextIterationDate);

		CommerceSubscriptionEntry updatedSubscriptionEntry =
			commerceSubscriptionEntryPersistence.update(
				commerceSubscriptionEntry);

		// Send user notification

		CommerceOrderItem commerceOrderItem =
			commerceSubscriptionEntry.fetchCommerceOrderItem();

		if (commerceOrderItem != null) {
			CommerceOrder commerceOrder = commerceOrderItem.getCommerceOrder();

			_commerceNotificationHelper.sendNotifications(
				commerceOrder.getGroupId(), commerceOrder.getUserId(),
				CommerceSubscriptionNotificationConstants.SUBSCRIPTION_RENEWED,
				updatedSubscriptionEntry);
		}

		return updatedSubscriptionEntry;
	}

	/**
	 * @deprecated As of Athanasius (7.3.x)
	 */
	@Deprecated
	@Override
	public BaseModelSearchResult
			searchCommerceSubscriptionEntries(
				long companyId, Long maxSubscriptionCycles,
				Integer subscriptionStatus, String keywords, int start, int end,
				Sort sort)
		throws PortalException {

		SearchContext searchContext = _buildSearchContext(
			companyId, null, maxSubscriptionCycles, subscriptionStatus,
			keywords, start, end, sort);

		return _searchCommerceSubscriptionEntries(searchContext);
	}

	@Override
	public BaseModelSearchResult
			searchCommerceSubscriptionEntries(
				long companyId, long[] groupIds, Long maxSubscriptionCycles,
				Integer subscriptionStatus, String keywords, int start, int end,
				Sort sort)
		throws PortalException {

		SearchContext searchContext = _buildSearchContext(
			companyId, groupIds, maxSubscriptionCycles, subscriptionStatus,
			keywords, start, end, sort);

		return _searchCommerceSubscriptionEntries(searchContext);
	}

	/**
	 * @deprecated As of Athanasius (7.3.x)
	 */
	@Deprecated
	@Override
	public CommerceSubscriptionEntry updateCommerceSubscriptionEntry(
			long commerceSubscriptionEntryId, int subscriptionLength,
			String subscriptionType,
			UnicodeProperties subscriptionTypeSettingsUnicodeProperties,
			long maxSubscriptionCycles, int subscriptionStatus,
			int nextIterationDateMonth, int nextIterationDateDay,
			int nextIterationDateYear, int nextIterationDateHour,
			int nextIterationDateMinute)
		throws PortalException {

		return commerceSubscriptionEntryLocalService.
			updateCommerceSubscriptionEntry(
				commerceSubscriptionEntryId, subscriptionLength,
				subscriptionType, subscriptionTypeSettingsUnicodeProperties,
				maxSubscriptionCycles, subscriptionStatus,
				nextIterationDateMonth, nextIterationDateDay,
				nextIterationDateYear, nextIterationDateHour,
				nextIterationDateMinute, 0, null, null, 0,
				CommerceSubscriptionEntryConstants.SUBSCRIPTION_STATUS_INACTIVE,
				0, 0, 0, 0, 0);
	}

	@Indexable(type = IndexableType.REINDEX)
	@Override
	public CommerceSubscriptionEntry updateCommerceSubscriptionEntry(
			long commerceSubscriptionEntryId, int subscriptionLength,
			String subscriptionType,
			UnicodeProperties subscriptionTypeSettingsUnicodeProperties,
			long maxSubscriptionCycles, int subscriptionStatus,
			int nextIterationDateMonth, int nextIterationDateDay,
			int nextIterationDateYear, int nextIterationDateHour,
			int nextIterationDateMinute, int deliverySubscriptionLength,
			String deliverySubscriptionType,
			UnicodeProperties deliverySubscriptionTypeSettingsUnicodeProperties,
			long deliveryMaxSubscriptionCycles, int deliverySubscriptionStatus,
			int deliveryNextIterationDateMonth,
			int deliveryNextIterationDateDay, int deliveryNextIterationDateYear,
			int deliveryNextIterationDateHour,
			int deliveryNextIterationDateMinute)
		throws PortalException {

		CommerceSubscriptionEntry commerceSubscriptionEntry =
			commerceSubscriptionEntryPersistence.findByPrimaryKey(
				commerceSubscriptionEntryId);

		User user = _userLocalService.getUser(
			commerceSubscriptionEntry.getUserId());

		_validateSubscriptionStatus(
			subscriptionStatus,
			commerceSubscriptionEntry.getSubscriptionStatus());

		_validateSubscriptionStatus(
			deliverySubscriptionStatus,
			commerceSubscriptionEntry.getDeliverySubscriptionStatus());

		CPSubscriptionType cpSubscriptionType =
			_cpSubscriptionTypeRegistry.getCPSubscriptionType(subscriptionType);

		if (cpSubscriptionType != null) {
			subscriptionTypeSettingsUnicodeProperties =
				cpSubscriptionType.getSubscriptionTypeSettingsUnicodeProperties(
					subscriptionTypeSettingsUnicodeProperties);
		}

		CPSubscriptionType deliveryCPSubscriptionType =
			_cpSubscriptionTypeRegistry.getCPSubscriptionType(
				deliverySubscriptionType);

		if (deliveryCPSubscriptionType != null) {
			deliverySubscriptionTypeSettingsUnicodeProperties =
				deliveryCPSubscriptionType.
					getDeliverySubscriptionTypeSettingsUnicodeProperties(
						deliverySubscriptionTypeSettingsUnicodeProperties);
		}

		commerceSubscriptionEntry.setSubscriptionLength(subscriptionLength);
		commerceSubscriptionEntry.setSubscriptionType(subscriptionType);
		commerceSubscriptionEntry.setSubscriptionTypeSettingsUnicodeProperties(
			subscriptionTypeSettingsUnicodeProperties);
		commerceSubscriptionEntry.setMaxSubscriptionCycles(
			maxSubscriptionCycles);
		commerceSubscriptionEntry.setSubscriptionStatus(subscriptionStatus);

		if (subscriptionStatus !=
				CommerceSubscriptionEntryConstants.
					SUBSCRIPTION_STATUS_INACTIVE) {

			commerceSubscriptionEntry.setNextIterationDate(
				_portal.getDate(
					nextIterationDateMonth, nextIterationDateDay,
					nextIterationDateYear, nextIterationDateHour,
					nextIterationDateMinute, user.getTimeZone(),
					CommerceSubscriptionEntryNextIterationDateException.class));
		}

		commerceSubscriptionEntry.setDeliverySubscriptionLength(
			deliverySubscriptionLength);
		commerceSubscriptionEntry.setDeliverySubscriptionType(
			deliverySubscriptionType);
		commerceSubscriptionEntry.
			setDeliverySubscriptionTypeSettingsUnicodeProperties(
				deliverySubscriptionTypeSettingsUnicodeProperties);
		commerceSubscriptionEntry.setDeliveryMaxSubscriptionCycles(
			deliveryMaxSubscriptionCycles);
		commerceSubscriptionEntry.setDeliverySubscriptionStatus(
			deliverySubscriptionStatus);

		if (deliverySubscriptionStatus !=
				CommerceSubscriptionEntryConstants.
					SUBSCRIPTION_STATUS_INACTIVE) {

			commerceSubscriptionEntry.setDeliveryNextIterationDate(
				_portal.getDate(
					deliveryNextIterationDateMonth,
					deliveryNextIterationDateDay, deliveryNextIterationDateYear,
					deliveryNextIterationDateHour,
					deliveryNextIterationDateMinute, user.getTimeZone(),
					CommerceSubscriptionEntryNextIterationDateException.class));
		}

		return commerceSubscriptionEntryPersistence.update(
			commerceSubscriptionEntry);
	}

	/**
	 * @deprecated As of Athanasius (7.3.x)
	 */
	@Deprecated
	@Override
	public CommerceSubscriptionEntry
			updateCommerceSubscriptionEntryIterationDates(
				long commerceSubscriptionEntryId, Date lastIterationDate)
		throws PortalException {

		CommerceSubscriptionEntry commerceSubscriptionEntry =
			commerceSubscriptionEntryPersistence.findByPrimaryKey(
				commerceSubscriptionEntryId);

		CPSubscriptionType cpSubscriptionType =
			_cpSubscriptionTypeRegistry.getCPSubscriptionType(
				commerceSubscriptionEntry.getSubscriptionType());

		User user = _userLocalService.getUser(
			commerceSubscriptionEntry.getUserId());

		commerceSubscriptionEntry.setLastIterationDate(lastIterationDate);

		Date subscriptionNextIterationDate =
			cpSubscriptionType.getSubscriptionNextIterationDate(
				user.getTimeZone(),
				commerceSubscriptionEntry.getSubscriptionLength(),
				commerceSubscriptionEntry.
					getSubscriptionTypeSettingsUnicodeProperties(),
				lastIterationDate);

		commerceSubscriptionEntry.setNextIterationDate(
			subscriptionNextIterationDate);

		return commerceSubscriptionEntryPersistence.update(
			commerceSubscriptionEntry);
	}

	@Indexable(type = IndexableType.REINDEX)
	@Override
	public CommerceSubscriptionEntry updateDeliverySubscriptionStatus(
			long commerceSubscriptionEntryId, int subscriptionStatus)
		throws PortalException {

		CommerceSubscriptionEntry commerceSubscriptionEntry =
			commerceSubscriptionEntryPersistence.findByPrimaryKey(
				commerceSubscriptionEntryId);

		_validateSubscriptionStatus(
			subscriptionStatus,
			commerceSubscriptionEntry.getSubscriptionStatus());

		commerceSubscriptionEntry.setDeliverySubscriptionStatus(
			subscriptionStatus);

		// Messaging

		_sendSubscriptionStatusMessage(
			commerceSubscriptionEntryId, subscriptionStatus);

		return commerceSubscriptionEntryPersistence.update(
			commerceSubscriptionEntry);
	}

	@Indexable(type = IndexableType.REINDEX)
	@Override
	public CommerceSubscriptionEntry updateSubscriptionStatus(
			long commerceSubscriptionEntryId, int subscriptionStatus)
		throws PortalException {

		CommerceSubscriptionEntry commerceSubscriptionEntry =
			commerceSubscriptionEntryPersistence.findByPrimaryKey(
				commerceSubscriptionEntryId);

		_validateSubscriptionStatus(
			subscriptionStatus,
			commerceSubscriptionEntry.getSubscriptionStatus());

		commerceSubscriptionEntry.setSubscriptionStatus(subscriptionStatus);

		// Messaging

		_sendSubscriptionStatusMessage(
			commerceSubscriptionEntryId, subscriptionStatus);

		return commerceSubscriptionEntryPersistence.update(
			commerceSubscriptionEntry);
	}

	private SearchContext _buildSearchContext(
		long companyId, long[] groupIds, Long maxSubscriptionCycles,
		Integer subscriptionStatus, String keywords, int start, int end,
		Sort sort) {

		SearchContext searchContext = new SearchContext();

		searchContext.setAttributes(
			HashMapBuilder.put(
				CommerceSubscriptionEntryIndexer.FIELD_CP_INSTANCE_ID, keywords
			).put(
				CommerceSubscriptionEntryIndexer.FIELD_MAX_SUBSCRIPTION_CYCLES,
				() -> maxSubscriptionCycles
			).put(
				CommerceSubscriptionEntryIndexer.FIELD_SKU, keywords
			).put(
				CommerceSubscriptionEntryIndexer.FIELD_SUBSCRIPTION_STATUS,
				() -> subscriptionStatus
			).put(
				Field.ENTRY_CLASS_PK, keywords
			).put(
				"params",
				LinkedHashMapBuilder.put(
					"keywords", keywords
				).build()
			).build());
		searchContext.setCompanyId(companyId);
		searchContext.setEnd(end);

		if ((groupIds != null) && (groupIds.length > 0)) {
			searchContext.setGroupIds(groupIds);
		}

		if (Validator.isNotNull(keywords)) {
			searchContext.setKeywords(keywords);
		}

		if (sort != null) {
			searchContext.setSorts(sort);
		}

		searchContext.setStart(start);

		QueryConfig queryConfig = searchContext.getQueryConfig();

		queryConfig.setHighlightEnabled(false);
		queryConfig.setScoreEnabled(false);

		return searchContext;
	}

	private List _getCommerceSubscriptionEntries(
			Hits hits)
		throws PortalException {

		List documents = hits.toList();

		List commerceSubscriptionEntries =
			new ArrayList<>(documents.size());

		for (Document document : documents) {
			long commerceSubscriptionEntryId = GetterUtil.getLong(
				document.get(Field.ENTRY_CLASS_PK));

			CommerceSubscriptionEntry commerceSubscriptionEntry =
				fetchCommerceSubscriptionEntry(commerceSubscriptionEntryId);

			if (commerceSubscriptionEntry == null) {
				commerceSubscriptionEntries = null;

				Indexer indexer =
					_indexerRegistry.getIndexer(
						CommerceSubscriptionEntry.class);

				long companyId = GetterUtil.getLong(
					document.get(Field.COMPANY_ID));

				indexer.delete(companyId, document.getUID());
			}
			else if (commerceSubscriptionEntries != null) {
				commerceSubscriptionEntries.add(commerceSubscriptionEntry);
			}
		}

		return commerceSubscriptionEntries;
	}

	private BaseModelSearchResult
			_searchCommerceSubscriptionEntries(SearchContext searchContext)
		throws PortalException {

		Indexer indexer =
			_indexerRegistry.nullSafeGetIndexer(
				CommerceSubscriptionEntry.class);

		for (int i = 0; i < 10; i++) {
			Hits hits = indexer.search(searchContext, _SELECTED_FIELD_NAMES);

			List commerceSubscriptionEntries =
				_getCommerceSubscriptionEntries(hits);

			if (commerceSubscriptionEntries != null) {
				return new BaseModelSearchResult<>(
					commerceSubscriptionEntries, hits.getLength());
			}
		}

		throw new SearchException(
			"Unable to fix the search index after 10 attempts");
	}

	private void _sendSubscriptionStatusMessage(
		long commerceSubscriptionEntryId, int subscriptionStatus) {

		TransactionCommitCallbackUtil.registerCallback(
			() -> {
				Message message = new Message();

				message.setPayload(
					JSONUtil.put(
						"commerceSubscriptionEntryId",
						commerceSubscriptionEntryId
					).put(
						"subscriptionStatus", subscriptionStatus
					));

				MessageBusUtil.sendMessage(
					DestinationNames.COMMERCE_SUBSCRIPTION_STATUS, message);

				return null;
			});
	}

	private void _validateSubscriptionStatus(
			int subscriptionStatus, int oldSubscriptionStatus)
		throws PortalException {

		if ((oldSubscriptionStatus ==
				CommerceSubscriptionEntryConstants.
					SUBSCRIPTION_STATUS_SUSPENDED) ||
			((subscriptionStatus ==
				CommerceSubscriptionEntryConstants.
					SUBSCRIPTION_STATUS_INACTIVE) &&
			 (oldSubscriptionStatus !=
				 CommerceSubscriptionEntryConstants.
					 SUBSCRIPTION_STATUS_COMPLETED))) {

			return;
		}

		if (subscriptionStatus < oldSubscriptionStatus) {
			throw new CommerceSubscriptionEntrySubscriptionStatusException();
		}
	}

	private static final String[] _SELECTED_FIELD_NAMES = {
		Field.ENTRY_CLASS_PK, Field.COMPANY_ID, Field.GROUP_ID, Field.UID
	};

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

	@Reference
	private CommerceNotificationHelper _commerceNotificationHelper;

	@Reference
	private CPSubscriptionTypeRegistry _cpSubscriptionTypeRegistry;

	@Reference
	private IndexerRegistry _indexerRegistry;

	@Reference
	private Portal _portal;

	@Reference
	private UserLocalService _userLocalService;

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy