From 2e02a79c6ae65fb8fdff09ecf6ce3c47cdaeced7 Mon Sep 17 00:00:00 2001 From: DEEP MEHTA Date: Tue, 8 Nov 2022 21:53:16 +0000 Subject: [PATCH] Application changes --- .vscode/launch.json | 15 ++ README.md | 10 +- docs/ER_Diagram.pdf | Bin 0 -> 61846 bytes docs/README.txt | 26 +++ .../add-schedule/add-schedule.component.html | 166 +++++++++--------- .../add-schedule/add-schedule.component.ts | 32 +++- .../add-service-center.component.html | 10 +- service-center-app/src/app/app.component.html | 4 + service-center-app/src/app/app.module.ts | 6 +- .../customer-home/customer-home.component.ts | 7 + .../manager-home/manager-home.component.html | 4 - .../receptionist-main.component.html | 4 - sql-files/set_up.sql | 102 +++++++++-- .../controllers/ServiceEventController.java | 7 +- 14 files changed, 279 insertions(+), 114 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 docs/ER_Diagram.pdf create mode 100644 docs/README.txt diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..53df668 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://127.0.0.1:4200", + "webRoot": "/workspaces/DBMS-Car-Service-Center/service-center-app" + } + ] +} \ No newline at end of file diff --git a/README.md b/README.md index 06f2aee..3004cc8 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # AUTOR - Auto Repair and Service Management System CSC540 Fall 2022 - DBMS [Team 15] -Team: -1. Deep Mehta - dmmehta2, + +1. Deep Mehta - dmmehta2 2. Rohan Shiveshwarkar - rsshives 3. Yash Sonar - ysonar 4. Kunal Patil - kpatil5 @@ -18,3 +18,9 @@ To cofigure this in local, ensure you have JDK 11 installed on your machine. The Run the spring boot application and you will be able to see all the APIs listed in the form of Swagger UI. This utilizes JDBC to run SQL queries and retrive results. This is connected with NCSU Oracle DB. These APIs are then consumed by the Angular App which is present in the folder: `service-center-app`, which can be run by ng serve. Update the api url in environment.ts and environment.prod.ts file. + +The GitHub Repository is hosted here: https://github.com/deep-mm/DBMS-Car-Service-Center + +Application URL: https://yoururl.tech/svc + +API URL: https://service-center-api.azurewebsites.net \ No newline at end of file diff --git a/docs/ER_Diagram.pdf b/docs/ER_Diagram.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6ec7527c448c58131e4ca16befb0b8da6a80d559 GIT binary patch literal 61846 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 Z;7!xlKN!46P)dr50aBEFd>V$D{|{jndjJ3c literal 0 HcmV?d00001 diff --git a/docs/README.txt b/docs/README.txt new file mode 100644 index 0000000..cf1090a --- /dev/null +++ b/docs/README.txt @@ -0,0 +1,26 @@ +# AUTOR - Auto Repair and Service Management System + +CSC540 Fall 2022 - DBMS [Team 15] + +1. Deep Mehta - dmmehta2 +2. Rohan Shiveshwarkar - rsshives +3. Yash Sonar - ysonar +4. Kunal Patil - kpatil5 + +This is a Java 11 Spring Boot API and Angular 14 APP Project + +To cofigure this in local, ensure you have JDK 11 installed on your machine. Then update the following values in application.properties (src > main > resources) file: + +1. spring.datasource.username={NCSU Unity ID} +2. spring.datasource.password={NCSU Oracle DB Password} +3. ssh.password={NCSU Unity ID Password} + +Run the spring boot application and you will be able to see all the APIs listed in the form of Swagger UI. This utilizes JDBC to run SQL queries and retrieve results. This is connected with NCSU Oracle DB. + +These APIs are then consumed by the Angular App which is present in the folder: `service-center-app`, which can be run by ng serve. Update the api url in environment.ts and environment.prod.ts file. + +The GitHub Repository is hosted here: https://github.com/deep-mm/DBMS-Car-Service-Center [*Currently this is private, will be made public past submission deadline.] + +Application URL: https://yoururl.tech/svc [*It might take 2 minutes to load up if the application has been idle for a long time. Refresh it after 5 minutes if it still doesn't load.] + +API URL: https://service-center-api.azurewebsites.net \ No newline at end of file diff --git a/service-center-app/src/app/add-schedule/add-schedule.component.html b/service-center-app/src/app/add-schedule/add-schedule.component.html index 7390ca9..c0bf95a 100644 --- a/service-center-app/src/app/add-schedule/add-schedule.component.html +++ b/service-center-app/src/app/add-schedule/add-schedule.component.html @@ -1,84 +1,92 @@
-

