public InvoiceItemModelDao(final InvoiceItem invoiceItem) { this(invoiceItem.getId(), invoiceItem.getCreatedDate(), invoiceItem.getInvoiceItemType(), invoiceItem.getInvoiceId(), invoiceItem.getAccountId(), invoiceItem.getChildAccountId(), invoiceItem.getBundleId(), invoiceItem.getSubscriptionId(), invoiceItem.getDescription(), invoiceItem.getProductName(), invoiceItem.getPlanName(), invoiceItem.getPhaseName(), invoiceItem.getUsageName(), invoiceItem.getStartDate(), invoiceItem.getEndDate(), invoiceItem.getAmount(), invoiceItem.getRate(), invoiceItem.getCurrency(), invoiceItem.getLinkedItemId(), invoiceItem.getQuantity(), invoiceItem.getItemDetails()); }
public Item(final InvoiceItem item, final UUID targetInvoiceId, final ItemAction action) { this(item, item.getStartDate(), item.getEndDate(), targetInvoiceId, action); }
@Override public boolean apply(final InvoiceItem input) { return input.getInvoiceItemType() == invoiceItemType && input.getSubscriptionId().equals(subscriptionId); } });
assertEquals(result.get(0).getAmount().compareTo(new BigDecimal("4.0")), 0, String.format("%s != 4.0", result.get(0).getAmount())); assertEquals(result.get(0).getCurrency(), Currency.BTC); assertEquals(result.get(0).getAccountId(), accountId); assertEquals(result.get(0).getBundleId(), bundleId); assertEquals(result.get(0).getSubscriptionId(), subscriptionId); assertEquals(result.get(0).getPlanName(), planName); assertEquals(result.get(0).getPhaseName(), phaseName); assertEquals(result.get(0).getUsageName(), usage.getName()); assertTrue(result.get(0).getStartDate().compareTo(startDate) == 0); assertTrue(result.get(0).getEndDate().compareTo(firstBCDDate) == 0); assertNotNull(result.get(0).getItemDetails()); UsageConsumableInArrearAggregate usageDetail = objectMapper.readValue(result.get(0).getItemDetails(), new TypeReference<UsageConsumableInArrearAggregate>() {}); List<UsageConsumableInArrearTierUnitAggregate> itemDetails = usageDetail.getTierDetails(); assertEquals(itemDetails.size(), 1); assertEquals(result.get(1).getAmount().compareTo(new BigDecimal("1.0")), 0, String.format("%s != 1.0", result.get(0).getAmount())); assertEquals(result.get(1).getCurrency(), Currency.BTC); assertEquals(result.get(1).getAccountId(), accountId); assertEquals(result.get(1).getBundleId(), bundleId); assertEquals(result.get(1).getSubscriptionId(), subscriptionId); assertEquals(result.get(1).getPlanName(), planName); assertEquals(result.get(1).getPhaseName(), phaseName); assertEquals(result.get(1).getUsageName(), usage.getName()); assertTrue(result.get(1).getStartDate().compareTo(firstBCDDate) == 0); assertTrue(result.get(1).getEndDate().compareTo(endDate) == 0); assertNotNull(result.get(1).getItemDetails()); usageDetail = objectMapper.readValue(result.get(1).getItemDetails(), new TypeReference<UsageConsumableInArrearAggregate>() {});
@Test(groups = "fast") public void testBuildTaxItem() throws Exception { // Overrides Assert.assertEquals(invoice1TaxItem.getInvoiceItemType(), InvoiceItemType.TAX); Assert.assertEquals(invoice1TaxItem.getStartDate(), invoice1TaxableItem.getStartDate()); Assert.assertNull(invoice1TaxItem.getEndDate()); Assert.assertEquals(invoice1TaxItem.getAmount().compareTo(BigDecimal.ONE), 0); Assert.assertEquals(invoice1TaxItem.getDescription(), "TestNG tax"); Assert.assertEquals(invoice1TaxItem.getLinkedItemId(), invoice1TaxableItem.getId()); Assert.assertNull(invoice1TaxItem.getRate()); // Copies Assert.assertEquals(invoice1TaxItem.getInvoiceId(), invoice1TaxableItem.getInvoiceId()); Assert.assertEquals(invoice1TaxItem.getAccountId(), invoice1TaxableItem.getAccountId()); Assert.assertEquals(invoice1TaxItem.getCurrency(), invoice1TaxableItem.getCurrency()); Assert.assertEquals(invoice1TaxItem.getBundleId(), invoice1TaxableItem.getBundleId()); Assert.assertEquals(invoice1TaxItem.getSubscriptionId(), invoice1TaxableItem.getSubscriptionId()); Assert.assertEquals(invoice1TaxItem.getPlanName(), invoice1TaxableItem.getPlanName()); Assert.assertEquals(invoice1TaxItem.getPhaseName(), invoice1TaxableItem.getPhaseName()); Assert.assertEquals(invoice1TaxItem.getUsageName(), invoice1TaxableItem.getUsageName()); } }
invoiceItemType, invoiceId, model.getAccountId(), model.getChildAccountId(), startDate, endDate, amount, model.getCurrency(), description, model.getSubscriptionId(), model.getBundleId(), model.getProductName(), model.getPrettyProductName(), model.getPlanName(), model.getPrettyPlanName(), model.getPhaseName(), model.getPrettyPhaseName(), model.getRate(), model.getId(), model.getUsageName(), model.getPrettyUsageName(), model.getQuantity(), model.getItemDetails(), model.getCreatedDate(), model.getUpdatedDate());
@Override public InvoiceItemModelDao apply(final InvoiceItem input) { return new InvoiceItemModelDao(internalCallContext.getCreatedDate(), input.getInvoiceItemType(), migrationInvoice.getId(), accountId, input.getBundleId(), input.getSubscriptionId(), input.getDescription(), input.getProductName(), input.getPlanName(), input.getPhaseName(), input.getUsageName(), input.getStartDate(), input.getEndDate(), input.getAmount(), input.getRate(), input.getCurrency(), input.getLinkedItemId()); } }));
if (inputItem.getAmount() == null || inputItem.getAmount().compareTo(BigDecimal.ZERO) < 0) { if (itemType == InvoiceItemType.EXTERNAL_CHARGE) { throw new InvoiceApiException(ErrorCode.EXTERNAL_CHARGE_AMOUNT_INVALID, inputItem.getAmount()); } else if (itemType == InvoiceItemType.CREDIT_ADJ) { throw new InvoiceApiException(ErrorCode.CREDIT_AMOUNT_INVALID, inputItem.getAmount()); if (inputItem.getCurrency() != null && !inputItem.getCurrency().equals(accountCurrency)) { throw new InvoiceApiException(ErrorCode.CURRENCY_INVALID, inputItem.getCurrency(), accountCurrency); final UUID invoiceIdForItem = inputItem.getInvoiceId(); final Currency currency = inputItem.getCurrency(); final InvoiceStatus status = autoCommit ? InvoiceStatus.COMMITTED : InvoiceStatus.DRAFT; curInvoiceForItem.getId(), accountId, inputItem.getBundleId(), inputItem.getSubscriptionId(), inputItem.getProductName(), inputItem.getPlanName(), inputItem.getPhaseName(), inputItem.getPrettyProductName(), inputItem.getPrettyPlanName(), inputItem.getPrettyPhaseName(), inputItem.getDescription(), MoreObjects.firstNonNull(inputItem.getStartDate(), effectiveDate), inputItem.getEndDate(), inputItem.getAmount(), inputItem.getRate(),
public Item(final InvoiceItem item, final LocalDate startDate, final LocalDate endDate, final UUID targetInvoiceId, final ItemAction action) { this.id = item.getId(); this.accountId = item.getAccountId(); this.bundleId = item.getBundleId(); this.subscriptionId = item.getSubscriptionId(); this.targetInvoiceId = targetInvoiceId; this.invoiceId = item.getInvoiceId(); this.productName = item.getProductName(); this.planName = item.getPlanName(); this.phaseName = item.getPhaseName(); this.startDate = startDate; this.endDate = endDate; this.amount = item.getAmount().abs(); this.rate = item.getRate(); this.currency = item.getCurrency(); this.linkedId = item.getLinkedItemId(); this.createdDate = item.getCreatedDate(); this.action = action; this.currentRepairedAmount = BigDecimal.ZERO; this.adjustedAmount = BigDecimal.ZERO; }
public CreditJson(final Invoice invoice, final InvoiceItem credit, final List<AuditLog> auditLogs) { super(toAuditLogJson(auditLogs)); this.creditId = credit.getId(); this.accountId = credit.getAccountId(); this.creditAmount = credit.getAmount(); this.currency = credit.getCurrency(); this.invoiceId = credit.getInvoiceId(); this.invoiceNumber = invoice.getInvoiceNumber().toString(); this.effectiveDate = credit.getStartDate(); this.description = credit.getDescription(); this.itemDetails = credit.getItemDetails(); }
public static InvoiceItem buildInvoiceItem(final Invoice invoice, final InvoiceItemType invoiceItemType, final BigDecimal amount, @Nullable final UUID linkedItemID) { final InvoiceItem invoiceItem = Mockito.mock(InvoiceItem.class); Mockito.when(invoiceItem.getId()).thenReturn(UUID.randomUUID()); Mockito.when(invoiceItem.getInvoiceItemType()).thenReturn(invoiceItemType); // To work-around org.mockito.exceptions.misusing.UnfinishedStubbingException final UUID accountId = invoice.getAccountId(); final UUID invoiceId = invoice.getId(); final Currency currency = invoice.getCurrency(); Mockito.when(invoiceItem.getAccountId()).thenReturn(accountId); Mockito.when(invoiceItem.getInvoiceId()).thenReturn(invoiceId); Mockito.when(invoiceItem.getLinkedItemId()).thenReturn(linkedItemID); Mockito.when(invoiceItem.getBundleId()).thenReturn(UUID.randomUUID()); Mockito.when(invoiceItem.getSubscriptionId()).thenReturn(UUID.randomUUID()); Mockito.when(invoiceItem.getPlanName()).thenReturn(UUID.randomUUID().toString()); Mockito.when(invoiceItem.getPhaseName()).thenReturn(UUID.randomUUID().toString()); Mockito.when(invoiceItem.getUsageName()).thenReturn(UUID.randomUUID().toString()); Mockito.when(invoiceItem.getAmount()).thenReturn(amount); Mockito.when(invoiceItem.getCurrency()).thenReturn(currency); return invoiceItem; }
Assert.assertEquals(invoiceItems.get(0).getInvoiceItemType(), InvoiceItemType.FIXED); Assert.assertEquals(invoiceItems.get(0).getStartDate(), new LocalDate("2012-05-01")); Assert.assertNull(invoiceItems.get(0).getEndDate()); Assert.assertEquals(invoiceItems.get(0).getAmount().compareTo(BigDecimal.ZERO), 0); Assert.assertNull(invoiceItems.get(0).getRate()); Assert.assertEquals(invoiceItems.get(1).getInvoiceItemType(), InvoiceItemType.RECURRING); Assert.assertEquals(invoiceItems.get(1).getStartDate(), new LocalDate("2012-05-31")); Assert.assertEquals(invoiceItems.get(1).getEndDate(), new LocalDate("2012-06-30")); Assert.assertEquals(invoiceItems.get(1).getAmount(), new BigDecimal("249.95")); Assert.assertEquals(invoiceItems.get(1).getRate(), new BigDecimal("249.95")); Assert.assertEquals(invoiceItems.get(2).getInvoiceItemType(), InvoiceItemType.RECURRING); Assert.assertEquals(invoiceItems.get(2).getStartDate(), new LocalDate("2012-06-30")); Assert.assertEquals(invoiceItems.get(2).getEndDate(), new LocalDate("2012-07-15")); Assert.assertEquals(invoiceItems.get(2).getAmount(), new BigDecimal("124.98")); Assert.assertEquals(invoiceItems.get(2).getRate(), new BigDecimal("249.95")); Assert.assertEquals(invoiceItems.get(3).getInvoiceItemType(), InvoiceItemType.RECURRING); Assert.assertEquals(invoiceItems.get(3).getStartDate(), new LocalDate("2012-07-25")); Assert.assertEquals(invoiceItems.get(3).getEndDate(), new LocalDate("2012-07-31")); Assert.assertEquals(invoiceItems.get(3).getAmount(), new BigDecimal("193.55")); Assert.assertEquals(invoiceItems.get(3).getRate(), new BigDecimal("1000")); Assert.assertEquals(item.getAccountId(), account.getId()); Assert.assertEquals(item.getBundleId(), subscription.getBundleId()); Assert.assertEquals(item.getCurrency(), account.getCurrency()); Assert.assertEquals(item.getInvoiceId(), invoice.getId()); Assert.assertNull(item.getLinkedItemId());
@Test(groups = "slow") public void testAdjustFullInvoiceItem() throws Exception { final InvoiceItem invoiceItem = invoiceUserApi.getInvoice(invoiceId, callContext).getInvoiceItems().get(0); // Verify we picked a non zero item Assert.assertEquals(invoiceItem.getAmount().compareTo(BigDecimal.ZERO), 1); // Verify the initial invoice balance final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance(); Assert.assertEquals(invoiceBalance.compareTo(BigDecimal.ZERO), 1); // Verify the initial account balance final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, callContext); Assert.assertEquals(accountBalance, invoiceBalance); // Adjust the invoice for the full amount final InvoiceItem adjInvoiceItem = invoiceUserApi.insertInvoiceItemAdjustment(accountId, invoiceId, invoiceItem.getId(), clock.getUTCToday(), null, null, null, callContext); Assert.assertEquals(adjInvoiceItem.getInvoiceId(), invoiceId); Assert.assertEquals(adjInvoiceItem.getInvoiceItemType(), InvoiceItemType.ITEM_ADJ); Assert.assertEquals(adjInvoiceItem.getAccountId(), accountId); Assert.assertEquals(adjInvoiceItem.getAmount(), invoiceItem.getAmount().negate()); Assert.assertEquals(adjInvoiceItem.getCurrency(), accountCurrency); Assert.assertEquals(adjInvoiceItem.getLinkedItemId(), invoiceItem.getId()); // Verify the adjusted invoice balance final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance(); verifyAdjustedInvoiceBalance(invoiceBalance, invoiceItem.getAmount(), invoiceItem.getCurrency(), adjustedInvoiceBalance); // Verify the adjusted account balance final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, callContext); Assert.assertEquals(adjustedAccountBalance, adjustedInvoiceBalance); // Verify idempotency Assert.assertNull(invoiceUserApi.insertInvoiceItemAdjustment(accountId, invoiceId, invoiceItem.getId(), clock.getUTCToday(), null, null, null, callContext)); }
final Currency currencyForAdjustment = MoreObjects.firstNonNull(currency, invoiceItemToBeAdjusted.getCurrency()); if (invoiceItemToBeAdjusted.getCurrency() != currencyForAdjustment) { throw new InvoiceApiException(ErrorCode.CURRENCY_INVALID, currency, invoiceItemToBeAdjusted.getCurrency()); invoiceItemToBeAdjusted.getInvoiceId(), invoiceItemToBeAdjusted.getAccountId(), null, null, description, invoiceItemToBeAdjusted.getProductName(), invoiceItemToBeAdjusted.getPlanName(), invoiceItemToBeAdjusted.getPhaseName(), invoiceItemToBeAdjusted.getUsageName(), effectiveDate, effectiveDate, null, currencyForAdjustment, invoiceItemToBeAdjusted.getId(), null, itemDetails,
private void verifyExternalChargeOnNewInvoice(final BigDecimal initialAccountBalance, @Nullable final UUID bundleId, final BigDecimal externalChargeAmount, final InvoiceItem externalChargeInvoiceItem) throws InvoiceApiException { Assert.assertNotNull(externalChargeInvoiceItem.getInvoiceId()); Assert.assertNotEquals(externalChargeInvoiceItem.getInvoiceId(), invoiceId); Assert.assertEquals(externalChargeInvoiceItem.getBundleId(), bundleId); Assert.assertEquals(externalChargeInvoiceItem.getInvoiceItemType(), InvoiceItemType.EXTERNAL_CHARGE); Assert.assertEquals(externalChargeInvoiceItem.getAccountId(), accountId); Assert.assertEquals(externalChargeInvoiceItem.getAmount().compareTo(externalChargeAmount), 0); Assert.assertEquals(externalChargeInvoiceItem.getCurrency(), accountCurrency); Assert.assertNull(externalChargeInvoiceItem.getLinkedItemId()); // Verify the adjusted invoice balance final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(externalChargeInvoiceItem.getInvoiceId(), callContext).getBalance(); Assert.assertEquals(adjustedInvoiceBalance.compareTo(externalChargeAmount), 0); // Verify the adjusted account balance final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, callContext); Assert.assertEquals(adjustedAccountBalance, initialAccountBalance.add(externalChargeAmount)); }
invoice = invoices.get(0); assertEquals(invoice.getInvoiceItems().size(), 1); assertEquals(invoice.getInvoiceItems().get(0).getSubscriptionId(), subscriptionId1); assertEquals(invoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.FIXED); assertEquals(invoice.getInvoiceItems().get(0).getStartDate(), new LocalDate(2011, 1, 5)); assertNull(invoice.getInvoiceItems().get(0).getEndDate()); assertEquals(invoice.getInvoiceItems().get(0).getAmount().compareTo(EIGHT), 0); invoice = invoices.get(1); assertEquals(invoice.getInvoiceItems().size(), 1); assertEquals(invoice.getInvoiceItems().get(0).getSubscriptionId(), subscriptionId1); assertEquals(invoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.FIXED); assertEquals(invoice.getInvoiceItems().get(0).getStartDate(), new LocalDate(2011, 1, 5)); assertNull(invoice.getInvoiceItems().get(0).getEndDate()); assertEquals(invoice.getInvoiceItems().get(0).getAmount().compareTo(TWENTY), 0); invoice = invoices.get(2); assertEquals(invoice.getInvoiceItems().size(), 1); assertEquals(invoice.getInvoiceItems().get(0).getSubscriptionId(), subscriptionId1); assertEquals(invoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.RECURRING); assertEquals(invoice.getInvoiceItems().get(0).getStartDate(), new LocalDate(2011, 4, 5)); assertEquals(invoice.getInvoiceItems().get(0).getEndDate(), new LocalDate(2011, 5, 5)); assertEquals(invoice.getInvoiceItems().get(0).getAmount().compareTo(TWELVE), 0); assertEquals(invoices.get(2), invoice); invoice = invoices.get(3); assertEquals(invoice.getInvoiceItems().get(0).getSubscriptionId(), subscriptionId1); assertEquals(invoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.RECURRING); assertEquals(invoice.getInvoiceItems().get(0).getStartDate(), new LocalDate(2011, 4, 5));
@Test(groups = "slow", expectedExceptions = InvoiceApiException.class, expectedExceptionsMessageRegExp = ".*it is already in COMMITTED status") public void testAdjustCommittedInvoice() throws Exception { // Verify the initial invoice balance final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance(); Assert.assertEquals(invoiceBalance.compareTo(BigDecimal.ZERO), 1); // Verify the initial account balance final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, callContext); Assert.assertEquals(accountBalance, invoiceBalance); // Adjust the invoice for the full amount final InvoiceItem creditInvoiceItem = invoiceUserApi.insertCreditForInvoice(accountId, invoiceId, invoiceBalance, clock.getUTCToday(), accountCurrency, "some description", null, null, callContext); Assert.assertEquals(creditInvoiceItem.getInvoiceId(), invoiceId); Assert.assertEquals(creditInvoiceItem.getInvoiceItemType(), InvoiceItemType.CREDIT_ADJ); Assert.assertEquals(creditInvoiceItem.getAccountId(), accountId); Assert.assertEquals(creditInvoiceItem.getAmount().compareTo(invoiceBalance.negate()), 0); Assert.assertEquals(creditInvoiceItem.getCurrency(), accountCurrency); Assert.assertEquals(creditInvoiceItem.getDescription(), "some description"); Assert.assertNull(creditInvoiceItem.getLinkedItemId()); // Verify the adjusted invoice balance final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance(); Assert.assertEquals(adjustedInvoiceBalance.compareTo(BigDecimal.ZERO), 0); // Verify the adjusted account balance final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, callContext); Assert.assertEquals(adjustedAccountBalance, adjustedInvoiceBalance); }
final InvoiceItem fixedItem1 = new FixedPriceInvoiceItem(invoice1.getId(), invoice1.getAccountId(), null, null, null, UUID.randomUUID().toString(), UUID.randomUUID().toString(), clock.getUTCToday(), BigDecimal.TEN, Currency.USD); final RepairAdjInvoiceItem repairAdjInvoiceItem = new RepairAdjInvoiceItem(fixedItem1.getInvoiceId(), fixedItem1.getAccountId(), fixedItem1.getStartDate(), fixedItem1.getEndDate(), fixedItem1.getAmount().negate(), fixedItem1.getCurrency(), fixedItem1.getId()); final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem1 = new CreditBalanceAdjInvoiceItem(fixedItem1.getInvoiceId(), fixedItem1.getAccountId(), fixedItem1.getStartDate(), fixedItem1.getAmount(), fixedItem1.getCurrency()); invoiceUtil.createInvoice(invoice1, context); invoiceUtil.createInvoiceItem(fixedItem1, context);
@Test(groups = "fast") public void testWithSingleMonthlyEvent() throws InvoiceApiException, CatalogApiException { final BillingEventSet events = new MockBillingEventSet(); final SubscriptionBase sub = createSubscription(); final LocalDate startDate = invoiceUtil.buildDate(2011, 9, 1); final Plan plan = new MockPlan(); final BigDecimal rate1 = TEN; final PlanPhase phase = createMockMonthlyPlanPhase(rate1); final BillingEvent event = createBillingEvent(sub.getId(), sub.getBundleId(), startDate, plan, phase, 1); events.add(event); final LocalDate targetDate = invoiceUtil.buildDate(2011, 10, 3); final InvoiceWithMetadata invoiceWithMetadata = generator.generateInvoice(account, events, null, null, targetDate, Currency.USD, internalCallContext); final Invoice invoice = invoiceWithMetadata.getInvoice(); assertNotNull(invoice); assertEquals(invoice.getNumberOfItems(), 2); assertEquals(invoice.getBalance(), KillBillMoney.of(TWENTY, invoice.getCurrency())); assertEquals(invoice.getInvoiceItems().get(0).getSubscriptionId(), sub.getId()); assertEquals(invoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.RECURRING); assertEquals(invoice.getInvoiceItems().get(0).getStartDate(), new LocalDate(2011, 9, 1)); assertEquals(invoice.getInvoiceItems().get(0).getEndDate(), new LocalDate(2011, 10, 1)); assertEquals(invoice.getInvoiceItems().get(1).getInvoiceItemType(), InvoiceItemType.RECURRING); assertEquals(invoice.getInvoiceItems().get(1).getStartDate(), new LocalDate(2011, 10, 1)); assertEquals(invoice.getInvoiceItems().get(1).getEndDate(), new LocalDate(2011, 11, 1)); }
private InvoiceItem createInvoiceItem(final BigDecimal amount, final String networkName, final LocalDate startDate, final LocalDate endDate, final String planName) { final InvoiceItem item = Mockito.mock(InvoiceItem.class); Mockito.when(item.getAmount()).thenReturn(amount); Mockito.when(item.getStartDate()).thenReturn(startDate); Mockito.when(item.getEndDate()).thenReturn(endDate); Mockito.when(item.getPlanName()).thenReturn(planName); Mockito.when(item.getDescription()).thenReturn(networkName); return item; } }