/** * Saves the sale tier received in the HTTP request to the database. * @param tiersRequest The HTTP with the sale tier to be stored/updated. * @return HTTP response with the just stored sale tier. */ // TODO: Check for conflicting sale tier configurations (e.g. overlapping start and end dates) // before inserting the received sale tier. @PostMapping(value = "/create", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) public ResponseEntity<List<SaleTierResponse>> createTiers( @RequestBody List<SaleTierRequest> tiersRequest) { List<SaleTierResponse> tiersResponse = tiersRequest.stream().map((request) -> { return saleTierService.saveTransactionless(fromRequestToEntity(request)); }).map((savedEntity) -> fromEntityToResponse(savedEntity)).collect(Collectors.toList()); return ResponseEntity.ok(tiersResponse); }
/** * @return HTTP response containing all sale tiers in the database ordered by the tiers' start * date. */ @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @ResponseStatus(HttpStatus.OK) @ResponseBody public ResponseEntity<List<SaleTierResponse>> getAllTiers() { List<SaleTierResponse> saleTiers = new ArrayList<>(); saleTierService.getAllSaleTiersOrderByStartDate().forEach( t -> saleTiers.add(fromEntityToResponse(t))); return ResponseEntity.ok(saleTiers); }
private BigInteger getTotalRemainingTomics() { return getTotalTomicsAmount().subtract(saleTierService.getTotalTomicsSold()); }
@Test public void createTiers_With_Right_Credential() throws Exception { when(saleTierService.getAllSaleTiersOrderByStartDate()) .thenReturn(tiers); Instant now = Instant.now(); SaleTierRequest req1 = new SaleTierRequest(1, "test1", Date.from(now), Date.from(now.plusSeconds(6000)), new BigDecimal("0.5"), new BigInteger("0"), new BigInteger("1000000000"), true, true); List<SaleTierRequest> listRequest = Arrays.asList(req1); SaleTier saleTierEntityRequest = tierController.fromRequestToEntity(req1); when(saleTierService.saveTransactionless(any())).thenReturn(saleTierEntityRequest); MvcResult result = this.mockMvc.perform(post(TIERS_CREATE_ENDPOINT) .with(httpBasic("user", "password")) .content(jsonSaleTierRequest.write(listRequest).getJson()) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) .andDo(print()) .andReturn(); SaleTierResponse resp1 = new SaleTierResponse(1, "test1", SaleTier.StatusType.ACTIVE, Date.from(now), Date.from(now.plusSeconds(6000)), new BigDecimal("0.5"), new BigInteger("0"), new BigInteger("1000000000")); List<SaleTierResponse> listResponse = Arrays.asList(resp1); assertThat(result.getResponse().getContentAsString()).isEqualTo( jsonSaleTierResponse.write(listResponse).getJson()); }
@Bean public SaleTierService saleTierService() { return new SaleTierService(); }
private void shiftDates(SaleTier tier, Date blockTime) { long dateShift; if (blockTime.getTime() < tier.getStartDate().getTime()) { dateShift = tier.getEndDate().getTime() - tier.getStartDate().getTime(); tier.setEndDate(tier.getStartDate()); } else { dateShift = tier.getEndDate().getTime() - blockTime.getTime(); tier.setEndDate(blockTime); } tier = saleTierRepository.save(tier); saleTierService.getAllSubsequentTiers(tier).forEach(t -> { t.setStartDate(new Date(t.getStartDate().getTime() - dateShift)); t.setEndDate(new Date(t.getEndDate().getTime() - dateShift)); saleTierRepository.save(t); }); }
Optional<SaleTier> oTier = saleTierService.getTierAtDate(blockTime); if (oTier.isPresent()) { handleDynamicMax(oTier.get());
LOG.debug("Distributing {} USD to tier {}. Distributing Overflow of {} USD to " + "next tier.", usd, tier.getTierNo(), overflowInUsd); return distributeToNextTier(overflowInUsd, saleTierService.getSubsequentTier(tier), blockTime) .addToAllocatedTomics(remainingTomicsOnTier); if (tier.isFull()) { if (tier.hasDynamicDuration()) shiftDates(tier, blockTime); saleTierService.getSubsequentTier(tier).ifPresent(this::handleDynamicMax);
true ); saleTierService.saveTransactionless(s1); saleTierService.saveTransactionless(s2); LOG.info("Development tiers successfully set-up."); LOG.info("Tier {}: startDate={} endDate={}", s1.getTierNo(), startDateS1, endDateS1);
@Test public void getAllTiers() throws Exception { tiers = createFiveTiers(); when(saleTierService.getAllSaleTiersOrderByStartDate()) .thenReturn(tiers); MvcResult result = this.mockMvc.perform(get(TIERS_ENDPOINT) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) .andDo(print()) .andReturn(); List<SaleTierResponse> responses = tiers.stream() .map(t -> tierController.fromEntityToResponse(t)) .collect(Collectors.toList()); assertThat(result.getResponse().getContentAsString()).isEqualTo( jsonSaleTierResponse.write(responses).getJson()); }
BigInteger overallRemainingTomics = totalTomicsAmount().subtract(saleTierService.getTotalTomicsSold()); BigInteger tomicsFromTier3 = overallRemainingTomics.divide(BigInteger.valueOf(3)); BigDecimal paymentToTier3 = monitorService.convertTomicsToUsd(tomicsFromTier3, tiers.get(3).getDiscount()); overallRemainingTomics = totalTomicsAmount().subtract(saleTierService.getTotalTomicsSold()); BigDecimal paymentToTier4 = monitorService.convertTomicsToUsd(overallRemainingTomics, tiers.get(4).getDiscount()); BigDecimal payment = paymentToTier4.add(BigDecimal.TEN); assertEquals(0, log.getEligibleForRefund().getUsdAmount().round(new MathContext(6, RoundingMode.HALF_EVEN)).compareTo(BigDecimal.TEN)); tiers.forEach(TestTier::assertTier); assertEquals(0, totalTomicsAmount().compareTo(saleTierService.getTotalTomicsSold()));
private SaleTier createAndSaveSaleTier(int tierNo, Date startDate, Date endDate, BigDecimal discount, BigInteger tomicsMax, boolean hasDynamicDuration, boolean hasDynamicMax) { SaleTier t = new SaleTier( tierNo, "test tier " + tierNo, startDate, endDate, discount, BigInteger.ZERO, tomicsMax, hasDynamicDuration, hasDynamicMax); return saleTierService.saveTransactionless(t); }
private void createAndSaveTier() { Date from = Date.from(Instant.EPOCH); Date to = new Date(); BigInteger tomics = monitorService.convertTokensToTomics(new BigDecimal(1000L)) .toBigInteger(); saleTierService.saveTransactionless( new SaleTier(4, "4", from, to, new BigDecimal("0.0"), BigInteger.ZERO, tomics, true, false)); }