From 0f49b616385d0cadfac7bcb7e59e658650e0e35d Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Tue, 18 Feb 2020 10:33:19 -0500 Subject: [PATCH] add support for viewing/updating payment methods --- .../model/bill/AccountPaymentMethod.java | 8 ++++++++ .../java/bubble/model/bill/AccountPlan.java | 2 +- .../src/main/java/bubble/model/bill/Bill.java | 2 +- .../bill/AccountPaymentMethodsResource.java | 15 +++++++++++++-- .../post_auth/ResourceMessages.properties | 18 ++++++++++++++++++ bubble-web | 2 +- 6 files changed, 42 insertions(+), 5 deletions(-) diff --git a/bubble-server/src/main/java/bubble/model/bill/AccountPaymentMethod.java b/bubble-server/src/main/java/bubble/model/bill/AccountPaymentMethod.java index 1163d24b..260a9110 100644 --- a/bubble-server/src/main/java/bubble/model/bill/AccountPaymentMethod.java +++ b/bubble-server/src/main/java/bubble/model/bill/AccountPaymentMethod.java @@ -9,6 +9,7 @@ import bubble.model.cloud.CloudService; import bubble.notify.payment.PaymentValidationResult; import bubble.server.BubbleConfiguration; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -23,6 +24,7 @@ import org.cobbzilla.wizard.validation.ValidationResult; import org.hibernate.annotations.Type; import javax.persistence.*; +import java.util.List; import static org.cobbzilla.util.daemon.ZillaRuntime.*; import static org.cobbzilla.util.reflect.ReflectionUtil.copy; @@ -86,6 +88,12 @@ public class AccountPaymentMethod extends IdentifiableBase implements HasAccount public boolean deleted() { return deleted != null; } public boolean notDeleted() { return !deleted(); } + @Transient @Getter @Setter private transient List planNames = null; + @Transient public Boolean getDeletable () { return planNames == null ? null : notDeleted() && planNames.isEmpty(); } + public void setDeletable(boolean deletable) {} // noop + + @JsonProperty @Override public long getCtime () { return super.getCtime(); } + public ValidationResult validate(ValidationResult result, BubbleConfiguration configuration) { if (!hasPaymentMethodType()) { 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 abf165c2..e26fad74 100644 --- a/bubble-server/src/main/java/bubble/model/bill/AccountPlan.java +++ b/bubble-server/src/main/java/bubble/model/bill/AccountPlan.java @@ -68,7 +68,7 @@ public class AccountPlan extends IdentifiableBase implements HasAccount { @ECSearchable @ECField(index=40) @ECForeignKey(entity=AccountPaymentMethod.class) - @Column(updatable=false, length=UUID_MAXLEN) + @Column(length=UUID_MAXLEN) @Getter @Setter private String paymentMethod; @ECSearchable @ECField(index=50) diff --git a/bubble-server/src/main/java/bubble/model/bill/Bill.java b/bubble-server/src/main/java/bubble/model/bill/Bill.java index ec5ac618..c16653aa 100644 --- a/bubble-server/src/main/java/bubble/model/bill/Bill.java +++ b/bubble-server/src/main/java/bubble/model/bill/Bill.java @@ -22,7 +22,7 @@ import static org.cobbzilla.wizard.model.entityconfig.annotations.ECForeignKeySe @ECTypeURIs(listFields={"account", "plan", "periodLabel", "total", "status"}) @Entity @NoArgsConstructor @Accessors(chain=true) @ECIndexes({ - @ECIndex(unique=true, of={"account", "accountPlan", "type", "periodStart"}) + @ECIndex(unique=true, of={"accountPlan", "periodStart"}) }) public class Bill extends IdentifiableBase implements HasAccountNoName { diff --git a/bubble-server/src/main/java/bubble/resources/bill/AccountPaymentMethodsResource.java b/bubble-server/src/main/java/bubble/resources/bill/AccountPaymentMethodsResource.java index ad3cac75..24a12dff 100644 --- a/bubble-server/src/main/java/bubble/resources/bill/AccountPaymentMethodsResource.java +++ b/bubble-server/src/main/java/bubble/resources/bill/AccountPaymentMethodsResource.java @@ -1,8 +1,10 @@ package bubble.resources.bill; import bubble.dao.bill.AccountPaymentMethodDAO; +import bubble.dao.bill.AccountPlanDAO; import bubble.model.account.Account; import bubble.model.bill.AccountPaymentMethod; +import bubble.model.bill.AccountPlan; import bubble.resources.account.AccountOwnedResource; import bubble.server.BubbleConfiguration; import lombok.extern.slf4j.Slf4j; @@ -27,6 +29,7 @@ public class AccountPaymentMethodsResource extends AccountOwnedResource list(ContainerRequest ctx) { final Map params = queryParams(ctx.getRequestUri().getQuery()); if (params.containsKey(PARAM_ALL) && Boolean.parseBoolean(params.get("all").toLowerCase())) { - return super.list(ctx); + return setPlanNames(super.list(ctx)); } else { - return super.list(ctx).stream().filter(AccountPaymentMethod::notDeleted).collect(Collectors.toList()); + return setPlanNames(super.list(ctx).stream().filter(AccountPaymentMethod::notDeleted).collect(Collectors.toList())); } } + private List setPlanNames(List paymentMethods) { + for (AccountPaymentMethod apm : paymentMethods) { + final List plans = accountPlanDAO.findByAccountAndPaymentMethodAndNotDeleted(apm.getAccount(), apm.getUuid()); + apm.setPlanNames(plans.stream().map(AccountPlan::getName).collect(Collectors.toList())); + } + return paymentMethods; + } + @Override protected AccountPaymentMethod setReferences(ContainerRequest ctx, Account caller, AccountPaymentMethod request) { final ValidationResult result = new ValidationResult(); request.validate(result, configuration); diff --git a/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties b/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties index cfc6b2bf..14da6ef4 100644 --- a/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties +++ b/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties @@ -33,6 +33,8 @@ button_label_update_profile=Update link_label_change_password=Change Password link_label_account_ssh_keys=Manage SSH Keys link_label_account_policy=Account Policy and Contact Info +link_label_account_payments=Payment Methods and Credits +link_label_account_bills=Bills message_profile_update_success=Profile update was successful # Account SSH key fields @@ -285,6 +287,22 @@ label_promotion_AccountCredit1=$1 Bonus label_promotion_AccountCredit5=$5 Bonus label_promotion_AccountCreditBill=Full Bill Bonus ($100 max value) +title_account_payment_methods=Payment Methods +label_account_payment_method_type=Type +label_account_payment_method_info=Info +label_account_payment_method_added=Added +label_account_payment_method_added_format={{MMM}} {{d}}, {{YYYY}} +label_account_payment_method_current=Currently paying for +label_account_payment_method_remove=Delete +label_account_payment_method_set=Set as payment for plan +label_account_payment_add=Add New Payment Method +button_label_account_payment_delete=Remove + +title_account_promotions=Promotional Credits +title_account_promotions_used=Used Promotional Credits +label_account_promotion_used=Used On +label_account_payment_method_used_format={{MMM}} {{d}}, {{YYYY}} + # Bubble Plans plan_name_bubble=Bubble Standard plan_description_bubble=Try this one first. Most users probably don't need anything more diff --git a/bubble-web b/bubble-web index ddbe7e69..ecaebb46 160000 --- a/bubble-web +++ b/bubble-web @@ -1 +1 @@ -Subproject commit ddbe7e69b39138c458766c82ee616c31fa7980d1 +Subproject commit ecaebb464c6ecb27d2422a42f42892181ae09c4e