billing azure
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/BillingSchedulerAzure.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/BillingSchedulerAzure.java
deleted file mode 100644
index f81fe2e..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/BillingSchedulerAzure.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure;
-
-import com.epam.dlab.MongoKeyWords;
-import com.epam.dlab.billing.azure.config.AzureAuthFile;
-import com.epam.dlab.billing.azure.config.BillingConfigurationAzure;
-import com.epam.dlab.billing.azure.model.AzureDailyResourceInvoice;
-import com.epam.dlab.billing.azure.model.BillingPeriod;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.util.mongo.modules.IsoDateModule;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.mongodb.BasicDBObject;
-import com.mongodb.client.model.Filters;
-import com.mongodb.client.model.UpdateOptions;
-import com.mongodb.client.result.UpdateResult;
-import lombok.extern.slf4j.Slf4j;
-import org.bson.Document;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-@Slf4j
-@Component
-public class BillingSchedulerAzure {
-	private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
-	private BillingConfigurationAzure billingConfigurationAzure;
-	private MongoDbBillingClient mongoDbBillingClient;
-
-	@Autowired
-	public BillingSchedulerAzure(BillingConfigurationAzure configuration) throws IOException {
-		billingConfigurationAzure = configuration;
-		Path path = Paths.get(billingConfigurationAzure.getAuthenticationFile());
-
-		if (path.toFile().exists()) {
-			log.info("Read and override configs using auth file");
-			try {
-				AzureAuthFile azureAuthFile = new ObjectMapper().readValue(path.toFile(), AzureAuthFile.class);
-				this.billingConfigurationAzure.setClientId(azureAuthFile.getClientId());
-				this.billingConfigurationAzure.setClientSecret(azureAuthFile.getClientSecret());
-				this.billingConfigurationAzure.setTenantId(azureAuthFile.getTenantId());
-				this.billingConfigurationAzure.setSubscriptionId(azureAuthFile.getSubscriptionId());
-			} catch (IOException e) {
-				log.error("Cannot read configuration file", e);
-				throw e;
-			}
-			log.info("Configs from auth file are used");
-		} else {
-			log.info("Configs from yml file are used");
-		}
-
-		this.mongoDbBillingClient = new MongoDbBillingClient
-				(billingConfigurationAzure.getAggregationOutputMongoDataSource().getHost(),
-						billingConfigurationAzure.getAggregationOutputMongoDataSource().getPort(),
-						billingConfigurationAzure.getAggregationOutputMongoDataSource().getDatabase(),
-						billingConfigurationAzure.getAggregationOutputMongoDataSource().getUsername(),
-						billingConfigurationAzure.getAggregationOutputMongoDataSource().getPassword());
-	}
-
-	@PostConstruct
-	public void start() {
-		if (billingConfigurationAzure.isBillingEnabled()) {
-			executorService.scheduleWithFixedDelay(new CalculateBilling(billingConfigurationAzure,
-							mongoDbBillingClient), billingConfigurationAzure.getInitialDelay(),
-					billingConfigurationAzure.getPeriod(), TimeUnit.MINUTES);
-		} else {
-			log.info("======Billing is disabled======");
-		}
-	}
-
-	public void stop() {
-		try {
-			log.info("Stopping Azure billing scheduler");
-			if (!executorService.awaitTermination(30, TimeUnit.SECONDS)) {
-				log.error("Force shut down");
-				executorService.shutdownNow();
-			}
-			mongoDbBillingClient.getClient().close();
-		} catch (InterruptedException e) {
-			executorService.shutdownNow();
-			mongoDbBillingClient.getClient().close();
-			Thread.currentThread().interrupt();
-		}
-	}
-
-
-	@Slf4j
-	private static class CalculateBilling implements Runnable {
-		private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern
-				("yyyy-MM-dd'T'HH:mm:ss.SSS'Z");
-		private static final String SCHEDULER_ID = "azureBillingScheduler";
-		private BillingConfigurationAzure billingConfigurationAzure;
-		private MongoDbBillingClient client;
-		private ObjectMapper objectMapper = new ObjectMapper().registerModule(new IsoDateModule());
-
-
-		public CalculateBilling(BillingConfigurationAzure billingConfigurationAzure, MongoDbBillingClient client) {
-			this.billingConfigurationAzure = billingConfigurationAzure;
-			this.client = client;
-		}
-
-		@Override
-		public void run() {
-			try {
-				BillingPeriod billingPeriod = getBillingPeriod();
-				DateTime currentTime = new DateTime().withZone(DateTimeZone.UTC);
-				if (billingPeriod == null) {
-					saveBillingPeriod(initialSchedulerInfo(currentTime));
-				} else {
-					log.info("Billing period from db is {}", billingPeriod);
-
-					if (shouldTriggerJobByTime(currentTime, billingPeriod)) {
-						boolean hasNew = run(billingPeriod);
-						updateBillingPeriod(billingPeriod, currentTime, hasNew);
-					}
-				}
-			} catch (RuntimeException e) {
-				log.error("Cannot update billing information", e);
-			}
-		}
-
-		private BillingPeriod initialSchedulerInfo(DateTime currentTime) {
-
-			BillingPeriod initialBillingPeriod = new BillingPeriod();
-			initialBillingPeriod.setFrom(currentTime.minusDays(2).toDateMidnight().toDate());
-			initialBillingPeriod.setTo(currentTime.toDateMidnight().toDate());
-
-			log.info("Initial scheduler info {}", initialBillingPeriod);
-
-			return initialBillingPeriod;
-
-		}
-
-		private boolean shouldTriggerJobByTime(DateTime currentTime, BillingPeriod billingPeriod) {
-
-			DateTime dateTimeToFromBillingPeriod = new DateTime(billingPeriod.getTo()).withZone(DateTimeZone.UTC);
-
-			log.info("Comparing current time[{}, {}] and from scheduler info [{}, {}]", currentTime,
-					currentTime.toDateMidnight(),
-					dateTimeToFromBillingPeriod, dateTimeToFromBillingPeriod.toDateMidnight());
-
-			if (currentTime.toDateMidnight().isAfter(dateTimeToFromBillingPeriod.toDateMidnight())
-					|| currentTime.toDateMidnight().isEqual(dateTimeToFromBillingPeriod.toDateMidnight())) {
-				log.info("Should trigger the job by time");
-				return true;
-			}
-
-			log.info("Should not trigger the job by time");
-			return false;
-		}
-
-		private boolean run(BillingPeriod billingPeriod) {
-			AzureInvoiceCalculationService azureInvoiceCalculationService
-					= new AzureInvoiceCalculationService(billingConfigurationAzure);
-
-			List<AzureDailyResourceInvoice> dailyInvoices = azureInvoiceCalculationService.generateInvoiceData(
-					DATE_TIME_FORMATTER.print(new DateTime(billingPeriod.getFrom()).withZone(DateTimeZone.UTC)),
-					DATE_TIME_FORMATTER.print(new DateTime(billingPeriod.getTo()).withZone(DateTimeZone.UTC)));
-
-			if (!dailyInvoices.isEmpty()) {
-				client.getDatabase().getCollection(MongoKeyWords.BILLING_DETAILS)
-						.insertMany(dailyInvoices.stream().map(AzureDailyResourceInvoice::to)
-								.collect(Collectors.toList()));
-				return true;
-			} else {
-				log.warn("Daily invoices is empty for period {}", billingPeriod);
-				return false;
-			}
-		}
-
-		private void updateBillingPeriod(BillingPeriod billingPeriod, DateTime currentTime, boolean updates) {
-
-			try {
-				client.getDatabase().getCollection(MongoKeyWords.AZURE_BILLING_SCHEDULER_HISTORY).insertOne(
-						Document.parse(objectMapper.writeValueAsString(billingPeriod)).append("updates", updates));
-				log.debug("History of billing periods is updated with {}",
-						objectMapper.writeValueAsString(billingPeriod));
-			} catch (JsonProcessingException e) {
-				log.error("Cannot update history of billing periods", e);
-
-			}
-
-			billingPeriod.setFrom(billingPeriod.getTo());
-
-			if (new DateTime(billingPeriod.getFrom()).withZone(DateTimeZone.UTC).toDateMidnight()
-					.isEqual(currentTime.toDateMidnight())) {
-
-				log.info("Setting billing to one day later");
-				billingPeriod.setTo(currentTime.plusDays(1).toDateMidnight().toDate());
-
-			} else {
-				billingPeriod.setTo(currentTime.toDateMidnight().toDate());
-			}
-
-			saveBillingPeriod(billingPeriod);
-		}
-
-		private boolean saveBillingPeriod(BillingPeriod billingPeriod) {
-			log.debug("Saving billing period {}", billingPeriod);
-
-			try {
-				UpdateResult updateResult = client.getDatabase().getCollection(MongoKeyWords.AZURE_BILLING_SCHEDULER)
-						.updateMany(Filters.eq(MongoKeyWords.MONGO_ID, SCHEDULER_ID),
-								new BasicDBObject("$set",
-										Document.parse(objectMapper.writeValueAsString(billingPeriod))
-												.append(MongoKeyWords.MONGO_ID, SCHEDULER_ID))
-								, new UpdateOptions().upsert(true)
-						);
-
-				log.debug("Billing period save operation result is {}", updateResult);
-				return true;
-			} catch (JsonProcessingException e) {
-				log.error("Cannot save billing period", e);
-			}
-
-			return false;
-		}
-
-		private BillingPeriod getBillingPeriod() {
-			log.debug("Get billing period");
-
-			try {
-				Document document = client.getDatabase().getCollection(MongoKeyWords.AZURE_BILLING_SCHEDULER)
-						.find(Filters.eq(MongoKeyWords.MONGO_ID, SCHEDULER_ID)).first();
-
-				log.debug("Retrieved billing period document {}", document);
-				if (document != null) {
-					return objectMapper.readValue(document.toJson(), BillingPeriod.class);
-				}
-
-				return null;
-
-			} catch (IOException e) {
-				log.error("Cannot save billing period", e);
-				throw new DlabException("Cannot parse string", e);
-			}
-		}
-	}
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/CalculateBillingService.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/CalculateBillingService.java
new file mode 100644
index 0000000..d432337
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/CalculateBillingService.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.dlab.billing.azure;
+
+import com.epam.dlab.dto.billing.BillingData;
+
+import java.util.List;
+
+public interface CalculateBillingService {
+    List<BillingData> getBillingData();
+}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/CalculateBillingServiceImpl.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/CalculateBillingServiceImpl.java
new file mode 100644
index 0000000..6b96d87
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/CalculateBillingServiceImpl.java
@@ -0,0 +1,246 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.dlab.billing.azure;
+
+import com.epam.dlab.MongoKeyWords;
+import com.epam.dlab.billing.azure.config.AzureAuthFile;
+import com.epam.dlab.billing.azure.config.BillingConfigurationAzure;
+import com.epam.dlab.billing.azure.model.AzureDailyResourceInvoice;
+import com.epam.dlab.billing.azure.model.BillingPeriod;
+import com.epam.dlab.dto.billing.BillingData;
+import com.epam.dlab.exceptions.DlabException;
+import com.epam.dlab.util.mongo.modules.IsoDateModule;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.mongodb.BasicDBObject;
+import com.mongodb.client.model.Filters;
+import com.mongodb.client.model.UpdateOptions;
+import com.mongodb.client.result.UpdateResult;
+import lombok.extern.slf4j.Slf4j;
+import org.bson.Document;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.time.LocalDate;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class CalculateBillingServiceImpl implements CalculateBillingService {
+    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z");
+    private static final String SCHEDULER_ID = "azureBillingScheduler";
+    private final BillingConfigurationAzure billingConfigurationAzure;
+    private final MongoDbBillingClient mongoDbBillingClient;
+    private ObjectMapper objectMapper;
+
+    @Autowired
+    public CalculateBillingServiceImpl(BillingConfigurationAzure configuration) throws IOException {
+        billingConfigurationAzure = configuration;
+        objectMapper = new ObjectMapper().registerModule(new IsoDateModule());
+        Path path = Paths.get(billingConfigurationAzure.getAuthenticationFile());
+
+        if (path.toFile().exists()) {
+            log.info("Read and override configs using auth file");
+            try {
+                AzureAuthFile azureAuthFile = new ObjectMapper().readValue(path.toFile(), AzureAuthFile.class);
+                this.billingConfigurationAzure.setClientId(azureAuthFile.getClientId());
+                this.billingConfigurationAzure.setClientSecret(azureAuthFile.getClientSecret());
+                this.billingConfigurationAzure.setTenantId(azureAuthFile.getTenantId());
+                this.billingConfigurationAzure.setSubscriptionId(azureAuthFile.getSubscriptionId());
+            } catch (IOException e) {
+                log.error("Cannot read configuration file", e);
+                throw e;
+            }
+            log.info("Configs from auth file are used");
+        } else {
+            log.info("Configs from yml file are used");
+        }
+
+        this.mongoDbBillingClient = new MongoDbBillingClient
+                (billingConfigurationAzure.getAggregationOutputMongoDataSource().getHost(),
+                        billingConfigurationAzure.getAggregationOutputMongoDataSource().getPort(),
+                        billingConfigurationAzure.getAggregationOutputMongoDataSource().getDatabase(),
+                        billingConfigurationAzure.getAggregationOutputMongoDataSource().getUsername(),
+                        billingConfigurationAzure.getAggregationOutputMongoDataSource().getPassword());
+    }
+
+    @Override
+    public List<BillingData> getBillingData() {
+        try {
+            BillingPeriod billingPeriod = getBillingPeriod();
+            DateTime currentTime = new DateTime().withZone(DateTimeZone.UTC);
+            if (billingPeriod == null) {
+                saveBillingPeriod(initialSchedulerInfo(currentTime));
+            } else {
+                log.info("Billing period from db is {}", billingPeriod);
+
+                if (shouldTriggerJobByTime(currentTime, billingPeriod)) {
+                    List<BillingData> billingData = getBillingData(billingPeriod);
+                    boolean hasNew = !billingData.isEmpty();
+                    updateBillingPeriod(billingPeriod, currentTime, hasNew);
+                    return billingData;
+                }
+            }
+        } catch (RuntimeException e) {
+            log.error("Cannot update billing information", e);
+        }
+        return Collections.emptyList();
+    }
+
+    private BillingPeriod initialSchedulerInfo(DateTime currentTime) {
+
+        BillingPeriod initialBillingPeriod = new BillingPeriod();
+        initialBillingPeriod.setFrom(currentTime.minusDays(2).toDateMidnight().toDate());
+        initialBillingPeriod.setTo(currentTime.toDateMidnight().toDate());
+
+        log.info("Initial scheduler info {}", initialBillingPeriod);
+
+        return initialBillingPeriod;
+
+    }
+
+    private boolean shouldTriggerJobByTime(DateTime currentTime, BillingPeriod billingPeriod) {
+
+        DateTime dateTimeToFromBillingPeriod = new DateTime(billingPeriod.getTo()).withZone(DateTimeZone.UTC);
+
+        log.info("Comparing current time[{}, {}] and from scheduler info [{}, {}]", currentTime,
+                currentTime.toDateMidnight(),
+                dateTimeToFromBillingPeriod, dateTimeToFromBillingPeriod.toDateMidnight());
+
+        if (currentTime.toDateMidnight().isAfter(dateTimeToFromBillingPeriod.toDateMidnight())
+                || currentTime.toDateMidnight().isEqual(dateTimeToFromBillingPeriod.toDateMidnight())) {
+            log.info("Should trigger the job by time");
+            return true;
+        }
+
+        log.info("Should not trigger the job by time");
+        return false;
+    }
+
+    private List<BillingData> getBillingData(BillingPeriod billingPeriod) {
+        AzureInvoiceCalculationService azureInvoiceCalculationService
+                = new AzureInvoiceCalculationService(billingConfigurationAzure);
+
+        List<AzureDailyResourceInvoice> dailyInvoices = azureInvoiceCalculationService.generateInvoiceData(
+                DATE_TIME_FORMATTER.print(new DateTime(billingPeriod.getFrom()).withZone(DateTimeZone.UTC)),
+                DATE_TIME_FORMATTER.print(new DateTime(billingPeriod.getTo()).withZone(DateTimeZone.UTC)));
+
+        if (!dailyInvoices.isEmpty()) {
+            return dailyInvoices
+                    .stream()
+                    .map(this::toBillingData)
+                    .collect(Collectors.toList());
+        } else {
+            log.warn("Daily invoices is empty for period {}", billingPeriod);
+            return Collections.emptyList();
+        }
+    }
+
+    private void updateBillingPeriod(BillingPeriod billingPeriod, DateTime currentTime, boolean updates) {
+
+        try {
+            mongoDbBillingClient.getDatabase().getCollection(MongoKeyWords.AZURE_BILLING_SCHEDULER_HISTORY).insertOne(
+                    Document.parse(objectMapper.writeValueAsString(billingPeriod)).append("updates", updates));
+            log.debug("History of billing periods is updated with {}",
+                    objectMapper.writeValueAsString(billingPeriod));
+        } catch (JsonProcessingException e) {
+            log.error("Cannot update history of billing periods", e);
+
+        }
+
+        billingPeriod.setFrom(billingPeriod.getTo());
+
+        if (new DateTime(billingPeriod.getFrom()).withZone(DateTimeZone.UTC).toDateMidnight()
+                .isEqual(currentTime.toDateMidnight())) {
+
+            log.info("Setting billing to one day later");
+            billingPeriod.setTo(currentTime.plusDays(1).toDateMidnight().toDate());
+
+        } else {
+            billingPeriod.setTo(currentTime.toDateMidnight().toDate());
+        }
+
+        saveBillingPeriod(billingPeriod);
+    }
+
+    private boolean saveBillingPeriod(BillingPeriod billingPeriod) {
+        log.debug("Saving billing period {}", billingPeriod);
+
+        try {
+            UpdateResult updateResult = mongoDbBillingClient.getDatabase().getCollection(MongoKeyWords.AZURE_BILLING_SCHEDULER)
+                    .updateMany(Filters.eq(MongoKeyWords.MONGO_ID, SCHEDULER_ID),
+                            new BasicDBObject("$set",
+                                    Document.parse(objectMapper.writeValueAsString(billingPeriod))
+                                            .append(MongoKeyWords.MONGO_ID, SCHEDULER_ID))
+                            , new UpdateOptions().upsert(true)
+                    );
+
+            log.debug("Billing period save operation result is {}", updateResult);
+            return true;
+        } catch (JsonProcessingException e) {
+            log.error("Cannot save billing period", e);
+        }
+
+        return false;
+    }
+
+    private BillingPeriod getBillingPeriod() {
+        log.debug("Get billing period");
+
+        try {
+            Document document = mongoDbBillingClient.getDatabase().getCollection(MongoKeyWords.AZURE_BILLING_SCHEDULER)
+                    .find(Filters.eq(MongoKeyWords.MONGO_ID, SCHEDULER_ID)).first();
+
+            log.debug("Retrieved billing period document {}", document);
+            if (document != null) {
+                return objectMapper.readValue(document.toJson(), BillingPeriod.class);
+            }
+
+            return null;
+
+        } catch (IOException e) {
+            log.error("Cannot save billing period", e);
+            throw new DlabException("Cannot parse string", e);
+        }
+    }
+
+    private BillingData toBillingData(AzureDailyResourceInvoice billingData) {
+        return BillingData.builder()
+                .tag(billingData.getDlabId())
+                .usageDateFrom(Optional.ofNullable(billingData.getUsageStartDate()).map(LocalDate::parse).orElse(null))
+                .usageDateTo(Optional.ofNullable(billingData.getUsageEndDate()).map(LocalDate::parse).orElse(null))
+                .usageDate(billingData.getDay())
+                .product(billingData.getMeterCategory())
+                .cost(BigDecimal.valueOf(billingData.getCost()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())
+                .currency(billingData.getCurrencyCode())
+                .build();
+    }
+}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/controller/BillingController.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/controller/BillingController.java
index eb728c9..9018791 100644
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/controller/BillingController.java
+++ b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/controller/BillingController.java
@@ -19,12 +19,11 @@
 
 package com.epam.dlab.billing.azure.controller;
 
-import com.epam.dlab.billing.azure.dao.BillingDAO;
+import com.epam.dlab.billing.azure.CalculateBillingService;
 import com.epam.dlab.dto.billing.BillingData;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
@@ -32,22 +31,14 @@
 @RestController
 public class BillingController {
 
-    private final BillingDAO billingDAO;
+    private final CalculateBillingService billingService;
 
-    public BillingController(BillingDAO billingDAO) {
-        this.billingDAO = billingDAO;
+    public BillingController(CalculateBillingService billingService) {
+        this.billingService = billingService;
     }
 
     @GetMapping
-    public ResponseEntity<List<BillingData>> getBilling(@RequestParam List<String> dlabIds) {
-        return new ResponseEntity<>(billingDAO.getBillingReport(dlabIds), HttpStatus.OK);
-    }
-
-    @GetMapping("/report")
-    public ResponseEntity<List<BillingData>> getBilling(@RequestParam("date-start") String dateStart,
-                                                        @RequestParam("date-end") String dateEnd,
-                                                        @RequestParam("dlab-id") String dlabId,
-                                                        @RequestParam("product") List<String> products) {
-        return new ResponseEntity<>(billingDAO.getBillingReport(dateStart, dateEnd, dlabId, products), HttpStatus.OK);
+    public ResponseEntity<List<BillingData>> getBilling() {
+        return new ResponseEntity<>(billingService.getBillingData(), HttpStatus.OK);
     }
 }