Add re-enrollment device cost calculation
feature/traccar-sync
osh 3 years ago
parent 8872d1baeb
commit c135105889

@ -81,6 +81,7 @@ import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.sql.Timestamp;
import java.util.List;
/**
@ -399,9 +400,23 @@ public interface DeviceManagementService {
@ApiParam(
name = "tenantDomain",
value = "The tenant domain.",
required = false,
defaultValue = "nita")
required = false)
String tenantDomain,
@ApiParam(
name = "startDate",
value = "The start date.",
required = false)
Timestamp startDate,
@ApiParam(
name = "endDate",
value = "The end date.",
required = false)
Timestamp endDate,
@ApiParam(
name = "generateBill",
value = "The generate bill boolean.",
required = false)
boolean generateBill,
@ApiParam(
name = "offset",
value = "The starting pagination index for the complete list of qualified items.",

@ -133,6 +133,7 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.core.Response;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
@ -345,24 +346,24 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
@Override
@Path("/billing")
public Response getDevicesBilling(
@DefaultValue("nita")
@QueryParam ("tenantDomain") String tenantDomain,
@QueryParam ("startDate") Timestamp startDate,
@QueryParam ("endDate") Timestamp endDate,
@QueryParam ("generateBill") boolean generateBill,
@QueryParam("offset") int offset,
@DefaultValue("10")
@QueryParam("limit") int limit) {
try {
RequestValidationUtil.validatePaginationParameters(offset, limit);
DeviceManagementProviderService dms = DeviceMgtAPIUtils.getDeviceManagementService();
// DeviceAccessAuthorizationService deviceAccessAuthorizationService =
// DeviceMgtAPIUtils.getDeviceAccessAuthorizationService();
PaginationRequest request = new PaginationRequest(offset, limit);
PaginationResult result;
DeviceList devices = new DeviceList();
try {
result = dms.getAllDevicesBillings(request, true, tenantDomain);
result = dms.getAllDevicesBillings(request, tenantDomain, startDate, endDate, generateBill);
} catch (Exception exception) {
String msg = "------------------TEST ERROR-----------------------";
String msg = "Error occurred when trying to retrieve billing data";
log.error(msg, exception);
return Response.serverError().entity(
new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build();
@ -379,7 +380,7 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
return Response.status(Response.Status.OK).entity(devices).build();
}
catch (Exception e) {
String msg = "Error occurred while fetching all enrolled devices";
String msg = "Error occurred while retrieving billing data";
log.error(msg, e);
return Response.serverError().entity(
new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build();

@ -24,8 +24,10 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import org.wso2.carbon.device.mgt.common.app.mgt.Application;
import org.wso2.carbon.device.mgt.common.device.details.DeviceInfo;
import org.wso2.carbon.device.mgt.common.device.details.DeviceLocationHistorySnapshotWrapper;
import org.wso2.carbon.device.mgt.common.type.mgt.DeviceStatus;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@ApiModel(value = "Device", description = "This class carries all information related to a managed device.")
@ -72,6 +74,17 @@ public class Device implements Serializable {
required = false)
private List<Application> applications;
@ApiModelProperty(name = "cost", value = "Cost charged per device.", required = false)
private Double cost;
@ApiModelProperty(name = "daysUsed", value = "Number of days gone since device enrollment.",
required = false)
private int daysUsed;
@ApiModelProperty(name = "deviceStatusInfo", value = "This defines the device status details. " +
"It is mandatory to define this information.", required = false)
private List<DeviceStatus> deviceStatusInfo = new ArrayList<>();
@ApiModelProperty(
name = "historySnapshot",
value = "device history snapshots")
@ -92,6 +105,30 @@ public class Device implements Serializable {
this.properties = properties;
}
public Double getCost() {
return cost;
}
public void setCost(Double cost) {
this.cost = cost;
}
public int getDaysUsed() {
return daysUsed;
}
public void setDaysUsed(int daysUsed) {
this.daysUsed = daysUsed;
}
public List<DeviceStatus> getDeviceStatusInfo() {
return deviceStatusInfo;
}
public void setDeviceStatusInfo(List<DeviceStatus> deviceStatusInfo) {
this.deviceStatusInfo = deviceStatusInfo;
}
public int getId() {
return id;
}

@ -17,18 +17,17 @@
*/
package org.wso2.carbon.device.mgt.common;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.gson.Gson;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.wso2.carbon.device.mgt.common.app.mgt.Application;
import org.wso2.carbon.device.mgt.common.device.details.DeviceInfo;
import org.wso2.carbon.device.mgt.common.device.details.DeviceLocationHistorySnapshotWrapper;
import org.wso2.carbon.device.mgt.common.type.mgt.DeviceStatus;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@ApiModel(value = "DeviceBilling", description = "This class carries all information related to a managed device.")
@ApiModel(value = "DeviceBilling", description = "This class carries all information related to a device billing.")
public class DeviceBilling implements Serializable {
private static final long serialVersionUID = 1998101711L;
@ -40,9 +39,6 @@ public class DeviceBilling implements Serializable {
@ApiModelProperty(name = "name", value = "The device name that can be set on the device by the device user.",
required = true)
private String name;
//
// @ApiModelProperty(name = "type", value = "The OS type of the device.", required = true)
// private String type;
@ApiModelProperty(name = "description", value = "Additional information on the device.", required = false)
private String description;
@ -58,7 +54,7 @@ public class DeviceBilling implements Serializable {
required = false)
private String deviceIdentifier;
@ApiModelProperty(name = "daysSinceEnrolled", value = "Number of days gone since device enrollment date to current date.",
@ApiModelProperty(name = "daysSinceEnrolled", value = "Number of days gone since device enrollment.",
required = false)
private int daysSinceEnrolled;
@ -70,39 +66,23 @@ public class DeviceBilling implements Serializable {
"It is mandatory to define this information.", required = false)
private EnrolmentInfo enrolmentInfo;
// @ApiModelProperty(name = "features", value = "List of features.", required = false)
// private List<Feature> features;
// private List<DeviceBilling.Property> properties;
@ApiModelProperty(name = "deviceStatusInfo", value = "This defines the device status details. " +
"It is mandatory to define this information.", required = false)
private List<DeviceStatus> deviceStatusInfo = new ArrayList<>();
@ApiModelProperty(name = "advanceInfo", value = "This defines the device registration related information. " +
"It is mandatory to define this information.", required = false)
private DeviceInfo deviceInfo;
// @ApiModelProperty(name = "applications", value = "This represents the application list installed into the device",
// required = false)
// private List<Application> applications;
// @ApiModelProperty(
// name = "historySnapshot",
// value = "device history snapshots")
// @JsonProperty(value = "historySnapshot")
// private DeviceLocationHistorySnapshotWrapper historySnapshot;
public DeviceBilling() {
}
public DeviceBilling(String name, String description, EnrolmentInfo enrolmentInfo) {
this.name = name;
this.description = description;
this.enrolmentInfo = enrolmentInfo;
public List<DeviceStatus> getDeviceStatusInfo() {
return deviceStatusInfo;
}
public DeviceBilling(String name, String description, String deviceId, EnrolmentInfo enrolmentInfo) {
this.name = name;
this.description = description;
this.deviceIdentifier = deviceId;
this.enrolmentInfo = enrolmentInfo;
public void setDeviceStatusInfo(List<DeviceStatus> deviceStatusInfo) {
this.deviceStatusInfo = deviceStatusInfo;
}
public int getDaysUsed() {
@ -177,46 +157,11 @@ public class DeviceBilling implements Serializable {
this.deviceInfo = deviceInfo;
}
public static class Property {
private String name;
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
@Override
public String toString() {
return new Gson().toJson(this);
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof DeviceBilling))
return false;
DeviceBilling device = (DeviceBilling) o;
return getDeviceIdentifier().equals(device.getDeviceIdentifier());
}
@Override
public int hashCode() {
return getDeviceIdentifier().hashCode();

@ -49,7 +49,7 @@ public class EnrolmentInfo implements Serializable {
private Long dateOfEnrolment;
@ApiModelProperty(name = "dateOfLastUpdate", value = "Date of the device's last update. This value is not necessary.", required = false )
private Long dateOfLastUpdate;
@ApiModelProperty(name = "lastBilledDate", value = "Date of the device's last update. This value is not necessary.", required = false )
@ApiModelProperty(name = "lastBilledDate", value = "Date of the device's last billed date", required = false )
private Long lastBilledDate;
@ApiModelProperty(name = "ownership", value = "Defines the ownership details. The ownership type can be any of the" +
" following values.\n" +
@ -95,14 +95,6 @@ public class EnrolmentInfo implements Serializable {
this.dateOfEnrolment = dateOfEnrolment;
}
public Long getDateOfLastUpdate() {
return dateOfLastUpdate;
}
public void setDateOfLastUpdate(Long dateOfLastUpdate) {
this.dateOfLastUpdate = dateOfLastUpdate;
}
public Long getLastBilledDate() {
return lastBilledDate;
}
@ -111,6 +103,14 @@ public class EnrolmentInfo implements Serializable {
this.lastBilledDate = lastBilledDate;
}
public Long getDateOfLastUpdate() {
return dateOfLastUpdate;
}
public void setDateOfLastUpdate(Long dateOfLastUpdate) {
this.dateOfLastUpdate = dateOfLastUpdate;
}
public OwnerShip getOwnership() {
return ownership;
}

@ -22,11 +22,9 @@ import com.google.gson.Gson;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.sql.Timestamp;
import java.util.Date;
@XmlRootElement(name = "Cost")
public class Costdata {
public class Cost {
private String tenantDomain;
private Double cost;

@ -47,6 +47,7 @@ import org.wso2.carbon.device.mgt.core.dto.DeviceType;
import org.wso2.carbon.device.mgt.common.geo.service.GeoCluster;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.List;
import java.util.Map;
@ -300,7 +301,7 @@ public interface DeviceDAO {
* @return returns paginated list of not removed devices of tenant.
* @throws DeviceManagementDAOException
*/
List<DeviceBilling> getDeviceBillList(PaginationRequest request, int tenantId) throws DeviceManagementDAOException;
List<DeviceBilling> getDeviceBillList(PaginationRequest request, int tenantId, Timestamp startDate, Timestamp endDate) throws DeviceManagementDAOException;
/**
* This method is used to retrieve the removed devices of a given tenant as a paginated result.

@ -34,7 +34,7 @@ public interface DeviceStatusDAO {
List<DeviceStatus> getStatus(int deviceId, int tenantId) throws DeviceManagementDAOException;
List<DeviceStatus> getStatus(int deviceId, int tenantId, Date fromDate, Date toDate) throws DeviceManagementDAOException;
List<DeviceStatus> getStatus(int deviceId, int tenantId, Date fromDate, Date toDate, boolean billingStatus) throws DeviceManagementDAOException;
List<DeviceStatus> getStatus(int enrolmentId) throws DeviceManagementDAOException;

@ -22,6 +22,7 @@ import org.wso2.carbon.device.mgt.common.Device;
import org.wso2.carbon.device.mgt.common.EnrolmentInfo;
import org.wso2.carbon.device.mgt.common.EnrolmentInfo.Status;
import java.sql.Timestamp;
import java.util.List;
public interface EnrollmentDAO {
@ -32,6 +33,8 @@ public interface EnrollmentDAO {
boolean updateEnrollmentStatus(List<EnrolmentInfo> enrolmentInfos) throws DeviceManagementDAOException;
boolean updateEnrollmentLastBilledDate(EnrolmentInfo enrolmentInfos, Timestamp lastBilledDate, int tenantId) throws DeviceManagementDAOException;
int removeEnrollment(int deviceId, String currentOwner, int tenantId) throws DeviceManagementDAOException;
@Deprecated

@ -15,7 +15,7 @@ import java.util.List;
public class DeviceStatusDAOImpl implements DeviceStatusDAO {
private List<DeviceStatus> getStatus(int id, Date fromDate, Date toDate, boolean isDeviceId) throws DeviceManagementDAOException {
private List<DeviceStatus> getStatus(int id, Date fromDate, Date toDate, boolean isDeviceId, boolean billingStatus) throws DeviceManagementDAOException {
List<DeviceStatus> result = new ArrayList<>();
Connection conn;
PreparedStatement stmt = null;
@ -25,7 +25,14 @@ public class DeviceStatusDAOImpl implements DeviceStatusDAO {
conn = this.getConnection();
// either we list all status values for the device using the device id or only get status values for the given enrolment id
String idType = isDeviceId ? "DEVICE_ID" : "ENROLMENT_ID";
String sql = "SELECT ENROLMENT_ID, DEVICE_ID, UPDATE_TIME, STATUS, CHANGED_BY FROM DM_DEVICE_STATUS WHERE " + idType + " = ?";
String sql;
if (billingStatus) {
sql = "SELECT ENROLMENT_ID, DEVICE_ID, UPDATE_TIME, STATUS, CHANGED_BY FROM DM_DEVICE_STATUS WHERE STATUS IN ('ACTIVE','REMOVED') AND " + idType + " = ?";
} else {
sql = "SELECT ENROLMENT_ID, DEVICE_ID, UPDATE_TIME, STATUS, CHANGED_BY FROM DM_DEVICE_STATUS WHERE " + idType + " = ?";
}
// filter the data based on a date range if specified
if (fromDate != null){
sql += " AND UPDATE_TIME >= ?";
@ -64,17 +71,17 @@ public class DeviceStatusDAOImpl implements DeviceStatusDAO {
@Override
public List<DeviceStatus> getStatus(int enrolmentId, Date fromDate, Date toDate) throws DeviceManagementDAOException {
return getStatus(enrolmentId, fromDate, toDate, false);
return getStatus(enrolmentId, fromDate, toDate, false, false);
}
@Override
public List<DeviceStatus> getStatus(int deviceId, int tenantId) throws DeviceManagementDAOException {
return getStatus(deviceId, tenantId, null, null);
return getStatus(deviceId, tenantId, null, null, false);
}
@Override
public List<DeviceStatus> getStatus(int deviceId, int tenantId, Date fromDate, Date toDate) throws DeviceManagementDAOException {
return getStatus(deviceId, fromDate, toDate, true);
public List<DeviceStatus> getStatus(int deviceId, int tenantId, Date fromDate, Date toDate, boolean billingStatus) throws DeviceManagementDAOException {
return getStatus(deviceId, fromDate, toDate, true, billingStatus);
}
@Override

@ -144,6 +144,27 @@ public class EnrollmentDAOImpl implements EnrollmentDAO {
return status;
}
@Override
public boolean updateEnrollmentLastBilledDate(EnrolmentInfo enrolmentInfo, Timestamp lastBilledDate, int tenantId) throws DeviceManagementDAOException {
Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = this.getConnection();
String sql = "UPDATE DM_ENROLMENT SET LAST_BILLED_DATE = ? WHERE ID = ? AND TENANT_ID = ?";
stmt = conn.prepareStatement(sql);
stmt.setLong(1, lastBilledDate.getTime());
stmt.setInt(2, enrolmentInfo.getId());
stmt.setInt(3, tenantId);
stmt.executeUpdate();
return true;
} catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while updating enrolment last billed date.", e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs);
}
}
@Override
public int removeEnrollment(int deviceId, String currentOwner,

@ -80,6 +80,7 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
"e.IS_TRANSFERRED, " +
"e.DATE_OF_LAST_UPDATE, " +
"e.DATE_OF_ENROLMENT, " +
"e.LAST_BILLED_DATE, " +
"e.ID AS ENROLMENT_ID " +
"FROM DM_ENROLMENT e, " +
"(SELECT d.ID, " +
@ -184,29 +185,27 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
}
@Override
public List<DeviceBilling> getDeviceBillList(PaginationRequest request, int tenantId)
public List<DeviceBilling> getDeviceBillList(PaginationRequest request, int tenantId, Timestamp startDate, Timestamp endDate)
throws DeviceManagementDAOException {
Connection conn;
PreparedStatement stmt = null;
List<DeviceBilling> devices = new ArrayList<>();
try {
conn = this.getConnection();
// String sql ="select DEVICE_IDENTIFICATION, DESCRIPTION, NAME AS DEVICE_NAME, DATE_OF_ENROLMENT, LAST_BILLED_DATE AS BILLED_DATE,STATUS,\n" +
// "TIMESTAMPDIFF('DAY', CURDATE(), DATE_OF_ENROLMENT) as DAYS_SINCE_ENROLLED from DM_DEVICE d, DM_ENROLMENT e\n" +
// "where e.TENANT_ID= ? and d.ID=e.DEVICE_ID and STATUS !='REMOVED' LIMIT 10";
String sql ="select DEVICE_IDENTIFICATION, DESCRIPTION, NAME AS DEVICE_NAME, DATE_OF_ENROLMENT, LAST_BILLED_DATE,STATUS,\n" +
"TIMESTAMPDIFF('DAY', DATE_OF_ENROLMENT, CURDATE()) as DAYS_SINCE_ENROLLED from DM_DEVICE d, DM_ENROLMENT e\n" +
"where e.TENANT_ID= ? and d.ID=e.DEVICE_ID and STATUS !='REMOVED' LIMIT 10";
String sql = "SELECT DM_DEVICE.ID, DEVICE_IDENTIFICATION, DESCRIPTION, NAME AS DEVICE_NAME, DM_ENROLMENT.ID AS ENROLMENT_ID,\n" +
" DATE_OF_ENROLMENT,STATUS, LAST_BILLED_DATE, TIMESTAMPDIFF('DAY', DATE_OF_ENROLMENT, CURDATE()) as DAYS_SINCE_ENROLLED\n" +
" FROM DM_DEVICE JOIN DM_ENROLMENT ON (DM_DEVICE.ID = DM_ENROLMENT.DEVICE_ID)\n" +
" WHERE DM_ENROLMENT.TENANT_ID=?";
stmt = conn.prepareStatement(sql);
stmt.setInt(1, tenantId);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
DeviceBilling device = DeviceManagementDAOUtil.loadDeviceBilling(rs, false);
DeviceBilling device = DeviceManagementDAOUtil.loadDeviceBilling(rs);
devices.add(device);
}
} catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while fetching the list of devices belongs to '" +
throw new DeviceManagementDAOException("Error occurred while fetching the list of devices '" +
request.getOwner() + "'", e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, null);
@ -230,7 +229,8 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
DeviceBilling device = DeviceManagementDAOUtil.loadDeviceBilling(rs, true);
// DeviceBilling device = DeviceManagementDAOUtil.loadDeviceBilling(rs, true);
DeviceBilling device = DeviceManagementDAOUtil.loadDeviceBilling(rs);
devices.add(device);
}
} catch (SQLException e) {

@ -194,7 +194,7 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl {
}
@Override
public List<DeviceBilling> getDeviceBillList(PaginationRequest request, int tenantId) throws DeviceManagementDAOException {
public List<DeviceBilling> getDeviceBillList(PaginationRequest request, int tenantId , Timestamp startDate, Timestamp endDate) throws DeviceManagementDAOException {
return null;
}

@ -185,7 +185,7 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl {
}
@Override
public List<DeviceBilling> getDeviceBillList(PaginationRequest request, int tenantId) throws DeviceManagementDAOException {
public List<DeviceBilling> getDeviceBillList(PaginationRequest request, int tenantId, Timestamp startDate, Timestamp endDate) throws DeviceManagementDAOException {
return null;
}

@ -195,7 +195,7 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl {
}
@Override
public List<DeviceBilling> getDeviceBillList(PaginationRequest request, int tenantId) throws DeviceManagementDAOException {
public List<DeviceBilling> getDeviceBillList(PaginationRequest request, int tenantId, Timestamp startDate, Timestamp endDate) throws DeviceManagementDAOException {
return null;
}

@ -21,7 +21,9 @@ import java.sql.*;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.context.CarbonContext;
@ -32,6 +34,7 @@ import org.wso2.carbon.device.mgt.common.EnrolmentInfo;
import org.wso2.carbon.device.mgt.common.device.details.DeviceInfo;
import org.wso2.carbon.device.mgt.common.device.details.DeviceLocationHistorySnapshot;
import org.wso2.carbon.device.mgt.common.device.details.DeviceMonitoringData;
import org.wso2.carbon.device.mgt.common.type.mgt.DeviceStatus;
import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException;
import org.wso2.carbon.device.mgt.core.dto.DeviceType;
import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder;
@ -41,9 +44,6 @@ import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
public final class DeviceManagementDAOUtil {
@ -150,16 +150,17 @@ public final class DeviceManagementDAOUtil {
enrolmentInfo.setDateOfEnrolment(rs.getTimestamp("DATE_OF_ENROLMENT").getTime());
enrolmentInfo.setDateOfLastUpdate(rs.getTimestamp("DATE_OF_LAST_UPDATE").getTime());
enrolmentInfo.setStatus(EnrolmentInfo.Status.valueOf(rs.getString("STATUS")));
enrolmentInfo.setLastBilledDate(rs.getLong("LAST_BILLED_DATE"));
return enrolmentInfo;
}
public static EnrolmentInfo loadEnrolmentBilling(ResultSet rs, Boolean removedDevices) throws SQLException {
System.out.println("-----------------DAOO 222------------------------------");
public static EnrolmentInfo loadEnrolmentBilling(ResultSet rs) throws SQLException {
EnrolmentInfo enrolmentInfo = new EnrolmentInfo();
enrolmentInfo.setId(rs.getInt("ENROLMENT_ID"));
enrolmentInfo.setDateOfEnrolment(rs.getTimestamp("DATE_OF_ENROLMENT").getTime());
enrolmentInfo.setLastBilledDate(rs.getLong("LAST_BILLED_DATE"));
enrolmentInfo.setStatus(EnrolmentInfo.Status.valueOf(rs.getString("STATUS")));
if (removedDevices) {
if (EnrolmentInfo.Status.valueOf(rs.getString("STATUS")).equals("REMOVED")) {
enrolmentInfo.setDateOfLastUpdate(rs.getTimestamp("DATE_OF_LAST_UPDATE").getTime());
}
return enrolmentInfo;
@ -210,18 +211,19 @@ public final class DeviceManagementDAOUtil {
return device;
}
public static DeviceBilling loadDeviceBilling(ResultSet rs, Boolean removedDevices) throws SQLException {
System.out.println("-----------------DAOO 111------------------------------");
public static DeviceBilling loadDeviceBilling(ResultSet rs) throws SQLException {
DeviceBilling device = new DeviceBilling();
device.setId(rs.getInt("ID"));
device.setName(rs.getString("DEVICE_NAME"));
device.setDescription(rs.getString("DESCRIPTION"));
device.setDeviceIdentifier(rs.getString("DEVICE_IDENTIFICATION"));
if (removedDevices) {
device.setDaysUsed((int) rs.getLong("DAYS_USED"));
} else {
device.setDaysSinceEnrolled((int) rs.getLong("DAYS_SINCE_ENROLLED"));
}
device.setEnrolmentInfo(loadEnrolmentBilling(rs, removedDevices));
device.setDaysUsed((int) rs.getLong("DAYS_SINCE_ENROLLED"));
// if (removedDevices) {
// device.setDaysUsed((int) rs.getLong("DAYS_USED"));
// } else {
// device.setDaysSinceEnrolled((int) rs.getLong("DAYS_SINCE_ENROLLED"));
// }
device.setEnrolmentInfo(loadEnrolmentBilling(rs));
return device;
}

@ -42,7 +42,6 @@ import org.wso2.carbon.device.mgt.common.configuration.mgt.AmbiguousConfiguratio
import org.wso2.carbon.device.mgt.common.configuration.mgt.ConfigurationManagementException;
import org.wso2.carbon.device.mgt.common.configuration.mgt.DeviceConfiguration;
import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfiguration;
import org.wso2.carbon.device.mgt.common.cost.mgt.Costdata;
import org.wso2.carbon.device.mgt.common.device.details.DeviceData;
import org.wso2.carbon.device.mgt.common.configuration.mgt.ConfigurationEntry;
import org.wso2.carbon.device.mgt.common.device.details.DeviceLocationHistorySnapshot;
@ -70,6 +69,7 @@ import org.wso2.carbon.device.mgt.common.geo.service.GeoCluster;
import org.wso2.carbon.device.mgt.common.geo.service.GeoCoordinate;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Collection;
import java.util.Date;
import java.util.List;
@ -203,22 +203,11 @@ public interface DeviceManagementProviderService {
* Method to retrieve all the devices with pagination support.
*
* @param request PaginationRequest object holding the data for pagination
* @return List<DeviceBilling> - Result includes the cost of removed device list.
* @throws DeviceManagementException If some unusual behaviour is observed while fetching the
* devices.
*/
List<DeviceBilling> getRemovedDeviceListWithCost(PaginationResult paginationResult, PaginationRequest request, Collection<Costdata> costdata, String tenantDomain, Double totalCost) throws DeviceManagementException;
/**
* Method to retrieve all the devices with pagination support.
*
* @param request PaginationRequest object holding the data for pagination
* @param requireDeviceInfo - A boolean indicating whether the device-info (location, app-info etc) is also required
* along with the device data.
* @return PaginationResult - Result including the required parameters necessary to do pagination.
* @throws DeviceManagementException If some unusual behaviour is observed while fetching the
* @throws DeviceManagementException If some unusual behaviour is observed while fetching billing of
* devices.
*/
PaginationResult getAllDevicesBillings(PaginationRequest request, boolean requireDeviceInfo, String tenantDomain) throws DeviceManagementException;
PaginationResult getAllDevicesBillings(PaginationRequest request, String tenantDomain, Timestamp startDate, Timestamp endDate, boolean generateBill) throws DeviceManagementException;
/**
* Returns the device of specified id.
@ -705,7 +694,7 @@ public interface DeviceManagementProviderService {
List<DeviceStatus> getDeviceStatusHistory(Device device) throws DeviceManagementException;
List<DeviceStatus> getDeviceStatusHistory(Device device, Date fromDate, Date toDate) throws DeviceManagementException;
List<DeviceStatus> getDeviceStatusHistory(Device device, Date fromDate, Date toDate, boolean billingStatus) throws DeviceManagementException;
List<DeviceStatus> getDeviceCurrentEnrolmentStatusHistory(Device device) throws DeviceManagementException;

@ -61,7 +61,7 @@ import org.wso2.carbon.device.mgt.common.configuration.mgt.DeviceConfiguration;
import org.wso2.carbon.device.mgt.common.configuration.mgt.DevicePropertyInfo;
import org.wso2.carbon.device.mgt.common.configuration.mgt.EnrollmentConfiguration;
import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfiguration;
import org.wso2.carbon.device.mgt.common.cost.mgt.Costdata;
import org.wso2.carbon.device.mgt.common.cost.mgt.Cost;
import org.wso2.carbon.device.mgt.common.device.details.DeviceData;
import org.wso2.carbon.device.mgt.common.device.details.DeviceInfo;
import org.wso2.carbon.device.mgt.common.device.details.DeviceLocation;
@ -137,6 +137,7 @@ import java.io.IOException;
import java.io.StringWriter;
import java.lang.reflect.Type;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.*;
import java.util.stream.Collectors;
@ -936,111 +937,155 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
}
@Override
public List<DeviceBilling> getRemovedDeviceListWithCost(PaginationResult paginationResult, PaginationRequest request, Collection<Costdata> costdata, String tenantDomain, Double totalCost) throws DeviceManagementException {
List<DeviceBilling> allRemovedDevices;
int tenantId = this.getTenantId();
try {
allRemovedDevices = deviceDAO.getRemovedDeviceBillList(request,tenantId);
for (Costdata test: costdata) {
if (test.getTenantDomain().equals(tenantDomain)) {
for (DeviceBilling device: allRemovedDevices) {
long dateDiff = device.getEnrolmentInfo().getDateOfLastUpdate()-device.getEnrolmentInfo().getDateOfEnrolment();
long dateInDays = dateDiff / (1000*60*60*24);
double cost = (test.getCost()/365)*dateInDays;
totalCost = cost + totalCost;
device.setCost(cost);
}
}
}
paginationResult.setTotalCost(totalCost);
} catch (DeviceManagementDAOException e) {
String msg = "Error occurred while retrieving device list pertaining to the current tenant";
log.error(msg, e);
throw new DeviceManagementException(msg, e);
}
catch (Exception e) {
String msg = "Error occurred get devices";
log.error(msg, e);
throw new DeviceManagementException(msg, e);
}
return allRemovedDevices;
}
@Override
public PaginationResult getAllDevicesBillings(PaginationRequest request, boolean requireDeviceInfo, String tenantDomain) throws DeviceManagementException {
public PaginationResult getAllDevicesBillings(PaginationRequest request, String tenantDomain, Timestamp startDate, Timestamp endDate, boolean generateBill) throws DeviceManagementException {
if (request == null) {
String msg = "Received incomplete pagination request for method getAllDeviceBillings";
log.error(msg);
throw new DeviceManagementException(msg);
}
if (log.isDebugEnabled()) {
log.debug("Get devices with pagination " + request.toString() + " and requiredDeviceInfo: " + requireDeviceInfo);
}
System.out.println("--------------------COREEEE LAYERR-------------------");
PaginationResult paginationResult = new PaginationResult();
Double totalCost = 0.0;
List<DeviceBilling> allDevices;
List<DeviceBilling> allRemovedDevices;
// List<DeviceBilling> allDevices;
List<Device> allDevices;
int count = 0;
int tenantId = this.getTenantId();
DeviceManagerUtil.validateDeviceListPageSize(request);
try {
DeviceManagementDAOFactory.openConnection();
allDevices = deviceDAO.getDeviceBillList(request, tenantId);
allRemovedDevices = deviceDAO.getRemovedDeviceBillList(request,tenantId);
// allDevices = deviceDAO.getDeviceBillList(request, tenantId, startDate, endDate);
allDevices = deviceDAO.getDevices(request, tenantId);
count = deviceDAO.getDeviceCount(request, tenantId);
System.out.println("-----------------HERE------------------------------");
String metaKey = "PER_DEVICE_COST";
MetadataManagementDAOFactory.openConnection();
Metadata metadata = metadataDAO.getMetadata(tenantId, metaKey);
Gson g = new Gson();
Type collectionType = new TypeToken<Collection<Costdata>>(){}.getType();
Collection<Costdata> costdata = g.fromJson(metadata.getMetaValue(), collectionType); // change name
Type collectionType = new TypeToken<Collection<Cost>>(){}.getType();
Collection<Cost> costData = g.fromJson(metadata.getMetaValue(), collectionType);
for (Costdata test: costdata) {
if (test.getTenantDomain().equals(tenantDomain)) {
for (DeviceBilling device: allDevices) {
long dateDiff;
for (Cost tenantCost: costData) {
if (tenantCost.getTenantDomain().equals(tenantDomain)) {
for (Device device: allDevices) {
device.setDeviceStatusInfo(getDeviceStatusHistory(device, startDate, endDate, true));
long dateDiff = 0;
List<DeviceStatus> deviceStatus = device.getDeviceStatusInfo();
boolean lastBilledDate = false;
for (int i=0; i<deviceStatus.size(); i++) {
if(deviceStatus.get(i).getStatus().toString().equals("ACTIVE")) {
if (deviceStatus.size()> i+1) {
if (lastBilledDate == false) {
lastBilledDate = true;
if (device.getEnrolmentInfo().getLastBilledDate() == 0) {
dateDiff = test.getSubscriptionEnd()-device.getEnrolmentInfo().getDateOfEnrolment();
dateDiff = dateDiff + (deviceStatus.get(i+1).getUpdateTime().getTime() - deviceStatus.get(i).getUpdateTime().getTime());
} else {
dateDiff = test.getSubscriptionEnd()-device.getEnrolmentInfo().getLastBilledDate();
if (deviceStatus.get(i+1).getUpdateTime().getTime() >= device.getEnrolmentInfo().getLastBilledDate()) {
dateDiff = dateDiff + (deviceStatus.get(i+1).getUpdateTime().getTime() - device.getEnrolmentInfo().getLastBilledDate());
}
// dateDiff = test.getSubscriptionEnd().getTime()-device.getEnrolmentInfo().getDateOfEnrolment();
long dateInDays = dateDiff / (1000*60*60*24);
double cost = (test.getCost()/365)*dateInDays;
totalCost = cost + totalCost;
device.setCost(cost);
}
} else {
if ( deviceStatus.get(i).getUpdateTime().getTime() >= device.getEnrolmentInfo().getLastBilledDate()) {
dateDiff = dateDiff + (deviceStatus.get(i+1).getUpdateTime().getTime() - deviceStatus.get(i).getUpdateTime().getTime());
}
}
for (Costdata test: costdata) {
if (test.getTenantDomain().equals(tenantDomain)) {
for (DeviceBilling device: allRemovedDevices) {
long dateDiff;
// long dateDiff = device.getEnrolmentInfo().getDateOfLastUpdate()-device.getEnrolmentInfo().getDateOfEnrolment();
} else {
if (lastBilledDate == false) {
lastBilledDate = true;
if (device.getEnrolmentInfo().getLastBilledDate() == 0) {
dateDiff = test.getSubscriptionEnd()-device.getEnrolmentInfo().getDateOfEnrolment();
dateDiff = dateDiff + (endDate.getTime() - deviceStatus.get(i).getUpdateTime().getTime());
} else {
dateDiff = test.getSubscriptionEnd()-device.getEnrolmentInfo().getLastBilledDate();
if (endDate.getTime() >= device.getEnrolmentInfo().getLastBilledDate()) {
dateDiff = dateDiff +(endDate.getTime() - device.getEnrolmentInfo().getLastBilledDate());
}
}
} else {
dateDiff = dateDiff + (endDate.getTime() - deviceStatus.get(i).getUpdateTime().getTime());
}
}
}
}
long dateInDays = dateDiff / (1000*60*60*24);
double cost = (test.getCost()/365)*dateInDays;
double cost = (tenantCost.getCost()/365)*dateInDays;
totalCost = cost + totalCost;
device.setCost(cost);
device.setDaysUsed((int) dateInDays);
if (generateBill) {
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
enrollmentDAO.updateEnrollmentLastBilledDate(device.getEnrolmentInfo(), timestamp, tenantId);
}
}
// for (DeviceBilling device: allDevices) {
// device.setDeviceStatusInfo(getDeviceStatusHistory(device, startDate, endDate, true));
// long dateDiff = 0;
//
// List<DeviceStatus> deviceStatus = device.getDeviceStatusInfo();
// boolean lastBilledDate = false;
//// int startIndex = deviceStatus.indexOf("ACTIVE");
// for (int i=0; i<deviceStatus.size(); i++) {
// if(deviceStatus.get(i).getStatus().toString().equals("ACTIVE")) {
// if (deviceStatus.size()> i+1) {
// if (lastBilledDate == false) {
// lastBilledDate = true;
// if (device.getEnrolmentInfo().getLastBilledDate() == 0) {
// dateDiff = dateDiff + (deviceStatus.get(i+1).getUpdateTime().getTime() - deviceStatus.get(i).getUpdateTime().getTime());
// } else {
// if (deviceStatus.get(i+1).getUpdateTime().getTime() >= device.getEnrolmentInfo().getLastBilledDate()) {
// dateDiff = dateDiff + (deviceStatus.get(i+1).getUpdateTime().getTime() - device.getEnrolmentInfo().getLastBilledDate());
// }
//// dateDiff = dateDiff + (deviceStatus.get(i+1).getUpdateTime().getTime() - device.getEnrolmentInfo().getLastBilledDate());
// }
// } else {
// if ( deviceStatus.get(i).getUpdateTime().getTime() >= device.getEnrolmentInfo().getLastBilledDate()) {
// dateDiff = dateDiff + (deviceStatus.get(i+1).getUpdateTime().getTime() - deviceStatus.get(i).getUpdateTime().getTime());
// }
//// dateDiff = dateDiff + (deviceStatus.get(i+1).getUpdateTime().getTime() - deviceStatus.get(i).getUpdateTime().getTime());
// }
//// dateDiff = deviceStatus.get(i+1).getUpdateTime().getTime() - deviceStatus.get(i).getUpdateTime().getTime();
// } else {
// if (lastBilledDate == false) {
// lastBilledDate = true;
// if (device.getEnrolmentInfo().getLastBilledDate() == 0) {
// dateDiff = dateDiff + (endDate.getTime() - deviceStatus.get(i).getUpdateTime().getTime());
// } else {
// if (endDate.getTime() >= device.getEnrolmentInfo().getLastBilledDate()) {
// dateDiff = dateDiff +(endDate.getTime() - device.getEnrolmentInfo().getLastBilledDate());
// }
//// dateDiff = dateDiff +(endDate.getTime() - device.getEnrolmentInfo().getLastBilledDate());
// }
// } else {
// dateDiff = dateDiff + (endDate.getTime() - deviceStatus.get(i).getUpdateTime().getTime());
// }
//// dateDiff = endDate.getTime() - deviceStatus.get(i).getUpdateTime().getTime();
// }
// }
// }
//
// long dateInDays = dateDiff / (1000*60*60*24);
// double cost = (test.getCost()/365)*dateInDays;
// totalCost = cost + totalCost;
// device.setCost(cost);
// device.setDaysUsed((int) dateInDays);
//
// if (generateBill) {
// Timestamp timestamp = new Timestamp(System.currentTimeMillis());
// enrollmentDAO.updateEnrollmentLastBilledDate(device.getEnrolmentInfo(), timestamp, tenantId);
// }
//
//// if (cost == 0) {
//// allDevices.remove(device);
//// }
//
// }
}
}
}
// allRemovedDevices = this.getRemovedDeviceListWithCost(paginationResult, request, costdata, tenantDomain, totalCost);
allDevices.addAll(allRemovedDevices);
} catch (DeviceManagementDAOException e) {
String msg = "Error occurred while retrieving device list pertaining to the current tenant";
@ -1881,13 +1926,13 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
}
}
@Override
public List<DeviceStatus> getDeviceStatusHistory(Device device, Date fromDate, Date toDate) throws DeviceManagementException{
public List<DeviceStatus> getDeviceStatusHistory(Device device, Date fromDate, Date toDate, boolean billingStatus) throws DeviceManagementException{
if (log.isDebugEnabled()) {
log.debug("get status history of device: " + device.getDeviceIdentifier());
}
try {
int tenantId = this.getTenantId();
return deviceStatusDAO.getStatus(device.getId(), tenantId, fromDate, toDate);
return deviceStatusDAO.getStatus(device.getId(), tenantId, fromDate, toDate, billingStatus);
} catch (DeviceManagementDAOException e) {
DeviceManagementDAOFactory.rollbackTransaction();
String msg = "Error occurred while retrieving status history";
@ -1931,7 +1976,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
@Override
public List<DeviceStatus> getDeviceStatusHistory(Device device) throws DeviceManagementException{
return getDeviceStatusHistory(device, null, null);
return getDeviceStatusHistory(device, null, null, false);
}
@Override

Loading…
Cancel
Save