diff --git a/bubble-server/src/main/java/bubble/dao/app/BubbleAppDAO.java b/bubble-server/src/main/java/bubble/dao/app/BubbleAppDAO.java index 3de9d1cd..417a2b67 100644 --- a/bubble-server/src/main/java/bubble/dao/app/BubbleAppDAO.java +++ b/bubble-server/src/main/java/bubble/dao/app/BubbleAppDAO.java @@ -1,7 +1,10 @@ package bubble.dao.app; import bubble.dao.account.AccountOwnedTemplateDAO; +import bubble.model.app.AppMatcher; +import bubble.model.app.AppRule; import bubble.model.app.BubbleApp; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import java.util.List; @@ -9,6 +12,9 @@ import java.util.List; @Repository public class BubbleAppDAO extends AccountOwnedTemplateDAO { + @Autowired private AppMatcherDAO matcherDAO; + @Autowired private AppRuleDAO ruleDAO; + public List findByAccountAndEnabledAndTemplate(String account, Boolean enabled, Boolean template) { if (enabled != null) { if (template != null) { @@ -22,4 +28,15 @@ public class BubbleAppDAO extends AccountOwnedTemplateDAO { return findByField("account", account); } + @Override public void delete(String uuid) { + final BubbleApp app = findByUuid(uuid); + for (AppMatcher m : matcherDAO.findByApp(app.getUuid())) { + matcherDAO.delete(m.getUuid()); + } + for (AppRule r : ruleDAO.findByApp(app.getUuid())) { + ruleDAO.delete(r.getUuid()); + } + super.delete(uuid); + } + } diff --git a/bubble-server/src/main/java/bubble/dao/bill/AccountPlanDAO.java b/bubble-server/src/main/java/bubble/dao/bill/AccountPlanDAO.java index e4dafeb3..c390890a 100644 --- a/bubble-server/src/main/java/bubble/dao/bill/AccountPlanDAO.java +++ b/bubble-server/src/main/java/bubble/dao/bill/AccountPlanDAO.java @@ -50,10 +50,11 @@ public class AccountPlanDAO extends AccountOwnedEntityDAO { return findByFields("account", account, "paymentMethod", paymentMethod, "deleted", null); } - public List findByDeletedAndNotClosed() { + public List findByDeletedAndNotClosedAndNoRefundIssued() { return list(criteria().add(and( isNotNull("deleted"), - eq("closed", false) + eq("closed", false), + eq("refundIssued", false) ))); } @@ -130,9 +131,14 @@ public class AccountPlanDAO extends AccountOwnedEntityDAO { throw invalidEx("err.accountPlan.stopNetworkBeforeDeleting"); } update(accountPlan.setDeleted(now()).setEnabled(false)); - networkDAO.delete(accountPlan.getNetwork()); - if (configuration.paymentsEnabled()) { - refundService.processRefunds(); + if (accountPlan.getNetwork() == null && accountPlan.getDeletedNetwork() != null) { + log.warn("delete: network was supposed to be deleted, deleting it again: "+accountPlan.getDeletedNetwork()); + networkDAO.delete(accountPlan.getDeletedNetwork()); + } else { + networkDAO.delete(accountPlan.getNetwork()); + if (configuration.paymentsEnabled()) { + refundService.processRefunds(); + } } } diff --git a/bubble-server/src/main/java/bubble/model/bill/AccountPlan.java b/bubble-server/src/main/java/bubble/model/bill/AccountPlan.java index 7efc1ad5..03848d68 100644 --- a/bubble-server/src/main/java/bubble/model/bill/AccountPlan.java +++ b/bubble-server/src/main/java/bubble/model/bill/AccountPlan.java @@ -116,6 +116,12 @@ public class AccountPlan extends IdentifiableBase implements HasAccount { @Getter @Setter private String deletedNetwork; public boolean hasDeletedNetwork() { return deletedNetwork != null; } + @ECSearchable @ECField(index=140) @Column(nullable=false) + @Getter @Setter private Boolean refundIssued = false; + + @ECSearchable @ECField(index=150) + @Getter @Setter private String refundError; + // Fields below are used when creating a new plan, to also create the network associated with it @Size(max=10000, message="err.description.length") @Transient @Getter @Setter private transient String description; diff --git a/bubble-server/src/main/java/bubble/resources/account/AccountOwnedResource.java b/bubble-server/src/main/java/bubble/resources/account/AccountOwnedResource.java index 66628134..bc60c215 100644 --- a/bubble-server/src/main/java/bubble/resources/account/AccountOwnedResource.java +++ b/bubble-server/src/main/java/bubble/resources/account/AccountOwnedResource.java @@ -171,13 +171,10 @@ public class AccountOwnedResource pendingPlans = accountPlanDAO.findByDeletedAndNotClosed(); + final List pendingPlans = accountPlanDAO.findByDeletedAndNotClosedAndNoRefundIssued(); for (AccountPlan accountPlan : pendingPlans) { try { final AccountPaymentMethod paymentMethod = paymentMethodDAO.findByUuid(accountPlan.getPaymentMethod()); final CloudService paymentCloud = cloudDAO.findByUuid(paymentMethod.getCloud()); final PaymentServiceDriver paymentDriver = paymentCloud.getPaymentDriver(configuration); paymentDriver.refund(accountPlan.getUuid()); + } catch (Exception e) { log.error("process: error processing refund for AccountPlan: "+accountPlan.getUuid()); + accountPlan.setRefundError(shortError(e)); + + } finally { + accountPlanDAO.update(accountPlan.setRefundIssued(true)); } } } diff --git a/bubble-web b/bubble-web index f9134769..702c0c4c 160000 --- a/bubble-web +++ b/bubble-web @@ -1 +1 @@ -Subproject commit f9134769f17da5b76d038974c75271f17fe88f9b +Subproject commit 702c0c4c2142cfa818c50b0c29af3bd7addc734e