diff --git a/api/src/main/java/org/killbill/billing/callcontext/InternalCallContext.java b/api/src/main/java/org/killbill/billing/callcontext/InternalCallContext.java
index dee6931..a06f003 100644
--- a/api/src/main/java/org/killbill/billing/callcontext/InternalCallContext.java
+++ b/api/src/main/java/org/killbill/billing/callcontext/InternalCallContext.java
@@ -78,6 +78,11 @@ public class InternalCallContext extends InternalTenantContext {
context.getUpdatedDate());
}
+ public InternalCallContext(final InternalCallContext context, final DateTime updatedDate) {
+ this(context.getTenantRecordId(), context.getAccountRecordId(), context.getReferenceDateTimeZone(), context.getUserToken(), context.getCreatedBy(), context.getCallOrigin(),
+ context.getContextUserType(), context.getReasonCode(), context.getComments(), context.getCreatedDate(), updatedDate);
+ }
+
// TODO should not be needed if all services are using internal API
// Unfortunately not true as some APIs ae hidden in object -- e.g OverdueStateApplicator is doing subscription.cancelEntitlementWithDateOverrideBillingPolicy
public CallContext toCallContext(final UUID tenantId) {
diff --git a/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java b/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java
index 2053ba1..3be74e7 100644
--- a/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java
+++ b/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java
@@ -115,7 +115,7 @@ public class DefaultPaymentDao implements PaymentDao {
public Void inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
final String transactionIdStr = transactionId != null ? transactionId.toString() : null;
final PaymentAttemptSqlDao transactional = entitySqlDaoWrapperFactory.become(PaymentAttemptSqlDao.class);
- transactional.updateAttempt(paymentAttemptId.toString(), transactionIdStr, state, context);
+ transactional.updateAttempt(paymentAttemptId.toString(), transactionIdStr, state, contextWithUpdatedDate(context));
return null;
}
});
@@ -129,7 +129,7 @@ public class DefaultPaymentDao implements PaymentDao {
public Void inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
final String transactionIdStr = transactionId != null ? transactionId.toString() : null;
final PaymentAttemptSqlDao transactional = entitySqlDaoWrapperFactory.become(PaymentAttemptSqlDao.class);
- transactional.updateAttemptWithProperties(paymentAttemptId.toString(), transactionIdStr, state, pluginProperties, context);
+ transactional.updateAttemptWithProperties(paymentAttemptId.toString(), transactionIdStr, state, pluginProperties, contextWithUpdatedDate(context));
return null;
}
});
@@ -289,7 +289,7 @@ public class DefaultPaymentDao implements PaymentDao {
transactional.create(paymentTransaction, context);
final PaymentTransactionModelDao paymentTransactionModelDao = transactional.getById(paymentTransaction.getId().toString(), context);
- entitySqlDaoWrapperFactory.become(PaymentSqlDao.class).updatePaymentForNewTransaction(paymentId.toString(), context);
+ entitySqlDaoWrapperFactory.become(PaymentSqlDao.class).updatePaymentForNewTransaction(paymentId.toString(), contextWithUpdatedDate(context));
return paymentTransactionModelDao;
}
@@ -307,14 +307,15 @@ public class DefaultPaymentDao implements PaymentDao {
@Override
public Void inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
+ final InternalCallContext contextWithUpdatedDate = contextWithUpdatedDate(context);
entitySqlDaoWrapperFactory.become(TransactionSqlDao.class).updateTransactionStatus(transactionId.toString(),
processedAmount, processedCurrency == null ? null : processedCurrency.toString(),
transactionStatus == null ? null : transactionStatus.toString(),
- gatewayErrorCode, gatewayErrorMsg, context);
+ gatewayErrorCode, gatewayErrorMsg, contextWithUpdatedDate);
if (lastPaymentSuccessStateName != null) {
- entitySqlDaoWrapperFactory.become(PaymentSqlDao.class).updateLastSuccessPaymentStateName(paymentId.toString(), currentPaymentStateName, lastPaymentSuccessStateName, context);
+ entitySqlDaoWrapperFactory.become(PaymentSqlDao.class).updateLastSuccessPaymentStateName(paymentId.toString(), currentPaymentStateName, lastPaymentSuccessStateName, contextWithUpdatedDate);
} else {
- entitySqlDaoWrapperFactory.become(PaymentSqlDao.class).updatePaymentStateName(paymentId.toString(), currentPaymentStateName, context);
+ entitySqlDaoWrapperFactory.become(PaymentSqlDao.class).updatePaymentStateName(paymentId.toString(), currentPaymentStateName, contextWithUpdatedDate);
}
postPaymentEventFromTransaction(accountId, transactionStatus, transactionType, paymentId, transactionId, processedAmount, processedCurrency, clock.getUTCNow(), gatewayErrorCode, entitySqlDaoWrapperFactory, context);
return null;
@@ -504,12 +505,12 @@ public class DefaultPaymentDao implements PaymentDao {
}
private void deletedPaymentMethodInTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory, final UUID paymentMethodId, final InternalCallContext context) {
- entitySqlDaoWrapperFactory.become(PaymentMethodSqlDao.class).markPaymentMethodAsDeleted(paymentMethodId.toString(), context);
+ entitySqlDaoWrapperFactory.become(PaymentMethodSqlDao.class).markPaymentMethodAsDeleted(paymentMethodId.toString(), contextWithUpdatedDate(context));
}
private void undeletedPaymentMethodInTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory, final UUID paymentMethodId, final InternalCallContext context) {
final PaymentMethodSqlDao paymentMethodSqlDao = entitySqlDaoWrapperFactory.become(PaymentMethodSqlDao.class);
- paymentMethodSqlDao.unmarkPaymentMethodAsDeleted(paymentMethodId.toString(), context);
+ paymentMethodSqlDao.unmarkPaymentMethodAsDeleted(paymentMethodId.toString(), contextWithUpdatedDate(context));
}
@Override
@@ -518,11 +519,14 @@ public class DefaultPaymentDao implements PaymentDao {
@Override
public List<PaymentMethodModelDao> inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
+
+ final InternalCallContext contextWithUpdatedDate = contextWithUpdatedDate(context);
+
final PaymentMethodSqlDao transactional = entitySqlDaoWrapperFactory.become(PaymentMethodSqlDao.class);
// Look at all payment methods, including deleted ones. We assume that newPaymentMethods (payment methods returned by the plugin)
// is the full set of non-deleted payment methods in the plugin. If a payment method was marked as deleted on our side,
// but is still existing in the plugin, we will un-delete it.
- final List<PaymentMethodModelDao> allPaymentMethodsForAccount = transactional.getForAccountIncludedDelete(context);
+ final List<PaymentMethodModelDao> allPaymentMethodsForAccount = transactional.getForAccountIncludedDelete(contextWithUpdatedDate);
// Consider only the payment methods for the plugin we are refreshing
final Collection<PaymentMethodModelDao> existingPaymentMethods = Collections2.filter(allPaymentMethodsForAccount,
@@ -543,7 +547,7 @@ public class DefaultPaymentDao implements PaymentDao {
break;
} else if (existingPaymentMethod.equalsButActive(finalPaymentMethod)) {
// We already have it but its status has changed - update it accordingly
- undeletedPaymentMethodInTransaction(entitySqlDaoWrapperFactory, existingPaymentMethod.getId(), context);
+ undeletedPaymentMethodInTransaction(entitySqlDaoWrapperFactory, existingPaymentMethod.getId(), contextWithUpdatedDate);
foundExistingPaymentMethod = existingPaymentMethod;
break;
}
@@ -551,7 +555,7 @@ public class DefaultPaymentDao implements PaymentDao {
}
if (foundExistingPaymentMethod == null) {
- insertPaymentMethodInTransaction(entitySqlDaoWrapperFactory, finalPaymentMethod, context);
+ insertPaymentMethodInTransaction(entitySqlDaoWrapperFactory, finalPaymentMethod, contextWithUpdatedDate);
} else {
existingPaymentMethods.remove(foundExistingPaymentMethod);
}
@@ -563,10 +567,10 @@ public class DefaultPaymentDao implements PaymentDao {
// the logic around audit/history will use getById to retrieve the entity and that method would not return
// a marked as deleted object
if (existingPaymentMethod.isActive()) {
- deletedPaymentMethodInTransaction(entitySqlDaoWrapperFactory, existingPaymentMethod.getId(), context);
+ deletedPaymentMethodInTransaction(entitySqlDaoWrapperFactory, existingPaymentMethod.getId(), contextWithUpdatedDate);
}
}
- return transactional.getForAccount(context);
+ return transactional.getForAccount(contextWithUpdatedDate);
}
});
}
@@ -637,4 +641,8 @@ public class DefaultPaymentDao implements PaymentDao {
log.error("Failed to post Payment event event for account {} ", accountId, e);
}
}
+
+ private InternalCallContext contextWithUpdatedDate(final InternalCallContext input) {
+ return new InternalCallContext(input, clock.getUTCNow());
+ }
}
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/engine/dao/DefaultSubscriptionDao.java b/subscription/src/main/java/org/killbill/billing/subscription/engine/dao/DefaultSubscriptionDao.java
index 41c73a0..119bfe7 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/engine/dao/DefaultSubscriptionDao.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/engine/dao/DefaultSubscriptionDao.java
@@ -389,17 +389,19 @@ public class DefaultSubscriptionDao extends EntityDaoBase<SubscriptionBundleMode
@Override
public void updateChargedThroughDate(final DefaultSubscriptionBase subscription, final InternalCallContext context) {
+
final Date ctd = (subscription.getChargedThroughDate() != null) ? subscription.getChargedThroughDate().toDate() : null;
+ final InternalCallContext contextWithUpdatedDate = contextWithUpdatedDate(context);
transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Void>() {
@Override
public Void inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
final SubscriptionSqlDao transactionalDao = entitySqlDaoWrapperFactory.become(SubscriptionSqlDao.class);
- transactionalDao.updateChargedThroughDate(subscription.getId().toString(), ctd, context);
+ transactionalDao.updateChargedThroughDate(subscription.getId().toString(), ctd, contextWithUpdatedDate);
final BundleSqlDao bundleSqlDao = entitySqlDaoWrapperFactory.become(BundleSqlDao.class);
final String bundleId = subscription.getBundleId().toString();
- bundleSqlDao.updateBundleLastSysTime(bundleId, clock.getUTCNow().toDate(), context);
+ bundleSqlDao.updateBundleLastSysTime(bundleId, clock.getUTCNow().toDate(), contextWithUpdatedDate);
return null;
}
});
@@ -596,6 +598,8 @@ public class DefaultSubscriptionDao extends EntityDaoBase<SubscriptionBundleMode
@Override
public void uncancelSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> uncancelEvents, final InternalCallContext context) {
+
+ final InternalCallContext contextWithUpdatedDate = contextWithUpdatedDate(context);
transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Void>() {
@Override
public Void inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
@@ -604,7 +608,7 @@ public class DefaultSubscriptionDao extends EntityDaoBase<SubscriptionBundleMode
final UUID subscriptionId = subscription.getId();
SubscriptionEventModelDao cancelledEvent = null;
final Date now = clock.getUTCNow().toDate();
- final List<SubscriptionEventModelDao> eventModels = transactional.getFutureActiveEventForSubscription(subscriptionId.toString(), now, context);
+ final List<SubscriptionEventModelDao> eventModels = transactional.getFutureActiveEventForSubscription(subscriptionId.toString(), now, contextWithUpdatedDate);
for (final SubscriptionEventModelDao cur : eventModels) {
if (cur.getUserType() == ApiEventType.CANCEL) {
@@ -617,17 +621,17 @@ public class DefaultSubscriptionDao extends EntityDaoBase<SubscriptionBundleMode
if (cancelledEvent != null) {
final String cancelledEventId = cancelledEvent.getId().toString();
- transactional.unactiveEvent(cancelledEventId, context);
+ transactional.unactiveEvent(cancelledEventId, contextWithUpdatedDate);
for (final SubscriptionBaseEvent cur : uncancelEvents) {
- transactional.create(new SubscriptionEventModelDao(cur), context);
+ transactional.create(new SubscriptionEventModelDao(cur), contextWithUpdatedDate);
recordFutureNotificationFromTransaction(entitySqlDaoWrapperFactory,
cur.getEffectiveDate(),
new SubscriptionNotificationKey(cur.getId()),
- context);
+ contextWithUpdatedDate);
}
// Notify the Bus of the latest requested change
- notifyBusOfRequestedChange(entitySqlDaoWrapperFactory, subscription, uncancelEvents.get(uncancelEvents.size() - 1), SubscriptionBaseTransitionType.UNCANCEL, context);
+ notifyBusOfRequestedChange(entitySqlDaoWrapperFactory, subscription, uncancelEvents.get(uncancelEvents.size() - 1), SubscriptionBaseTransitionType.UNCANCEL, contextWithUpdatedDate);
}
return null;
@@ -1035,7 +1039,7 @@ public class DefaultSubscriptionDao extends EntityDaoBase<SubscriptionBundleMode
public Void inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
final BundleSqlDao bundleSqlDao = entitySqlDaoWrapperFactory.become(BundleSqlDao.class);
- bundleSqlDao.updateBundleExternalKey(bundleId.toString(), externalKey, context);
+ bundleSqlDao.updateBundleExternalKey(bundleId.toString(), externalKey, contextWithUpdatedDate(context));
return null;
}
});
@@ -1172,4 +1176,8 @@ public class DefaultSubscriptionDao extends EntityDaoBase<SubscriptionBundleMode
return subscriptionWithNewEvent;
}
+ private InternalCallContext contextWithUpdatedDate(final InternalCallContext input) {
+ return new InternalCallContext(input, clock.getUTCNow());
+ }
+
}