Create new service schedule

+

Create new service schedule

-

Cart

- - - - - - - - - - - - - - - - - - - - - - - -
Service IDService NameService Time (hrs)Service Price ($)
{{service.id}}{{service.service_NAME}}{{getServiceTime(service)}}{{getServicePrice(service)}}
Total{{getTotalTime()}}{{getTotalPrice()}}
-
-Preferred Date
- - - - Enter a valid date - - -
-
-Preferred Start Time
- - - -
-
- +

Cart

+ + + + + + + + + + + + + + + + + + + + + + + +
Service IDService NameService Time (hrs)Service Price ($)
{{service.id}}{{service.service_NAME}}{{getServiceTime(service)}}{{getServicePrice(service)}}
Total{{getTotalTime()}}{{getTotalPrice()}}
+
+ Preferred Date
+ + + + + + Enter a valid date + + -

-

Repair Services

- - - - - - - - - - - - - - - - - - - -
Service IDService NameService Time (hrs)Service Price ($)Add to cart
{{service.id}}{{service.service_NAME}}{{getServiceTime(service)}}{{getServicePrice(service)}} - -
+
+
+ Preferred Start Time
+ + + +
+
+ -
-

Maintenance Service

-

Your next scheduled maintenance is: Schedule {{this.nextScheduledService}}

-
-

-
+

+

Repair Services

+ + + + + + + + + + + + + + + + + + + +
Service IDService NameService Time (hrs)Service Price ($)Add to cart
{{service.id}}{{service.service_NAME}}{{getServiceTime(service)}}{{getServicePrice(service)}} + +
+ +
+

Maintenance Service

+

Your next scheduled maintenance is: Schedule {{this.nextScheduledService}}

+
+

