Added some DB functionalities - not done yet

This commit is contained in:
Mary Tran 2018-11-20 13:03:26 -05:00
parent 944c1226b7
commit 168d8be0c7
2 changed files with 412 additions and 18 deletions

View file

@ -7,8 +7,12 @@ import android.database.Cursor;
import android.content.ContentValues;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import java.util.GregorianCalendar;
import com.uottawa.olympus.olympusservices.Booking.Status;
/**
* The class DBHelper allows the Android application to access and perform
@ -23,7 +27,7 @@ import java.util.List;
public class DBHelper extends SQLiteOpenHelper {
//version of db used for update method
private static final int DB_VERSION = 4;
private static final int DB_VERSION = 5;
//name of db in app data
private static final String DB_NAME = "UsersDB.db";
@ -59,6 +63,9 @@ public class DBHelper extends SQLiteOpenHelper {
//columns of TABLE_SERVICEPROVIDERS
private static final String COLUMN_SERVICEPROVIDERNAME = "username";
private static final String COLUMN_SERVICEPROVIDERSERVICE = "service";
private static final String COLUMN_AVERAGERATING = "averageRating";
private static final String COLUMN_RATERS = "raters";
private static final String COLUMN_ACTIVE = "active";
//name of table containing service provider availability
//availability is stored as number of minutes from 00:00
@ -80,7 +87,19 @@ public class DBHelper extends SQLiteOpenHelper {
private static final String COLUMN_SUNSTART = "sundaystart";
private static final String COLUMN_SUNEND = "sundayend";
//name of table containing booking
private static final String TABLE_BOOKINGS = "bookings";
//columns of TABLE_BOOKING
private static final String COLUMN_BOOKINGSERVICEPROVIDER = "serviceProvider";
private static final String COLUMN_BOOKINGHOMEOWNER = "homeOwner";
private static final String COLUMN_BOOKINGSERVICE = "service";
private static final String COLUMN_BOOKINGYEAR = "year";
private static final String COLUMN_BOOKINGMONTH = "month";
private static final String COLUMN_BOOKINGDATE = "day";
private static final String COLUMN_BOOKINGSTART = "starttime";
private static final String COLUMN_BOOKINGEND = "endtime";
private static final String COLUMN_BOOKINGSTATUS = "status";
private static final String COLUMN_RATING = "rating";
/**
* Creates an instance of DBHelper to allow activities to access and
@ -130,6 +149,9 @@ public class DBHelper extends SQLiteOpenHelper {
String CREATE_SERVICEPROVIDERS_TABLE = "CREATE TABLE "+ TABLE_SERVICEPROVIDERS + "("
+ COLUMN_SERVICEPROVIDERNAME + " TEXT, "
+ COLUMN_SERVICEPROVIDERSERVICE + " TEXT, "
+ COLUMN_AVERAGERATING + " REAL DEFAULT 0, "
+ COLUMN_RATERS + " REAL DEFAULT 0, "
+ COLUMN_ACTIVE + " TEXT DEFAULT 'active', "
//service provider name is foreign key
+ " FOREIGN KEY(" + COLUMN_SERVICEPROVIDERNAME
+ ") REFERENCES " + TABLE_LOGIN + "(" + COLUMN_USERNAME +"), "
@ -157,6 +179,21 @@ public class DBHelper extends SQLiteOpenHelper {
+ COLUMN_SUNSTART + " REAL, "
+ COLUMN_SUNEND + " REAL)";
db.execSQL(CREATE_AVAILABILITY_TABLE);
//making the table containing bookings
String CREATE_BOOKING_TABLE = "CREATE TABLE "+ TABLE_BOOKINGS + "("
+ COLUMN_BOOKINGSERVICEPROVIDER + " TEXT,"
+ COLUMN_BOOKINGHOMEOWNER + " TEXT,"
+ COLUMN_BOOKINGSERVICE + " TEXT, "
+ COLUMN_BOOKINGYEAR + " REAL,"
+ COLUMN_BOOKINGMONTH + " REAL, "
+ COLUMN_BOOKINGDATE + " REAL, "
+ COLUMN_BOOKINGSTART + " REAL, "
+ COLUMN_BOOKINGEND + " REAL, "
+ COLUMN_BOOKINGSTATUS + " TEXT, "
+ COLUMN_RATING + " REAL DEFAULT 0 "
+ ")";
db.execSQL(CREATE_BOOKING_TABLE);
}
@Override
@ -208,7 +245,22 @@ public class DBHelper extends SQLiteOpenHelper {
case 3:
db.execSQL("ALTER TABLE " + TABLE_LOGIN + " ADD COLUMN " + COLUMN_DESCRIPTION + " TEXT");
db.execSQL("ALTER TABLE " + TABLE_LOGIN + " ADD COLUMN " + COLUMN_SALT + " TEXT");
case 4:
db.execSQL("ALTER TABLE " + TABLE_SERVICEPROVIDERS + " ADD COLUMN " + COLUMN_AVERAGERATING + " REAL DEFAULT 0");
db.execSQL("ALTER TABLE " + TABLE_SERVICEPROVIDERS + " ADD COLUMN " + COLUMN_RATERS + " REAL DEFAULT 0");
db.execSQL("ALTER TABLE " + TABLE_SERVICEPROVIDERS + " ADD COLUMN " + COLUMN_ACTIVE + " TEXT DEFAULT 'active'");
db.execSQL("CREATE TABLE IF NOT EXISTS "+ TABLE_BOOKINGS + "("
+ COLUMN_BOOKINGSERVICEPROVIDER + " TEXT,"
+ COLUMN_BOOKINGHOMEOWNER + " TEXT,"
+ COLUMN_BOOKINGSERVICE + " TEXT, "
+ COLUMN_BOOKINGYEAR + " REAL,"
+ COLUMN_BOOKINGMONTH + " REAL, "
+ COLUMN_BOOKINGDATE + " REAL, "
+ COLUMN_BOOKINGSTART + " REAL, "
+ COLUMN_BOOKINGEND + " REAL, "
+ COLUMN_BOOKINGSTATUS + " TEXT, "
+ COLUMN_RATING + " REAL DEFAULT 0 "
+ ")");
}
}
@ -571,7 +623,7 @@ public class DBHelper extends SQLiteOpenHelper {
//Check for duplicate username/service combination by querying login table
Cursor cursor = writeDB.query(TABLE_SERVICEPROVIDERS,
new String[] {COLUMN_SERVICEPROVIDERNAME},
new String[] {COLUMN_ACTIVE},
COLUMN_SERVICEPROVIDERNAME + " = ? AND "
+ COLUMN_SERVICEPROVIDERSERVICE + " = ?",
new String[]{serviceProviderUsername, serviceName},
@ -579,8 +631,18 @@ public class DBHelper extends SQLiteOpenHelper {
"1");
//If cursor has 1+ elements in it, username/service combination already exists in table
if (cursor != null && cursor.getCount() > 0){
if (cursor.getString(0).equals("active")){
cursor.close();
return false;
} else {
ContentValues values = new ContentValues();
values.put(COLUMN_ACTIVE, "active");
return writeDB.update(TABLE_SERVICEPROVIDERS, values,
COLUMN_SERVICEPROVIDERNAME + " = ? AND "
+ COLUMN_SERVICEPROVIDERSERVICE + " = ?",
new String[]{serviceProviderUsername, serviceName})>0;
}
}
cursor.close();
@ -604,7 +666,11 @@ public class DBHelper extends SQLiteOpenHelper {
public boolean deleteServiceProvidedByUser(String serviceProviderUsername, String serviceName){
if (serviceProviderUsername == null || serviceName == null) return false;
serviceName = serviceName.toLowerCase().trim();
return writeDB.delete(TABLE_SERVICEPROVIDERS,
ContentValues values = new ContentValues();
values.put(COLUMN_ACTIVE, "inactive");
return writeDB.update(TABLE_SERVICEPROVIDERS, values,
COLUMN_SERVICEPROVIDERNAME + " = ? AND "
+ COLUMN_SERVICEPROVIDERSERVICE + " = ?",
new String[]{serviceProviderUsername, serviceName}) > 0;
@ -626,7 +692,8 @@ public class DBHelper extends SQLiteOpenHelper {
+ " ON " + TABLE_SERVICEPROVIDERS + "." + COLUMN_SERVICEPROVIDERSERVICE + " = "
+ TABLE_SERVICES + "." + COLUMN_SERVICE
+ " AND " + TABLE_SERVICEPROVIDERS + "." + COLUMN_SERVICEPROVIDERNAME
+ "= '" + serviceProviderName + "'");
+ "= '" + serviceProviderName + "'"
+ " AND " + TABLE_SERVICEPROVIDERS + "." + COLUMN_ACTIVE + " = 'active'");
}
public List<String[]> getAllProvidersByService(Service service){
@ -642,7 +709,8 @@ public class DBHelper extends SQLiteOpenHelper {
return getAll("SELECT " + COLUMN_SERVICEPROVIDERNAME
+ " FROM " + TABLE_SERVICEPROVIDERS
+ " WHERE " + COLUMN_SERVICEPROVIDERSERVICE + " = '"
+ serviceName + "'");
+ serviceName + "'"
+ " AND " + TABLE_SERVICEPROVIDERS + "." + COLUMN_ACTIVE + " = 'active'");
}
public boolean updateAvailability(ServiceProvider serviceProvider){
@ -732,6 +800,339 @@ public class DBHelper extends SQLiteOpenHelper {
return availabilities;
}
public boolean addBooking(Booking booking){
if (booking == null) return false;
GregorianCalendar current = new GregorianCalendar();
current.setTimeInMillis(System.currentTimeMillis());
GregorianCalendar bookDate = new GregorianCalendar(booking.getYear(), booking.getMonth(),
booking.getDay(), booking.getStarth(), booking.getStartmin());
//check if time of booking is after this time
if (current.compareTo(bookDate) > 0) return false;
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_BOOKINGSTART, booking.getStarth()*60 + booking.getStartmin());
contentValues.put(COLUMN_BOOKINGEND, booking.getEndh()*60 + booking.getEndmin());
contentValues.put(COLUMN_BOOKINGDATE, booking.getDay());
contentValues.put(COLUMN_BOOKINGMONTH, booking.getMonth());
contentValues.put(COLUMN_BOOKINGYEAR, booking.getYear());
contentValues.put(COLUMN_BOOKINGSERVICEPROVIDER, booking.getServiceprovider().getUsername());
contentValues.put(COLUMN_BOOKINGHOMEOWNER, booking.getHomeowner().getUsername());
contentValues.put(COLUMN_BOOKINGSERVICE, booking.getService().getName());
contentValues.put(COLUMN_BOOKINGSTATUS, Status.PENDING.toString());
contentValues.put(COLUMN_RATING, 0);
writeDB.insert(TABLE_BOOKINGS, null, contentValues);
return true;
}
public List<Booking> findBookings(String username){
List<Booking> bookingList = new ArrayList<>();
ServiceProvider serviceProvider = null;
HomeOwner homeOwner = null;
Cursor cursor = writeDB.rawQuery("SELECT * FROM " + TABLE_LOGIN + " WHERE "
+ COLUMN_BOOKINGSERVICEPROVIDER + " = ?",
new String[] {username});
if (!cursor.moveToFirst() || cursor.getString(5).equals("Admin")) return bookingList;
if (cursor.getString(5).equals("ServiceProvider")) {
serviceProvider = (ServiceProvider)findUserByUsername(username);
cursor = writeDB.rawQuery("SELECT * FROM " + TABLE_BOOKINGS + " WHERE "
+ COLUMN_BOOKINGSERVICEPROVIDER + " = ? AND "
+ COLUMN_BOOKINGSTATUS + " != ?", new String[]{username, Status.CANCELLED.toString()});
} else {
homeOwner = (HomeOwner)findUserByUsername(username);
cursor = writeDB.rawQuery("SELECT * FROM " + TABLE_BOOKINGS + " WHERE "
+ COLUMN_BOOKINGHOMEOWNER + " = ? AND "
+ COLUMN_BOOKINGSTATUS + " != ?", new String[]{username, Status.CANCELLED.toString()});
}
if (cursor.moveToFirst()){
for (int i=0; i<cursor.getCount(); i++){
int startTime = cursor.getInt(6);
int endTime = cursor.getInt(7);
int starth = startTime / 60;
int startmin = startTime % 60;
int endh = endTime / 60;
int endmin = endTime % 60;
int day = cursor.getInt(5);
int month = cursor.getInt(4);
int year = cursor.getInt(3);
String stat = cursor.getString(8);
Status status = (stat.equals("Pending")? Status.PENDING : Status.CONFIRMED);
ServiceProvider serviceprovider = (serviceProvider == null?
(ServiceProvider)findUserByUsername(cursor.getString(0)):serviceProvider);
HomeOwner homeowner = (homeOwner == null?
(HomeOwner) findUserByUsername(cursor.getString(1)):homeOwner);
Service service = findService(cursor.getString(3));
Booking booking = new Booking(starth, startmin, endh, endmin, day, month, year,
serviceprovider, homeowner, service);
booking.setStatus(status);
bookingList.add(booking);
cursor.moveToNext();
}
}
return bookingList;
}
// public boolean isProviderAvailable(String serviceProvider, String monthDayYear,
// int starth, int startmin, int endh, int endmin) {
// String[] date = monthDayYear.split("/");
// return isProviderAvailable(serviceProvider, Integer.parseInt(date[2]),
// Integer.parseInt(date[0]), Integer.parseInt(date[1]),
// starth, startmin, endh, endmin);
// }
// /**
// * Returns false if end time before start time, or service provider not available on that day
// *
// * @param serviceProvider
// * @param year
// * @param month
// * @param day
// * @param starth
// * @param startmin
// * @param endh
// * @param endmin
// * @return
// */
// public boolean isProviderAvailable(String serviceProvider, int year, int month, int day,
// int starth, int startmin, int endh, int endmin){
//
// int bookingStart = starth*60 + startmin;
// int bookingEnd = endh*60 + endmin;
//
// if (bookingEnd < bookingStart) return false;
//
// GregorianCalendar start = new GregorianCalendar(year, month-1, day);
// //Calendar.DAY_OF_WEEK starts with 1 for Sunday, and onwards
// int dayOfWeek = start.get(Calendar.DAY_OF_WEEK)-1;
// Cursor cursor = null;
// int availabilityStart, availabilityEnd;
//
// //Check availabilities on day of week
// switch (dayOfWeek){
// case 1: //Sunday
// cursor = writeDB.query(TABLE_AVAILABILITY, new String[] {COLUMN_SUNSTART, COLUMN_SUNEND},
// COLUMN_AVAILABILITYNAME + " = ?", new String[] {serviceProvider}, null,
// null, null, null);
// break;
// case 2: //Monday
// cursor = writeDB.query(TABLE_AVAILABILITY, new String[] {COLUMN_MONSTART, COLUMN_MONEND},
// COLUMN_AVAILABILITYNAME + " = ?", new String[] {serviceProvider}, null,
// null, null, null);
// break;
// case 3: //Tuesday
// cursor = writeDB.query(TABLE_AVAILABILITY, new String[] {COLUMN_TUESTART, COLUMN_TUEEND},
// COLUMN_AVAILABILITYNAME + " = ?", new String[] {serviceProvider}, null,
// null, null, null);
// break;
// case 4: //Wednesday
// cursor = writeDB.query(TABLE_AVAILABILITY, new String[] {COLUMN_WEDSTART, COLUMN_WEDEND},
// COLUMN_AVAILABILITYNAME + " = ?", new String[] {serviceProvider}, null,
// null, null, null);
// break;
// case 5: //Thursday
// cursor = writeDB.query(TABLE_AVAILABILITY, new String[] {COLUMN_THUSTART, COLUMN_THUEND},
// COLUMN_AVAILABILITYNAME + " = ?", new String[] {serviceProvider}, null,
// null, null, null);
// break;
// case 6: //Friday
// cursor = writeDB.query(TABLE_AVAILABILITY, new String[] {COLUMN_FRISTART, COLUMN_FRIEND},
// COLUMN_AVAILABILITYNAME + " = ?", new String[] {serviceProvider}, null,
// null, null, null);
// break;
// case 7: //Saturday
// cursor = writeDB.query(TABLE_AVAILABILITY, new String[] {COLUMN_SATSTART, COLUMN_SATEND},
// COLUMN_AVAILABILITYNAME + " = ?", new String[] {serviceProvider}, null,
// null, null, null);
// break;
// }
//
// cursor.moveToFirst();
// availabilityStart = cursor.getInt(0);
// availabilityEnd = cursor.getInt(1);
//
// //service provider not available if availability end is 0, if availability starts after booking start,
// // or if availability ends before booking end
// if (availabilityEnd == 0 || availabilityStart > bookingStart || availabilityEnd < bookingEnd) return false;
//
//
// //now we know for sure that the service provider is available on said day of the week
// //we check to see if any of the bookings overlap on this time slot
// cursor = writeDB.query(TABLE_BOOKINGS, new String[] {COLUMN_BOOKINGSTART, COLUMN_BOOKINGEND},
// COLUMN_BOOKINGSERVICEPROVIDER + " = ? AND "
// + COLUMN_BOOKINGYEAR + " = ? AND "
// + COLUMN_BOOKINGMONTH + " = ? AND "
// + COLUMN_BOOKINGDATE + " = ? AND "
// + COLUMN_BOOKINGSTATUS + " != ?",
// new String[] {serviceProvider, String.valueOf(year),
// String.valueOf(month), String.valueOf(day), Status.CANCELLED.toString()},
// null, null, COLUMN_BOOKINGSTART, null);
// boolean found = cursor.moveToFirst();
// cursor.close();
// return found;
// }
public boolean confirmBooking(Booking booking){
if (booking == null) return false;
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_BOOKINGSTATUS, Status.CONFIRMED.toString());
GregorianCalendar current = new GregorianCalendar();
current.setTimeInMillis(System.currentTimeMillis());
GregorianCalendar bookDate = new GregorianCalendar(booking.getYear(), booking.getMonth(),
booking.getDay(), booking.getStarth(), booking.getStartmin());
//check if time of booking is before this time
if (current.compareTo(bookDate) > 0) return false;
return writeDB.update(TABLE_BOOKINGS, contentValues,
COLUMN_BOOKINGSERVICEPROVIDER + " = ? AND "
+ COLUMN_BOOKINGHOMEOWNER + " = ? AND "
+ COLUMN_BOOKINGYEAR + " = ? AND "
+ COLUMN_BOOKINGMONTH + " = ? AND "
+ COLUMN_BOOKINGDATE + " = ? AND "
+ COLUMN_BOOKINGSTART + " = ? AND "
+ COLUMN_BOOKINGSTATUS + " = ?)",
new String[] {booking.getServiceprovider().getUsername(),
booking.getHomeowner().getUsername(),
String.valueOf(booking.getYear()),
String.valueOf(booking.getMonth()),
String.valueOf(booking.getDay()),
String.valueOf(booking.getStarth()*60 + booking.getStartmin()),
Status.PENDING.toString()}) > 0;
}
public boolean cancelBooking(Booking booking){
if (booking == null) return false;
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_BOOKINGSTATUS, Status.CANCELLED.toString());
GregorianCalendar current = new GregorianCalendar();
current.setTimeInMillis(System.currentTimeMillis());
GregorianCalendar bookDate = new GregorianCalendar(booking.getYear(), booking.getMonth(),
booking.getDay(), booking.getStarth(), booking.getStartmin());
//check if time of booking has passed
if (current.compareTo(bookDate) > 0) return false;
return writeDB.update(TABLE_BOOKINGS, contentValues,
COLUMN_BOOKINGSERVICEPROVIDER + " = ? AND "
+ COLUMN_BOOKINGHOMEOWNER + " = ? AND "
+ COLUMN_BOOKINGYEAR + " = ? AND "
+ COLUMN_BOOKINGMONTH + " = ? AND "
+ COLUMN_BOOKINGDATE + " = ? AND "
+ COLUMN_BOOKINGSTART + " = ?)",
new String[] {booking.getServiceprovider().getUsername(),
booking.getHomeowner().getUsername(),
String.valueOf(booking.getYear()),
String.valueOf(booking.getMonth()),
String.valueOf(booking.getDay()),
String.valueOf(booking.getStarth()*60 + booking.getStartmin())}) > 0;
}
public boolean addRating(Booking booking, double rating){
if (booking == null) return false;
GregorianCalendar current = new GregorianCalendar();
current.setTimeInMillis(System.currentTimeMillis());
GregorianCalendar bookDate = new GregorianCalendar(booking.getYear(), booking.getMonth(),
booking.getDay(), booking.getEndh(), booking.getEndmin());
//check if time of booking is before this time
if (current.compareTo(bookDate) < 0) return false;
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_RATING, rating);
boolean updated = writeDB.update(TABLE_BOOKINGS, contentValues,
COLUMN_BOOKINGSERVICEPROVIDER + " = ? AND "
+ COLUMN_BOOKINGHOMEOWNER + " = ? AND "
+ COLUMN_BOOKINGYEAR + " = ? AND "
+ COLUMN_BOOKINGMONTH + " = ? AND "
+ COLUMN_BOOKINGDATE + " = ? AND "
+ COLUMN_BOOKINGSTART + " = ?)",
new String[] {booking.getServiceprovider().getUsername(),
booking.getHomeowner().getUsername(),
String.valueOf(booking.getYear()),
String.valueOf(booking.getMonth()),
String.valueOf(booking.getDay()),
String.valueOf(booking.getStarth()*60 + booking.getStartmin())}) > 0;
if (updated) {
Cursor cursor = writeDB.query(TABLE_SERVICEPROVIDERS, new String[]{COLUMN_AVERAGERATING, COLUMN_RATERS},
COLUMN_SERVICEPROVIDERNAME + " = ? AND "
+ COLUMN_SERVICEPROVIDERSERVICE + " = ?",
new String[] {booking.getServiceprovider().getUsername(), booking.getService().getName()},
null, null, null, null);
cursor.moveToFirst();
int currentRaters = cursor.getInt(1) + 1;
double currentAverageRatings = cursor.getDouble(0) + rating;
cursor.close();
contentValues = new ContentValues();
contentValues.put(COLUMN_AVERAGERATING, currentAverageRatings/(double)currentRaters);
contentValues.put(COLUMN_RATERS, currentRaters);
writeDB.update(TABLE_BOOKINGS, contentValues,
COLUMN_SERVICEPROVIDERNAME + " = ? AND "
+ COLUMN_SERVICEPROVIDERSERVICE + " = ?",
new String[] {booking.getServiceprovider().getUsername(),
booking.getService().getName()});
}
return updated;
}
public double getRatings(ServiceProvider serviceProvider, Service service){
return getRatings(serviceProvider.getUsername(), service.getName());
}
public double getRatings(String serviceProviderName, String serviceName){
Cursor cursor = writeDB.query(TABLE_SERVICEPROVIDERS, new String[]{COLUMN_AVERAGERATING},
COLUMN_SERVICEPROVIDERNAME + " = ? AND "
+ COLUMN_SERVICEPROVIDERSERVICE + " = ?",
new String[] {serviceProviderName, serviceName},
null, null, null, null);
cursor.moveToFirst();
cursor.close();
return cursor.getDouble(0);
}
public int getRaters(ServiceProvider serviceProvider, Service service){
return getRaters(serviceProvider.getUsername(), service.getName());
}
public int getRaters(String serviceProviderName, String serviceName){
Cursor cursor = writeDB.query(TABLE_SERVICEPROVIDERS, new String[]{COLUMN_RATERS},
COLUMN_SERVICEPROVIDERNAME + " = ? AND "
+ COLUMN_SERVICEPROVIDERSERVICE + " = ?",
new String[] {serviceProviderName, serviceName},
null, null, null, null);
cursor.moveToFirst();
cursor.close();
return cursor.getInt(0);
}
/**
* Prints all entries of table. One row is printed per line. Columns are
* separated by spaces.

View file

@ -46,15 +46,7 @@ public class ServiceProvider extends UserType {
*/
ServiceProvider(String username, String password, String firstname, String lastname, String address,
String phonenumber, String companyname, boolean licensed){
super(username, password, firstname, lastname);
services = new ArrayList<>();
availabilities = new int[7][4];
this.address = address;
this.phonenumber = phonenumber;
this.companyname = companyname;
this.licensed = licensed;
this.description = "";
this.rating = 0;
this(username, password, firstname, lastname, address, phonenumber, companyname, licensed, "");
}
ServiceProvider(String username, String password, String firstname, String lastname, String address,
@ -67,6 +59,7 @@ public class ServiceProvider extends UserType {
this.companyname = companyname;
this.licensed = licensed;
this.description = description;
this.rating = 0;
}
/**