Add cost calculation for carbon super

master
osh 1 year ago
parent 5371c5268b
commit 8bc0fa37de

@ -248,7 +248,7 @@ public class DeviceManagementAdminServiceImpl implements DeviceManagementAdminSe
devices.setList((List<Device>) result.getData());
devices.setDeviceCount(result.getTotalDeviceCount());
devices.setMessage(result.getMessage());
// devices.setTotalCost(result.getTotalCost());
devices.setTotalCost(result.getTotalCost());
devices.setBillPeriod(startDate.toString() + " - " + endDate.toString());
return Response.status(Response.Status.OK).entity(devices).build();
}

@ -1036,25 +1036,62 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
*/
public BillingResponse calculateUsage(String tenantDomain, Timestamp startDate, Timestamp endDate, List<Device> allDevices) throws MetadataManagementDAOException, DeviceManagementException {
// All code related to cost calculation has being commented out to comply with the current requirements
BillingResponse billingResponse = new BillingResponse();
List<Device> deviceStatusNotAvailable = new ArrayList<>();
// double totalCost = 0.0;
double totalCost = 0.0;
try {
// MetadataManagementService meta = DeviceManagementDataHolder
// .getInstance().getMetadataManagementService();
// Metadata metadata = meta.retrieveMetadata(DeviceManagementConstants.META_KEY);
//
// Gson g = new Gson();
// Collection<Cost> costData = null;
//
// Type collectionType = new TypeToken<Collection<Cost>>() {
// }.getType();
// if (metadata != null) {
// costData = g.fromJson(metadata.getMetaValue(), collectionType);
// for (Cost tenantCost : costData) {
// if (tenantCost.getTenantDomain().equals(tenantDomain)) {
MetadataManagementService meta = DeviceManagementDataHolder
.getInstance().getMetadataManagementService();
Metadata metadata = meta.retrieveMetadata(DeviceManagementConstants.META_KEY);
Gson g = new Gson();
Collection<Cost> costData = null;
int tenantIdContext = CarbonContext.getThreadLocalCarbonContext().getTenantId();
Type collectionType = new TypeToken<Collection<Cost>>() {
}.getType();
if (tenantIdContext == MultitenantConstants.SUPER_TENANT_ID && metadata != null) {
costData = g.fromJson(metadata.getMetaValue(), collectionType);
for (Cost tenantCost : costData) {
if (tenantCost.getTenantDomain().equals(tenantDomain)) {
totalCost = generateCost(allDevices, startDate, endDate, tenantCost, deviceStatusNotAvailable, totalCost);
}
}
} else {
totalCost = generateCost(allDevices, startDate, endDate, null, deviceStatusNotAvailable, totalCost);
}
} catch (DeviceManagementException e) {
String msg = "Error occurred calculating cost of devices";
log.error(msg, e);
throw new DeviceManagementException(msg, e);
} catch (MetadataManagementException e) {
String msg = "Error when retrieving metadata of billing feature";
log.error(msg, e);
throw new DeviceManagementException(msg, e);
}
if (!deviceStatusNotAvailable.isEmpty()) {
allDevices.removeAll(deviceStatusNotAvailable);
}
Calendar calStart = Calendar.getInstance();
Calendar calEnd = Calendar.getInstance();
calStart.setTimeInMillis(startDate.getTime());
calEnd.setTimeInMillis(endDate.getTime());
billingResponse.setDevice(allDevices);
billingResponse.setYear(String.valueOf(calStart.get(Calendar.YEAR)));
billingResponse.setStartDate(startDate.toString());
billingResponse.setEndDate(endDate.toString());
billingResponse.setBillPeriod(calStart.get(Calendar.YEAR) + " - " + calEnd.get(Calendar.YEAR));
billingResponse.setTotalCostPerYear(Math.round(totalCost * 100.0) / 100.0);
billingResponse.setDeviceCount(allDevices.size());
return billingResponse;
}
public double generateCost(List<Device> allDevices, Timestamp startDate, Timestamp endDate, Cost tenantCost, List<Device> deviceStatusNotAvailable, double totalCost) throws DeviceManagementException {
for (Device device : allDevices) {
long dateDiff = 0;
device.setDeviceStatusInfo(getDeviceStatusHistory(device, null, endDate, true));
@ -1089,49 +1126,24 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
}
long dateInDays = (long) dateDiffInDays;
// double cost = (tenantCost.getCost() / 365) * dateInDays;
// totalCost += cost;
// device.setCost(Math.round(cost * 100.0) / 100.0);
double cost = 0;
if (tenantCost != null) {
cost = (tenantCost.getCost() / 365) * dateInDays;
}
totalCost += cost;
device.setCost(Math.round(cost * 100.0) / 100.0);
long totalDays = dateInDays + device.getDaysUsed();
device.setDaysUsed((int) totalDays);
if (deviceStatus.isEmpty()) {
deviceStatusNotAvailable.add(device);
}
}
// }
// }
// }
} catch (DeviceManagementException e) {
String msg = "Error occurred calculating cost of devices";
log.error(msg, e);
throw new DeviceManagementException(msg, e);
}
if (!deviceStatusNotAvailable.isEmpty()) {
allDevices.removeAll(deviceStatusNotAvailable);
}
Calendar calStart = Calendar.getInstance();
Calendar calEnd = Calendar.getInstance();
calStart.setTimeInMillis(startDate.getTime());
calEnd.setTimeInMillis(endDate.getTime());
billingResponse.setDevice(allDevices);
billingResponse.setYear(String.valueOf(calStart.get(Calendar.YEAR)));
billingResponse.setStartDate(startDate.toString());
billingResponse.setEndDate(endDate.toString());
billingResponse.setBillPeriod(calStart.get(Calendar.YEAR) + " - " + calEnd.get(Calendar.YEAR));
// billingResponse.setTotalCostPerYear(Math.round(totalCost * 100.0) / 100.0);
billingResponse.setDeviceCount(allDevices.size());
return billingResponse;
return totalCost;
}
@Override
public PaginationResult createBillingFile(int tenantId, String tenantDomain, Timestamp startDate, Timestamp endDate) throws DeviceManagementException {
// All code related to cost calculation has being commented out to comply with the current requirements
PaginationResult paginationResult = new PaginationResult();
List<Device> allDevices = new ArrayList<>();
List<BillingResponse> billingResponseList = new ArrayList<>();
@ -1193,7 +1205,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
BillingResponse billingResponse = calculateUsage(tenantDomain, newStartDate, newEndDate, allDevicesPerYear);
billingResponseList.add(billingResponse);
allDevices.addAll(billingResponse.getDevice());
// totalCost = totalCost + billingResponse.getTotalCostPerYear();
totalCost = totalCost + billingResponse.getTotalCostPerYear();
deviceCount = deviceCount + billingResponse.getDeviceCount();
LocalDateTime nextStartDate = oneYearAfterStart.plusDays(1).with(LocalTime.of(00, 00, 00));
startDate = Timestamp.valueOf(nextStartDate);
@ -1217,7 +1229,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
BillingResponse billingResponse = calculateUsage(tenantDomain, startDate, endDate, allDevicesPerRemainingDays);
billingResponseList.add(billingResponse);
allDevices.addAll(billingResponse.getDevice());
// totalCost = totalCost + billingResponse.getTotalCostPerYear();
totalCost = totalCost + billingResponse.getTotalCostPerYear();
deviceCount = deviceCount + billingResponse.getDeviceCount();
}
@ -1229,7 +1241,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
BillingResponse billingResponse = new BillingResponse("all", Math.round(totalCost * 100.0) / 100.0, allDevices, calStart.get(Calendar.YEAR) + " - " + calEnd.get(Calendar.YEAR), initialStartDate.toString(), endDate.toString(), allDevices.size());
billingResponseList.add(billingResponse);
paginationResult.setData(billingResponseList);
// paginationResult.setTotalCost(Math.round(totalCost * 100.0) / 100.0);
paginationResult.setTotalCost(Math.round(totalCost * 100.0) / 100.0);
paginationResult.setTotalDeviceCount(deviceCount);
BillingCacheManagerImpl.getInstance().addBillingToCache(paginationResult, tenantDomain, initialStartDate, endDate);
return paginationResult;

Loading…
Cancel
Save