+ \ No newline at end of file diff --git a/service-center-app/src/app/add-schedule/add-schedule.component.ts b/service-center-app/src/app/add-schedule/add-schedule.component.ts index 4410a77..25c1e12 100644 --- a/service-center-app/src/app/add-schedule/add-schedule.component.ts +++ b/service-center-app/src/app/add-schedule/add-schedule.component.ts @@ -190,7 +190,7 @@ export class AddScheduleComponent implements OnInit { checkout() { this.loading = true; let datePipe = new DatePipe('en-US'); - let dateString = datePipe.transform(this.preferredDate, 'dd-MMM-yyyy')!.toString(); + let dateString = datePipe.transform(this.preferredDate, 'yyyy-MM-dd')!.toString(); let currentStartTime = this.preferredTime; this._apiService.getAvailableMechanic(this.customer.service_CENTER_ID, dateString).subscribe( (res: any) => { @@ -208,6 +208,9 @@ export class AddScheduleComponent implements OnInit { this.cartService.forEach(element => { let start_TIME = currentStartTime > 12 ? currentStartTime - 12 : currentStartTime; let end_TIME = +currentStartTime + this.getServiceTime(element); + if (currentStartTime <= 12 && end_TIME >= 1) { + end_TIME = end_TIME + 1; + } end_TIME = end_TIME > 12 ? end_TIME - 12 : end_TIME; currentStartTime = end_TIME; let serviceEvent = new ServiceEvent({ @@ -248,8 +251,35 @@ export class AddScheduleComponent implements OnInit { }, (err: any) => { this.loading = false; + this._snackBar.open('No mechanic available. Please select a different date', 'Close', { + duration: 2000, + }); console.log(err); } ) + } + + myFilter = (d: Date | null): boolean => { + const day = (d || new Date()).getDay(); + // Prevent Sunday from being selected. + return day !== 0; }; + + CheckDate() { + let day = this.preferredDate.getFullYear(); + if (this.preferredDate.getDay() == 0){ + this.preferredDate.setDate(this.preferredDate.getDate() + 1); + this._snackBar.open('Service center is closed on Sunday.', 'Close', { + duration: 2000, + }); + } + + if (this.preferredDate.getDay() == 6){ + this.remainingTime = 4; + this.time = this.time.slice(0, this.remainingTime + 1); + this._snackBar.open('Service center works from 8am - 1pm on Saturday.', 'Close', { + duration: 2000, + }); + } + } } diff --git a/service-center-app/src/app/add-service-center/add-service-center.component.html b/service-center-app/src/app/add-service-center/add-service-center.component.html index b59e32f..b3e084d 100644 --- a/service-center-app/src/app/add-service-center/add-service-center.component.html +++ b/service-center-app/src/app/add-service-center/add-service-center.component.html @@ -116,7 +116,7 @@

{{update?'Update':'New'}} Service Center

Email
+ maxlength="250" [class.is-invalid]="Email.invalid && (Email.touched || Email.dirty)" email> Enter a valid Email @@ -127,7 +127,7 @@

{{update?'Update':'New'}} Service Center

Phone
+ maxlength="10" minlength="10" [class.is-invalid]="Phone.invalid && (Phone.touched || Phone.dirty)"> Enter a valid Phone @@ -138,7 +138,7 @@

{{update?'Update':'New'}} Service Center

Username
+ maxlength="50" [class.is-invalid]="Username.invalid && (Username.touched || Username.dirty)"> Enter a valid Username @@ -149,7 +149,7 @@

{{update?'Update':'New'}} Service Center

Password
+ maxlength="50" [class.is-invalid]="Password.invalid && (Password.touched || Password.dirty)"> Enter a valid Password @@ -159,7 +159,7 @@

{{update?'Update':'New'}} Service Center

Salary
- Enter a valid salary amount diff --git a/service-center-app/src/app/app.component.html b/service-center-app/src/app/app.component.html index 8bb4590..a626204 100644 --- a/service-center-app/src/app/app.component.html +++ b/service-center-app/src/app/app.component.html @@ -2,6 +2,10 @@

AUTOR 🚘 - Auto Repair and Service Management System

+ +
diff --git a/service-center-app/src/app/app.module.ts b/service-center-app/src/app/app.module.ts index c2e851e..9b56b9c 100644 --- a/service-center-app/src/app/app.module.ts +++ b/service-center-app/src/app/app.module.ts @@ -36,6 +36,8 @@ import { AddLeaveComponent } from './add-leave/add-leave.component'; import { AddSwapComponent } from './add-swap/add-swap.component'; import { AddServiceComponent } from './add-service/add-service.component'; import { AddScheduleComponent } from './add-schedule/add-schedule.component'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatNativeDateModule } from '@angular/material/core'; @NgModule({ declarations: [ @@ -76,7 +78,9 @@ import { AddScheduleComponent } from './add-schedule/add-schedule.component'; MatSnackBarModule, MatCheckboxModule, MatSelectModule, - MatSlideToggleModule + MatSlideToggleModule, + MatDatepickerModule, + MatNativeDateModule ], providers: [HttpClient], bootstrap: [AppComponent] diff --git a/service-center-app/src/app/customer-home/customer-home.component.ts b/service-center-app/src/app/customer-home/customer-home.component.ts index 7aa14e0..9dad3fd 100644 --- a/service-center-app/src/app/customer-home/customer-home.component.ts +++ b/service-center-app/src/app/customer-home/customer-home.component.ts @@ -79,6 +79,13 @@ export class CustomerHomeComponent implements OnInit { this.customerCarService.deleteCustomerCar(customerCar.vin).subscribe((res: any) => { this.loading = false; this.customerCars = this.customerCars.filter((car: CustomerCar) => car.vin !== customerCar.vin); + if (this.customerCars.length === 0) { + this.customer.status = 0; + this._apiService.updateCustomer(this.customer).subscribe((res: any) => { + this.customer = res; + } + ); + } this._snackBar.open('Customer car deleted successfully!', 'Close', { duration: 3000, }); diff --git a/service-center-app/src/app/manager-home/manager-home.component.html b/service-center-app/src/app/manager-home/manager-home.component.html index b044e51..beb9eab 100644 --- a/service-center-app/src/app/manager-home/manager-home.component.html +++ b/service-center-app/src/app/manager-home/manager-home.component.html @@ -32,7 +32,6 @@

Service Center Employees

Phone Username Password - Actions @@ -46,9 +45,6 @@

Service Center Employees

{{employee.phone}} {{employee.username}} {{employee.password}} - - - diff --git a/service-center-app/src/app/receptionist-main/receptionist-main.component.html b/service-center-app/src/app/receptionist-main/receptionist-main.component.html index 89993b4..ec9ca2f 100644 --- a/service-center-app/src/app/receptionist-main/receptionist-main.component.html +++ b/service-center-app/src/app/receptionist-main/receptionist-main.component.html @@ -15,7 +15,6 @@ Username Password Status - Actions @@ -28,9 +27,6 @@ {{customer.username}} {{customer.password}} {{customer.status==1?'Active':'Inactive'}} - - - diff --git a/sql-files/set_up.sql b/sql-files/set_up.sql index 723f6fe..064a2c6 100644 --- a/sql-files/set_up.sql +++ b/sql-files/set_up.sql @@ -207,26 +207,96 @@ CREATE TABLE SWAP_SLOT ( REQUESTED_SERVICE_CENTER_ID ) ); -create or replace TRIGGER VERIFY_WAGE_IS_IN_LIMIT -BEFORE UPDATE OF hourly_rate ON HOURLY_PAID_EMPLOYEE -FOR EACH ROW -DECLARE maxWage REAL; minWage REAL; +create or replace TRIGGER VERIFY_WAGE_IS_IN_LIMIT BEFORE +UPDATE OF hourly_rate ON HOURLY_PAID_EMPLOYEE FOR EACH ROW +DECLARE maxWage REAL; +minWage REAL; BEGIN -SELECT SC.MAX_WAGE into maxWage FROM SERVICE_CENTER SC WHERE SC.service_center_id = :new.service_center_id; -SELECT SC.MIN_WAGE into minWage FROM SERVICE_CENTER SC WHERE SC.service_center_id = :new.service_center_id; -IF :new.hourly_rate > maxWage OR :new.hourly_rate < minWage -THEN :new.hourly_rate := :old.hourly_rate; +SELECT SC.MAX_WAGE into maxWage +FROM SERVICE_CENTER SC +WHERE SC.service_center_id = :new.service_center_id; +SELECT SC.MIN_WAGE into minWage +FROM SERVICE_CENTER SC +WHERE SC.service_center_id = :new.service_center_id; +IF :new.hourly_rate > maxWage +OR :new.hourly_rate < minWage THEN :new.hourly_rate := :old.hourly_rate; END IF; END; - -create or replace TRIGGER UPDATE_SERVICE_CENTER_STATUS -BEFORE INSERT ON EMPLOYEE -FOR EACH ROW -WHEN (new.ROLE = 3) +create or replace TRIGGER UPDATE_SERVICE_CENTER_STATUS BEFORE +INSERT ON EMPLOYEE FOR EACH ROW + WHEN (new.ROLE = 3) DECLARE totalMechanics INT; BEGIN -SELECT Count(*) into totalMechanics FROM EMPLOYEE E WHERE E.service_center_id = :new.service_center_id; -IF totalMechanics >= 3 -THEN UPDATE SERVICE_CENTER SC SET SC.operational_status = 1 WHERE SC.service_center_id = :new.service_center_id; +SELECT Count(*) into totalMechanics +FROM EMPLOYEE E +WHERE E.service_center_id = :new.service_center_id; +IF totalMechanics >= 3 THEN +UPDATE SERVICE_CENTER SC +SET SC.operational_status = 1 +WHERE SC.service_center_id = :new.service_center_id; END IF; +END; +create or replace TRIGGER CHECK_CUSTOMER_STATUS +AFTER +INSERT ON CUSTOMER_CAR FOR EACH ROW BEGIN +UPDATE CUSTOMER C +SET C.status = 1 +WHERE C.customer_id = :new.customer_id + AND C.service_center_id = :new.service_center_id; +END; +create or replace TRIGGER INSERT_SERVICE_CENTER_PROVIDES_SERVICE +AFTER +INSERT ON SERVICE FOR EACH ROW +DECLARE serviceCenter SERVICE_CENTER.service_center_id %type; +CURSOR serviceCenterCursor is +select SC.SERVICE_CENTER_ID +from SERVICE_CENTER SC; +BEGIN OPEN serviceCenterCursor; +LOOP FETCH serviceCenterCursor INTO serviceCenter; +EXIT +WHEN serviceCenterCursor %NOTFOUND; +INSERT INTO SERVICE_CENTER_PROVIDES_SERVICE +VALUES (serviceCenter, :new.id, 1, 100); +INSERT INTO SERVICE_CENTER_PROVIDES_SERVICE +VALUES (serviceCenter, :new.id, 2, 100); +INSERT INTO SERVICE_CENTER_PROVIDES_SERVICE +VALUES (serviceCenter, :new.id, 3, 100); +END LOOP; +CLOSE serviceCenterCursor; +END; +create or replace TRIGGER INSERT_SERVICE_CENTER_PROVIDES_SERVICE_ON_ADDING_SERVICE_CENTER +AFTER +INSERT ON SERVICE_CENTER FOR EACH ROW +DECLARE serviceId SERVICE.id %type; +CURSOR serviceCursor is +select S.id +from SERVICE S; +BEGIN OPEN serviceCursor; +LOOP FETCH serviceCursor INTO serviceId; +EXIT +WHEN serviceCursor %NOTFOUND; +INSERT INTO SERVICE_CENTER_PROVIDES_SERVICE +VALUES (:new.service_center_id, serviceId, 1, 100); +INSERT INTO SERVICE_CENTER_PROVIDES_SERVICE +VALUES (:new.service_center_id, serviceId, 2, 100); +INSERT INTO SERVICE_CENTER_PROVIDES_SERVICE +VALUES (:new.service_center_id, serviceId, 3, 100); +END LOOP; +CLOSE serviceCursor; +END; +create or replace TRIGGER AUTO_APPROVE_LEAVE BEFORE +INSERT ON LEAVE FOR EACH ROW BEGIN :new.status := 1; +END; +create or replace TRIGGER ON_SWAP_SLOT_APPROVE +AFTER +UPDATE ON SWAP_SLOT FOR EACH ROW + WHEN (new.status = 1) BEGIN +UPDATE SERVICE_EVENT SE +SET SE.mechanic_id = :new.requested_employee_id +WHERE :new.requestor_employee_id = SE.mechanic_id + AND :new.invoice_give = SE.invoice_id; +UPDATE SERVICE_EVENT SE +SET SE.mechanic_id = :new.requestor_employee_id +WHERE :new.requested_employee_id = SE.mechanic_id + AND :new.invoice_take = SE.invoice_id; END; \ No newline at end of file diff --git a/src/main/java/com/dbms/team15/controllers/ServiceEventController.java b/src/main/java/com/dbms/team15/controllers/ServiceEventController.java index e130b3b..6853a4e 100644 --- a/src/main/java/com/dbms/team15/controllers/ServiceEventController.java +++ b/src/main/java/com/dbms/team15/controllers/ServiceEventController.java @@ -101,8 +101,11 @@ public ServiceEvent getServiceEventByName(@PathVariable int service_id) { @GetMapping("/api/serviceEvent/getMechanic/{service_center_id}") public Integer getAvailableMechanic(@PathVariable int service_center_id, @RequestParam(value = "date", defaultValue = "") String date) { - String sql = "SELECT SE.MECHANIC_ID FROM SERVICE_EVENT SE WHERE SE.service_center_id = " + service_center_id - + " AND '" + date + "' NOT BETWEEN SE.START_TIME AND SE.END_TIME"; + + String sql = "SELECT UNIQUE SE.MECHANIC_ID FROM SERVICE_EVENT SE WHERE SE.service_center_id = " + + service_center_id + " AND NOT EXISTS (SELECT * FROM SERVICE_EVENT SE1 WHERE SE1.mechanic_id = SE.mechanic_id AND SE1.service_center_id = SE.service_center_id AND trunc(SE1.START_TIME) = TO_DATE('" + + date + "', 'YYYY-MM-DD')) AND NOT EXISTS (SELECT * FROM LEAVE L WHERE TO_DATE('" + + date + "', 'YYYY-MM-DD') BETWEEN trunc(L.START_DATE) AND trunc(L.END_DATE) AND L.employee_id = SE.mechanic_id AND L.service_center_id = SE.service_center_id AND L.status = 1)"; List mechanics = jdbcTemplate.queryForList( sql,