diff options
author | Bjørn Christian Seime <bjorncs@vespa.ai> | 2023-10-27 12:35:13 +0200 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@vespa.ai> | 2023-10-27 12:35:13 +0200 |
commit | 3e9a01e465e65e2130c6b4c4b8b7f9e490e777f1 (patch) | |
tree | 6aac818f0bc66f933274b1c646d00df4e61f87db /controller-server/src/main/java | |
parent | 1dd0634447a9ee626e3cad02762ab628d4dd1d6d (diff) |
Split `TaxId` into type and code
Diffstat (limited to 'controller-server/src/main/java')
2 files changed, 34 insertions, 7 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java index eae8f86f289..85b7acd603a 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java @@ -96,6 +96,8 @@ public class TenantSerializer { private static final String accountField = "account"; private static final String templateVersionField = "templateVersion"; private static final String taxIdField = "taxId"; + private static final String taxIdTypeField = "type"; + private static final String taxIdCodeField = "code"; private static final String purchaseOrderField = "purchaseOrder"; private static final String invoiceEmailField = "invoiceEmail"; @@ -287,7 +289,17 @@ public class TenantSerializer { } private TenantBilling tenantInfoBillingContactFromSlime(Inspector billingObject) { - var taxId = new TaxId(billingObject.field(taxIdField).asString()); + var taxIdInspector = billingObject.field(taxIdField); + var taxId = switch (taxIdInspector.type()) { + case STRING -> TaxId.legacy(taxIdInspector.asString()); + case OBJECT -> { + var taxIdType = taxIdInspector.field(taxIdTypeField).asString(); + var taxIdCode = taxIdInspector.field(taxIdCodeField).asString(); + yield new TaxId(new TaxId.Type(taxIdType), new TaxId.Code(taxIdCode)); + } + case NIX -> TaxId.empty(); + default -> throw new IllegalStateException(taxIdInspector.type().name()); + }; var purchaseOrder = new PurchaseOrder(billingObject.field(purchaseOrderField).asString()); var invoiceEmail = new Email(billingObject.field(invoiceEmailField).asString(), false); @@ -361,7 +373,9 @@ public class TenantSerializer { billingCursor.setString("email", billingContact.contact().email().getEmailAddress()); billingCursor.setBool("emailVerified", billingContact.contact().email().isVerified()); billingCursor.setString("phone", billingContact.contact().phone()); - billingCursor.setString(taxIdField, billingContact.getTaxId().value()); + var taxIdCursor = billingCursor.setObject(taxIdField); + taxIdCursor.setString(taxIdTypeField, billingContact.getTaxId().type().value()); + taxIdCursor.setString(taxIdCodeField, billingContact.getTaxId().code().value()); billingCursor.setString(purchaseOrderField, billingContact.getPurchaseOrder().value()); billingCursor.setString(invoiceEmailField, billingContact.getInvoiceEmail().getEmailAddress()); toSlime(billingContact.address(), billingCursor); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java index 5548928b9d0..e4da2e4e92b 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java @@ -696,7 +696,9 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { contact.setString("email", billingContact.contact().email().getEmailAddress()); contact.setBool("emailVerified", billingContact.contact().email().isVerified()); contact.setString("phone", billingContact.contact().phone()); - root.setString("taxId", billingContact.getTaxId().value()); + var taxIdCursor = root.setObject("taxId"); + taxIdCursor.setString("type", billingContact.getTaxId().type().value()); + taxIdCursor.setString("code", billingContact.getTaxId().code().value()); root.setString("purchaseOrder", billingContact.getPurchaseOrder().value()); root.setString("invoiceEmail", billingContact.getInvoiceEmail().getEmailAddress()); @@ -714,10 +716,14 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { var mergedContact = updateBillingContact(inspector.field("contact"), cloudTenant.name(), contact); var mergedAddress = updateTenantInfoAddress(inspector.field("address"), billing.address()); - var mergedTaxId = optional("taxId", inspector).map(TaxId::new).orElse(billing.getTaxId()); + var mergedTaxId = updateTaxId(inspector.field("taxId"), billing.getTaxId()); var mergedPurchaseOrder = optional("purchaseOrder", inspector).map(PurchaseOrder::new).orElse(billing.getPurchaseOrder()); var mergedInvoiceEmail = optional("invoiceEmail", inspector).map(mail -> new Email(mail, false)).orElse(billing.getInvoiceEmail()); + if (!inspector.field("taxId").valid() && inspector.field("address").valid()) { + throw new IllegalArgumentException("Tax ID information is mandatory for setting up billing"); + } + var mergedBilling = info.billingContact() .withContact(mergedContact) .withAddress(mergedAddress) @@ -802,7 +808,9 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { billingCursor.setString("email", billingContact.contact().email().getEmailAddress()); billingCursor.setBool("emailVerified", billingContact.contact().email().isVerified()); billingCursor.setString("phone", billingContact.contact().phone()); - billingCursor.setString("taxId", billingContact.getTaxId().value()); + var taxIdCursor = billingCursor.setObject("taxId"); + taxIdCursor.setString("type", billingContact.getTaxId().type().value()); + taxIdCursor.setString("code", billingContact.getTaxId().code().value()); billingCursor.setString("purchaseOrder", billingContact.getPurchaseOrder().value()); billingCursor.setString("invoiceEmail", billingContact.getInvoiceEmail().getEmailAddress()); toSlime(billingContact.address(), billingCursor); @@ -914,6 +922,12 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { throw new IllegalArgumentException("All address fields must be set"); } + private TaxId updateTaxId(Inspector insp, TaxId old) { + if (!insp.valid()) return old; + return new TaxId(getString(insp.field("type"), old.type().value()), + getString(insp.field("code"), old.code().value())); + } + private TenantContact updateBillingContact(Inspector insp, TenantName tenantName, TenantContact oldContact) { if (!insp.valid()) return oldContact; @@ -934,13 +948,12 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { private TenantBilling updateTenantInfoBillingContact(Inspector insp, TenantName tenantName, TenantBilling oldContact) { if (!insp.valid()) return oldContact; - var taxId = optional("taxId", insp).map(TaxId::new).orElse(oldContact.getTaxId()); var purchaseOrder = optional("purchaseOrder", insp).map(PurchaseOrder::new).orElse(oldContact.getPurchaseOrder()); var invoiceEmail = optional("invoiceEmail", insp).map(mail -> new Email(mail, false)).orElse(oldContact.getInvoiceEmail()); return TenantBilling.empty() .withContact(updateBillingContact(insp, tenantName, oldContact.contact())) .withAddress(updateTenantInfoAddress(insp.field("address"), oldContact.address())) - .withTaxId(taxId) + .withTaxId(updateTaxId(insp.field("taxId"), oldContact.getTaxId())) .withPurchaseOrder(purchaseOrder) .withInvoiceEmail(invoiceEmail); } |