diff --git a/.DS_Store b/.DS_Store index d3b672a..fa161f9 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/mobileservice/.DS_Store b/mobileservice/.DS_Store index f6a8441..363c90b 100644 Binary files a/mobileservice/.DS_Store and b/mobileservice/.DS_Store differ diff --git a/mobileservice/gcc_mobile_service_uploads/.DS_Store b/mobileservice/gcc_mobile_service_uploads/.DS_Store index 0d599ec..20de68f 100644 Binary files a/mobileservice/gcc_mobile_service_uploads/.DS_Store and b/mobileservice/gcc_mobile_service_uploads/.DS_Store differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/.DS_Store b/mobileservice/gcc_mobile_service_uploads/app_icon/.DS_Store index f4c4f7c..f78d987 100644 Binary files a/mobileservice/gcc_mobile_service_uploads/app_icon/.DS_Store and b/mobileservice/gcc_mobile_service_uploads/app_icon/.DS_Store differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/15.png b/mobileservice/gcc_mobile_service_uploads/app_icon/15.png new file mode 100644 index 0000000..63698d4 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/15.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/30.png b/mobileservice/gcc_mobile_service_uploads/app_icon/30.png new file mode 100644 index 0000000..2d5d8ee Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/30.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/31.png b/mobileservice/gcc_mobile_service_uploads/app_icon/31.png new file mode 100644 index 0000000..2816a65 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/31.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/32.png b/mobileservice/gcc_mobile_service_uploads/app_icon/32.png new file mode 100644 index 0000000..f9c500c Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/32.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/5_25092024174715_dog.jpg b/mobileservice/gcc_mobile_service_uploads/app_icon/5_25092024174715_dog.jpg new file mode 100644 index 0000000..b9bb7a3 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/5_25092024174715_dog.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/D_18.png b/mobileservice/gcc_mobile_service_uploads/app_icon/D_18.png new file mode 100644 index 0000000..1a179f6 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/D_18.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/MI_42.png b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_42.png new file mode 100644 index 0000000..746a99b Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_42.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/MI_43.png b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_43.png new file mode 100644 index 0000000..415bd78 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_43.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/MI_44.png b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_44.png new file mode 100644 index 0000000..4bced05 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_44.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/MI_45.png b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_45.png new file mode 100644 index 0000000..6678b50 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_45.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/MI_46.png b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_46.png new file mode 100644 index 0000000..0e52ee5 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_46.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/MI_47.png b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_47.png new file mode 100644 index 0000000..85c9197 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_47.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/MI_63.png b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_63.png new file mode 100644 index 0000000..ec9185d Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_63.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/MI_64.png b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_64.png new file mode 100644 index 0000000..8958d37 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/MI_64.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_54.png b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_54.png new file mode 100644 index 0000000..b75c4be Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_54.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_55.png b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_55.png new file mode 100644 index 0000000..144c6c7 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_55.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_56.png b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_56.png new file mode 100644 index 0000000..5852876 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_56.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_57.png b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_57.png new file mode 100644 index 0000000..bc8027f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_57.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_58.png b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_58.png new file mode 100644 index 0000000..4e9e6b2 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_58.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_59.png b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_59.png new file mode 100644 index 0000000..3e8ebb2 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_59.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_60.png b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_60.png new file mode 100644 index 0000000..f78e017 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_60.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_61.png b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_61.png new file mode 100644 index 0000000..250c26b Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/icons/MI_61.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/.DS_Store b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/.DS_Store index d3ec1fe..b0404d5 100644 Binary files a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/.DS_Store and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/.DS_Store differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_1.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_1.png new file mode 100644 index 0000000..0be5caa Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_1.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_10.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_10.png new file mode 100644 index 0000000..9455582 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_10.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_11.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_11.png new file mode 100644 index 0000000..3e5b10f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_11.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_12.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_12.png new file mode 100644 index 0000000..2315e4e Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_12.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_13.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_13.png new file mode 100644 index 0000000..44988b6 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_13.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_14.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_14.png new file mode 100644 index 0000000..24a9578 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_14.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_15.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_15.png new file mode 100644 index 0000000..74d490f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_15.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_16.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_16.png new file mode 100644 index 0000000..21a4535 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_16.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_17.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_17.png new file mode 100644 index 0000000..9a6577b Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_17.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_3.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_3.png new file mode 100644 index 0000000..bc67ac9 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_3.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_5.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_5.png new file mode 100644 index 0000000..2a61fbb Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_5.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_6.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_6.png new file mode 100644 index 0000000..53d8bcc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_6.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_7.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_7.png new file mode 100644 index 0000000..ce42bdc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_7.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_8.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_8.png new file mode 100644 index 0000000..3f35028 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_8.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_9.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_9.png new file mode 100644 index 0000000..6c6097b Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/D_9.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep.zip b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep.zip new file mode 100644 index 0000000..06908b0 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep.zip differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/ACCOUNTS CENTRAL CELL.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/ACCOUNTS CENTRAL CELL.png new file mode 100644 index 0000000..a2c2dc4 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/ACCOUNTS CENTRAL CELL.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/BRIDGES.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/BRIDGES.png new file mode 100644 index 0000000..2315e4e Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/BRIDGES.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/BUILDINGS.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/BUILDINGS.png new file mode 100644 index 0000000..24a9578 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/BUILDINGS.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/BUS ROUTE ROADS.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/BUS ROUTE ROADS.png new file mode 100644 index 0000000..44988b6 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/BUS ROUTE ROADS.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/CHIEF ENGINEER OFFICE.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/CHIEF ENGINEER OFFICE.png new file mode 100644 index 0000000..e55d3f1 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/CHIEF ENGINEER OFFICE.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/COUNCIL.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/COUNCIL.png new file mode 100644 index 0000000..cfa10f8 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/COUNCIL.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/DISTRICT FAMILY WELFARE.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/DISTRICT FAMILY WELFARE.png new file mode 100644 index 0000000..51883eb Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/DISTRICT FAMILY WELFARE.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/D_1.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/D_1.png new file mode 100644 index 0000000..0be5caa Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/D_1.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/D_10.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/D_10.png new file mode 100644 index 0000000..9455582 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/D_10.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/D_11.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/D_11.png new file mode 100644 index 0000000..3e5b10f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/D_11.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/D_6.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/D_6.png new file mode 100644 index 0000000..53d8bcc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/D_6.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/D_7.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/D_7.png new file mode 100644 index 0000000..ce42bdc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/D_7.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/ELECTRICAL.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/ELECTRICAL.png new file mode 100644 index 0000000..bc67ac9 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/ELECTRICAL.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/ELEMENTARY EDUCATION.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/ELEMENTARY EDUCATION.png new file mode 100644 index 0000000..13676de Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/ELEMENTARY EDUCATION.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/HEALTH.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/HEALTH.png new file mode 100644 index 0000000..2a61fbb Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/HEALTH.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/LEGAL CELL.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/LEGAL CELL.png new file mode 100644 index 0000000..6526d59 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/LEGAL CELL.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/PLANNING AND TRAINING.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/PLANNING AND TRAINING.png new file mode 100644 index 0000000..9a6577b Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/PLANNING AND TRAINING.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/REVENUE.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/REVENUE.png new file mode 100644 index 0000000..74d490f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/REVENUE.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/SOLID WASTE MANAGEMENT.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/SOLID WASTE MANAGEMENT.png new file mode 100644 index 0000000..3f35028 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/SOLID WASTE MANAGEMENT.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/STORM WATER DRAINS.png b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/STORM WATER DRAINS.png new file mode 100644 index 0000000..6c6097b Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/app_icon/menu/icons Dep/STORM WATER DRAINS.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_activity/.DS_Store b/mobileservice/gcc_mobile_service_uploads/asset_activity/.DS_Store index 01682ca..166de2f 100644 Binary files a/mobileservice/gcc_mobile_service_uploads/asset_activity/.DS_Store and b/mobileservice/gcc_mobile_service_uploads/asset_activity/.DS_Store differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_5_08082024115517_1-login.png b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_5_08082024115517_1-login.png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_5_08082024115517_1-login.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_6_08082024140752_1-login (1).png b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_6_08082024140752_1-login (1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_6_08082024140752_1-login (1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_after_3_09082024100121_1-login(1).png b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_after_3_09082024100121_1-login(1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_after_3_09082024100121_1-login(1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_10_08082024145025_1-login.png b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_10_08082024145025_1-login.png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_10_08082024145025_1-login.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_11_08082024150552_1-login.png b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_11_08082024150552_1-login.png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_11_08082024150552_1-login.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_1_08082024153444_1-login.png b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_1_08082024153444_1-login.png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_1_08082024153444_1-login.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_1_08082024173336_1-login.png b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_1_08082024173336_1-login.png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_1_08082024173336_1-login.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_2_08082024161158_1-login.png b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_2_08082024161158_1-login.png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_2_08082024161158_1-login.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_2_09082024092735_1-login.png b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_2_09082024092735_1-login.png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_2_09082024092735_1-login.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_3_08082024161506_1-login.png b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_3_08082024161506_1-login.png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_3_08082024161506_1-login.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_7_08082024142341_1-login.png b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_7_08082024142341_1-login.png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_7_08082024142341_1-login.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_8_08082024144658_1-login.png b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_8_08082024144658_1-login.png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_8_08082024144658_1-login.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_9_08082024144748_1-login.png b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_9_08082024144748_1-login.png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_activity/1/1_before_9_08082024144748_1-login.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_images/.DS_Store b/mobileservice/gcc_mobile_service_uploads/asset_images/.DS_Store index 01682ca..166de2f 100644 Binary files a/mobileservice/gcc_mobile_service_uploads/asset_images/.DS_Store and b/mobileservice/gcc_mobile_service_uploads/asset_images/.DS_Store differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_images/1/1_08082024220731_1-login_(1).png b/mobileservice/gcc_mobile_service_uploads/asset_images/1/1_08082024220731_1-login_(1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_images/1/1_08082024220731_1-login_(1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_images/1/1_08082024223052_1-login(1).png b/mobileservice/gcc_mobile_service_uploads/asset_images/1/1_08082024223052_1-login(1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_images/1/1_08082024223052_1-login(1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/asset_images/1/1_09082024000023_box1.png b/mobileservice/gcc_mobile_service_uploads/asset_images/1/1_09082024000023_box1.png new file mode 100644 index 0000000..ae265a2 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/asset_images/1/1_09082024000023_box1.png differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/1_16082024175625_1-login(1).png b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/1_16082024175625_1-login(1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/1_16082024175625_1-login(1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024202939_CCTNSHitsDB-APP.jpg b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024202939_CCTNSHitsDB-APP.jpg new file mode 100644 index 0000000..0bbb2dc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024202939_CCTNSHitsDB-APP.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024203001_CCTNSHitsDB-APP.jpg b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024203001_CCTNSHitsDB-APP.jpg new file mode 100644 index 0000000..0bbb2dc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024203001_CCTNSHitsDB-APP.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024203015_CCTNSHitsDB-APP.jpg b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024203015_CCTNSHitsDB-APP.jpg new file mode 100644 index 0000000..0bbb2dc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024203015_CCTNSHitsDB-APP.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024230717_CCTNSHitsDB-APP.jpg b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024230717_CCTNSHitsDB-APP.jpg new file mode 100644 index 0000000..0bbb2dc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024230717_CCTNSHitsDB-APP.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024230856_CCTNSHitsDB-APP.jpg b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024230856_CCTNSHitsDB-APP.jpg new file mode 100644 index 0000000..0bbb2dc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024230856_CCTNSHitsDB-APP.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024230911_CCTNSHitsDB-APP.jpg b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024230911_CCTNSHitsDB-APP.jpg new file mode 100644 index 0000000..0bbb2dc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024230911_CCTNSHitsDB-APP.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024230941_CCTNSHitsDB-APP.jpg b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024230941_CCTNSHitsDB-APP.jpg new file mode 100644 index 0000000..0bbb2dc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024230941_CCTNSHitsDB-APP.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024231147_CCTNSHitsDB-APP.jpg b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024231147_CCTNSHitsDB-APP.jpg new file mode 100644 index 0000000..0bbb2dc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024231147_CCTNSHitsDB-APP.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024231152_CCTNSHitsDB-APP.jpg b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024231152_CCTNSHitsDB-APP.jpg new file mode 100644 index 0000000..0bbb2dc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024231152_CCTNSHitsDB-APP.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024231219_CCTNSHitsDB-APP.jpg b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024231219_CCTNSHitsDB-APP.jpg new file mode 100644 index 0000000..0bbb2dc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024231219_CCTNSHitsDB-APP.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024231300_CCTNSHitsDB-APP.jpg b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024231300_CCTNSHitsDB-APP.jpg new file mode 100644 index 0000000..0bbb2dc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/after_16082024231300_CCTNSHitsDB-APP.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024175756_1-login(1).png b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024175756_1-login(1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024175756_1-login(1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024175759_1-login(1).png b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024175759_1-login(1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024175759_1-login(1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024175846_1-login(1).png b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024175846_1-login(1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024175846_1-login(1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024180233_1-login(1).png b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024180233_1-login(1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024180233_1-login(1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024180305_1-login(1).png b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024180305_1-login(1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024180305_1-login(1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024180341_1-login(1).png b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024180341_1-login(1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024180341_1-login(1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024181228_1-login(1).png b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024181228_1-login(1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024181228_1-login(1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024181235_1-login(1).png b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024181235_1-login(1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024181235_1-login(1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024193720_1-login(1).png b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024193720_1-login(1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024193720_1-login(1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024194322_1-login(1).png b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024194322_1-login(1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024194322_1-login(1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024194348_1-login(1).png b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024194348_1-login(1).png new file mode 100644 index 0000000..dc4cf5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_16082024194348_1-login(1).png differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_19082024015425_OverAllPending.jpg b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_19082024015425_OverAllPending.jpg new file mode 100644 index 0000000..2a4d905 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_19082024015425_OverAllPending.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_19082024015459_OverAllPending.jpg b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_19082024015459_OverAllPending.jpg new file mode 100644 index 0000000..2a4d905 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/brr_activity_images/2024/08/before_19082024015459_OverAllPending.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/default b/mobileservice/gcc_mobile_service_uploads/default new file mode 100644 index 0000000..7326c4f --- /dev/null +++ b/mobileservice/gcc_mobile_service_uploads/default @@ -0,0 +1,316 @@ +## +# You should look at the following URL's in order to grasp a solid understanding +# of Nginx configuration files in order to fully unleash the power of Nginx. +# https://www.nginx.com/resources/wiki/start/ +# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/ +# https://wiki.debian.org/Nginx/DirectoryStructure +# +# In most cases, administrators will remove this file from sites-enabled/ and +# leave it as reference inside of sites-available where it will continue to be +# updated by the nginx packaging team. +# +# This file will automatically load configuration files provided by other +# applications, such as Drupal or Wordpress. These applications will be made +# available underneath a path with that package name, such as /drupal8. +# +# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. +## + +# Default server configuration +# +server { + #listen 80 default_server; + #listen [::]:80 default_server; + + # SSL configuration + # + listen 443 ssl; + listen [::]:443 ssl; + ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; + ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; + ssl_protocols TLSv1.2 TLSv1.3; + # listen 443 ssl default_server; + # listen [::]:443 ssl default_server; + # + # Note: You should disable gzip for SSL traffic. + # See: https://bugs.debian.org/773332 + # + # Read up on ssl_ciphers to ensure a secure configuration. + # See: https://bugs.debian.org/765782 + # + # Self signed certs generated by the ssl-cert package + # Don't use them in a production server! + # + # include snippets/snakeoil.conf; + + root /var/www/html; + + # Add index.php to the list if you are using PHP + index index.php index.html index.htm index.nginx-debian.html; + + server_name _; + + location / { + + if ($server_port = 8061) { + return 301 http://localhost/maintenance.html; + } + # First attempt to serve request as file, then + # as directory, then fall back to displaying a 404. + try_files $uri $uri/ =404; + } + +# PHPMyadmin + location /phpmyadmin { + proxy_pass http://localhost/phpmyadmin; + proxy_buffering off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + } + +#MyPortal + +location /myportal { + proxy_pass http://localhost/myportal/public/index.php; + proxy_buffering off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + +location /myportal/public/css { + alias /var/www/html/myportal/public/css; + } + location /myportal/public/vendor { + alias /var/www/html/myportal/public/vendor; + } + location /myportal/public/index.php/user-uploads { + alias /var/www/html/myportal/public/user-uploads; + } + + } + + location /myportal/public/css { + # alias /var/www/html/myportal/public/css; + } + location /myportal/public/vendor { + # alias /var/www/html/myportal/public/vendor; + } + location /myportal/public/index.php/user-uploads { + # alias /var/www/html/myportal/public/user-uploads; + } + +# Pet reg + location /pet { + proxy_pass http://localhost:8061; + proxy_buffering off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + } + + +# Define a location block to serve files from the /home/mm/projects directory + # location /files/ { + # alias /home/mm/projects/; + # autoindex on; # Enable directory listing if needed + # } + +# Block access to files in /home/mm/projects directory + location /files/ { + deny all; + return 403; + } + + # Allow your web application to serve files from /home/mm/projects directory + location /gcc/upload_files/ { + alias /home/mm/projects/; + } + +# Makkaludan Mudhalvar + location /mm { + proxy_pass http://localhost:8070; + proxy_buffering off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + + location /mm/assets/ { + #proxy_pass http://localhost:8070/assets/; + } + } + +# CM Dashboard + location /cm { + proxy_pass http://localhost:8066; + proxy_buffering off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + } + +# GCC PlayStore Support + location /support { + proxy_pass http://localhost:8069; + proxy_buffering off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + location /support/assets/ { + proxy_pass http://localhost:8069/assets/; + } + location /support/feedback/ { + proxy_pass http://localhost:8069/feedback/; + } + } + +# GCC Official App Mobile (gccofficialapp) + location /gccofficialapp { + proxy_pass http://localhost:8067; + proxy_buffering off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + location /gccofficialapp/assets/ { + proxy_pass http://localhost:8067/assets/; + } + location /gccofficialapp/feedback/ { + proxy_pass http://localhost:8067/feedback/; + } + } + + +# Makkalai Thedi Mayor + location /mtm { + proxy_pass http://localhost:8060; + proxy_buffering off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + location /mtm/assets/ { + proxy_pass http://localhost:8060/assets/; + } + location /mtm/login { + proxy_pass http://localhost:8060/login; + } + location /mtm/api/ { + proxy_pass http://localhost:8060/api/; + } + } +# QR Service - GCC Asset Feedback + location /qrfeedback { + proxy_pass http://localhost:8065/public-feedback; + proxy_buffering off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + location /qrfeedback/assets/ { + proxy_pass http://localhost:8065/assets/; + } + location /qrfeedback/api/ { + proxy_pass http://localhost:8065/api/; + } + } + +# GCC Portal + location /gcc { + proxy_pass http://localhost:8064/gcc; + proxy_connect_timeout 120s; + proxy_read_timeout 240s; + proxy_send_timeout 10s; + proxy_buffering off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + location /gcc/assets/ { + proxy_pass http://localhost:8064/assets/; + } + #For Upload file + location /gcc/uploads/ { + alias /home/mm/projects/gccoffice_uploads/; + #autoindex on; # Enable directory listing if needed + } + } + +# Election Portal + location /election { + proxy_pass http://localhost:8065/election; + proxy_connect_timeout 120s; + proxy_read_timeout 240s; + proxy_send_timeout 10s; + proxy_buffering off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + location /election/assets/ { + proxy_pass http://localhost:8065/assets/; + } + #For Upload file + location /election/uploads/ { + alias /home/mm/projects/election_uploads/; + #autoindex on; # Enable directory listing if needed + } + } + +# Hall Booking + location /communityhall { + proxy_pass http://localhost:8062; + proxy_buffering off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + + location /communityhall/assets/ { + proxy_pass http://localhost:8062/assets/; + } + #For Upload file + location /communityhall/images/ { + alias /home/mm/projects/communityHallDocuments/; + #autoindex on; # Enable directory listing if needed + } + } +#location /support/assets/ { + # proxy_pass http://localhost:8069/assets/; + # proxy_buffering off; + # proxy_set_header X-Real-IP $remote_addr; + # proxy_set_header X-Forwarded-Host $host; + # proxy_set_header X-Forwarded-Port $server_port; + #} + # pass PHP scripts to FastCGI server + # + #location ~ \.php$ { + # include snippets/fastcgi-php.conf; + # + # # With php-fpm (or other unix sockets): + # fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; + # # With php-cgi (or other tcp sockets): + # fastcgi_pass 127.0.0.1:9000; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} +} + + +# Virtual Host configuration for example.com +# +# You can move that to a different file under sites-available/ and symlink that +# to sites-enabled/ to enable it. +# +#server { +# listen 80; +# listen [::]:80; +# +# server_name example.com; +# +# root /var/www/example.com; +# index index.html; +# +# location / { +# try_files $uri $uri/ =404; +# } +#} diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2/2_04092024201313_CCTNSHitsDB-APP.jpg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2/2_04092024201313_CCTNSHitsDB-APP.jpg new file mode 100644 index 0000000..0bbb2dc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2/2_04092024201313_CCTNSHitsDB-APP.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2/2_05092024084212_CCTNSHitsDB-APP.jpg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2/2_05092024084212_CCTNSHitsDB-APP.jpg new file mode 100644 index 0000000..0bbb2dc Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2/2_05092024084212_CCTNSHitsDB-APP.jpg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/challan_2_06092024141630_WhatsAppImage2024-08-30at12.49.03(2).jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/challan_2_06092024141630_WhatsAppImage2024-08-30at12.49.03(2).jpeg new file mode 100644 index 0000000..23d6d08 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/challan_2_06092024141630_WhatsAppImage2024-08-30at12.49.03(2).jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/challan_2_06092024141759_WhatsAppImage2024-08-30at12.49.03(2).jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/challan_2_06092024141759_WhatsAppImage2024-08-30at12.49.03(2).jpeg new file mode 100644 index 0000000..23d6d08 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/challan_2_06092024141759_WhatsAppImage2024-08-30at12.49.03(2).jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/challan_2_06092024141932_WhatsAppImage2024-08-30at12.49.03(2).jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/challan_2_06092024141932_WhatsAppImage2024-08-30at12.49.03(2).jpeg new file mode 100644 index 0000000..23d6d08 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/challan_2_06092024141932_WhatsAppImage2024-08-30at12.49.03(2).jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/challan_2_06092024141949_WhatsAppImage2024-08-30at12.49.03(2).jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/challan_2_06092024141949_WhatsAppImage2024-08-30at12.49.03(2).jpeg new file mode 100644 index 0000000..23d6d08 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/challan_2_06092024141949_WhatsAppImage2024-08-30at12.49.03(2).jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/challan_2_06092024142024_WhatsAppImage2024-08-30at12.49.03(2).jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/challan_2_06092024142024_WhatsAppImage2024-08-30at12.49.03(2).jpeg new file mode 100644 index 0000000..23d6d08 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/challan_2_06092024142024_WhatsAppImage2024-08-30at12.49.03(2).jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/close_3_06092024145251_WhatsAppImage2024-08-30at12.49.03(2).jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/close_3_06092024145251_WhatsAppImage2024-08-30at12.49.03(2).jpeg new file mode 100644 index 0000000..23d6d08 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/close_3_06092024145251_WhatsAppImage2024-08-30at12.49.03(2).jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/close_3_06092024145350_WhatsAppImage2024-08-30at12.49.03(2).jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/close_3_06092024145350_WhatsAppImage2024-08-30at12.49.03(2).jpeg new file mode 100644 index 0000000..23d6d08 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/close_3_06092024145350_WhatsAppImage2024-08-30at12.49.03(2).jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/close_3_06092024145558_WhatsAppImage2024-08-30at12.49.03(2).jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/close_3_06092024145558_WhatsAppImage2024-08-30at12.49.03(2).jpeg new file mode 100644 index 0000000..23d6d08 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/close_3_06092024145558_WhatsAppImage2024-08-30at12.49.03(2).jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_1_05092024154815_pan-card.jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_1_05092024154815_pan-card.jpeg new file mode 100644 index 0000000..267dd5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_1_05092024154815_pan-card.jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_1_05092024154847_pan-card.jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_1_05092024154847_pan-card.jpeg new file mode 100644 index 0000000..267dd5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_1_05092024154847_pan-card.jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_1_05092024154857_pan-card.jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_1_05092024154857_pan-card.jpeg new file mode 100644 index 0000000..267dd5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_1_05092024154857_pan-card.jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_3_05092024155003_pan-card.jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_3_05092024155003_pan-card.jpeg new file mode 100644 index 0000000..267dd5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_3_05092024155003_pan-card.jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_3_05092024155206_pan-card.jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_3_05092024155206_pan-card.jpeg new file mode 100644 index 0000000..267dd5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_3_05092024155206_pan-card.jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_3_05092024155229_pan-card.jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_3_05092024155229_pan-card.jpeg new file mode 100644 index 0000000..267dd5f Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/2024/09/fine_3_05092024155229_pan-card.jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024175449_WhatsAppImage2024-09-21at18.40.47.jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024175449_WhatsAppImage2024-09-21at18.40.47.jpeg new file mode 100644 index 0000000..7da9ce8 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024175449_WhatsAppImage2024-09-21at18.40.47.jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024175541_WhatsAppImage2024-09-21at18.40.47.jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024175541_WhatsAppImage2024-09-21at18.40.47.jpeg new file mode 100644 index 0000000..7da9ce8 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024175541_WhatsAppImage2024-09-21at18.40.47.jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024175630_WhatsAppImage2024-09-21at18.40.47.jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024175630_WhatsAppImage2024-09-21at18.40.47.jpeg new file mode 100644 index 0000000..7da9ce8 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024175630_WhatsAppImage2024-09-21at18.40.47.jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024175742_WhatsAppImage2024-09-21at18.40.47.jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024175742_WhatsAppImage2024-09-21at18.40.47.jpeg new file mode 100644 index 0000000..7da9ce8 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024175742_WhatsAppImage2024-09-21at18.40.47.jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024175839_WhatsAppImage2024-09-21at18.40.47.jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024175839_WhatsAppImage2024-09-21at18.40.47.jpeg new file mode 100644 index 0000000..7da9ce8 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024175839_WhatsAppImage2024-09-21at18.40.47.jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024180236_WhatsAppImage2024-09-21at18.40.47.jpeg b/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024180236_WhatsAppImage2024-09-21at18.40.47.jpeg new file mode 100644 index 0000000..7da9ce8 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/penalty_activity/pos/2024/09/challan_1_30092024180236_WhatsAppImage2024-09-21at18.40.47.jpeg differ diff --git a/mobileservice/gcc_mobile_service_uploads/sos_rescue_activity_images/2024/08/24/1_24082024131015_300000-Page1-16884680450038429284263760162296.jpg b/mobileservice/gcc_mobile_service_uploads/sos_rescue_activity_images/2024/08/24/1_24082024131015_300000-Page1-16884680450038429284263760162296.jpg new file mode 100644 index 0000000..1df2782 Binary files /dev/null and b/mobileservice/gcc_mobile_service_uploads/sos_rescue_activity_images/2024/08/24/1_24082024131015_300000-Page1-16884680450038429284263760162296.jpg differ diff --git a/mobileservice/src/.DS_Store b/mobileservice/src/.DS_Store index fb32258..3fa9e7e 100644 Binary files a/mobileservice/src/.DS_Store and b/mobileservice/src/.DS_Store differ diff --git a/mobileservice/src/main/.DS_Store b/mobileservice/src/main/.DS_Store index d697744..b9a0adb 100644 Binary files a/mobileservice/src/main/.DS_Store and b/mobileservice/src/main/.DS_Store differ diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/MobileServiceApplication.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/MobileServiceApplication.java index a36334f..c3cd50d 100644 --- a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/MobileServiceApplication.java +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/MobileServiceApplication.java @@ -1,5 +1,7 @@ package in.gov.chennaicorporation.mobileservice; +import java.util.TimeZone; + import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -7,6 +9,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; public class MobileServiceApplication { public static void main(String[] args) { + // Set the timezone to Asia/Kolkata + TimeZone.setDefault(TimeZone.getTimeZone("Asia/Kolkata")); SpringApplication.run(MobileServiceApplication.class, args); } diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/configuration/DataSourceConfig.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/configuration/DataSourceConfig.java index 7a669b1..3b89a47 100644 --- a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/configuration/DataSourceConfig.java +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/configuration/DataSourceConfig.java @@ -20,14 +20,14 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement public class DataSourceConfig { - private static String host = "localhost:3306"; + //private static String host = "localhost:3306"; + //private static String dbpassword = ""; + //private static String dbpassword = "gccroot"; - private static String dbpassword = "gccroot"; - //private static String dbpassword = ""; // AWS - //private static String host = "gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com:3306"; - //private static String dbpassword = "gcc-facial"; + private static String host = "gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com:3306"; + private static String dbpassword = "gcc-facial-password"; //////////////////////////////(For GCC APP) //////////////////////// @Configuration @@ -87,7 +87,7 @@ public class DataSourceConfig { public DataSource mysqlPenaltyDataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); - dataSource.setUrl("jdbc:mysql://"+host+"/gcc_penalty"); + dataSource.setUrl("jdbc:mysql://"+host+"/gcc_penalty_pos"); dataSource.setUsername("root"); dataSource.setPassword(dbpassword); return dataSource; @@ -137,7 +137,41 @@ public class DataSourceConfig { dataSource.setPassword(dbpassword); return dataSource; } + + //////////////////////////////(For Stray Dog (veterinary)) //////////////////////// + @Bean(name = "mysqlGccStraydogsDataSource") + public DataSource mysqlGccStraydogsDataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://"+host+"/gcc_stray_dogs"); + dataSource.setUsername("root"); + dataSource.setPassword(dbpassword); + return dataSource; + } + //////////////////////////////(For Schools) //////////////////////// + @Bean(name = "mysqlGccSchoolsDataSource") + public DataSource mysqlGccSchoolsDataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://"+host+"/gcc_schools"); + dataSource.setUsername("root"); + dataSource.setPassword(dbpassword); + return dataSource; + } + + //////////////////////////////(For Parks and Playground) //////////////////////// + @Bean(name = "mysqlGccParksDataSource") + public DataSource mysqlGccParksDataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://"+host+"/gcc_parks_playground"); + dataSource.setUsername("root"); + dataSource.setPassword(dbpassword); + return dataSource; + } + + ////////////////////////////// ORACLE //////////////////////// @Bean(name = "oracleERPDataSource") public DataSource oracleERPDataSource() { @@ -148,4 +182,5 @@ public class DataSourceConfig { dataSource.setPassword("FAS"); return dataSource; } + } \ No newline at end of file diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/controller/APIOfficialController.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/controller/APIOfficialController.java index b1601e8..f7b5d9c 100644 --- a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/controller/APIOfficialController.java +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/controller/APIOfficialController.java @@ -30,6 +30,11 @@ public class APIOfficialController { return "Invalid Url"; } + @GetMapping({"/versionCheck"}) // Template + public List versionCheck() { + return officialAPIService.versionCheck(); + } + // API FOR TOTHER APP @GetMapping(value="/sendOTP") public List sendOTP(HttpServletRequest request, diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/controller/MainController.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/controller/MainController.java index 58bee1e..14dcd1f 100644 --- a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/controller/MainController.java +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/controller/MainController.java @@ -1,16 +1,25 @@ package in.gov.chennaicorporation.mobileservice.controller; +import java.util.List; +import java.util.Map; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import in.gov.chennaicorporation.mobileservice.service.MainService; +import in.gov.chennaicorporation.mobileservice.service.OfficialAPIService; @RequestMapping("/gccofficialapp") @Controller("mainController") public class MainController { + @Autowired + private MainService mainService; private final Environment environment; @Autowired @@ -26,7 +35,7 @@ public class MainController { return "error"; } - @GetMapping({"support"}) + @GetMapping({"/support"}) public String support(Model model) { String assetsBaseUrl = environment.getProperty("assets.base-url"); model.addAttribute("assetsBaseUrl", assetsBaseUrl); diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccactivity/controller/APIActivityController.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccactivity/controller/APIActivityController.java index da89e7d..56061df 100644 --- a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccactivity/controller/APIActivityController.java +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccactivity/controller/APIActivityController.java @@ -100,6 +100,19 @@ public class APIActivityController { return activity.filterReportsByDate(assetTypeId, fromDate, toDate, fromDate, toDate, streetid, loginId); } + @GetMapping(value = "/asset/dashboardFiletReport") + public List> dashboardFiletReport( + @RequestParam(value = "assetTypeId", required = false) String assetTypeId, + @RequestParam(value = "fromDate", required = false) String fromDate, + @RequestParam(value = "toDate", required = false) String toDate, + @RequestParam(value = "zone", required = false) String zone, + @RequestParam(value = "ward", required = false) String ward, + @RequestParam(value = "streetid", required = false) String streetid, + @RequestParam(value = "loginId", required = false) String loginId + ){ + return activity.dashboardFiletReport(assetTypeId, fromDate, toDate, zone, ward, streetid, loginId); + } + @GetMapping("/sendwhatsapp") public String fetchApi() { String url="https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to=7845014181&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Welcome to GCC%21+%0A%0AYour+OTP+for+GCC+Community+Centre+is+36837+."; diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccactivity/service/Activity.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccactivity/service/Activity.java index 71204fa..0df46a2 100644 --- a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccactivity/service/Activity.java +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccactivity/service/Activity.java @@ -48,7 +48,7 @@ public class Activity { private JdbcTemplate jdbcActivityTemplate; private DateTimeUtil dateTimeUtil; private final Environment environment; - + private String fileBaseUrl; @Autowired public void setDataSource(@Qualifier("mysqlActivityDataSource") DataSource activityDataSource) { this.jdbcActivityTemplate = new JdbcTemplate(activityDataSource); @@ -57,6 +57,7 @@ public class Activity { @Autowired public Activity(Environment environment) { this.environment = environment; + this.fileBaseUrl=environment.getProperty("fileBaseUrl"); } private byte[] compressImage(BufferedImage image, float quality) throws IOException { @@ -178,6 +179,7 @@ public String assetFileUpload(String catId, MultipartFile file) { uploadDirectory = uploadDirectory + serviceFolderName + catId; try { + System.out.println("file-size: "+file.getBytes().toString()); // Create directory if it doesn't exist Path directoryPath = Paths.get(uploadDirectory); if (!Files.exists(directoryPath)) { @@ -219,7 +221,7 @@ public String assetFileUpload(String catId, MultipartFile file) { String serviceFolderName = environment.getProperty("activity_new_asset_foldername"); String filePath=serviceFolderName + assetTypeId+"/"; //String sqlQuery = "SELECT *,CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files/"+filePath+"', image) AS imageUrl FROM `asset_list` WHERE `category_id`=? AND `streetid`=?"; - String sqlQuery="SELECT al.*, CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files/', al.image) AS imageUrl, " + String sqlQuery="SELECT al.*, CONCAT('"+fileBaseUrl+"/gccofficialapp/files/', al.image) AS imageUrl, " + "af.feedback_date AS lastfeedbackdate FROM asset_list al " + "LEFT JOIN ( SELECT af1.*, af2.latest_feedback_date FROM activity_feedback af1 " + "INNER JOIN ( SELECT asset_id, MAX(feedback_date) AS latest_feedback_date FROM activity_feedback GROUP BY asset_id ) af2 " @@ -519,7 +521,7 @@ public String assetFileUpload(String catId, MultipartFile file) { String serviceFolderName = environment.getProperty("activity_foldername"); String filePath=serviceFolderName + catId+"/"; - String sqlQuery3 = "SELECT *,CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files/"+filePath+"', filename) AS imageUrl " + String sqlQuery3 = "SELECT *,CONCAT('"+fileBaseUrl+"/gccofficialapp/files/"+filePath+"', filename) AS imageUrl " + "FROM `activity_feedback_file` WHERE feedback_id=? or feedback_id=?"; List> result3 = jdbcActivityTemplate.queryForList(sqlQuery3, feedback_id, feedback_id_before); @@ -556,7 +558,7 @@ public String assetFileUpload(String catId, MultipartFile file) { //uploadDirectory = uploadDirectory + serviceFolderName + catId; String serviceFolderName = environment.getProperty("activity_foldername"); String filePath=serviceFolderName + catId+"/"; - String sqlQuery3 = "SELECT *,CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files/"+filePath+"', filename) AS imageUrl FROM `activity_feedback_file` WHERE feedback_id=?"; + String sqlQuery3 = "SELECT *,CONCAT('"+fileBaseUrl+"/gccofficialapp/files/"+filePath+"', filename) AS imageUrl FROM `activity_feedback_file` WHERE feedback_id=?"; List> result3 = jdbcActivityTemplate.queryForList(sqlQuery3, feedback_id); // Add the result2 and result3 to the main result map @@ -590,7 +592,7 @@ public String assetFileUpload(String catId, MultipartFile file) { //uploadDirectory = uploadDirectory + serviceFolderName + catId; String serviceFolderName = environment.getProperty("activity_foldername"); String filePath=serviceFolderName + catId+"/"; - String sqlQuery3 = "SELECT *,CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files/"+filePath+"', filename) AS imageUrl FROM `activity_feedback_file` WHERE feedback_id=?"; + String sqlQuery3 = "SELECT *,CONCAT('"+fileBaseUrl+"/gccofficialapp/files/"+filePath+"', filename) AS imageUrl FROM `activity_feedback_file` WHERE feedback_id=?"; List> result3 = jdbcActivityTemplate.queryForList(sqlQuery3, feedback_id); // Add the result2 and result3 to the main result map @@ -680,12 +682,22 @@ public String assetFileUpload(String catId, MultipartFile file) { // Group by zone sqlQuery.append(" GROUP BY "+groupQuery); + // Add HAVING clause to filter out rows where total_started and total_completed are both zero + sqlQuery.append(" HAVING (COALESCE(SUM(CASE WHEN aff.fileaction = 'before' THEN 1 ELSE 0 END), 0) > 0 OR " + + "COALESCE(SUM(CASE WHEN aff.fileaction = 'after' THEN 1 ELSE 0 END), 0) > 0)"); + // Prepare parameters List params = new ArrayList<>(); if (fromDate != null && toDate != null) { + System.out.println("filterReports:"); + System.out.println("From Date:" + fromDate); + System.out.println("To Date:" + toDate); fromDate = convertDateFormat(fromDate,0); - toDate = convertDateFormat(toDate,1); + toDate = convertDateFormat(toDate,0); + + fromDate = fromDate + " 00:00:00"; + toDate = toDate + " 23:59:59"; params.add(fromDate); params.add(toDate); @@ -734,7 +746,7 @@ public String assetFileUpload(String catId, MultipartFile file) { sqlQueryOverall.append(" AND feedback_date BETWEEN ? AND ?"); } - sqlQueryOverall.append(" GROUP BY asset_id) latest_feedback_dates " + sqlQueryOverall.append(" GROUP BY asset_id) latest_feedback_dates " + " ON " + " af.asset_id = latest_feedback_dates.asset_id " + " AND af.feedback_date = latest_feedback_dates.latest_feedback_date " @@ -757,6 +769,10 @@ public String assetFileUpload(String catId, MultipartFile file) { sqlQueryOverall.append(" AND al.category_id = ?"); } + // Add HAVING clause to filter out rows where total_started and total_completed are both zero + sqlQueryOverall.append(" HAVING (COALESCE(SUM(CASE WHEN aff.fileaction = 'before' THEN 1 ELSE 0 END), 0) > 0 OR " + + "COALESCE(SUM(CASE WHEN aff.fileaction = 'after' THEN 1 ELSE 0 END), 0) > 0)"); + // Execute overall query List> overallResult = jdbcActivityTemplate.queryForList(sqlQueryOverall.toString(), params.toArray()); @@ -812,6 +828,7 @@ public String assetFileUpload(String catId, MultipartFile file) { + "GROUP BY " + " `asset_list`.`id`"; + System.out.println(sqlQueryForTasks); // Execute the query to get the tasks List> taskResult = jdbcActivityTemplate.queryForList(sqlQueryForTasks, fromDate, toDate, assetType, streetid); @@ -840,7 +857,103 @@ public String assetFileUpload(String catId, MultipartFile file) { // Query to get feedback files for the feedback_id String serviceFolderName = environment.getProperty("activity_foldername"); String filePath = serviceFolderName + catId + "/"; - String sqlQueryForFeedbackFiles = "SELECT *,CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files/" + filePath + "', filename) " + String sqlQueryForFeedbackFiles = "SELECT *,CONCAT('"+fileBaseUrl+"/gccofficialapp/files/" + filePath + "', filename) " + + "AS imageUrl FROM `activity_feedback_file` WHERE feedback_id IN (" + feedbackIds + ")"; + List> feedbackFileResult = jdbcActivityTemplate.queryForList(sqlQueryForFeedbackFiles); + System.out.println(sqlQueryForFeedbackFiles + feedbackIds); + // Add feedback data and files to the task result + task.put("feedback_value", feedbackDataResult); + task.put("feedback_file", feedbackFileResult); + } + } + + return taskResult; + } + + + @Transactional + public List> dashboardFiletReport( + String assetType, + String fromDate, + String toDate, + String zone, + String ward, + String streetid, + String loginId) { + + // Step 1: Generate all dates within the specified month and year + StringBuilder sqlQuery = new StringBuilder("SELECT " + + " `asset_list`.`id`," + + " `asset_list`.`category_id`, " + + " `asset_list`.`image`, " + + " `asset_list`.`latitude`, " + + " `asset_list`.`longitude`, " + + " `asset_list`.`zone`, " + + " `asset_list`.`ward`, " + + " `asset_list`.`streetid`, " + + " `asset_list`.`streetname`, " + + " `asset_list`.`cdate`, " + + " `asset_list`.`cby`, " + + " `asset_list`.`isactive`, " + + " `asset_list`.`isdelete`, " + + " `asset_list`.`gis_id`, " + + " GROUP_CONCAT(`activity_feedback`.`id`) AS feedback_ids " + + "FROM " + + " `activity_feedback` " + + "JOIN " + + " `asset_list` ON `asset_list`.`id` = `activity_feedback`.`asset_id` " + + "WHERE 1=1 "); + + + + // Add additional filters if provided + if (fromDate != null && toDate != null) { + sqlQuery.append(" AND activity_feedback.feedback_date BETWEEN '"+fromDate+"' AND '"+toDate+"' "); + } + if (zone != null && !zone.isEmpty() && !zone.isBlank()) { + sqlQuery.append(" AND asset_list.zone = '"+zone+"'"); + } + if (ward != null && !ward.isEmpty() && !ward.isBlank()) { + sqlQuery.append(" AND asset_list.ward = '"+zone+"'"); + } + if (streetid != null && !streetid.isEmpty() && !streetid.isBlank()) { + sqlQuery.append(" AND asset_list.streetid = '"+streetid+"'"); + } + if (assetType != null && !assetType.isEmpty() && !assetType.isBlank()) { + sqlQuery.append(" AND asset_list.category_id = '"+assetType+"'"); + } + + sqlQuery.append(" AND (`asset_list`.`isactive`=1 AND `asset_list`.`isdelete`=0) GROUP BY `asset_list`.`id`"); + + System.out.println(sqlQuery); + // Execute the query to get the tasks + List> taskResult = jdbcActivityTemplate.queryForList(sqlQuery.toString()); + + // Step 2: For each task, load the detailed feedback similar to loadAssetFeedback method + for (Map task : taskResult) { + + String assetId = task.get("id").toString(); + String catId = task.get("category_id").toString(); + String feedbackIds = task.get("feedback_ids").toString(); + + // Query to get the last feedback by user for the given asset + String sqlQueryForFeedback = "SELECT * FROM `activity_feedback` WHERE (`isactive`=1 AND `isdelete`=0) " + + "AND (`asset_id`="+assetId+" AND id IN ("+feedbackIds+")) ORDER BY `feedback_date` DESC LIMIT 1"; + + // Execute the query and get the feedback result + List> feedbackResult = jdbcActivityTemplate.queryForList(sqlQueryForFeedback); + if (!feedbackResult.isEmpty()) { + String feedback_id = feedbackResult.get(0).get("id").toString(); + + // Query to get feedback data for the feedback_id + String sqlQueryForFeedbackData = "SELECT *,`activity_questions`.english,`activity_questions`.tamil FROM `activity_feedback_data`, `activity_questions` WHERE feedback_id=? " + + "AND `activity_questions`.qid = `activity_feedback_data`.`qid`"; + List> feedbackDataResult = jdbcActivityTemplate.queryForList(sqlQueryForFeedbackData, feedback_id); + + // Query to get feedback files for the feedback_id + String serviceFolderName = environment.getProperty("activity_foldername"); + String filePath = serviceFolderName + catId + "/"; + String sqlQueryForFeedbackFiles = "SELECT *,CONCAT('"+fileBaseUrl+"/gccofficialapp/files/" + filePath + "', filename) " + "AS imageUrl FROM `activity_feedback_file` WHERE feedback_id IN (" + feedbackIds + ")"; List> feedbackFileResult = jdbcActivityTemplate.queryForList(sqlQueryForFeedbackFiles); System.out.println(sqlQueryForFeedbackFiles + feedbackIds); @@ -853,6 +966,7 @@ public String assetFileUpload(String catId, MultipartFile file) { return taskResult; } + /* @Transactional public List> filterReportsByDate( diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccactivity/service/MassClearn.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccactivity/service/MassClearn.java index eb15c4a..fbcb5ee 100644 --- a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccactivity/service/MassClearn.java +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccactivity/service/MassClearn.java @@ -39,6 +39,7 @@ import org.springframework.web.multipart.MultipartFile; public class MassClearn { private JdbcTemplate jdbcActivityTemplate; private final Environment environment; + private String fileBaseUrl; @Autowired public void setDataSource(@Qualifier("mysqlActivityDataSource") DataSource activityDataSource) { @@ -48,6 +49,7 @@ public class MassClearn { @Autowired public MassClearn(Environment environment) { this.environment = environment; + this.fileBaseUrl=environment.getProperty("fileBaseUrl"); } private byte[] compressImage(BufferedImage image, float quality) throws IOException { @@ -242,7 +244,7 @@ public class MassClearn { return result; }else { - String sqlQuery3 = "SELECT *,CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files', filepath) AS imageUrl " + String sqlQuery3 = "SELECT *,CONCAT('"+fileBaseUrl+"/gccofficialapp/files', filepath) AS imageUrl " + "FROM `brr_task_activity_log` WHERE taskid=? ORDER BY `id` DESC"; List> result2 = jdbcActivityTemplate.queryForList(sqlQuery3, taskId); @@ -672,7 +674,7 @@ public class MassClearn { String sqlQuery2 = "(" + " SELECT " + " *," - + " CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files', filepath) AS imageUrl," + + " CONCAT('"+fileBaseUrl+"/gccofficialapp/files', filepath) AS imageUrl," + " 0 AS activity_id " + " FROM " + " `brr_task_activity_log` " @@ -686,7 +688,7 @@ public class MassClearn { + "( " + " SELECT " + " *," - + " CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files', filepath) AS imageUrl, " + + " CONCAT('"+fileBaseUrl+"/gccofficialapp/files', filepath) AS imageUrl, " + " (SELECT id FROM brr_task_activity_log bl WHERE bl.taskid = brr_task_activity_log.taskid AND bl.before_after = 'before' ORDER BY id DESC LIMIT 1) AS activity_id " + " FROM " + " `brr_task_activity_log` " diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccparks/controller/ParksController.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccparks/controller/ParksController.java new file mode 100644 index 0000000..9ba9015 --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccparks/controller/ParksController.java @@ -0,0 +1,53 @@ +package in.gov.chennaicorporation.mobileservice.gccparks.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Controller; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import in.gov.chennaicorporation.mobileservice.gccparks.service.ParksService; + +@Controller@RequestMapping("/gccofficialapp/api/parks") +@RestController("gccofficalapparksrest") +public class ParksController { + + @Autowired + private ParksService parksService; + + @GetMapping("/saveAssets") + public List saveAssets(@RequestParam MultiValueMap formData, + @RequestParam(value = "categoryId", required = false) String categoryId, + @RequestParam(value = "assetTypeId", required = false) String assetTypeId, + @RequestParam(value = "latitude", required = false) String latitude, + @RequestParam(value = "longitude", required = false) String longitude, + @RequestParam(value = "zone", required = false) String zone, + @RequestParam(value = "ward", required = false) String ward, + @RequestParam(value = "streeId", required = false) String streeId, + @RequestParam(value = "streetName", required = false) String streetName, + @RequestParam(value = "loginId", required = false) String loginId, + @RequestParam(value = "name", required = false) String name, + @RequestParam(value = "file", required = false) MultipartFile file + ) { + return parksService.saveAsset(formData, categoryId, assetTypeId, latitude, + longitude, zone, ward, streeId, streetName, loginId, name, file); + } + + @GetMapping("/filterAssets") + public List getAssets(@RequestParam MultiValueMap formData, + @RequestParam(value = "categoryId", required = false) String categoryId, + @RequestParam(value = "assetTypeId", required = false) String assetTypeId, + @RequestParam(value = "latitude", required = false) String latitude, + @RequestParam(value = "longitude", required = false) String longitude + ) { + return parksService.loadAssetByFilter(categoryId, assetTypeId, latitude, + longitude); + } + +} diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccparks/controller/package-info.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccparks/controller/package-info.java new file mode 100644 index 0000000..7b09262 --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccparks/controller/package-info.java @@ -0,0 +1 @@ +package in.gov.chennaicorporation.mobileservice.gccparks.controller; \ No newline at end of file diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccparks/package-info.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccparks/package-info.java new file mode 100644 index 0000000..2143779 --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccparks/package-info.java @@ -0,0 +1 @@ +package in.gov.chennaicorporation.mobileservice.gccparks; \ No newline at end of file diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccparks/service/ParksService.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccparks/service/ParksService.java new file mode 100644 index 0000000..cd3e292 --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccparks/service/ParksService.java @@ -0,0 +1,249 @@ +package in.gov.chennaicorporation.mobileservice.gccparks.service; + +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.SecureRandom; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import javax.imageio.ImageIO; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.stream.ImageOutputStream; +import javax.sql.DataSource; + +import org.hibernate.internal.build.AllowSysOut; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.env.Environment; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.PreparedStatementCreator; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.MultiValueMap; +import org.springframework.web.multipart.MultipartFile; + +import in.gov.chennaicorporation.mobileservice.gccactivity.service.DateTimeUtil; + +@Service +public class ParksService { + + private JdbcTemplate jdbcParkseTemplate; + + private final Environment environment; + private String fileBaseUrl; + + private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + private static final int STRING_LENGTH = 15; + private static final Random RANDOM = new SecureRandom(); + + @Autowired + public void setDataSource(@Qualifier("mysqlGccParksDataSource") DataSource parksDataSource) { + this.jdbcParkseTemplate = new JdbcTemplate(parksDataSource); + } + + @Autowired + public ParksService(Environment environment) { + this.environment = environment; + this.fileBaseUrl=environment.getProperty("fileBaseUrl"); + } + + public static String generateRandomString() { + StringBuilder result = new StringBuilder(STRING_LENGTH); + for (int i = 0; i < STRING_LENGTH; i++) { + result.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length()))); + } + return result.toString(); + } + + private byte[] compressImage(BufferedImage image, float quality) throws IOException { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(byteArrayOutputStream); + + ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); + writer.setOutput(imageOutputStream); + + ImageWriteParam param = writer.getDefaultWriteParam(); + if (param.canWriteCompressed()) { + param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + param.setCompressionQuality(quality); + } + + writer.write(null, new javax.imageio.IIOImage(image, null, null), param); + + writer.dispose(); + imageOutputStream.close(); + + return byteArrayOutputStream.toByteArray(); + } + + public String fileUpload(String name, String id, MultipartFile file) { + + int lastInsertId = 0; + // Set the file path where you want to save it + String uploadDirectory = environment.getProperty("file.upload.directory"); + String serviceFolderName = environment.getProperty("parks_playground_foldername"); + var year =DateTimeUtil.getCurrentYear(); + var month =DateTimeUtil.getCurrentMonth(); + + uploadDirectory = uploadDirectory + serviceFolderName + year +"/"+month; + + try { + // Create directory if it doesn't exist + Path directoryPath = Paths.get(uploadDirectory); + if (!Files.exists(directoryPath)) { + Files.createDirectories(directoryPath); + } + + // Datetime string + String datetimetxt = DateTimeUtil.getCurrentDateTime(); + // File name + String fileName = name+ "_" + id + "_" + datetimetxt + "_" + file.getOriginalFilename(); + fileName = fileName.replaceAll("\\s+", ""); // Remove space on filename + + String filePath = uploadDirectory + "/" + fileName; + + String filepath_txt = "/"+serviceFolderName + year +"/"+month+"/"+fileName; + + // Create a new Path object + Path path = Paths.get(filePath); + + // Get the bytes of the file + byte[] bytes = file.getBytes(); + + // Compress the image + BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes)); + byte[] compressedBytes = compressImage(image, 0.5f); // Compress with 50% quality + + // Write the bytes to the file + Files.write(path, bytes); + + System.out.println(filePath); + return filepath_txt; + + } catch (IOException e) { + e.printStackTrace(); + return "Failed to save file " + file.getOriginalFilename(); + } + } + + @Transactional + public List> saveAsset( + MultiValueMap formData, + String categoryId, + String assetTypeId, + String latitude, + String longitude, + String zone, + String ward, + String streeId, + String streetName, + String loginId, + String name, + MultipartFile file) { + List> result=null; + Map response = new HashMap<>(); + int lastInsertId = 0; + + String image = fileUpload(categoryId,assetTypeId,file); + + String sqlQuery = "INSERT INTO `asset_list`(`category_id`, `assettype_id`, `name`, `image`, `latitude`, `longitude`, " + + "`zone`, `ward`, `streetid`, `streetname`, `cby`) " + + "VALUES (?,?,?,?,?,?,?,?,?,?,?)"; + + KeyHolder keyHolder = new GeneratedKeyHolder(); + + try { + int affectedRows = jdbcParkseTemplate.update(new PreparedStatementCreator() { + @Override + public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { + PreparedStatement ps = connection.prepareStatement(sqlQuery, new String[]{"id"}); + ps.setString(1, categoryId); + ps.setString(2, assetTypeId); + ps.setString(3, name); + ps.setString(4, image); + ps.setString(5, latitude); + ps.setString(6, longitude); + ps.setString(7, zone); + ps.setString(8, ward); + ps.setString(9, streeId); + ps.setString(10, streetName); + ps.setString(11, loginId); + return ps; + } + }, keyHolder); + + if (affectedRows > 0) { + Number generatedId = keyHolder.getKey(); + lastInsertId = (generatedId != null) ? generatedId.intValue() : 0; + response.put("insertId", lastInsertId); + response.put("status", "success"); + response.put("message", "A new asset was inserted successfully!"); + System.out.println("A new asset was inserted successfully! Insert ID: " + generatedId); + } else { + response.put("status", "error"); + response.put("message", "Failed to insert a new asset."); + } + } catch (DataAccessException e) { + System.out.println("Data Access Exception:"); + Throwable rootCause = e.getMostSpecificCause(); + if (rootCause instanceof SQLException) { + SQLException sqlException = (SQLException) rootCause; + System.out.println("SQL State: " + sqlException.getSQLState()); + System.out.println("Error Code: " + sqlException.getErrorCode()); + System.out.println("Message: " + sqlException.getMessage()); + response.put("status", "error"); + response.put("message", sqlException.getMessage()); + response.put("sqlState", sqlException.getSQLState()); + response.put("errorCode", sqlException.getErrorCode()); + } else { + System.out.println("Message: " + rootCause.getMessage()); + response.put("status", "error"); + response.put("message", rootCause.getMessage()); + } + } + + return Collections.singletonList(response); + } + + @Transactional + public List> loadAssetByFilter(String categoryId, String assetTypeId, String latitude, String longitude ){ + + String sqlWhere = "1=1"; + + if(categoryId!=null && !categoryId.isBlank() && !categoryId.isEmpty()){ + sqlWhere += " AND ai.category_id='"+categoryId+"'"; + } + + if(categoryId!=null && !assetTypeId.isBlank() && !assetTypeId.isEmpty()){ + sqlWhere += " AND ai.assettype_id='"+assetTypeId+"'"; + } + if(latitude!=null && longitude!=null && !latitude.isBlank() && !latitude.isEmpty() && !longitude.isBlank() && !longitude.isEmpty()){ + sqlWhere += " AND ((6371008.8 * acos(ROUND(cos(radians("+latitude+")) * cos(radians(al.latitude)) * cos(radians(al.longitude) - radians("+longitude+")) + sin(radians("+latitude+")) * sin(radians(al.latitude)), 9))) < 500) "; + } + + String sqlQuery="SELECT al.`id`, al.`category_id`, al.`assettype_id`, al.`name`, al.`latitude`, al.`longitude`, al.`zone`, " + + "al.`ward`, al.`streetid`, al.`streetname`, " + + "CONCAT('"+fileBaseUrl+"/gccofficialapp/files/', al.image) AS imageUrl " + + "FROM asset_list al WHERE "+sqlWhere; + + List> result = jdbcParkseTemplate.queryForList(sqlQuery); + return result; + } + + +} diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccparks/service/package-info.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccparks/service/package-info.java new file mode 100644 index 0000000..3262671 --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccparks/service/package-info.java @@ -0,0 +1 @@ +package in.gov.chennaicorporation.mobileservice.gccparks.service; \ No newline at end of file diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccschools/controller/SchoolUserController.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccschools/controller/SchoolUserController.java new file mode 100644 index 0000000..da7408d --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccschools/controller/SchoolUserController.java @@ -0,0 +1,924 @@ +package in.gov.chennaicorporation.mobileservice.gccschools.controller; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import in.gov.chennaicorporation.mobileservice.gccschools.service.SchoolUserActivity; +//import in.gov.chennaicorporation.mobileservice.gccsos.service.UserActivity; + +@RequestMapping("/gccofficialapp/api/gccschools/user/") +@RestController("gccofficialappUserSchoolsRest") +public class SchoolUserController { + @Autowired + private JdbcTemplate jdbcSchoolsTemplate; + @Autowired + private SchoolUserActivity schoolUserActivity; + + @PostMapping("/saveschool") + public ResponseEntity saveSchool( + @RequestParam String latitude, + @RequestParam String longitude, + @RequestParam(required = false) MultipartFile photo, + @RequestParam Integer schoolType, + @RequestParam String schoolName, + @RequestParam String earmark, + @RequestParam String zone, + @RequestParam String division, + @RequestParam String user_id + ) { + try { + // Save school details if type is valid + schoolUserActivity.saveSchool(latitude, longitude, photo, schoolType, schoolName, earmark, zone, division, user_id); + return new ResponseEntity<>("School details saved successfully.", HttpStatus.OK); + } catch (IllegalArgumentException e) { + return new ResponseEntity<>("Failed to save school details: " + e.getMessage(), HttpStatus.BAD_REQUEST); + } catch (Exception e) { + return new ResponseEntity<>("Failed to save school details: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @PostMapping("/savetype") + public ResponseEntity saveSchoolType(@RequestParam String schoolType) { + Integer schoolTypeId = schoolUserActivity.saveSchoolType(schoolType); + return ResponseEntity.ok(schoolTypeId); + } + + @GetMapping("/getCategoryWithQuestions") + public ResponseEntity> getCategoryWithQuestions( + @RequestParam int categoryId + ) { + try { + Map categoryDetails = schoolUserActivity.getCategoryWithQuestions(categoryId); + return ResponseEntity.ok(categoryDetails); + } catch (Exception e) { + return ResponseEntity.status(500).body(Map.of("error", "Failed to retrieve category details: " + e.getMessage())); + } + } + + @GetMapping("/getFeedback") + public ResponseEntity getFeedback(@RequestParam int catQuestionId) { + try { + // Call the service method to fetch feedback + List> feedbackDetails = schoolUserActivity.getFeedbackByQuestionId(catQuestionId); + + // Check if feedback exists for the given catQuestionId + if (feedbackDetails.isEmpty()) { + return new ResponseEntity<>("No feedback found for the provided category question ID.", HttpStatus.NOT_FOUND); + } + + return new ResponseEntity<>(feedbackDetails, HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>("Failed to retrieve feedback: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + @GetMapping("/getSchools") + public ResponseEntity getSchools( + @RequestParam String latitude, + @RequestParam String longitude + ) { + try { + // Validate latitude and longitude + double lat = Double.parseDouble(latitude); + double lon = Double.parseDouble(longitude); + + if (lat < -90 || lat > 90 || lon < -180 || lon > 180) { + return ResponseEntity.badRequest() + .body(Collections.singletonList("Latitude must be between -90 and 90, and longitude between -180 and 180.")); + } + //String latitude1=latitude; + + // Get schools based on location + List> schools = schoolUserActivity.getSchoolsByLocationAndType(latitude, longitude); + + if (schools.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(Collections.singletonList("No schools found for the specified location.")); + } + + return ResponseEntity.ok(schools); + } catch (NumberFormatException e) { + return ResponseEntity.badRequest() + .body(Collections.singletonList("Invalid latitude or longitude format.")); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Collections.singletonList("Failed to retrieve schools: " + e.getMessage())); + } + } + + + @PostMapping("/savechennaiboard") + public ResponseEntity saveChennaiBoard( + @RequestParam int categoryId, + @RequestParam String newboardconstructQa, + @RequestParam String newboardconstructAns, + @RequestParam String SchoolunderConstructQa, + @RequestParam String SchoolunderConstructAns, + @RequestParam(required = false) MultipartFile feedPhoto, // file is optional + @RequestParam(required = false) int school_details_id, // school_details_id is optional + @RequestParam String zone, + @RequestParam String division, + @RequestParam double latitude, + @RequestParam double longitude, + @RequestParam String user_id ) { + + try { + // Save feedback for both questions + schoolUserActivity.saveChennaiSchoolBoard(categoryId, newboardconstructQa, newboardconstructAns, + SchoolunderConstructQa, SchoolunderConstructAns, feedPhoto, school_details_id, zone, division,latitude,longitude,user_id); + + return new ResponseEntity<>("Feedback saved successfully.", HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>("Failed to save feedback: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @PostMapping("/saveDrinkingWater") + public ResponseEntity saveDrinkingWater( + @RequestParam int categoryId, + @RequestParam String MetroWaterFacilitiesQa, + @RequestParam String MetroWaterFacilitiesAns, + @RequestParam String SumpFacilitiesAvailableQa, + @RequestParam String SumpFacilitiesAvailableAns, + @RequestParam String SumpGoodConditionQa, + @RequestParam String SumpGoodConditionAns, + @RequestParam String ROFacilitiesAvailableQa, + @RequestParam String ROFacilitiesAvailableAns, + @RequestParam String ROGoodConditionQa, + @RequestParam String ROGoodConditionAns,//Drinking water facilities available or not + @RequestParam String DrinkingwaterfacilitiesQa, + @RequestParam String DrinkingwaterfacilitiesAns, + @RequestParam String typeoffacilitiesQa, + @RequestParam String typeoffacilitiesAns, + + @RequestParam(required = false) MultipartFile feedPhoto, + @RequestParam(required = false) int school_details_id, + @RequestParam String zone, + @RequestParam String division, + @RequestParam double latitude, + @RequestParam double longitude, + @RequestParam String user_id + ) { + + try { + // Call the service method to save feedback + schoolUserActivity.savewaterfd(categoryId, MetroWaterFacilitiesQa, MetroWaterFacilitiesAns, + SumpFacilitiesAvailableQa, SumpFacilitiesAvailableAns, + SumpGoodConditionQa, SumpGoodConditionAns, + ROFacilitiesAvailableQa, ROFacilitiesAvailableAns, + ROGoodConditionQa, ROGoodConditionAns,DrinkingwaterfacilitiesQa,DrinkingwaterfacilitiesAns, + typeoffacilitiesQa,typeoffacilitiesAns, + feedPhoto, school_details_id, zone, division,latitude,longitude,user_id); + + return new ResponseEntity<>("Feedback saved successfully.", HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>("Failed to save feedback: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + + @PostMapping("/FirstAidKit") + public ResponseEntity FirstAidKit( + @RequestParam int categoryId, + @RequestParam String FirstAidKitAvailableQa, + @RequestParam String FirstAidKitAvailableAns, + @RequestParam(required = false) MultipartFile feedPhoto, + @RequestParam(required = false) int school_details_id, + @RequestParam String zone, + @RequestParam String division , + @RequestParam double latitude, + @RequestParam double longitude, + @RequestParam String user_id) { + + try { + // Call the service method to save feedback + schoolUserActivity.saveFirstAidKitFeedback(categoryId, FirstAidKitAvailableQa, FirstAidKitAvailableAns, + feedPhoto, school_details_id, zone, division, latitude,longitude,user_id); + + return new ResponseEntity<>("Feedback saved successfully.", HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>("Failed to save feedback: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @PostMapping("/Cleaning") + public ResponseEntity Cleaning( + @RequestParam int categoryId, + @RequestParam String ToiletsAvailableQa, + @RequestParam String ToiletsAvailableAns, + @RequestParam String UrinariesAvailableQa, + @RequestParam String UrinariesAvailableAns, + @RequestParam String SweepersAvailableQa, + @RequestParam String SweepersAvailableAns, + @RequestParam String SewagesAvailableQa, + @RequestParam String SewagesAvailableAns, + @RequestParam String RoomsAvailableQa, + @RequestParam String RoomsAvailableAns, + @RequestParam String PlaygroundAvailableQa, + @RequestParam String PlaygroundAvailableAns, + @RequestParam String DrainageAvailableQa, + @RequestParam String DrainageAvailableAns, + @RequestParam(required = false) MultipartFile toiletfeedPhoto, + @RequestParam(required = false) MultipartFile RoomsfeedPhoto, + @RequestParam(required = false) MultipartFile PlaygroundfeedPhoto, + @RequestParam(required = false) int school_details_id, + @RequestParam String zone, + @RequestParam String division, + @RequestParam double latitude, + @RequestParam double longitude, + @RequestParam String user_id) { + + try { + // Call the service method to save feedback + schoolUserActivity.saveCleaningFeedback( + categoryId, + ToiletsAvailableQa, ToiletsAvailableAns, + UrinariesAvailableQa, UrinariesAvailableAns, + SweepersAvailableQa, SweepersAvailableAns, + SewagesAvailableQa, SewagesAvailableAns, + RoomsAvailableQa, RoomsAvailableAns, + PlaygroundAvailableQa, PlaygroundAvailableAns, + DrainageAvailableQa, DrainageAvailableAns, + toiletfeedPhoto, RoomsfeedPhoto, PlaygroundfeedPhoto, + school_details_id, zone, division, latitude, longitude,user_id + ); + + return new ResponseEntity<>("Feedback saved successfully.", HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>("Failed to save feedback: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + + + @PostMapping("/NoonMealKitchenCenter") + public ResponseEntity NoonMealKitchenCenter( + @RequestParam int categoryId, + @RequestParam String NoonMealKitchenAvailableQa, + @RequestParam String NoonMealKitchenAvailableAns, + @RequestParam String GasStoveQa, + @RequestParam String GasStoveAns, + @RequestParam String StoreRoomAvailableQa, + @RequestParam String StoreRoomAvailableAns, + @RequestParam String UtensilsAvailableQa, + @RequestParam String UtensilsAvailableAns, + @RequestParam String SufficientNumberQa, + @RequestParam String SufficientNumberAns, + @RequestParam String BlockageInWashAreaQa, + @RequestParam String BlockageInWashAreaAns, + @RequestParam String SeepageQa, + @RequestParam String SeepageAns, + @RequestParam(required = false) MultipartFile feedPhoto, + @RequestParam(required = false) int school_details_id, + @RequestParam String zone, + @RequestParam String division, + @RequestParam Double latitude, + @RequestParam Double longitude, + @RequestParam String user_id) { + + try { + // Call the service method to save feedback + schoolUserActivity.saveNoonMealFeedback( + categoryId, + NoonMealKitchenAvailableQa, NoonMealKitchenAvailableAns, + GasStoveQa, GasStoveAns, + StoreRoomAvailableQa, StoreRoomAvailableAns, + UtensilsAvailableQa, UtensilsAvailableAns, + SufficientNumberQa, SufficientNumberAns, + BlockageInWashAreaQa, BlockageInWashAreaAns, + SeepageQa, SeepageAns, + feedPhoto, school_details_id, zone, division,latitude,longitude,user_id + ); + + return new ResponseEntity<>("Feedback saved successfully.", HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>("Failed to save feedback: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @PostMapping("/Electricity") + public ResponseEntity Electricity( + @RequestParam int categoryId, + @RequestParam String FansAvailableQa, + @RequestParam String FansAvailableAns, + @RequestParam String LightsAvailableQa, + @RequestParam String LightsAvailableAns, + @RequestParam String SwitchBoardQa, + @RequestParam String SwitchBoardAns, + @RequestParam String GenSetQa, + @RequestParam String GenSetAns, + @RequestParam String GenSetconditionQa, + @RequestParam String GenSetconditionAns, + @RequestParam(required = false) MultipartFile feedPhoto, + @RequestParam(required = false) int school_details_id, + @RequestParam String zone, + @RequestParam String division, + @RequestParam double latitude , + @RequestParam double longitude, + @RequestParam String user_id) { + + try { + // Call the service method to save feedback + schoolUserActivity.saveElectricityFeedback( + categoryId, + FansAvailableQa, FansAvailableAns, + LightsAvailableQa, LightsAvailableAns, + SwitchBoardQa, SwitchBoardAns, + GenSetQa, GenSetAns,GenSetconditionQa,GenSetconditionAns, + feedPhoto, school_details_id, zone, division,latitude,longitude,user_id + ); + + return new ResponseEntity<>("Feedback saved successfully.", HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>("Failed to save feedback: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + @PostMapping("/ITAssets") + public ResponseEntity ITAssets( + @RequestParam int categoryId, + @RequestParam String SystemAvailableQa, + @RequestParam String SystemAvailableAns, + @RequestParam String PrinterAvailableQa, + @RequestParam String PrinterAvailableAns, + @RequestParam String UPSAvailableQa, + @RequestParam String UPSAvailableAns, + @RequestParam String NetworkAvailableQa, + @RequestParam String NetworkAvailableAns, + @RequestParam String projectorgoodconditionQa, + @RequestParam String projectorgoodconditionAns, + @RequestParam String smartboardgoodconditionQa, + @RequestParam String smartboardgoodconditionAns, + @RequestParam(required = false) MultipartFile feedPhoto, + @RequestParam(required = false) int school_details_id, + @RequestParam String zone, + @RequestParam String division, + @RequestParam Double latitude, + @RequestParam double longitude, + @RequestParam String user_id) { + + try { + // Call the service method to save feedback + schoolUserActivity.saveITAssetsFeedback( + categoryId, + SystemAvailableQa, SystemAvailableAns, + PrinterAvailableQa, PrinterAvailableAns, + UPSAvailableQa, UPSAvailableAns, + NetworkAvailableQa, NetworkAvailableAns, + projectorgoodconditionQa, projectorgoodconditionAns, + smartboardgoodconditionQa, smartboardgoodconditionAns, + feedPhoto, school_details_id, zone, division,latitude,longitude,user_id + ); + + return new ResponseEntity<>("Feedback saved successfully.", HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>("Failed to save feedback: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @PostMapping("/SeepageSchool") + public ResponseEntity SeepageSchool( + @RequestParam int categoryId, + @RequestParam String SeepageinSchoolQa, + @RequestParam String SeepageinSchoolAns, + @RequestParam String HowmanyLocationsQa, + @RequestParam String HowmanyLocationsAns, + //@RequestParam(required = false) MultipartFile feedPhoto, + @RequestParam(required = false) int school_details_id, + @RequestParam String zone, + @RequestParam String division, + @RequestParam(required = false) Double latitude, + @RequestParam Double longitude, + @RequestParam String user_id) { // Add latitude parameter + + try { + // Call the service method to save feedback + schoolUserActivity.saveSeepageSchoolFeedback( + categoryId, + SeepageinSchoolQa, SeepageinSchoolAns, + HowmanyLocationsQa, HowmanyLocationsAns, + school_details_id, zone, division, + latitude,longitude,user_id // Pass latitude to the service + ); + + return new ResponseEntity<>("Feedback saved successfully.", HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>("Failed to save feedback: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @GetMapping("/subCategories") + public ResponseEntity>> getAllSubCategories() { + List> subCategories = schoolUserActivity.getAllSubCategories(); + + if (subCategories.isEmpty()) { + return ResponseEntity.status(404).body(null); // or use a different response if needed + } + + return ResponseEntity.ok(subCategories); + } + + @GetMapping("/getschooltype") + public ResponseEntity> getSchoolType(@RequestParam int id) { + Map schoolType = schoolUserActivity.getSchoolTypeById(id); + return ResponseEntity.ok(schoolType); + } + @GetMapping("/get") + public ResponseEntity>> getSchoolTypes() { + List> schoolTypes = schoolUserActivity.getAllSchoolTypes(); + return ResponseEntity.ok(schoolTypes); + } + + @GetMapping("/getcountsdivision") + public ResponseEntity getFeedbackCountByDivision(@RequestParam String division) { + try { + List> feedbackCount = schoolUserActivity.getFeedbackCountByDivision(division); + return ResponseEntity.ok(feedbackCount); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Collections.singletonList("Failed to retrieve feedback count: " + e.getMessage())); + } + } + + @GetMapping("/overallreport") + public Map getFeedbackBySchoolId( + @RequestParam int schoolId, + @RequestParam String division, + @RequestParam String zone, + @RequestParam int categoryId, + @RequestParam String fromDate, + @RequestParam String toDate, + @RequestParam String user_id) { + + return schoolUserActivity.getFeedbackBySchoolId(schoolId, division, zone, categoryId, fromDate, toDate, user_id); + } + + @GetMapping("/feedbackdetails") + public Map getFeedbackByFeedRef( + @RequestParam String feedref, + @RequestParam String user_id) { + + return schoolUserActivity.getFeedbackByFeedRef(feedref, user_id); + } + + /* + * @GetMapping("/overallreport") + public ResponseEntity getFeedbackBySchoolId( + @RequestParam int schoolId, + @RequestParam String division, + @RequestParam String zone, + @RequestParam int categoryId, + @RequestParam String fromDate, + @RequestParam String toDate, + @RequestParam (required = false) String user_id + ) { + try { + List> feedbackList = schoolUserActivity.getFeedbackBySchoolId(schoolId, division, zone, categoryId, fromDate, toDate, user_id); + + if (feedbackList.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(Collections.singletonList("No feedback found for the specified parameters.")); + } + + // Initialize response structure + List> responseList = new ArrayList<>(); + + // Create a map to store the last inserted data for each question + Map> lastInsertedData = new HashMap<>(); + + // Create a map to store the common data + Map commonData = feedbackList.get(0); + + // Retrieve the schoolId from the feedbackList + Integer schoolIdValue = (Integer) feedbackList.get(0).get("schoolId"); + + // Create a map to store the grouped feedbacks + Map>> groupedFeedbacks = new HashMap<>(); + + // Create a set to store the common photos + Set commonPhotos = new HashSet<>(); + + for (Map feedback : feedbackList) { + String[] questions = ((String) feedback.get("category_questions")).split(","); + String feedbackResponse = (String) feedback.get("feedback"); + String feedbackPhotos = (String) feedback.get("feedbackphotos"); + + if (feedbackPhotos != null && !feedbackPhotos.isEmpty()) { + String[] photos = feedbackPhotos.split(","); + for (String photo : photos) { + commonPhotos.add(photo.trim()); + } + } + + for (String question : questions) { + question = question.trim(); + + // Check if the question already exists in the last inserted data map + if (lastInsertedData.containsKey(question)) { + Map existingEntry = lastInsertedData.get(question); + existingEntry.put("feedback", feedbackResponse); + existingEntry.put("feedback_photos", new ArrayList<>(commonPhotos)); + } else { + Map newEntry = new HashMap<>(); + newEntry.put("feedback", feedbackResponse); + newEntry.put("category_question", question); + newEntry.put("feedback_photos", new ArrayList<>(commonPhotos)); + lastInsertedData.put(question, newEntry); + } + } + } + + // Create a key for the common data + String key = commonData.get("division") + "_" + commonData.get("cdate") + "_" + commonData.get("zone") + "_" + commonData.get("schoolId") + "_" + commonData.get("school_name") + "_" + commonData.get("category"); + + // Add the feedbacks to the grouped feedbacks map + if (!groupedFeedbacks.containsKey(key)) { + groupedFeedbacks.put(key, new ArrayList<>()); + } + + for (Map entry : lastInsertedData.values()) { + groupedFeedbacks.get(key).add(entry); + } + + // Create the response list with the grouped feedbacks + for (Map.Entry>> entry : groupedFeedbacks.entrySet()) { + Map response = new HashMap<>(); + String[] parts = entry.getKey().split("_"); + response.put("division", parts[0]); + response.put("cdate", parts[1]); + response.put("zone", parts[2]); + response.put("school_details_id", schoolId); + response.put("school_name", parts[4]); + response.put("category", parts[5]); + response.put("feedbacks", entry.getValue()); + + // Add the common photos to the response + for (Map feedback : (List>) response.get("feedbacks")) { + feedback.put("feedback_photos", new ArrayList<>(commonPhotos)); + } + + responseList.add(response); + } + + // Find which photo belongs to which question + List questions = new ArrayList<>(); + for (Map feedback : feedbackList) { + String[] questionArray = ((String) feedback.get("category_questions")).split(","); + questions.addAll(Arrays.asList(questionArray)); + } + + Map> questionPhotos = new HashMap<>(); + for (String question : questions) { + List photos = getPhotosForQuestion(question, lastInsertedData); + questionPhotos.put(question, photos); + } + + return ResponseEntity.ok(responseList); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Collections.singletonList(" Failed to retrieve feedback: " + e.getMessage())); + } + } +*/ + private List getPhotosForQuestion(String question, Map> lastInsertedData) { + List photos = new ArrayList<>(); + for (Map entry : lastInsertedData.values()) { + if (entry.get("category_question").equals(question)) { + photos.addAll((List) entry.get("feedback_photos")); + } + } + return photos; + } + + @GetMapping("/categories") + public ResponseEntity getCategories() { + try { + List> categories = schoolUserActivity.getActiveCategories(); + + return ResponseEntity.ok(categories); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Collections.singletonList("Failed to retrieve categories: " + e.getMessage())); + } + } + + + @GetMapping("/categorydates") + public ResponseEntity getFeedbackCountByCategoryAndDate( + @RequestParam int categoryId, + @RequestParam String startDate, // Change to String + @RequestParam String endDate, + @RequestParam (required = false) String user_id) { // Change to String + try { + // Define the date formatter + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + LocalDate start = LocalDate.parse(startDate, formatter); + LocalDate end = LocalDate.parse(endDate, formatter); + + List> feedbackCounts = schoolUserActivity.getFeedbackCountByCategoryAndDate(categoryId, start, end, user_id); + if (feedbackCounts.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(Collections.singletonList("No feedback found for the specified category and date range.")); + } + return ResponseEntity.ok(feedbackCounts); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Collections.singletonList("Failed to retrieve feedback count: " + e.getMessage())); + } + } + + @GetMapping("/divisionschools") + public ResponseEntity getFeedbackCountByDivisionAndSchool( + @RequestParam String division, + @RequestParam String categoryId, // Add categoryId parameter + @RequestParam String fromDate, + @RequestParam String toDate, + @RequestParam (required = false) String user_id + ) { + try { + // Define the date formatter + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + LocalDate from = LocalDate.parse(fromDate, formatter); + LocalDate to = LocalDate.parse(toDate, formatter); + + List> feedbackCounts = schoolUserActivity.getFeedbackCountByDivisionAndSchool(division, categoryId, from, to, user_id); + + if (feedbackCounts.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(Collections.singletonList("No feedback found for the specified division and date range.")); + } + + return ResponseEntity.ok(feedbackCounts); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Collections.singletonList("Failed to retrieve feedback count: " + e.getMessage())); + } + } + + @GetMapping("/divisionschoolslist") + public ResponseEntity getFeedbackCountByDivisionAndSchoolList( + @RequestParam String schoolId, + @RequestParam String division, + @RequestParam String categoryId, // Add categoryId parameter + @RequestParam String fromDate, + @RequestParam String toDate, + @RequestParam (required = false) String user_id + ) { + try { + // Define the date formatter + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + LocalDate from = LocalDate.parse(fromDate, formatter); + LocalDate to = LocalDate.parse(toDate, formatter); + + List> feedbackCounts = schoolUserActivity.getFeedbackCountByDivisionAndSchoolList(division, schoolId, categoryId, from, to, user_id); + + if (feedbackCounts.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(Collections.singletonList("No feedback found for the specified division and date range.")); + } + + return ResponseEntity.ok(feedbackCounts); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Collections.singletonList("Failed to retrieve feedback count: " + e.getMessage())); + } + } + + @GetMapping("/myreportlist") + public ResponseEntity getMyReportList( + @RequestParam String categoryId, // Add categoryId parameter + @RequestParam String fromDate, + @RequestParam String toDate, + @RequestParam (required = true) String user_id + ) { + try { + // Define the date formatter + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + LocalDate from = LocalDate.parse(fromDate, formatter); + LocalDate to = LocalDate.parse(toDate, formatter); + + List> feedbackCounts = schoolUserActivity.getFeedbackCountSchoolListByUserId(categoryId, from, to, user_id); + + if (feedbackCounts.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(Collections.singletonList("No feedback found for the specified division and date range.")); + } + + return ResponseEntity.ok(feedbackCounts); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Collections.singletonList("Failed to retrieve feedback count: " + e.getMessage())); + } + } + + @GetMapping("/zonecatschool") + public ResponseEntity>> getFeedbackCountByZoneCat( + @RequestParam String zone, + @RequestParam int categoryId, + @RequestParam String fromDate, + @RequestParam String toDate, + @RequestParam(required = false) String user_id) { + + // Parse the date strings to LocalDate + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + LocalDate from = LocalDate.parse(fromDate, formatter); + LocalDate to = LocalDate.parse(toDate, formatter); + + // Call the service method + List> feedbackCounts = schoolUserActivity.getFeedbackCountByZoneCat(zone, categoryId, from, to, user_id); + + return ResponseEntity.ok(feedbackCounts); + } + + /* + @GetMapping("/zonecatschool") + public ResponseEntity getFeedbackCountByZoneCat( + @RequestParam String zone, + @RequestParam int categoryId, + @RequestParam String fromDate, // Change to String + @RequestParam String toDate, + @RequestParam (required = false) String user_id) { // Change to String + try { + // Define the date formatter for dd-MM-yyyy + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + LocalDate from = LocalDate.parse(fromDate, formatter); + LocalDate to = LocalDate.parse(toDate, formatter); + + List> feedbackCounts = schoolUserActivity.getFeedbackCountByZoneCat(zone, categoryId, from, to, user_id); + + if (feedbackCounts.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(Collections.singletonList("No feedback found for the specified zone and date range.")); + } + + // Assuming all feedback counts have the same division, extract it + String division = feedbackCounts.get(0).get("division").toString(); + + // Build the response + Map response = new HashMap<>(); + response.put("division", division); + + // Sum up feedback counts as Long + long totalFeedbackCount = feedbackCounts.stream() + .mapToLong(feedback -> ((Number) feedback.get("feedback_count")).longValue()) + .sum(); + + response.put("feedback_count", totalFeedbackCount); + + // Wrap the response in a list + return ResponseEntity.ok(Collections.singletonList(response)); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Collections.singletonList("Failed to retrieve feedback count: " + e.getMessage())); + } + } + */ + + @GetMapping("/divisioncatschool") + public ResponseEntity getFeedbackCountByDivCat( + @RequestParam String division, + @RequestParam int categoryId, + @RequestParam String fromDate, // Change to String + @RequestParam String toDate, + @RequestParam (required = false) String user_id) { // Change to String + try { + // Define the date formatter for dd-MM-yyyy + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + LocalDate from = LocalDate.parse(fromDate, formatter); + LocalDate to = LocalDate.parse(toDate, formatter); + + List> feedbackCounts = schoolUserActivity.getFeedbackCountByDivCat(division, categoryId, from, to); + + if (feedbackCounts.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(Collections.singletonList("No feedback found for the specified division.")); + } + + // Create a map to aggregate feedback counts by division + Map aggregatedCounts = new HashMap<>(); + + for (Map feedback : feedbackCounts) { + String div = (String) feedback.get("division"); + Long count = (Long) feedback.get("feedback_count"); + + // Aggregate feedback counts + aggregatedCounts.put(div, aggregatedCounts.getOrDefault(div, 0L) + count); + } + + // Build the response + List> response = new ArrayList<>(); + for (Map.Entry entry : aggregatedCounts.entrySet()) { + Map divisionData = new HashMap<>(); + divisionData.put("division", entry.getKey()); + divisionData.put("feedback_count", entry.getValue()); + response.add(divisionData); + } + + return ResponseEntity.ok(response); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Collections.singletonList("Failed to retrieve feedback count: " + e.getMessage())); + } + } + + @PostMapping("/saveCmSheme") + public ResponseEntity CmSheme( + @RequestParam int categoryId, + @RequestParam String BreakFastQualityQa, + @RequestParam String BreakFastQualityAns, + @RequestParam String CMBFhelpersPresentSchoolQa, + @RequestParam String CMBFhelpersPresentSchoolAns, + @RequestParam String DinningAreaKeptQa, + @RequestParam String DinningAreaKeptAns, + @RequestParam String IsschoolhygienicallyQa, + @RequestParam String IsschoolhygienicallyAns, + @RequestParam(required = false) MultipartFile feedPhoto, + @RequestParam(required = false) int school_details_id, + @RequestParam String zone, + @RequestParam String division, + @RequestParam Double latitude, + @RequestParam double longitude, + @RequestParam String user_id, + @RequestParam (required = false) String question_id + ) { + + try { + // Call the service method to save feedback + schoolUserActivity.saveCmSheme( + categoryId, + BreakFastQualityQa, BreakFastQualityAns, + CMBFhelpersPresentSchoolQa, CMBFhelpersPresentSchoolAns, + DinningAreaKeptQa, DinningAreaKeptAns, + IsschoolhygienicallyQa, IsschoolhygienicallyAns, + feedPhoto, school_details_id, zone, division,latitude,longitude,user_id,question_id + ); + + return new ResponseEntity<>("Feedback saved successfully.", HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>("Failed to save feedback: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @PostMapping("/saveClusterKitchen") + public ResponseEntity ClusterKitchen( + @RequestParam int categoryId, + @RequestParam String ClusterKitchencleanandneatQa, + @RequestParam String ClusterKitchencleanandneatAns, + @RequestParam String SampleoffoodmaintainedQa, + @RequestParam String SampleoffoodmaintainedAns, + @RequestParam String cookingstaffwearingQa, + @RequestParam String cookingstaffwearingAns, + @RequestParam String fooditemsmatchwiththestockQa , + @RequestParam String fooditemsmatchwiththestockAns, + @RequestParam String FooditemsusedofgoodqualityQa , + @RequestParam String FooditemsusedofgoodqualityAns, + @RequestParam(required = false) MultipartFile feedPhoto, + @RequestParam(required = false) int school_details_id, + @RequestParam String zone, + @RequestParam String division, + @RequestParam Double latitude, + @RequestParam double longitude, + @RequestParam String user_id, + @RequestParam (required = false) String question_id +) { + + try { + // Call the service method to save feedback + schoolUserActivity.saveClusterKitchen( + categoryId, + ClusterKitchencleanandneatQa, ClusterKitchencleanandneatAns, + SampleoffoodmaintainedQa, SampleoffoodmaintainedAns, + cookingstaffwearingQa, cookingstaffwearingAns, + fooditemsmatchwiththestockQa, fooditemsmatchwiththestockAns, + FooditemsusedofgoodqualityQa,FooditemsusedofgoodqualityAns, + feedPhoto, school_details_id, zone, division,latitude,longitude,user_id,question_id + ); + + return new ResponseEntity<>("Feedback saved successfully.", HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>("Failed to save feedback: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } +} diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccschools/controller/package-info.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccschools/controller/package-info.java new file mode 100644 index 0000000..a5f130f --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccschools/controller/package-info.java @@ -0,0 +1 @@ +package in.gov.chennaicorporation.mobileservice.gccschools.controller; \ No newline at end of file diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccschools/package-info.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccschools/package-info.java new file mode 100644 index 0000000..fa9a467 --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccschools/package-info.java @@ -0,0 +1 @@ +package in.gov.chennaicorporation.mobileservice.gccschools; \ No newline at end of file diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccschools/service/SchoolUserActivity.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccschools/service/SchoolUserActivity.java new file mode 100644 index 0000000..3b5996b --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccschools/service/SchoolUserActivity.java @@ -0,0 +1,1048 @@ +package in.gov.chennaicorporation.mobileservice.gccschools.service; + +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.sql.PreparedStatement; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; + +import javax.imageio.ImageIO; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.stream.ImageOutputStream; +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.env.Environment; +import org.springframework.dao.DataAccessException; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Service; +import org.springframework.jdbc.support.GeneratedKeyHolder; + +import java.security.SecureRandom; + +import in.gov.chennaicorporation.mobileservice.gccactivity.service.DateTimeUtil; + +@Service +public class SchoolUserActivity { + + private JdbcTemplate jdbcSchoolsTemplate; + + private final Environment environment; + private String fileBaseUrl; + + private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + private static final int STRING_LENGTH = 15; + private static final Random RANDOM = new SecureRandom(); + + @Autowired + public void setDataSource(@Qualifier("mysqlGccSchoolsDataSource") DataSource schoolDataSource) { + this.jdbcSchoolsTemplate = new JdbcTemplate(schoolDataSource); + } + + @Autowired + public SchoolUserActivity(Environment environment) { + this.environment = environment; + this.fileBaseUrl=environment.getProperty("fileBaseUrl"); + } + + //CONCAT('"+fileBaseUrl+"/gccofficialapp/files/', al.image) AS imageUrl, + + public static String generateRandomString() { + StringBuilder result = new StringBuilder(STRING_LENGTH); + for (int i = 0; i < STRING_LENGTH; i++) { + result.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length()))); + } + return result.toString(); + } + + private byte[] compressImage(BufferedImage image, float quality) throws IOException { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(byteArrayOutputStream); + + ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); + writer.setOutput(imageOutputStream); + + ImageWriteParam param = writer.getDefaultWriteParam(); + if (param.canWriteCompressed()) { + param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + param.setCompressionQuality(quality); + } + + writer.write(null, new javax.imageio.IIOImage(image, null, null), param); + + writer.dispose(); + imageOutputStream.close(); + + return byteArrayOutputStream.toByteArray(); + } + + public String fileUpload(String name, String id, MultipartFile file) { + + int lastInsertId = 0; + // Set the file path where you want to save it + String uploadDirectory = environment.getProperty("file.upload.directory"); + String serviceFolderName = environment.getProperty("gccschools_foldername"); + var year =DateTimeUtil.getCurrentYear(); + var month =DateTimeUtil.getCurrentMonth(); + + uploadDirectory = uploadDirectory + serviceFolderName + year +"/"+month; + + try { + // Create directory if it doesn't exist + Path directoryPath = Paths.get(uploadDirectory); + if (!Files.exists(directoryPath)) { + Files.createDirectories(directoryPath); + } + + // Datetime string + String datetimetxt = DateTimeUtil.getCurrentDateTime(); + // File name + String fileName = name+ "_" +id + "_" + datetimetxt + "_" + file.getOriginalFilename(); + fileName = fileName.replaceAll("\\s+", ""); // Remove space on filename + + String filePath = uploadDirectory + "/" + fileName; + + String filepath_txt = "/"+serviceFolderName + year +"/"+month+"/"+fileName; + + // Create a new Path object + Path path = Paths.get(filePath); + + // Get the bytes of the file + byte[] bytes = file.getBytes(); + + // Compress the image + BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes)); + byte[] compressedBytes = compressImage(image, 0.5f); // Compress with 50% quality + + // Write the bytes to the file + Files.write(path, bytes); + + System.out.println(filePath); + return filepath_txt; + + } catch (IOException e) { + e.printStackTrace(); + return "Failed to save file " + file.getOriginalFilename(); + } + } + + public void saveSchool(String latitude, String longitude, MultipartFile photo, Integer schoolType, String schoolName, String earmark, String zone, String division, String userId) { + // Save or retrieve the school type ID based on schoolType + //Integer schoolTypeId = saveSchoolType(schoolType); + if (schoolType == null || schoolType<=0) { + throw new IllegalArgumentException("Invalid school type ID: " + schoolType); + } + + // Save school details and retrieve the generated school_details_id + int schoolDetailsId = saveSchoolDetails(latitude, longitude, schoolType, schoolName, earmark, zone, division, userId); + + String photoUrl = null; + + // Handle file upload if a photo is provided + if (photo != null && !photo.isEmpty()) { + // Make sure to pass the correct type for the first argument + String id = String.valueOf(schoolDetailsId); + String sdid = String.valueOf(schoolDetailsId); + photoUrl = fileUpload(id, sdid, photo); // Adjusted to use schoolDetailsId + } + + // Save the photo URL in school_photos if the photo was uploaded + if (photoUrl != null) { + saveSchoolPhoto(schoolDetailsId, photoUrl); + } + } + + private int saveSchoolDetails(String latitude, String longitude, Integer schoolTypeId, String schoolName, String earmark, String zone, String division, String userId) { + // SQL statement to insert school details + String sql = "INSERT INTO school_details (latitude, longitude, school_type, school_name, earmark, zone, division, user_id) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ? )"; + + // Debugging + System.out.println("Executing SQL: " + sql); + System.out.println("Parameters: Latitude = " + latitude + ", Longitude = " + longitude + + " SchoolTypeId = " + schoolTypeId + + ", SchoolName = " + schoolName + ", Zone = " + zone + ", Division = " + division); + + KeyHolder keyHolder = new GeneratedKeyHolder(); + + // Execute the SQL statement + try { + jdbcSchoolsTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"}); + ps.setString(1, latitude); + ps.setString(2, longitude); + ps.setInt(3, schoolTypeId); // Correctly saving the ID of scl_type + ps.setString(4, schoolName); + ps.setString(5, earmark); + ps.setString(6, zone); + ps.setString(7, division); + ps.setString(8, userId); + return ps; + }, keyHolder); + + } catch (Exception e) { + System.err.println("Error during SQL execution: " + e.getMessage()); + throw e; // Rethrow to be handled by the controller + } + + return keyHolder.getKey().intValue(); // Return the generated school_details_id + } + + + private void saveSchoolPhoto(int schoolDetailsId, String photoPath) { + String sql = "INSERT INTO school_photos (photo_url, is_active, is_deleted, school_details_id) VALUES (?, 1, 0, ?)"; + + // Execute the SQL update to insert the photo information + jdbcSchoolsTemplate.update(sql, photoPath, schoolDetailsId); + } + + ////feedback/////////////// + public void addCategory(String category, List questions) { + // Check if the category already exists + String checkCategorySql = "SELECT id FROM category WHERE category = ? LIMIT 1"; + List existingCategoryIds = jdbcSchoolsTemplate.query( + checkCategorySql, + (rs, rowNum) -> rs.getInt("id"), + category + ); + + int categoryId; + + if (existingCategoryIds.isEmpty()) { + // Category does not exist, insert the new category + String insertCategorySql = "INSERT INTO category (category, is_active, is_deleted) VALUES (?, ?, ?)"; + KeyHolder keyHolder = new GeneratedKeyHolder(); + + jdbcSchoolsTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement(insertCategorySql, new String[]{"id"}); + ps.setString(1, category); + ps.setInt(2, 1); // is_active + ps.setInt(3, 0); // is_deleted + return ps; + }, keyHolder); + + // Get the auto-generated category ID + categoryId = keyHolder.getKey().intValue(); + } else { + // Category already exists, get its ID + categoryId = existingCategoryIds.get(0); + } + + // Insert the questions related to the category + for (String question : questions) { + String insertQuestionSql = "INSERT INTO category_question (category_questions, is_active, is_delete, category_id) VALUES (?, ?, ?, ?)"; + jdbcSchoolsTemplate.update(insertQuestionSql, question, 1, 0, categoryId); + } + } + + public Integer saveSchoolType(String schoolType) { + // Check if the school type already exists + List existingIds = jdbcSchoolsTemplate.query( + "SELECT id FROM school_type WHERE scl_type = ? LIMIT 1", + (rs, rowNum) -> rs.getInt("id"), + schoolType // Passing schoolType as a parameter + ); + + // If the school type exists, return its ID + if (!existingIds.isEmpty()) { + return existingIds.get(0); + } + + // Insert the new school type if not found + jdbcSchoolsTemplate.update( + "INSERT INTO school_type (scl_type) VALUES (?)", + schoolType // Insert the school type + ); + + // Retrieve the newly generated ID for the inserted school type + Integer newId = jdbcSchoolsTemplate.queryForObject( + "SELECT id FROM school_type WHERE scl_type = ? LIMIT 1", + Integer.class, + schoolType + ); + + // Return the new ID + return newId; + } + + /////////////////////////////////////////////////////////////////////////////// + public Map getCategoryWithQuestions(int categoryId) { + // Query to get category details + String categorySql = "SELECT id, category FROM category WHERE id = ?"; + Map category = jdbcSchoolsTemplate.queryForMap(categorySql, categoryId); + + // Query to get questions associated with the category + String questionsSql = "SELECT category_questions FROM category_question WHERE category_id = ? AND is_active = 1 AND is_delete = 0"; + List questions = jdbcSchoolsTemplate.queryForList(questionsSql, String.class, categoryId); + + // Add questions to the category details + category.put("questions", questions); + return category; + } + + ////////////////////////////////////////////////////////////////////////// + + public List> getFeedbackByQuestionId(int catQuestionId) { + String sql = "SELECT f.cat_question_id, f.feedback, f.feed_photo, q.category_questions " + + "FROM feedback f " + + "JOIN category_question q ON f.cat_question_id = q.id " + + "WHERE f.cat_question_id = ?"; + + // Query the database and return the result + return jdbcSchoolsTemplate.queryForList(sql, catQuestionId); + } + + ////////////////////////////////////////////////////////////////////// + public List> getSchoolsByLocationAndType(String latitude, String longitude) { + + String sql = "SELECT ac.id, ac.school_name,school_type FROM school_details ac WHERE " + + "((6371008.8 * acos(ROUND(cos(radians(?)) * cos(radians(ac.latitude)) * cos(radians(ac.longitude) - radians(?)) + sin(radians(?)) * sin(radians(ac.latitude)), 9))) < 500) " + + "GROUP BY ac.id, ac.school_name,ac.school_type "; + + // Use latitude, longitude, and schoolType as positional parameters + return jdbcSchoolsTemplate.queryForList(sql, new Object[]{latitude, longitude, latitude}); + } + + //////////////////////// + public void saveChennaiSchoolBoard(int categoryId, String newboardQa, String newboardAns, + String schoolConstructQa, String schoolConstructAns, + MultipartFile feedPhoto, int school_details_id, + String zone, String division, double latitude, + double longitude, String user_id) { + + String feedPhotoPath = null; + String feedref = generateRandomString(); //generate feedback reference text + + // Handle file upload if a file is provided + if (feedPhoto != null && !feedPhoto.isEmpty()) { + String id = String.valueOf(categoryId); + String sdid = String.valueOf(school_details_id); + feedPhotoPath = fileUpload(id, sdid, feedPhoto); // Adjusted to use schoolDetailsId + } + + // Save feedback for both questions + saveFeedbackDetails(categoryId, newboardQa, newboardAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, schoolConstructQa, schoolConstructAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + + // If a photo was uploaded, save it in category_photos + if (feedPhotoPath != null) { + String qid="1"; + saveCategoryPhoto(categoryId, feedPhotoPath, qid, feedref); + } + } + + //////////////////////////////////////////////////// + public void savewaterfd( + int categoryId, + String MetroWaterFacilitiesQa, + String MetroWaterFacilitiesAns, + String SumpFacilitiesAvailableQa, + String SumpFacilitiesAvailableAns, + String SumpGoodConditionQa, + String SumpGoodConditionAns, + String ROFacilitiesAvailableQa, + String ROFacilitiesAvailableAns, + String ROGoodConditionQa, + String ROGoodConditionAns, + String DrinkingwaterfacilitiesQa, + String DrinkingwaterfacilitiesAns, + String typeoffacilitiesQa, + String typeoffacilitiesAns, + + MultipartFile feedPhoto, // feedPhoto and schoolDetailsId were missing in the method signature + int school_details_id, + String zone, + String division , + double latitude , + double longitude , + String user_id) { + + String feedPhotoPath = null; + String feedref = generateRandomString(); //generate feedback reference text + + // Handle file upload if a file is provided + if (feedPhoto != null && !feedPhoto.isEmpty()) { + String id = String.valueOf(categoryId); + String sdid = String.valueOf(school_details_id); + feedPhotoPath = fileUpload(id, sdid, feedPhoto); // Adjusted to use schoolDetailsId + //feedPhotoPath = assetFileUpload(categoryId, feedPhoto, school_details_id); + } + + // Save feedback for each question and answer pair + saveFeedbackDetails(categoryId, MetroWaterFacilitiesQa, MetroWaterFacilitiesAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, SumpFacilitiesAvailableQa, SumpFacilitiesAvailableAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, SumpGoodConditionQa, SumpGoodConditionAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, ROFacilitiesAvailableQa, ROFacilitiesAvailableAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, ROGoodConditionQa, ROGoodConditionAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, DrinkingwaterfacilitiesQa, DrinkingwaterfacilitiesAns , school_details_id, zone, division,latitude,longitude,user_id,feedref); + + saveFeedbackDetails(categoryId, typeoffacilitiesQa, typeoffacilitiesAns , school_details_id, zone, division,latitude,longitude,user_id,feedref); + + // If a photo was uploaded, save it in the category_photos table + if (feedPhotoPath != null) { + String qid = "33"; + saveCategoryPhoto(categoryId, feedPhotoPath, qid, feedref); + } + } + + ///////////////////////////////////////////////// + + public void saveFirstAidKitFeedback( + int categoryId, + String FirstAidKitAvailableQa, + String FirstAidKitAvailableAns, + MultipartFile feedPhoto, + int school_details_id, + String zone, + String division , + double latitude, + double longitude , + String user_id) { + + String feedPhotoPath = null; + + // Handle file upload if a file is provided + if (feedPhoto != null && !feedPhoto.isEmpty()) { + String id = String.valueOf(categoryId); + String sdid = String.valueOf(school_details_id); + feedPhotoPath = fileUpload(id, sdid, feedPhoto); // Adjusted to use schoolDetailsId + //feedPhotoPath = assetFileUpload(categoryId, feedPhoto, school_details_id); + } + + String feedref = generateRandomString(); //generate feedback reference text + // Save feedback for the First Aid Kit question and answer pair + saveFeedbackDetails(categoryId, FirstAidKitAvailableQa, FirstAidKitAvailableAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + + // If a photo was uploaded, save it in the category_photos table + if (feedPhotoPath != null) { + String qid="8"; + saveCategoryPhoto(categoryId, feedPhotoPath, qid, feedref); + } + } + ////////////////////////////////////////////////////////////// + public void saveCleaningFeedback( + int categoryId, + String ToiletsAvailableQa, + String ToiletsAvailableAns, + String UrinariesAvailableQa, + String UrinariesAvailableAns, + String SweepersAvailableQa, + String SweepersAvailableAns, + String SewagesAvailableQa, + String SewagesAvailableAns, + String RoomsAvailableQa, + String RoomsAvailableAns, + String PlaygroundAvailableQa, + String PlaygroundAvailableAns, + String DrainageAvailableQa, + String DrainageAvailableAns, + MultipartFile toiletfeedPhoto, + MultipartFile RoomsfeedPhoto, + MultipartFile PlaygroundfeedPhoto, + int school_details_id, + String zone, + String division, + double latitude, + double longitude, + String user_id) { + + // Handle photo uploads (toilet, room, and playground photos) + String toiletPhotoPath = null; + String roomsPhotoPath = null; + String playgroundPhotoPath = null; + + // If each photo is present, upload and get the path + if (toiletfeedPhoto != null && !toiletfeedPhoto.isEmpty()) { + String id = String.valueOf(categoryId); + String sdid = String.valueOf(school_details_id); + toiletPhotoPath = fileUpload(id, sdid, RoomsfeedPhoto); // Adjusted to use schoolDetailsId + //toiletPhotoPath = assetFileUpload(categoryId, toiletfeedPhoto, school_details_id); + } + + if (RoomsfeedPhoto != null && !RoomsfeedPhoto.isEmpty()) { + String id = String.valueOf(categoryId); + String sdid = String.valueOf(school_details_id); + roomsPhotoPath = fileUpload(id, sdid, RoomsfeedPhoto); // Adjusted to use schoolDetailsId + //roomsPhotoPath = assetFileUpload(categoryId, RoomsfeedPhoto, school_details_id); + } + + if (PlaygroundfeedPhoto != null && !PlaygroundfeedPhoto.isEmpty()) { + String id = String.valueOf(categoryId); + String sdid = String.valueOf(school_details_id); + playgroundPhotoPath = fileUpload(id, sdid, RoomsfeedPhoto); // Adjusted to use schoolDetailsId + //playgroundPhotoPath = assetFileUpload(categoryId, PlaygroundfeedPhoto, school_details_id); + } + + String feedref = generateRandomString(); //generate feedback reference text + // Save feedback for each question and answer pair + saveFeedbackDetails(categoryId, ToiletsAvailableQa, ToiletsAvailableAns, school_details_id, zone, division, latitude, longitude,user_id,feedref); + saveFeedbackDetails(categoryId, UrinariesAvailableQa, UrinariesAvailableAns, school_details_id, zone, division, latitude, longitude,user_id,feedref); + saveFeedbackDetails(categoryId, SweepersAvailableQa, SweepersAvailableAns, school_details_id, zone, division, latitude, longitude,user_id,feedref); + saveFeedbackDetails(categoryId, SewagesAvailableQa, SewagesAvailableAns, school_details_id, zone, division, latitude, longitude,user_id,feedref); + saveFeedbackDetails(categoryId, RoomsAvailableQa, RoomsAvailableAns, school_details_id, zone, division, latitude, longitude,user_id,feedref); + saveFeedbackDetails(categoryId, PlaygroundAvailableQa, PlaygroundAvailableAns, school_details_id, zone, division, latitude, longitude,user_id,feedref); + saveFeedbackDetails(categoryId, DrainageAvailableQa, DrainageAvailableAns, school_details_id, zone, division, latitude, longitude,user_id,feedref); + + // If photos were uploaded, save them in the category_photos table + if (toiletPhotoPath != null) { + String qid="9"; + saveCategoryPhoto(categoryId, toiletPhotoPath, qid, feedref); + } + if (roomsPhotoPath != null) { + String qid="13"; + saveCategoryPhoto(categoryId, roomsPhotoPath, qid, feedref); + } + if (playgroundPhotoPath != null) { + String qid="14"; + saveCategoryPhoto(categoryId, playgroundPhotoPath, qid, feedref); + } + } + + +//////////////////////////////////////// + public void saveNoonMealFeedback( + int categoryId, + String NoonMealKitchenAvailableQa, + String NoonMealKitchenAvailableAns, + String GasStoveQa, + String GasStoveAns, + String StoreRoomAvailableQa, + String StoreRoomAvailableAns, + String UtensilsAvailableQa, + String UtensilsAvailableAns, + String SufficientNumberQa, + String SufficientNumberAns, + String BlockageInWashAreaQa, + String BlockageInWashAreaAns, + String SeepageQa, + String SeepageAns, + MultipartFile feedPhoto, + int school_details_id, + String zone, + String division , + double latitude , + double longitude, + String user_id) { + + String feedPhotoPath = null; + + // Handle file upload if a file is provided + if (feedPhoto != null && !feedPhoto.isEmpty()) { + String id = String.valueOf(categoryId); + String sdid = String.valueOf(school_details_id); + feedPhotoPath = fileUpload(id, sdid, feedPhoto); // Adjusted to use schoolDetailsId + //feedPhotoPath = assetFileUpload(categoryId, feedPhoto, school_details_id); + } + + String feedref = generateRandomString(); //generate feedback reference text + // Save feedback for each question and answer pair + saveFeedbackDetails(categoryId, NoonMealKitchenAvailableQa, NoonMealKitchenAvailableAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, GasStoveQa, GasStoveAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, StoreRoomAvailableQa, StoreRoomAvailableAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, UtensilsAvailableQa, UtensilsAvailableAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, SufficientNumberQa, SufficientNumberAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, BlockageInWashAreaQa, BlockageInWashAreaAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, SeepageQa, SeepageAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + + // If a photo was uploaded, save it in the category_photos table + if (feedPhotoPath != null) { + String qid="16"; + saveCategoryPhoto(categoryId, feedPhotoPath, qid, feedref); + } + } + //////////////////////////////////////////////////////////// + public void saveElectricityFeedback( + int categoryId, + String FansAvailableQa, + String FansAvailableAns, + String LightsAvailableQa, + String LightsAvailableAns, + String SwitchBoardQa, + String SwitchBoardAns, + String GenSetQa, + String GenSetAns, + String GenSetconditionQa, + String GenSetconditionAns, + MultipartFile feedPhoto, + int school_details_id, + String zone, + String division, + double latitude , + double longitude, + String user_id) { + + String feedPhotoPath = null; + + // Handle file upload if a file is provided + if (feedPhoto != null && !feedPhoto.isEmpty()) { + String id = String.valueOf(categoryId); + String sdid = String.valueOf(school_details_id); + feedPhotoPath = fileUpload(id, sdid, feedPhoto); // Adjusted to use schoolDetailsId + //feedPhotoPath = assetFileUpload(categoryId, feedPhoto, school_details_id); + } + + String feedref = generateRandomString(); //generate feedback reference text + // Save feedback for each question and answer pair + saveFeedbackDetails(categoryId, FansAvailableQa, FansAvailableAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, LightsAvailableQa, LightsAvailableAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, SwitchBoardQa, SwitchBoardAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, GenSetQa, GenSetAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, GenSetconditionQa, GenSetconditionAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + + + // If a photo was uploaded, save it in the category_photos table + if (feedPhotoPath != null) { + String qid="26"; + saveCategoryPhoto(categoryId, feedPhotoPath, qid, feedref); + } + } +///////////////////////////////////////////// + public void saveITAssetsFeedback( + int categoryId, + String SystemAvailableQa, + String SystemAvailableAns, + String PrinterAvailableQa, + String PrinterAvailableAns, + String UPSAvailableQa, + String UPSAvailableAns, + String NetworkAvailableQa, + String NetworkAvailableAns, + String projectorgoodconditionQa, + String projectorgoodconditionAns, + String smartboardgoodconditionQa, + String smartboardgoodconditionAns, + MultipartFile feedPhoto, + int school_details_id, + String zone, + String division, + double latitude, + double longitude, + String user_id) { + + String feedPhotoPath = null; + + // Handle file upload if a file is provided + if (feedPhoto != null && !feedPhoto.isEmpty()) { + String id = String.valueOf(categoryId); + String sdid = String.valueOf(school_details_id); + feedPhotoPath = fileUpload(id, sdid, feedPhoto); // Adjusted to use schoolDetailsId + //feedPhotoPath = assetFileUpload(categoryId, feedPhoto, school_details_id); + } + + String feedref = generateRandomString(); //generate feedback reference text + + // Save feedback for each question and answer pair + saveFeedbackDetails(categoryId, SystemAvailableQa, SystemAvailableAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, PrinterAvailableQa, PrinterAvailableAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, UPSAvailableQa, UPSAvailableAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, NetworkAvailableQa, NetworkAvailableAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, projectorgoodconditionQa, projectorgoodconditionAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, smartboardgoodconditionQa, smartboardgoodconditionAns, school_details_id, zone, division,latitude,longitude,user_id,feedref); + + // If a photo was uploaded, save it in the category_photos table + if (feedPhotoPath != null) { + //String qid="8"; + //saveCategoryPhoto(categoryId, feedPhotoPath, qid); + } + } +///////////////////////////////////// + public void saveSeepageSchoolFeedback( + int categoryId, + String SeepageinSchoolQa, + String SeepageinSchoolAns, + String HowmanyLocationsQa, + String HowmanyLocationsAns, +// MultipartFile feedPhoto, + int school_details_id, + String zone, + String division, + Double latitude , + Double longitude, + String user_id) { // Add latitude parameter + + String feedref = generateRandomString(); //generate feedback reference text + // Save feedback for each question and answer pair + saveFeedbackDetails(categoryId, SeepageinSchoolQa, SeepageinSchoolAns, school_details_id, zone, division, latitude,longitude,user_id,feedref); + saveFeedbackDetails(categoryId, HowmanyLocationsQa, HowmanyLocationsAns, school_details_id, zone, division, latitude,longitude,user_id,feedref); + + } + + private void saveFeedbackDetails( + int categoryId, String qid, String feedback, + int school_details_id, String zone, String division, + double latitude,Double longitude,String user_id, + String feedref) { + String sql = "INSERT INTO feedback (cat_question_id, feedback, school_details_id, " + + "zone, division, latitude, longitude, user_id, qid, feedref) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + // Execute SQL query to save feedback for the provided question + jdbcSchoolsTemplate.update(sql, categoryId, feedback, school_details_id, zone, division, latitude, longitude, user_id, qid, feedref); + } + + private void saveCategoryPhoto(int categoryId, String photoPath, String qid, String feedRef) { + String sql = "INSERT INTO category_photos " + + "(photo_url, is_active, is_deleted, category_id, qid, feedref) VALUES (?, ?, ?, ?, ?, ?)"; + + // Execute SQL query to save the photo path related to the category + jdbcSchoolsTemplate.update(sql, photoPath, 1, 0, categoryId, qid, feedRef); + } + //////////////////////////// + + public List> getAllSubCategories() { + String sql = "SELECT * FROM sub_category"; + return jdbcSchoolsTemplate.queryForList(sql); + } + + public Map getSchoolTypeById(int id) { + String sql = "SELECT * FROM school_type WHERE id = ?"; + return jdbcSchoolsTemplate.queryForMap(sql, id); + } + + public List> getAllSchoolTypes() { + String sql = "SELECT * FROM school_type"; + return jdbcSchoolsTemplate.queryForList(sql); + } + + public List> getFeedbackCountByCategoryAndDate(int categoryId, LocalDate startDate, LocalDate endDate,String user_id) { + String sql = "SELECT fb.zone ,COUNT(DISTINCT fb.cdate) AS feedback_count FROM " + + "feedback fb WHERE fb.cat_question_id = ? AND DATE(fb.cdate) BETWEEN ? AND ? " + + "GROUP BY fb.zone;"; + + return jdbcSchoolsTemplate.queryForList(sql, new Object[]{categoryId, startDate, endDate}); + } + + //////////////////////////////// + public List> getFeedbackCountByDivision(String division) { + String sql = "SELECT fd.division, COUNT(fd.feedback) AS feedback_count " + + "FROM feedback fd " + + "WHERE fd.division = ? " + + "GROUP BY fd.division"; + + return jdbcSchoolsTemplate.queryForList(sql, new Object[]{division}); + } + + public List> getFeedbackCountByDivisionAndSchool(String division, String categoryId, LocalDate fromDate, LocalDate toDate,String user_id) { + String sql = "SELECT sd.*, fb.zone,fb.division,COUNT(DISTINCT fb.cdate) AS feedback_count FROM feedback fb, " + + "school_details sd WHERE fb.cat_question_id = ? AND (DATE(fb.cdate) " + + "BETWEEN ? AND ?) AND " + + "(fb.division=?) AND " + + "(sd.id=fb.school_details_id) " + + "GROUP BY fb.zone,fb.division,sd.school_name"; + + return jdbcSchoolsTemplate.queryForList(sql, new Object[]{categoryId, fromDate, toDate, division}); + } + + public List> getFeedbackCountByDivisionAndSchoolList(String division, String schoolId, String categoryId, LocalDate fromDate, LocalDate toDate,String user_id) { + String sql = "SELECT sd.`id`, sd.`latitude`, sd.`longitude`, sd.`school_type`, sd.`school_name`, st.scl_type, " + + "fb.zone, fb.division, COUNT(DISTINCT fb.cdate) AS feedback_count, " + + "DATE_FORMAT(fb.cdate, '%d-%m-%Y %r') AS formatted_date, " + + "DATE_FORMAT(fb.cdate, '%d-%m-%Y') AS fdate, " + + "DATE_FORMAT(fb.cdate, '%r') AS ftime, " + + "fb.user_id as activityby, " + + "fb.`feedref` " + + "FROM feedback fb, school_details sd, school_type st WHERE " + + "fb.cat_question_id = ? AND (DATE(fb.cdate) BETWEEN ? AND ?) " + + "AND (fb.school_details_id = ? AND fb.division = ?) " + + "AND (sd.id=fb.school_details_id) " + + "AND (st.id=sd.school_type) " + + "GROUP BY fb.zone,fb.division,fb.`feedref` " + + "ORDER BY formatted_date DESC"; + + return jdbcSchoolsTemplate.queryForList(sql, new Object[]{categoryId, fromDate, toDate, schoolId, division}); + } + + public List> getFeedbackCountSchoolListByUserId(String categoryId, LocalDate fromDate, LocalDate toDate,String user_id) { + String sql = "SELECT sd.`id`, sd.`latitude`, sd.`longitude`, sd.`school_type`, sd.`school_name`, " + + " st.scl_type, fb.zone, fb.division, COUNT(DISTINCT fb.cdate) AS feedback_count, " + + " DATE_FORMAT(fb.cdate, '%d-%m-%Y %r') AS formatted_date, " + + " DATE_FORMAT(fb.cdate, '%d-%m-%Y') AS fdate, " + + " DATE_FORMAT(fb.cdate, '%r') AS ftime, " + + " fb.user_id as activityby, fb.`feedref` " + + "FROM feedback fb " + + "JOIN school_details sd ON sd.id = fb.school_details_id " + + "JOIN school_type st ON st.id = sd.school_type " + + "WHERE fb.cat_question_id = ? " + + " AND (DATE(fb.cdate) BETWEEN ? AND ?) " + + " AND fb.user_id = ? " + + "GROUP BY fb.zone, fb.division, fb.`feedref` " + + "ORDER BY formatted_date DESC;"; + + return jdbcSchoolsTemplate.queryForList(sql, new Object[]{categoryId, fromDate, toDate, user_id}); + } + + public List> getFeedbackCountByZoneCat(String zone, int categoryId, LocalDate fromDate, LocalDate toDate,String user_id) { + String sql = "SELECT fb.zone,fb.division,COUNT(DISTINCT fb.cdate) AS feedback_count " + + "FROM feedback fb WHERE fb.cat_question_id = ? AND " + + "(DATE(fb.cdate) BETWEEN ? AND ?) " + + "AND fb.zone=? GROUP BY fb.zone,fb.division"; + + return jdbcSchoolsTemplate.queryForList(sql, new Object[]{categoryId, fromDate, toDate, zone}); + } + + public List> getActiveCategories() { + String sql = "SELECT * FROM category WHERE is_active = 1 AND is_deleted = 0"; + return jdbcSchoolsTemplate.queryForList(sql); + } + + public List> getFeedbackCountByDivCat(String division, int categoryId, LocalDate fromDate, LocalDate toDate) { + + String sql = "SELECT fd.division, sd.school_name, COUNT(fd.feedback) AS feedback_count " + + "FROM feedback fd " + + "JOIN school_details sd ON fd.school_details_id = sd.id " + + "JOIN category cd ON fd.cat_question_id = cd.id " + // Join category table + "WHERE fd.division = ? AND cd.id = ? AND sd.cdate BETWEEN ? AND ? " + // Filter by division, categoryId, and date range + "GROUP BY fd.division, sd.school_name"; + + return jdbcSchoolsTemplate.queryForList(sql, new Object[]{division, categoryId, fromDate, toDate}); + } + + public Map getFeedbackBySchoolId(int schoolId, String division, String zone, int categoryId, String fromDate, String toDate, String userId) { + // Convert fromDate and toDate to YYYY-MM-DD format + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + LocalDate fromLocalDate = LocalDate.parse(fromDate, formatter); + LocalDate toLocalDate = LocalDate.parse(toDate, formatter); + String fromSqlDate = fromLocalDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + String toSqlDate = toLocalDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + + String sql = "SELECT fb.zone, fb.division, sd.school_name, cd.category, cq.id AS cat_question_id, " + + "sd.school_type, DATE_FORMAT(fb.cdate, '%Y-%m-%d') AS feedback_date, fb.feedref, " + + "cq.category_questions AS question, fb.feedback AS ans, " + + "GROUP_CONCAT(DISTINCT CONCAT('"+fileBaseUrl+"/gccofficialapp/files', cp.photo_url) SEPARATOR ',') AS photos " + + "FROM feedback fb " + + "JOIN category cd ON fb.cat_question_id = cd.id " + + "JOIN school_details sd ON fb.school_details_id = sd.id " + + "JOIN category_question cq ON fb.qid = cq.id " + + "LEFT JOIN category_photos cp ON fb.qid = cp.qid " + + "WHERE fb.zone = ? AND fb.division = ? AND fb.school_details_id = ? AND cd.id = ? " + + "AND DATE(fb.cdate) BETWEEN ? AND ? " + + "GROUP BY fb.zone, fb.division, fb.id, sd.school_name, cd.category, cq.id, fb.feedback, fb.feedref, fb.cdate"; + + List> result = jdbcSchoolsTemplate.queryForList(sql, zone, division, schoolId, categoryId, fromSqlDate, toSqlDate); + + if (result.isEmpty()) { + return Collections.emptyMap(); + } + + // Build response map + Map response = new HashMap<>(); + Map firstRow = result.get(0); + response.put("zone", firstRow.get("zone")); + response.put("division", firstRow.get("division")); + response.put("schoolName", firstRow.get("school_name")); + response.put("category", firstRow.get("category")); + response.put("catQuestionId", firstRow.get("cat_question_id")); + response.put("schoolType", firstRow.get("school_type")); + response.put("feedbackDate", firstRow.get("feedback_date")); + response.put("feedbackRef", firstRow.get("feedref")); + + List> feedbackData = new ArrayList<>(); + for (Map row : result) { + Map feedbackEntry = new HashMap<>(); + feedbackEntry.put("question", row.get("question")); + feedbackEntry.put("ans", row.get("ans")); + + // Split photo URLs into a list + String photos = (String) row.get("photos"); + feedbackEntry.put("photos", (photos != null && !photos.isEmpty()) ? Arrays.asList(photos.split(",")) : Collections.emptyList()); + + feedbackData.add(feedbackEntry); + } + + response.put("feedbackData", feedbackData); + return response; + } + + + public Map getFeedbackByFeedRef( String feedref, String userId) { + String sql = "SELECT sd.`id`, sd.`latitude`, sd.`longitude`, sd.`school_type`, sd.`school_name`, st.scl_type, " + + "fb.zone, fb.division, fb.id, fb.feedback, cd.category, cd.id AS cat_question_id, " + + "cq.category_questions AS question, fb.feedback AS ans, fb.feedref, " + + "CONCAT('"+fileBaseUrl+"/gccofficialapp/files', cp.photo_url) AS photos, " + //+ "CONCAT('"+fileBaseUrl+"/gccofficialapp/files', sp.photo_url) AS schoolphotos, " + + "GROUP_CONCAT(cq.category_questions) AS category_questions, " + + "DATE_FORMAT(fb.cdate, '%d-%m-%Y %r') AS cdate, " + + "DATE_FORMAT(fb.cdate, '%d-%m-%Y %r') AS formatted_date, " + + "DATE_FORMAT(fb.cdate, '%d-%m-%Y') AS fdate, " + + "DATE_FORMAT(fb.cdate, '%r') AS ftime " + + "FROM feedback fb " + + "JOIN category cd ON fb.cat_question_id = cd.id " + + "JOIN school_details sd ON fb.school_details_id = sd.id " + + "LEFT JOIN school_photos sp ON sd.id = sp.school_details_id " + + "LEFT JOIN category_photos cp ON fb.qid = cp.qid " + + "LEFT JOIN category_question cq ON fb.qid = cq.id " + + "JOIN school_type st ON st.id = sd.school_type " + + "WHERE fb.feedref = ? " + + "GROUP BY fb.zone, fb.division, fb.id, sd.school_name, cd.category, sd.school_type, fb.feedback, fb.feedref"; + + List> result = jdbcSchoolsTemplate.queryForList(sql,feedref); + + if (result.isEmpty()) { + return Collections.emptyMap(); + } + + // Build response map + Map response = new HashMap<>(); + Map firstRow = result.get(0); + response.put("zone", firstRow.get("zone")); + response.put("division", firstRow.get("division")); + response.put("schoolName", firstRow.get("school_name")); + response.put("category", firstRow.get("category")); + response.put("catQuestionId", firstRow.get("cat_question_id")); + response.put("schoolType", firstRow.get("scl_type")); + response.put("feedbackDate", firstRow.get("formatted_date")); + response.put("feedDate", firstRow.get("fdate")); + response.put("feedTime", firstRow.get("ftime")); + response.put("feedbackRef", firstRow.get("feedref")); + + List> feedbackData = new ArrayList<>(); + for (Map row : result) { + Map feedbackEntry = new HashMap<>(); + feedbackEntry.put("question", row.get("question")); + feedbackEntry.put("ans", row.get("ans")); + + // Split photo URLs into a list + String photos = (String) row.get("photos"); + feedbackEntry.put("photos", (photos != null && !photos.isEmpty()) ? Arrays.asList(photos.split(",")) : Collections.emptyList()); + + feedbackData.add(feedbackEntry); + } + + response.put("feedbackData", feedbackData); + return response; + } + +/* + public List> getFeedbackBySchoolId(int schoolId, String division, String zone, int categoryId, String fromDate, String toDate,String user_id) { + // Convert fromDate and toDate to YYYY-MM-DD format + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + LocalDate fromLocalDate = LocalDate.parse(fromDate, formatter); + LocalDate toLocalDate = LocalDate.parse(toDate, formatter); + String fromSqlDate = fromLocalDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + String toSqlDate = toLocalDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + + String sql = "SELECT fd.zone, fd.division, fd.id, sd.school_name, cd.category, cd.id AS cat_question_id, " + + "sd.school_type, fd.feedback, " + + "CONCAT('"+fileBaseUrl+"/gccofficialapp/files', cp.photo_url) AS feedbackphotos, " + + "CONCAT('"+fileBaseUrl+"/gccofficialapp/files', sp.photo_url) AS schoolphotos, " + + "GROUP_CONCAT(cq.category_questions) AS category_questions, " + + "DATE_FORMAT(fd.cdate, '%d-%m-%Y') AS cdate " + + "FROM feedback fd " + + "JOIN category cd ON fd.cat_question_id = cd.id " + + "JOIN school_details sd ON fd.school_details_id = sd.id " + + "LEFT JOIN school_photos sp ON sd.id = sp.school_details_id " + + "LEFT JOIN category_photos cp ON cd.id = cp.category_id " + + "LEFT JOIN category_question cq ON cd.id = cq.category_id " + + "WHERE sd.id = ? AND fd.division = ? AND fd.zone = ? AND cd.id = ? AND DATE(fd.cdate) BETWEEN ? AND ? " + + "GROUP BY fd.zone, fd.division, fd.id, sd.school_name, cd.category, sd.school_type, fd.feedback, DATE_FORMAT(fd.cdate, '%d-%m-%Y') " + + ""; + return jdbcSchoolsTemplate.queryForList(sql, new Object[]{schoolId, division, zone, categoryId, fromSqlDate, toSqlDate}); + } + */ + public void saveCmSheme( + int categoryId, + String BreakFastQualityQa, + String BreakFastQualityAns, + String CMBFhelpersPresentSchoolQa, + String CMBFhelpersPresentSchoolAns, + String DinningAreaKeptQa, + String DinningAreaKeptAns, + String IsschoolhygienicallyQa, + String IsschoolhygienicallyAns, + MultipartFile feedPhoto, + int school_details_id, + String zone, + String division, + double latitude, + double longitude, + String user_id, + String question_id) { + + String feedPhotoPath = null; + + + // Handle file upload if a photo is provided + if (feedPhoto != null && !feedPhoto.isEmpty()) { + // Make sure to pass the correct type for the first argument + String id = String.valueOf(categoryId); + String sdid = String.valueOf(school_details_id); + feedPhotoPath = fileUpload(id, sdid, feedPhoto); // Adjusted to use schoolDetailsId + } + + // Create a map for questions and answers + Map questionsAndAnswers = new HashMap<>(); + questionsAndAnswers.put(BreakFastQualityQa, BreakFastQualityAns); + questionsAndAnswers.put(CMBFhelpersPresentSchoolQa, CMBFhelpersPresentSchoolAns); + questionsAndAnswers.put(DinningAreaKeptQa, DinningAreaKeptAns); + questionsAndAnswers.put(IsschoolhygienicallyQa, IsschoolhygienicallyAns); + // questionsAndAnswers.put(genSetConditionQa, genSetConditionAns); + + String feedref = generateRandomString(); //generate feedback reference text + + // Save feedback for each question and answer pair + questionsAndAnswers.forEach((question, answer) -> + saveFeedbackDetails(categoryId, question, answer, school_details_id, zone, division, latitude, longitude, user_id,feedref) + ); + + // If a photo was uploaded, save it in the category_photos table + if (feedPhotoPath != null) { + String qid="38"; + saveCategoryPhoto(categoryId, feedPhotoPath, qid, feedref); + } + } + + public void saveClusterKitchen(int categoryId, String clusterKitchencleanandneatQa, + String clusterKitchencleanandneatAns, String sampleoffoodmaintainedQa, + String sampleoffoodmaintainedAns, String cookingstaffwearingQa, String cookingstaffwearingAns, + String fooditemsmatchwiththestockQa, String fooditemsmatchwiththestockAns, + String fooditemsusedofgoodqualityQa, String fooditemsusedofgoodqualityAns, MultipartFile feedPhoto, + int school_details_id, String zone, String division, Double latitude, double longitude, + String user_id, String question_id) { + + String feedPhotoPath = null; + + // Handle file upload if a photo is provided + if (feedPhoto != null && !feedPhoto.isEmpty()) { + // Make sure to pass the correct type for the first argument + String id = String.valueOf(categoryId); + String sdid = String.valueOf(school_details_id); + feedPhotoPath = fileUpload(id, sdid, feedPhoto); // Adjusted to use schoolDetailsId + } + // Create a map for questions and answers + Map questionsAndAnswers = new HashMap<>(); + questionsAndAnswers.put(clusterKitchencleanandneatQa, clusterKitchencleanandneatAns); + questionsAndAnswers.put(sampleoffoodmaintainedQa, sampleoffoodmaintainedAns); + questionsAndAnswers.put(cookingstaffwearingQa, cookingstaffwearingAns); + questionsAndAnswers.put(fooditemsmatchwiththestockQa, fooditemsmatchwiththestockAns); + questionsAndAnswers.put(fooditemsusedofgoodqualityQa, fooditemsusedofgoodqualityAns); + + String feedref = generateRandomString(); //generate feedback reference text + + // Save feedback for each question and answer pair + questionsAndAnswers.forEach((question, answer) -> + saveFeedbackDetails(categoryId, question, answer, school_details_id, zone, division, latitude, longitude, user_id,feedref) + ); + + // If a photo was uploaded, save it in the category_photos table + if (feedPhotoPath != null) { + String qid="40"; + saveCategoryPhoto(categoryId,feedPhotoPath,qid,feedref); + } + } + +} + + diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccschools/service/package-info.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccschools/service/package-info.java new file mode 100644 index 0000000..d54c816 --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccschools/service/package-info.java @@ -0,0 +1 @@ +package in.gov.chennaicorporation.mobileservice.gccschools.service; \ No newline at end of file diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccsos/service/OfficerActivity.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccsos/service/OfficerActivity.java index de6e06a..54502b8 100644 --- a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccsos/service/OfficerActivity.java +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccsos/service/OfficerActivity.java @@ -31,15 +31,16 @@ import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import in.gov.chennaicorporation.mobileservice.gccactivity.service.DateTimeUtil; -@Service - +@Service("gccofficialappOfficerActivity") public class OfficerActivity { private JdbcTemplate jdbcSOSTemplate; private final Environment environment; + private String fileBaseUrl; @Autowired public void setDataSource(@Qualifier("mysqlGccSOSDataSource") DataSource sosDataSource) { @@ -49,6 +50,7 @@ public class OfficerActivity { @Autowired public OfficerActivity(Environment environment) { this.environment = environment; + this.fileBaseUrl=environment.getProperty("fileBaseUrl"); } private byte[] compressImage(BufferedImage image, float quality) throws IOException { @@ -635,7 +637,7 @@ public class OfficerActivity { return result; }else { - String sqlQuery2 = "SELECT *,CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files', filepath) AS imageUrl " + String sqlQuery2 = "SELECT *,CONCAT('"+fileBaseUrl+"/gccofficialapp/files', filepath) AS imageUrl " + "FROM `rescue_officer_update` WHERE rescue_id='"+rescue_id+"'"; List> result2 = jdbcSOSTemplate.queryForList(sqlQuery2); System.out.println(sqlQuery2); diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccsos/service/UserActivity.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccsos/service/UserActivity.java index dacf9ed..daa4451 100644 --- a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccsos/service/UserActivity.java +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccsos/service/UserActivity.java @@ -43,6 +43,7 @@ public class UserActivity { private JdbcTemplate jdbcSOSTemplate; private final Environment environment; + private String fileBaseUrl; @Autowired public void setDataSource(@Qualifier("mysqlGccSOSDataSource") DataSource sosDataSource) { @@ -52,6 +53,7 @@ public class UserActivity { @Autowired public UserActivity(Environment environment) { this.environment = environment; + this.fileBaseUrl=environment.getProperty("fileBaseUrl"); } private byte[] compressImage(BufferedImage image, float quality) throws IOException { @@ -208,7 +210,7 @@ public class UserActivity { return result; }else { - String sqlQuery2 = "SELECT *,CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files', filepath) AS imageUrl " + String sqlQuery2 = "SELECT *,CONCAT('"+fileBaseUrl+"/gccofficialapp/files', filepath) AS imageUrl " + "FROM `rescue_officer_update` WHERE rescue_id='"+rescue_id+"'"; List> result2 = jdbcSOSTemplate.queryForList(sqlQuery2); System.out.println(sqlQuery2); diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccstraydogs/controller/UserApiController.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccstraydogs/controller/UserApiController.java new file mode 100644 index 0000000..1941ee1 --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccstraydogs/controller/UserApiController.java @@ -0,0 +1,330 @@ +package in.gov.chennaicorporation.mobileservice.gccstraydogs.controller; + +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import org.springframework.http.HttpStatus; + +import in.gov.chennaicorporation.mobileservice.gccstraydogs.service.UserService; + +@RequestMapping("/gccofficialapp/api/gccstraydogs/user/") +@RestController("gccofficialappUserStraydogRest") +public class UserApiController { + + @Autowired + private UserService userService; + + @PostMapping("/step1") + public ResponseEntity> saveStep1( + @RequestParam("qr_id") String qr_id, + @RequestParam("userid_1") String userid_1, + @RequestParam("date1") String date1, + @RequestParam("lat_1") String lat_1, + @RequestParam("long_1") String long_1, + @RequestParam("location_1") String location_1, + @RequestParam("photo1") MultipartFile photo1, + @RequestParam("sex_1") String sex_1, + @RequestParam("contraception_1") boolean contraception_1) { + + try { + Timestamp date_1 = Timestamp.valueOf(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").parse(date1))); + + String step = userService.saveStep1(qr_id, userid_1, date_1, lat_1, long_1, location_1, photo1, sex_1, contraception_1, 1); + + Map response = new HashMap<>(); + response.put("status", "OK"); + response.put("QR_id", qr_id); + response.put("Step", step); + + return ResponseEntity.ok(response); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of( + "status", "ERROR", + "message", "Error saving Step_1: " + e.getMessage() + )); + } + } + + + @PostMapping("/step2") + public ResponseEntity> saveStep2( + @RequestParam("qr_id") String qr_id, + @RequestParam("userid_2") String userid_2, + @RequestParam("date2") String date2, + @RequestParam("lat_2") String lat_2, + @RequestParam("long_2") String long_2, + @RequestParam("location_2") String location_2, + @RequestParam("photo2") MultipartFile photo2, + @RequestParam("sex_2") String sex_2, + @RequestParam("contraception_2") boolean contraception_2) { + + try { + Timestamp date_2 = Timestamp.valueOf(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").parse(date2))); + + //String photo_2 = photo2.getOriginalFilename(); + + String step = userService.saveStep2(qr_id, userid_2, date_2, lat_2, long_2, location_2, photo2, sex_2, contraception_2, 2); + + // Prepare and return the response + Map response = new HashMap<>(); + response.put("status", "OK"); + response.put("QR_id", qr_id); + response.put("Step", step); + + return ResponseEntity.ok(response); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of( + "status", "ERROR", + "message", "Error saving Step_2: " + e.getMessage() + )); + } + } + + @PostMapping("/step3") + public ResponseEntity> saveStep3( + @RequestParam("qr_id") String qr_id, + @RequestParam("rf_id") String rf_id, + @RequestParam("userid_3") String userid_3, + @RequestParam("sex_3") String sex_3, + @RequestParam("body_weight_3") String body_weight_3, + @RequestParam("temperature_3") String temperature_3, + @RequestParam("surgery_fitness_3") boolean surgery_fitness_3, + @RequestParam("surgery_type_3") String surgery_type_3) { + + int stage = 0; + String step = ""; + String qrid = ""; + Timestamp surgery_date = new Timestamp(new Date().getTime()); // Current timestamp + + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String formattedDate = sdf.format(surgery_date); + + // Fetch logs using rf_id + List> data = userService.getlogsrfid(rf_id); + + if (data != null && !data.isEmpty()) { + for (Map map : data) { + if (map.get("date_5") != null) { + int days = userService.getVaccineDue(qr_id, rf_id, formattedDate); + if (days <= 10) { + stage = 5; + } else { + stage = 6; + } + step = userService.updateStage(rf_id, qr_id, stage); + } + } + } else { + if (surgery_fitness_3) { + stage = 4; + } else { + stage = 5; + } + step = userService.updateStage(rf_id, qr_id, stage); + qrid = userService.saveStep3(qr_id, rf_id, userid_3, sex_3, body_weight_3, temperature_3, surgery_fitness_3, surgery_type_3, surgery_date); + } + + // Create response + Map response = new HashMap<>(); + response.put("QR_id", qr_id); + response.put("RF_id", rf_id); + response.put("Step", step); + response.put("status", "OK"); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of( + "status", "ERROR", + "message", "Error saving Step_3: " + e.getMessage() + )); + } + } + @PostMapping("/step4") + public ResponseEntity> saveStep4(@RequestParam("rf_id") String rf_id, + @RequestParam("qr_id") String qr_id, + @RequestParam("userid_4") String userid_4, + @RequestParam("surgery_complication_4") boolean surgery_complication_4, + @RequestParam("complication_type_4") String complication_type_4) { + try { + int stage = 5; // Assuming stage is hardcoded to 5 for Step 4 + + String qrid = userService.saveStep4(qr_id, rf_id, userid_4, surgery_complication_4, complication_type_4); + String step = userService.updateStage(rf_id, qr_id, stage); + + // Prepare response + Map response = new HashMap<>(); + response.put("QR_id", qrid); + response.put("RF_id", rf_id); + response.put("Step", step); + response.put("status", "OK"); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of( + "status", "ERROR", + "message", "Error saving Step 4: " + e.getMessage() + )); + } + } + + + @PostMapping("/step5") + public ResponseEntity> saveStep5(@RequestParam("rf_id") String rf_id, + @RequestParam("qr_id") String qr_id, + @RequestParam("userid_5") String userid_5, + @RequestParam("arv_5") boolean arv_5, + @RequestParam("dhppi_5") boolean dhppi_5, + @RequestParam("photo_5") MultipartFile photo_5, + @RequestParam("lat_5") String lat_5, + @RequestParam("long_5") String long_5, + @RequestParam("location_5") String location_5, + @RequestParam("date_5") String date_5) { + try { + int stage = 6; // Assuming stage is set to 6 for Step 5 + Timestamp date5 = parseDate(date_5); + int days = userService.getVaccineDue(qr_id, rf_id, date5.toString()); + + String qrid; + String step; + + if (days <= 10) { + qrid = userService.saveNewStep5(rf_id, qr_id, userid_5, arv_5, dhppi_5, photo_5, lat_5, long_5, location_5, date5); + } else { + qrid = userService.saveUpdateStep5(rf_id, qr_id, userid_5, arv_5, dhppi_5, photo_5, lat_5, long_5, location_5, date5); + } + step = userService.updateStage(rf_id, qr_id, stage); + + Map response = new HashMap<>(); + response.put("status", "OK"); + response.put("Qr_id", qrid); + response.put("Step", step); + + return ResponseEntity.ok(response); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of( + "status", "ERROR", + "message", "Error saving Step 5: " + e.getMessage() + )); + } + } + + private Timestamp parseDate(String dateStr) throws ParseException { + SimpleDateFormat inputFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = inputFormat.parse(dateStr); + return Timestamp.valueOf(outputFormat.format(date)); + } + + @PostMapping("/step6") + public ResponseEntity> saveStep6(@RequestParam("qr_id") String qr_id, + @RequestParam("userid_6") String userid_6, + @RequestParam("lat_6") String lat_6, + @RequestParam("long_6") String long_6, + @RequestParam("location_6") String location_6, + @RequestParam("date_6") String date_6, + @RequestParam("photo_6") MultipartFile photo_6) { + try { + int stage = 0; // Assuming stage 0 is a valid value, adjust as needed + + Timestamp date6 = parseDate(date_6); + //String photoFilename = photo_6.getOriginalFilename(); // Retrieve the filename of the uploaded photo + + String step = userService.saveStep6(qr_id, userid_6, lat_6, long_6, location_6, date6, photo_6, stage); + + Map response = new HashMap<>(); + response.put("status", "OK"); + response.put("Qr_id", qr_id); + response.put("Step", step); + + return ResponseEntity.ok(response); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of( + "status", "ERROR", + "message", "Error saving Step 6: " + e.getMessage() + )); + } + } + + private Timestamp parseDate1(String dateStr) throws ParseException { + SimpleDateFormat inputFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = inputFormat.parse(dateStr); + return Timestamp.valueOf(outputFormat.format(date)); + } + + + + @GetMapping("/getMasterData") + public ResponseEntity> getMasterData(@RequestParam String rf_id) { + try { + List> data = userService.getMasterData(rf_id); + Map response = new HashMap<>(); + + if (data.isEmpty()) { + //response.put("status", "Failed"); + //response.put("message", "No Data Found"); + } else { + response.put("status", "OK"); + response.put("data", data); + } + + return ResponseEntity.ok(response); + } catch (Exception e) { + // Log the exception details for debugging + e.printStackTrace(); + + // Provide a user-friendly error message + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of( + "status", "Error", + "message", "Error getting data: " + e.getMessage() + )); + } + } + + + @GetMapping("/getLogData") + public ResponseEntity> getLogData(@RequestParam String qr_id) { + try{ + List> data = userService.getLogData(qr_id); + Map response = new HashMap<>(); + if(data.size() != 0) { + response.put("status", "OK"); + response.put("data", data); + } else { + //response.put("status", "Failed"); + //response.put("data", "No Data Found"); + } + return ResponseEntity.ok(response); + }catch (Exception e) { + // Log the exception details for debugging + e.printStackTrace(); + + // Provide a user-friendly error message + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of( + "status", "Error", + "message", "Error getting data: " + e.getMessage() + )); + } + } + +} diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccstraydogs/controller/package-info.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccstraydogs/controller/package-info.java new file mode 100644 index 0000000..c5060f2 --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccstraydogs/controller/package-info.java @@ -0,0 +1 @@ +package in.gov.chennaicorporation.mobileservice.gccstraydogs.controller; \ No newline at end of file diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccstraydogs/package-info.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccstraydogs/package-info.java new file mode 100644 index 0000000..d0d6b3e --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccstraydogs/package-info.java @@ -0,0 +1 @@ +package in.gov.chennaicorporation.mobileservice.gccstraydogs; \ No newline at end of file diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccstraydogs/service/UserService.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccstraydogs/service/UserService.java new file mode 100644 index 0000000..c966388 --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccstraydogs/service/UserService.java @@ -0,0 +1,325 @@ +package in.gov.chennaicorporation.mobileservice.gccstraydogs.service; + +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.Timestamp; +import java.util.List; +import java.util.Map; + +import javax.imageio.ImageIO; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.stream.ImageOutputStream; +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.env.Environment; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import in.gov.chennaicorporation.mobileservice.gccactivity.service.DateTimeUtil; +import jakarta.transaction.Transactional; + +@Service +public class UserService { + + private JdbcTemplate jdbcStraydogsTemplate; + private final Environment environment; + private String fileBaseUrl; + + @Autowired + public void setDataSource(@Qualifier("mysqlGccStraydogsDataSource") DataSource straydogsDataSource) { + this.jdbcStraydogsTemplate = new JdbcTemplate(straydogsDataSource); + } + + @Autowired + public UserService(Environment environment) { + this.environment = environment; + this.fileBaseUrl=environment.getProperty("fileBaseUrl"); + } + + private byte[] compressImage(BufferedImage image, float quality) throws IOException { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(byteArrayOutputStream); + + ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); + writer.setOutput(imageOutputStream); + + ImageWriteParam param = writer.getDefaultWriteParam(); + if (param.canWriteCompressed()) { + param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + param.setCompressionQuality(quality); + } + + writer.write(null, new javax.imageio.IIOImage(image, null, null), param); + + writer.dispose(); + imageOutputStream.close(); + + return byteArrayOutputStream.toByteArray(); + } + + + public String fileUpload(String name, String id, MultipartFile file) { + + int lastInsertId = 0; + // Set the file path where you want to save it + String uploadDirectory = environment.getProperty("file.upload.directory"); + String serviceFolderName = environment.getProperty("straydogs_foldername"); + var year =DateTimeUtil.getCurrentYear(); + var month =DateTimeUtil.getCurrentMonth(); + + uploadDirectory = uploadDirectory + serviceFolderName + year +"/"+month+"/"; + + try { + // Create directory if it doesn't exist + Path directoryPath = Paths.get(uploadDirectory); + if (!Files.exists(directoryPath)) { + Files.createDirectories(directoryPath); + } + + // Datetime string + String datetimetxt = DateTimeUtil.getCurrentDateTime(); + // File name + String fileName = name+ "_" +id + "_" + datetimetxt + "_" + file.getOriginalFilename(); + fileName = fileName.replaceAll("\\s+", ""); // Remove space on filename + + String filePath = uploadDirectory + "/" + fileName; + + String filepath_txt = "/"+serviceFolderName + year +"/"+month+"/"+fileName; + + // Create a new Path object + Path path = Paths.get(filePath); + + // Get the bytes of the file + byte[] bytes = file.getBytes(); + + // Compress the image + BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes)); + byte[] compressedBytes = compressImage(image, 0.5f); // Compress with 50% quality + + // Write the bytes to the file + Files.write(path, bytes); + + System.out.println(filePath); + return filepath_txt; + + } catch (IOException e) { + e.printStackTrace(); + return "Failed to save file " + file.getOriginalFilename(); + } + } + + @Transactional + public String saveStep1(String qr_id, String userid_1, Timestamp date_1, String lat_1, String long_1, String location_1, MultipartFile file, String sex_1, boolean contraception_1, int stage) { + + String filename = fileUpload("straydogs", "step1", file); + + String sql = "INSERT INTO stray_dog_logs (qr_id, userid_1, date_1, lat_1, long_1, location_1, photo_1, sex_1, contraception_1, stage) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + try { + int rowsAffected = jdbcStraydogsTemplate.update(sql, qr_id, userid_1, date_1, lat_1, long_1, location_1, filename, sex_1, contraception_1, stage); + if (rowsAffected > 0) { + return Integer.toString(stage); + } else { + return "Error: No rows inserted"; + } + } catch (Exception e) { + e.printStackTrace(); + return "Error in Saving Step_1 give proper input"; + } + } + + + @Transactional + public String saveStep2(String qr_id, String userid_2, Timestamp date_2, String lat_2, String long_2, String location_2, MultipartFile file, String sex_2, boolean contraception_2, int stage) { + + String filename = fileUpload("straydogs", "step2", file); + + String sql = "UPDATE stray_dog_logs SET userid_2 = ?, date_2 = ?, lat_2 = ?, long_2 = ?, location_2 = ?, photo_2 = ?, sex_2 = ?, contraception_2 = ?, stage = ? WHERE qr_id = ?"; + try { + System.out.println("----------------->"+userid_2); + jdbcStraydogsTemplate.update(sql, userid_2, date_2, lat_2, long_2, location_2, filename, sex_2, contraception_2, stage, qr_id); + + return Integer.toString(stage); + } catch (Exception e) { + e.printStackTrace(); + return "Error in Saving Step_2 give proper input"; + } + } + + @Transactional + public void saverfid(String qr_id, String rf_id) { + System.out.println("Check 1"); + String sql = "UPDATE stray_dog_logs SET rf_id = ? WHERE qr_id = ? "; + try { + jdbcStraydogsTemplate.update(sql, rf_id, qr_id); + System.out.println("Check 1"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Transactional + public String saveStep3(String qr_id, String rf_id, String userid_3, String sex_3, String body_weight_3, String temperature_3, boolean surgery_fitness_3, String surgery_type_3, Timestamp surgery_date) { + System.out.println("repo 2 1"); + String sql = "INSERT INTO stray_dog_master (qr_id, rf_id, userid_3, sex_3, body_weight_3, temperature_3, surgery_fitness_3, surgery_type_3, surgery_date) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; + try { + jdbcStraydogsTemplate.update(sql, qr_id, rf_id, userid_3, sex_3, body_weight_3, temperature_3, surgery_fitness_3, surgery_type_3, surgery_date); +// System.out.println("repo 2 2 1"); + return qr_id; + } catch (Exception e) { + e.printStackTrace(); + } + return "Error in Saving Step_3 give proper input"; + } + + @Transactional + public String saveStep4(String qr_id, String rf_id, String userid_4, boolean surgery_complication_4, String complication_type_4) { + String sql = "UPDATE stray_dog_master SET userid_4 = ?, surgery_complication_4 = ?, complication_type_4 = ? WHERE qr_id = ? AND rf_id = ?"; + try { + jdbcStraydogsTemplate.update(sql, userid_4, surgery_complication_4, complication_type_4, qr_id, rf_id); + return qr_id; + } catch (Exception e) { + e.printStackTrace(); + } + return "Error in Saving Step_4 give proper input"; + } + + @Transactional + public String saveNewStep5(String rf_id, String qr_id, String userid_5, boolean arv_5, boolean dhppi_5, MultipartFile file, String lat_5, String long_5, String location_5, Timestamp date_5) { + + String filename = fileUpload("straydogs", "step5", file); + + String sql = "INSERT INTO stray_dog_master (rf_id, qr_id, userid_5, arv_5, dhppi_5, photo_5, lat_5, long_5, location_5, date_5) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ? ,?)"; + try { + jdbcStraydogsTemplate.update(sql, rf_id, qr_id, userid_5, arv_5, dhppi_5, filename, lat_5, long_5, location_5, date_5); + return qr_id; + } catch (Exception e) { + e.printStackTrace(); + return "Error in Saving Step_5 give proper input"; + } + } + + + @Transactional + public String saveUpdateStep5(String rf_id, String qr_id, String userid_5, boolean arv_5, boolean dhppi_5, MultipartFile file, String lat_5, String long_5, String location_5, Timestamp date_5) { + + String filename = fileUpload("straydogs", "step5", file); + + String sql = "UPDATE stray_dog_master SET userid_5 = ?, arv_5 = ?, dhppi_5 = ?, photo_5 = ?, lat_5 = ?, long_5 = ?, location_5 = ?, date_5 = ? WHERE rf_id = ? AND qr_id = ?"; + try { + jdbcStraydogsTemplate.update(sql, userid_5, arv_5, dhppi_5, filename, lat_5, long_5, location_5, date_5, rf_id, qr_id); + return qr_id; + } catch (Exception e) { + e.printStackTrace(); + return "Error in Saving Step_5 give proper input"; + } + } + + + @Transactional + public String saveStep6(String qr_id, String userid_6, String lat_6, String long_6, String location_6, Timestamp date_6, MultipartFile file, int stage) { + + String filename = fileUpload("straydogs", "step6", file); + + String sql = "UPDATE stray_dog_logs SET userid_6 = ?, lat_6 = ?, long_6 = ?, location_6 = ?, date_6 = ?, photo_6 = ?, stage = ? WHERE qr_id = ?"; + try { + jdbcStraydogsTemplate.update(sql, userid_6, lat_6, long_6, location_6, date_6, filename, stage, qr_id); + return Integer.toString(stage); + + } catch (Exception e) { + e.printStackTrace(); + return "Error in Saving Step_6 give proper input"; + } + } + + @Transactional + public List> getMasterData(String rf_id) { + String sql = "SELECT *, " + + "CONCAT('"+fileBaseUrl+"/gccofficialapp/files', photo_5) AS step5_imageUrl, " + + + "CASE WHEN surgery_fitness_3 = 1 THEN DATE_FORMAT(surgery_date, '%d-%m-%Y %r') ELSE '-' END AS formatted_surgery_datetime, " + + "CASE WHEN surgery_fitness_3 = 1 THEN DATE_FORMAT(surgery_date, '%d-%m-%Y') ELSE '-' END AS formatted_surgery_date, " + + "CASE WHEN surgery_fitness_3 = 1 THEN DATE_FORMAT(surgery_date, '%r') ELSE '-' END AS formatted_surgery_time, " + + + "CASE WHEN arv_5 = 1 THEN DATE_FORMAT(date_5, '%d-%m-%Y %r') ELSE '-' END AS formatted_arv_datetime, " + + "CASE WHEN arv_5 = 1 THEN DATE_FORMAT(date_5, '%d-%m-%Y') ELSE '-' END AS formatted_arv_date, " + + "CASE WHEN arv_5 = 1 THEN DATE_FORMAT(date_5, '%r') ELSE '-' END AS formatted_arv_time " + + " FROM stray_dog_master WHERE rf_id = ?"; + return jdbcStraydogsTemplate.queryForList(sql, rf_id); + } + @Transactional + public List> getLogData(String qr_id) { + String sql = "SELECT *, " + + "CONCAT('"+fileBaseUrl+"/gccofficialapp/files', photo_1) AS step1_imageUrl, " + + "CONCAT('"+fileBaseUrl+"/gccofficialapp/files', photo_2) AS step2_imageUrl, " + + "CONCAT('"+fileBaseUrl+"/gccofficialapp/files', photo_6) AS step6_imageUrl, " + + + "CASE WHEN userid_1 IS NOT NULL THEN DATE_FORMAT(date_1, '%d-%m-%Y %r') ELSE '-' END AS formatted_stage_1_datetime, " + + "CASE WHEN userid_1 IS NOT NULL THEN DATE_FORMAT(date_1, '%d-%m-%Y') ELSE '-' END AS formatted_stage_1_date, " + + "CASE WHEN userid_1 IS NOT NULL THEN DATE_FORMAT(date_1, '%r') ELSE '-' END AS formatted_stage_1_time, " + + + "CASE WHEN userid_2 IS NOT NULL THEN DATE_FORMAT(date_2, '%d-%m-%Y %r') ELSE '-' END AS formatted_stage_2_datetime, " + + "CASE WHEN userid_2 IS NOT NULL THEN DATE_FORMAT(date_2, '%d-%m-%Y') ELSE '-' END AS formatted_stage_2_date, " + + "CASE WHEN userid_2 IS NOT NULL THEN DATE_FORMAT(date_2, '%r') ELSE '-' END AS formatted_stage_2_time, " + + + "CASE WHEN userid_6 IS NOT NULL THEN DATE_FORMAT(date_6, '%d-%m-%Y %r') ELSE '-' END AS formatted_stage_6_datetime, " + + "CASE WHEN userid_6 IS NOT NULL THEN DATE_FORMAT(date_6, '%d-%m-%Y') ELSE '-' END AS formatted_stage_6_date, " + + "CASE WHEN userid_6 IS NOT NULL THEN DATE_FORMAT(date_6, '%r') ELSE '-' END AS formatted_stage_6_time " + + + " FROM stray_dog_logs WHERE qr_id = ?"; + return jdbcStraydogsTemplate.queryForList(sql, qr_id); + } + + @Transactional + public List> getlogsrfid(String rf_id) { + System.out.println("repo 1"); + String sql = "SELECT *, " + + "CONCAT('"+fileBaseUrl+"/gccofficialapp/files', photo_5) AS step5_imageUrl, " + + + "CASE WHEN surgery_fitness_3 = 1 THEN DATE_FORMAT(surgery_date, '%d-%m-%Y %r') ELSE '-' END AS formatted_surgery_datetime, " + + "CASE WHEN surgery_fitness_3 = 1 THEN DATE_FORMAT(surgery_date, '%d-%m-%Y') ELSE '-' END AS formatted_surgery_date, " + + "CASE WHEN surgery_fitness_3 = 1 THEN DATE_FORMAT(surgery_date, '%r') ELSE '-' END AS formatted_surgery_time, " + + + "CASE WHEN arv_5 = 1 THEN DATE_FORMAT(date_5, '%d-%m-%Y %r') ELSE '-' END AS formatted_arv_datetime, " + + "CASE WHEN arv_5 = 1 THEN DATE_FORMAT(date_5, '%d-%m-%Y') ELSE '-' END AS formatted_arv_date, " + + "CASE WHEN arv_5 = 1 THEN DATE_FORMAT(date_5, '%r') ELSE '-' END AS formatted_arv_time " + + + "FROM stray_dog_master WHERE rf_id = ? ORDER BY rf_id DESC LIMIT 1"; + System.out.println("repo 2"); + return jdbcStraydogsTemplate.queryForList(sql, rf_id); + } + + @Transactional + public String updateStage(String rf_id, String qr_id, int stage) { + System.out.println("update repo 1"); + String sql = "UPDATE stray_dog_logs SET stage = ?, rf_id = ? WHERE qr_id = ?"; + jdbcStraydogsTemplate.update(sql, stage, rf_id, qr_id); + System.out.println("update repo 2"); + return Integer.toString(stage); + } + + @Transactional + public int getVaccineDue(String qrId, String rfId, String formattedDate) { + System.out.println("vaccine repo 1"); + String sql = "SELECT COALESCE(DATEDIFF(DATE_ADD(date_5, INTERVAL 1 YEAR), ?), 365) AS remaining_days\n" + + "FROM stray_dog_master\n" + + "WHERE qr_id = ? AND rf_id = ? ORDER BY date_5 DESC LIMIT 1"; + + System.out.println("vaccine repo 2"); + List days = jdbcStraydogsTemplate.queryForList(sql, new Object[]{formattedDate, qrId, rfId}, Integer.class); + int day = days.get(0); + + System.out.println("day = "+day); + return day; + + } + +} diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccstraydogs/service/package-info.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccstraydogs/service/package-info.java new file mode 100644 index 0000000..53121d2 --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/gccstraydogs/service/package-info.java @@ -0,0 +1 @@ +package in.gov.chennaicorporation.mobileservice.gccstraydogs.service; \ No newline at end of file diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/nulm/service/NULMOfficerActivity.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/nulm/service/NULMOfficerActivity.java index 24ba636..1d777fc 100644 --- a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/nulm/service/NULMOfficerActivity.java +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/nulm/service/NULMOfficerActivity.java @@ -39,6 +39,7 @@ import in.gov.chennaicorporation.mobileservice.gccactivity.service.DateTimeUtil; public class NULMOfficerActivity { private JdbcTemplate jdbcNULMTemplate; private final Environment environment; + private String fileBaseUrl; @Autowired public void setDataSource(@Qualifier("mysqlNulmDataSource") DataSource sosDataSource) { @@ -48,6 +49,7 @@ public class NULMOfficerActivity { @Autowired public NULMOfficerActivity(Environment environment) { this.environment = environment; + this.fileBaseUrl=environment.getProperty("fileBaseUrl"); } private byte[] compressImage(BufferedImage image, float quality) throws IOException { @@ -206,6 +208,7 @@ public class NULMOfficerActivity { Map response = new HashMap<>(); int lastQueryId = 0; + String datetimetxt = DateTimeUtil.getCurrentDateTimeMysql(); // Current timestamp try { diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/penalty/controller/APIPenaltyController.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/penalty/controller/APIPenaltyController.java index 55d6f4f..15b10ee 100644 --- a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/penalty/controller/APIPenaltyController.java +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/penalty/controller/APIPenaltyController.java @@ -21,8 +21,8 @@ public class APIPenaltyController { private PenaltyService penaltyService; @GetMapping(value="/getpenaltytypes") - public List> getPenaltyTypes() { - return penaltyService.getPenaltyTypeList(); + public List> getPenaltyTypes(@RequestParam(value = "departmentId", required = false) String departmentId) { + return penaltyService.getPenaltyTypeList(departmentId); } @PostMapping(value="/generateChallan") @@ -65,7 +65,7 @@ public class APIPenaltyController { @RequestParam(value = "file", required = false) MultipartFile file ) { return penaltyService.updateViolateInfo(formData, challanId, categoryId, latitude, longitude, zone, ward, streeId, - streetName, loginId,remarks,isviolatorAvailable,violatorName,violatorPhone,ton,file); + streetName, loginId, remarks, isviolatorAvailable, violatorName, violatorPhone, ton, file); } @GetMapping(value = "/getOfficerChallanList") @@ -103,7 +103,7 @@ public class APIPenaltyController { @PostMapping(value="/closeChallan") public List closeChallan(@RequestParam MultiValueMap formData, - @RequestParam(value = "challanId", required = false) String challanId, + @RequestParam(value = "challanId", required = false) String challanId, @RequestParam(value = "latitude", required = false) String latitude, @RequestParam(value = "longitude", required = false) String longitude, @RequestParam(value = "zone", required = false) String zone, diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/penalty/controller/APIPenaltyControllerPOS.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/penalty/controller/APIPenaltyControllerPOS.java new file mode 100644 index 0000000..a19d170 --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/penalty/controller/APIPenaltyControllerPOS.java @@ -0,0 +1,63 @@ +package in.gov.chennaicorporation.mobileservice.penalty.controller; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import in.gov.chennaicorporation.mobileservice.penalty.service.PenaltyServicePOS; + +@RequestMapping("/gccofficialapp/api/penalty/pos") +@RestController("apiPenaltyPOSRest") +public class APIPenaltyControllerPOS { + @Autowired + private PenaltyServicePOS penaltyServicePOS; + + @GetMapping(value="/getPenaltytypes") + public List> getPenaltyTypes(@RequestParam(value = "departmentId", required = false) String departmentId) { + return penaltyServicePOS.getPenaltyTypeList(departmentId); + } + + @GetMapping(value="/getPenaltyAmount") + public List> getPenaltyTypes( + @RequestParam(value = "categoryId", required = false) String categoryId, + @RequestParam(value = "ton", required = false) String ton + ) { + return penaltyServicePOS.getPenaltyAmount(categoryId,ton); + } + + @GetMapping(value="/getOfflineModeTypes") + public List> getOfflineModeTypes() { + return penaltyServicePOS.getOfflineModeTypes(); + } + + @PostMapping(value="/generateChallanPOS") + public List generateChallan(@RequestParam MultiValueMap formData, + @RequestParam(value = "categoryId", required = false) String categoryId, + @RequestParam(value = "latitude", required = false) String latitude, + @RequestParam(value = "longitude", required = false) String longitude, + @RequestParam(value = "zone", required = false) String zone, + @RequestParam(value = "ward", required = false) String ward, + @RequestParam(value = "loginId", required = false) String loginId, + @RequestParam(value = "violatorName", required = false) String violatorName, + @RequestParam(value = "violatorPhone", required = false) String violatorPhone, + @RequestParam(value = "ton", required = false) String ton, + @RequestParam(value = "amount", required = false) String amount, + @RequestParam(value = "file", required = false) MultipartFile file + ) { + return penaltyServicePOS.generateChallanPOS(formData, categoryId, latitude, longitude, zone, ward,loginId,violatorName,violatorPhone,ton,amount,file); + } + + @PostMapping("/storeBankTransaction") + public List storeBankTransaction(@RequestBody Map transactionData) { + return penaltyServicePOS.storeBankTransaction(transactionData); + } +} diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/penalty/service/PenaltyService.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/penalty/service/PenaltyService.java index 51e403c..e736018 100644 --- a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/penalty/service/PenaltyService.java +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/penalty/service/PenaltyService.java @@ -44,6 +44,7 @@ import in.gov.chennaicorporation.mobileservice.gccactivity.service.DateTimeUtil; public class PenaltyService { private JdbcTemplate jdbcPenaltyTemplate; private final Environment environment; + private String fileBaseUrl; @Autowired public void setDataSource(@Qualifier("mysqlActivityDataSource") DataSource penaltyDataSource) { @@ -53,6 +54,7 @@ public class PenaltyService { @Autowired public PenaltyService(Environment environment) { this.environment = environment; + this.fileBaseUrl=environment.getProperty("fileBaseUrl"); } // Function to convert date string from dd-MM-yyyy to yyyy-MM-dd @@ -157,9 +159,17 @@ public class PenaltyService { } @Transactional - public List> getPenaltyTypeList() { - String sqlQuery = "SELECT `id`, `name`,`iconurl` FROM `penalty_category` WHERE `isdelete`=0 AND `isactive`=1 ORDER BY `name`"; + public List> getPenaltyTypeList(String departmentId) { + //String sqlQuery = "SELECT `id`, `name`,`iconurl` FROM `penalty_category` WHERE `isdelete`=0 AND `isactive`=1 ORDER BY `name`"; + //List> result = jdbcPenaltyTemplate.queryForList(sqlQuery); + String sqlQuery = "SELECT * FROM `penalty_category` WHERE (`isactive`=1 AND `isdelete`=0) "; + + if(departmentId!=null && !departmentId.isEmpty() && !departmentId.isBlank()) { + sqlQuery= sqlQuery +" AND `mappingid`='"+departmentId+"'"; + } + sqlQuery = sqlQuery + " ORDER BY `display_order`, `name` ASC"; List> result = jdbcPenaltyTemplate.queryForList(sqlQuery); + return result; } @@ -343,7 +353,7 @@ public class PenaltyService { + "DATE_FORMAT(challan_date, '%d-%m-%Y %r') AS formatted_challan_datetime, " + "DATE_FORMAT(challan_date, '%d-%m-%Y') AS formatted_challan_date, " + "DATE_FORMAT(challan_date, '%r') AS formatted_challan_time, " - + "CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files', image) AS imageUrl, " + + "CONCAT('"+fileBaseUrl+"/gccofficialapp/files', image) AS imageUrl, " + "CASE " + " WHEN status = 1 THEN 'Generated'" + " WHEN status = 2 THEN 'User Action Takened'" @@ -374,11 +384,13 @@ public class PenaltyService { String loginId, String isviolatorAvailable ) { + System.out.println(fileBaseUrl); + StringBuilder sqlQuery = new StringBuilder("SELECT pc.*, " + "DATE_FORMAT(pc.challan_date, '%d-%m-%Y %r') AS formatted_challan_datetime, " + "DATE_FORMAT(pc.challan_date, '%d-%m-%Y') AS formatted_challan_date, " + "DATE_FORMAT(pc.challan_date, '%r') AS formatted_challan_time, " - + "CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files', pc.image) AS imageUrl, " + + "CONCAT('"+fileBaseUrl+"/gccofficialapp/files', pc.image) AS imageUrl, " // Conditional formatting for fineissued_date fields + "CASE WHEN pc.fineissued = 1 THEN DATE_FORMAT(pc.fineissued_date, '%d-%m-%Y %r') ELSE '-' END AS formatted_fineissue_datetime, " + "CASE WHEN pc.fineissued = 1 THEN DATE_FORMAT(pc.fineissued_date, '%d-%m-%Y') ELSE '-' END AS formatted_fineissue_date, " @@ -394,9 +406,13 @@ public class PenaltyService { + " ELSE 'Unknown' " + "END AS status_name, " + "DATE_FORMAT(pc.challan_date, '%d-%m-%Y %H:%i:%s') AS challan_date, " - + "penalty_category.name AS penalty_category_name " + + "penalty_category.name AS penalty_category_name, " + + "p.amount AS payment_amount, " + + "p.paymentStatus AS payment_status, " + + "DATE_FORMAT(p.paymentdate, '%d-%m-%Y %r') AS formatted_payment_datetime " + "FROM penalty_challan pc " + "JOIN penalty_category ON pc.category_id = penalty_category.id " + + "LEFT JOIN `Payment` p ON p.uniqueid = pc.id " + "WHERE (pc.isdelete = 0 AND pc.isactive = 1) AND pc.challan_by = '" + loginId + "' "); // Add additional filters if provided @@ -566,7 +582,6 @@ public class PenaltyService { }, keyHolder); if (affectedRows > 0) { - Number generatedId = keyHolder.getKey(); lastInsertId = (generatedId != null) ? generatedId.intValue() : 0; response.put("insertId", lastInsertId); @@ -621,4 +636,87 @@ public class PenaltyService { return result; } + + + //// POS //// + + @Transactional + public List> generateChallanPOS( + MultiValueMap formData, + String category_id, + String latitude, + String longitude, + String zone, + String ward, + String loginId, + String violatorName, + String violatorPhone, + String ton, + String amount, + MultipartFile file) { + + Map response = new HashMap<>(); + int lastInsertId = 0; + + String image = fileUpload("challan",category_id,file); + + String sqlQuery = "INSERT INTO `penalty_challan_pos`(`category_id`, `image`, `latitude`, `longitude`, " + + "`zone`, `ward`, `challan_by`" + + " `violator_name`, `violator_phone`, `ton`,`amount`) " + + "VALUES (?,?,?,?,?,?,?,?,?,?,?)"; + + KeyHolder keyHolder = new GeneratedKeyHolder(); + + try { + int affectedRows = jdbcPenaltyTemplate.update(new PreparedStatementCreator() { + @Override + public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { + PreparedStatement ps = connection.prepareStatement(sqlQuery, new String[]{"id"}); + ps.setString(1, category_id); + ps.setString(2, image); + ps.setString(3, latitude); + ps.setString(4, longitude); + ps.setString(5, zone); + ps.setString(6, ward); + ps.setString(7, loginId); + ps.setString(8, violatorName); + ps.setString(9, violatorPhone); + ps.setString(10, ton); + ps.setString(11, amount); + return ps; + } + }, keyHolder); + + if (affectedRows > 0) { + Number generatedId = keyHolder.getKey(); + lastInsertId = (generatedId != null) ? generatedId.intValue() : 0; + response.put("insertId", lastInsertId); + response.put("status", "success"); + response.put("message", "A new Penalty (Chellan) was generated successfully!"); + System.out.println("A new Penalty (Chellan) was generated successfully! Insert ID: " + generatedId); + } else { + response.put("status", "error"); + response.put("message", "Failed to insert a new Penalty (Chellan)."); + } + } catch (DataAccessException e) { + System.out.println("Data Access Exception:"); + Throwable rootCause = e.getMostSpecificCause(); + if (rootCause instanceof SQLException) { + SQLException sqlException = (SQLException) rootCause; + System.out.println("SQL State: " + sqlException.getSQLState()); + System.out.println("Error Code: " + sqlException.getErrorCode()); + System.out.println("Message: " + sqlException.getMessage()); + response.put("status", "error"); + response.put("message", sqlException.getMessage()); + response.put("sqlState", sqlException.getSQLState()); + response.put("errorCode", sqlException.getErrorCode()); + } else { + System.out.println("Message: " + rootCause.getMessage()); + response.put("status", "error"); + response.put("message", rootCause.getMessage()); + } + } + + return Collections.singletonList(response); + } } diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/penalty/service/PenaltyServicePOS.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/penalty/service/PenaltyServicePOS.java new file mode 100644 index 0000000..0cfa66b --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/penalty/service/PenaltyServicePOS.java @@ -0,0 +1,513 @@ +package in.gov.chennaicorporation.mobileservice.penalty.service; + +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.SecureRandom; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import javax.imageio.ImageIO; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.stream.ImageOutputStream; +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.env.Environment; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.PreparedStatementCreator; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.MultiValueMap; +import org.springframework.web.multipart.MultipartFile; + +import in.gov.chennaicorporation.mobileservice.gccactivity.service.DateTimeUtil; + +@Service +public class PenaltyServicePOS { + private JdbcTemplate jdbcPenaltyTemplate; + private final Environment environment; + private String fileBaseUrl; + + private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + private static final int STRING_LENGTH = 15; + private static final Random RANDOM = new SecureRandom(); + + @Autowired + public void setDataSource(@Qualifier("mysqlPenaltyDataSource") DataSource penaltyDataSource) { + this.jdbcPenaltyTemplate = new JdbcTemplate(penaltyDataSource); + } + + @Autowired + public PenaltyServicePOS(Environment environment) { + this.environment = environment; + this.fileBaseUrl=environment.getProperty("fileBaseUrl"); + } + + public static String generateRandomString() { + StringBuilder result = new StringBuilder(STRING_LENGTH); + for (int i = 0; i < STRING_LENGTH; i++) { + result.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length()))); + } + return result.toString(); + } + // Function to convert date string from dd-MM-yyyy to yyyy-MM-dd + public static String convertDateFormat(String inputDate, int add) { + // Check if the inputDate is not null or blank + if (inputDate != null && !inputDate.isBlank()) { + try { + // Define the input and output date formats + DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + // Parse the input date string to LocalDate + LocalDate date = LocalDate.parse(inputDate, inputFormatter); + + // Add the specified number of days to the date if 'add' is greater than 0 + if (add > 0) { + date = date.plusDays(add); + } + + // Format the date to the new format + return date.format(outputFormatter); + + } catch (DateTimeParseException e) { + // Handle the case where the input date is invalid + System.out.println("Invalid date format: " + inputDate); + return ""; + } + } else { + return ""; + } + } + + private byte[] compressImage(BufferedImage image, float quality) throws IOException { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(byteArrayOutputStream); + + ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); + writer.setOutput(imageOutputStream); + + ImageWriteParam param = writer.getDefaultWriteParam(); + if (param.canWriteCompressed()) { + param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + param.setCompressionQuality(quality); + } + + writer.write(null, new javax.imageio.IIOImage(image, null, null), param); + + writer.dispose(); + imageOutputStream.close(); + + return byteArrayOutputStream.toByteArray(); + } + + public String fileUpload(String name, String id, MultipartFile file) { + + int lastInsertId = 0; + // Set the file path where you want to save it + String uploadDirectory = environment.getProperty("file.upload.directory"); + String serviceFolderName = environment.getProperty("penalty_foldername"); + var year =DateTimeUtil.getCurrentYear(); + var month =DateTimeUtil.getCurrentMonth(); + + uploadDirectory = uploadDirectory + serviceFolderName +"pos/"+ year +"/"+month+"/"; + + try { + // Create directory if it doesn't exist + Path directoryPath = Paths.get(uploadDirectory); + if (!Files.exists(directoryPath)) { + Files.createDirectories(directoryPath); + } + + // Datetime string + String datetimetxt = DateTimeUtil.getCurrentDateTime(); + // File name + String fileName = name+ "_" +id + "_" + datetimetxt + "_" + file.getOriginalFilename(); + fileName = fileName.replaceAll("\\s+", ""); // Remove space on filename + + String filePath = uploadDirectory + "/" + fileName; + + String filepath_txt = "/"+serviceFolderName +"pos/"+ year +"/"+month+"/"+fileName; + + // Create a new Path object + Path path = Paths.get(filePath); + + // Get the bytes of the file + byte[] bytes = file.getBytes(); + + // Compress the image + BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes)); + byte[] compressedBytes = compressImage(image, 0.5f); // Compress with 50% quality + + // Write the bytes to the file + Files.write(path, bytes); + + System.out.println(filePath); + return filepath_txt; + + } catch (IOException e) { + e.printStackTrace(); + return "Failed to save file " + file.getOriginalFilename(); + } + } + + //// POS //// + + @Transactional + public List> getPenaltyTypeList(String departmentId) { + String sqlQuery = "SELECT * FROM `penalty_category` WHERE (`isactive`=1 AND `isdelete`=0) "; + + if(departmentId!=null && !departmentId.isEmpty() && !departmentId.isBlank()) { + sqlQuery= sqlQuery +" AND `mappingid`='"+departmentId+"'"; + } + sqlQuery = sqlQuery + " ORDER BY `display_order`, `name` ASC"; + List> result = jdbcPenaltyTemplate.queryForList(sqlQuery); + + Map response = new HashMap<>(); + response.put("status", 200); + response.put("message", "Penalty category list"); + response.put("data", result); + + return Collections.singletonList(response); + } + + @Transactional + public List> getPenaltyAmount(String categoryId, String ton) { + String sqlQuery = "SELECT * FROM `penalty_amount` WHERE (`isactive`=1 AND `isdelete`=0) "; + + if(categoryId!=null && !categoryId.isEmpty() && !categoryId.isBlank()) { + sqlQuery= sqlQuery +" AND `category_id`='"+categoryId+"'"; + } + if(ton!=null && !ton.isEmpty() && !ton.isBlank()) { + sqlQuery= sqlQuery +" AND `ton`='"+ton+"'"; + } + + sqlQuery = sqlQuery + " LIMIT 1"; + + System.out.println(sqlQuery); + List> result = jdbcPenaltyTemplate.queryForList(sqlQuery); + + Map response = new HashMap<>(); + response.put("status", 200); + response.put("message", "Penalty amount details"); + response.put("data", result); + + return Collections.singletonList(response); + } + + @Transactional + public List> getOfflineModeTypes() { + String sqlQuery = "SELECT `id`, `name` FROM `offline_mode_type` WHERE `isactive`=1 AND `isdelete`=0"; + List> result = jdbcPenaltyTemplate.queryForList(sqlQuery); + + Map response = new HashMap<>(); + response.put("status", 200); + response.put("message", "Offline mode types"); + response.put("data", result); + + return Collections.singletonList(response); + } + + @Transactional + public List> generateChallanPOS( + MultiValueMap formData, + String category_id, + String latitude, + String longitude, + String zone, + String ward, + String loginId, + String violatorName, + String violatorPhone, + String ton, + String amount, + MultipartFile file) { + + Map response = new HashMap<>(); + int lastInsertId = 0; + String orderid = generateRandomString(); + String image = fileUpload("challan",category_id,file); + + String sqlQuery = "INSERT INTO `penalty_challan`(`category_id`, `image`, `latitude`, `longitude`, " + + "`zone`, `ward`, `challan_by`, " + + "`violator_name`, `violator_phone`, `ton`, `fine_amount`,`orderid`) " + + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"; + + KeyHolder keyHolder = new GeneratedKeyHolder(); + + try { + int affectedRows = jdbcPenaltyTemplate.update(new PreparedStatementCreator() { + @Override + public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { + PreparedStatement ps = connection.prepareStatement(sqlQuery, new String[]{"id"}); + ps.setString(1, category_id); + ps.setString(2, image); + ps.setString(3, latitude); + ps.setString(4, longitude); + ps.setString(5, zone); + ps.setString(6, ward); + ps.setString(7, loginId); + ps.setString(8, violatorName); + ps.setString(9, violatorPhone); + ps.setString(10, ton); + ps.setString(11, amount); + ps.setString(12, orderid); + return ps; + } + }, keyHolder); + + if (affectedRows > 0) { + Number generatedId = keyHolder.getKey(); + lastInsertId = (generatedId != null) ? generatedId.intValue() : 0; + //CONCAT('"+fileBaseUrl+"/gccofficialapp/files', cp.photo_url) AS photos, + String sqlQuery_txt = "SELECT `category_id`,CONCAT('"+fileBaseUrl+"/gccofficialapp/files',`image`) as imageurl, `latitude`, `longitude`, `zone`, `ward`, " + + "`challan_by`, `violator_name`, `violator_phone`, `ton`, " + + "`fine_amount`,`orderid` From `penalty_challan` WHERE id='"+lastInsertId+"' LIMIT 1"; + List> result = jdbcPenaltyTemplate.queryForList(sqlQuery_txt); + + //response.put("insertid", lastInsertId); + response.put("status", 200); + response.put("message", "A new Penalty (Chellan) was generated successfully!"); + //response.put("orderid", orderid); + response.put("data", result); + + System.out.println("A new Penalty (Chellan) was generated successfully! Insert ID: " + generatedId); + } else { + response.put("status", 201); + response.put("message", "Failed to insert a new Penalty (Chellan)."); + response.put("data", ""); + } + } catch (DataAccessException e) { + System.out.println("Data Access Exception:"); + Throwable rootCause = e.getMostSpecificCause(); + if (rootCause instanceof SQLException) { + SQLException sqlException = (SQLException) rootCause; + System.out.println("SQL State: " + sqlException.getSQLState()); + System.out.println("Error Code: " + sqlException.getErrorCode()); + System.out.println("Message: " + sqlException.getMessage()); + response.put("status", 500); + response.put("message", "Database error while storing new Penalty (Chellan)."); + response.put("error", e.getMessage()); + } else { + System.out.println("Message: " + rootCause.getMessage()); + response.put("status", 400); + response.put("message", "Failed to insert a new Penalty (Chellan)."); + } + } + + return Collections.singletonList(response); + } + + @Transactional + public List> getChallanPOSData( + MultiValueMap formData, + String orderid, + String id) { + + String sqlQuery = "SELECT `category_id`,CONCAT('"+fileBaseUrl+"/gccofficialapp/files',`image`) as imageurl, `latitude`, `longitude`, `zone`, `ward`, " + + "`challan_by`, `violator_name`, `violator_phone`, `ton`, " + + "`fine_amount`,`orderid`,`status` From `penalty_challan` WHERE (`isactive`=1 AND `isdelete`=0) "; + + if(orderid!=null && !orderid.isEmpty() && !orderid.isBlank()) { + sqlQuery= sqlQuery +" AND `orderid`='"+orderid+"'"; + } + if(id!=null && !id.isEmpty() && !id.isBlank()) { + sqlQuery= sqlQuery +" AND `id`='"+id+"'"; + } + + sqlQuery = sqlQuery + " LIMIT 1"; + + //System.out.println(sqlQuery); + List> result = jdbcPenaltyTemplate.queryForList(sqlQuery); + Map response = new HashMap<>(); + response.put("status", 200); + response.put("message", "Challan Details"); + response.put("data", result); + + return result; + } + /* + @Transactional + public List> updateOrderDetails( + MultiValueMap formData, + String orderid, + String id) { + + String paymentStatus = "paid"; + + String sqlQuery = "UPDATE `penalty_challan` SET `status`='"+paymentStatus+"'"; + + if(orderid!=null && !orderid.isEmpty() && !orderid.isBlank()) { + sqlQuery= sqlQuery +" AND `orderid`='"+orderid+"'"; + } + + sqlQuery = sqlQuery + " LIMIT 1"; + + System.out.println(sqlQuery); + List> result = jdbcPenaltyTemplate.queryForList(sqlQuery); + + Map response = new HashMap<>(); + //response.put("insertid", lastInsertId); + response.put("status", 200); + response.put("message", "Payment Status updated successfully!"); + response.put("orderid", orderid); + response.put("data", result); + + return result; + } + */ + @Transactional + public List> storeBankTransaction( + Map transactionData) { + + Map response = new HashMap<>(); + int lastInsertId = 0; + + // Extract data from the JSON object + String transactionResponseStatus = (String) transactionData.get("transactionResponseStatus"); + + // Check if the transaction was successful + if ("Transaction success".equalsIgnoreCase(transactionResponseStatus)) { + + String mid = (String) transactionData.get("mid"); + String tid = (String) transactionData.get("tid"); + String txnId = (String) transactionData.get("txnId"); + + // Fetch nested transaction response data + Map txnResponseData = (Map) transactionData.get("txnResponseData"); + + String bankName = (String) txnResponseData.get("bankName"); + String batchNumber = (String) txnResponseData.get("batchNumber"); + String transactionTitle = (String) txnResponseData.get("transactionTitle"); + String txnAID = (String) txnResponseData.get("txnAID"); + String txnApprCode = (String) txnResponseData.get("txnApprCode"); + String txnCardNo = (String) txnResponseData.get("txnCardNo"); + String txnCardType = (String) txnResponseData.get("txnCardType"); + String txnDate = (String) txnResponseData.get("txnDate"); + String txnInvoice = (String) txnResponseData.get("txnInvoice"); + String txnMode = (String) txnResponseData.get("txnMode"); + String txnRefNo = (String) txnResponseData.get("txnRefNo"); + String txnTC = (String) txnResponseData.get("txnTC"); + String txnTSI = (String) txnResponseData.get("txnTSI"); + String txnTVR = (String) txnResponseData.get("txnTVR"); + String txnTime = (String) txnResponseData.get("txnTime"); + + // Convert transaction amount properly + Double transactionAmount = Double.valueOf((String) txnResponseData.get("transactionAmount")); + + String sqlQuery = "INSERT INTO bank_transactions (mid, tid, txnId, bankName, batchNumber, transactionAmount, " + + "transactionTitle, txnAID, txnApprCode, txnCardNo, txnCardType, txnDate, txnInvoice, txnMode, txnRefNo, txnTC, txnTSI, txnTVR, txnTime) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + + KeyHolder keyHolder = new GeneratedKeyHolder(); + + try { + int affectedRows = jdbcPenaltyTemplate.update(new PreparedStatementCreator() { + @Override + public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { + PreparedStatement ps = connection.prepareStatement(sqlQuery, new String[]{"id"}); + ps.setString(1, mid); + ps.setString(2, tid); + ps.setString(3, txnId); + ps.setString(4, bankName); + ps.setString(5, batchNumber); + ps.setDouble(6, transactionAmount); + ps.setString(7, transactionTitle); + ps.setString(8, txnAID); + ps.setString(9, txnApprCode); + ps.setString(10, txnCardNo); + ps.setString(11, txnCardType); + ps.setString(12, txnDate); + ps.setString(13, txnInvoice); + ps.setString(14, txnMode); + ps.setString(15, txnRefNo); + ps.setString(16, txnTC); + ps.setString(17, txnTSI); + ps.setString(18, txnTVR); + ps.setString(19, txnTime); + return ps; + } + }, keyHolder); + + if (affectedRows > 0) { + Number generatedId = keyHolder.getKey(); + lastInsertId = (generatedId != null) ? generatedId.intValue() : 0; + + updatePaymentStatus(txnId, transactionResponseStatus); + + // Fetch inserted data for response, joining `penalty_challan` and `bank_transactions` + String sqlQuery_joined = "SELECT pc.category_id, CONCAT('" + fileBaseUrl + "/gccofficialapp/files', pc.image) as imageurl, " + + "pc.latitude, pc.longitude, pc.zone, pc.ward, pc.challan_by, " + + "pc.violator_name, pc.violator_phone, pc.ton, pc.fine_amount, pc.orderid, pc.status, " + + "bt.mid, bt.tid, bt.txnId, bt.bankName, bt.batchNumber, bt.transactionAmount, bt.transactionTitle, " + + "bt.txnCardNo, bt.txnDate, bt.txnInvoice, bt.txnMode, bt.txnRefNo " + + "FROM penalty_challan pc " + + "LEFT JOIN bank_transactions bt ON pc.orderid = bt.txnId " + + "WHERE pc.isactive = 1 AND pc.isdelete = 0 AND bt.id = ? LIMIT 1"; + System.out.println(sqlQuery_joined); + // Execute the query + List> result = jdbcPenaltyTemplate.queryForList(sqlQuery_joined, lastInsertId); + /* + // Fetch inserted data for response + String sqlQuery_challan = "SELECT `category_id`,CONCAT('"+fileBaseUrl+"/gccofficialapp/files',`image`) as imageurl, `latitude`, `longitude`, `zone`, `ward`, " + + "`challan_by`, `violator_name`, `violator_phone`, `ton`, " + + "`fine_amount`, `orderid`, `status` From `penalty_challan` WHERE (`isactive`=1 AND `isdelete`=0) " + + "AND `orderid`='"+txnId+"' LIMIT 1"; + + List> result = jdbcPenaltyTemplate.queryForList(sqlQuery_challan, lastInsertId); + + // Fetch inserted data for response + String sqlQuery_txt = "SELECT mid, tid, txnId, bankName, batchNumber, transactionAmount, " + + "transactionTitle, txnCardNo, txnDate, txnInvoice, txnMode, txnRefNo " + + "FROM bank_transactions WHERE id = ? LIMIT 1"; + + List> result = jdbcPenaltyTemplate.queryForList(sqlQuery_txt, lastInsertId); + */ + response.put("status", 200); + response.put("message", "Transaction stored successfully!"); + response.put("data", result); + } else { + response.put("status", 201); + response.put("message", "Failed to store the transaction."); + response.put("data", ""); + } + } catch (DataAccessException e) { + response.put("status", 500); + response.put("message", "Database error while storing transaction."); + response.put("error", e.getMessage()); + e.printStackTrace(); // This will give you more detail in logs + } + } else { + response.put("status", 400); + response.put("message", "Transaction failed or invalid status."); + } + + return Collections.singletonList(response); + } + + public String updatePaymentStatus(String orderid, String status) { + String sqlQuery = "UPDATE penalty_challan SET status = ? WHERE orderid = ? LIMIT 1"; + jdbcPenaltyTemplate.update(sqlQuery, status, orderid); + return "success"; + } +} diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/service/MainService.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/service/MainService.java new file mode 100644 index 0000000..00165a2 --- /dev/null +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/service/MainService.java @@ -0,0 +1,30 @@ +package in.gov.chennaicorporation.mobileservice.service; + +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class MainService { + private JdbcTemplate jdbcMainTemplate; + @Autowired + public void setDataSource( + @Qualifier("mysqlActivityDataSource") DataSource activityDataSource) { + this.jdbcMainTemplate = new JdbcTemplate(activityDataSource); + } + /* + @Transactional + public List> versionCheck() { + String sqlQuery = "SELECT * FROM `app_version` WHERE `isactive`=1 LIMIT 1"; + List> result = jdbcMainTemplate.queryForList(sqlQuery); + return result; + } + */ +} diff --git a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/service/OfficialAPIService.java b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/service/OfficialAPIService.java index 139ae62..24fae79 100644 --- a/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/service/OfficialAPIService.java +++ b/mobileservice/src/main/java/in/gov/chennaicorporation/mobileservice/service/OfficialAPIService.java @@ -44,6 +44,12 @@ public class OfficialAPIService { this.jdbcActivityTemplate = new JdbcTemplate(activityDataSource); } + @Transactional + public List> versionCheck() { + String sqlQuery = "SELECT * FROM `app_version` WHERE `isactive`=1 LIMIT 1"; + List> result = jdbcActivityTemplate.queryForList(sqlQuery); + return result; + } public List> sendOTP(HttpServletRequest request, @RequestParam("MobileNo") String MobileNo, @RequestParam("generatedToken") String OTP) { @@ -333,7 +339,7 @@ public class OfficialAPIService { System.out.println("No data found in moduleids."); } - SqlQuery="SELECT *,CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files/app_icon/menu/', icon_url) " + SqlQuery="SELECT *,CONCAT('https://gccservices.in/gccofficialapp/files/app_icon/menu/', icon_url) " + "AS iconUrl FROM `department` WHERE `ISACTIVE`=1 AND `id` IN ("+mainmenus+") ORDER BY `orderby`, `name` ASC"; List> result = jdbcActivityTemplate.queryForList(SqlQuery); return result; @@ -369,7 +375,7 @@ public class OfficialAPIService { System.out.println("No data found in moduleids."); } - SqlQuery="SELECT *,CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files/app_icon/menu/', icon_url) " + SqlQuery="SELECT *,CONCAT('https://gccservices.in/gccofficialapp/files/app_icon/menu/', icon_url) " + "AS iconUrl FROM `modules` WHERE `ISACTIVE`=1 AND `id` IN ("+menus+") "; if(departmentId!=null && !departmentId.isEmpty() && !departmentId.isBlank()) { SqlQuery=SqlQuery+" AND `departmentId_id`='"+departmentId+"'"; @@ -409,7 +415,7 @@ public class OfficialAPIService { System.out.println("No data found in menuitem_ids."); } - SqlQuery="SELECT *,CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files/app_icon/menu/', icon_url) " + SqlQuery="SELECT *,CONCAT('https://gccservices.in/gccofficialapp/files/app_icon/menu/', icon_url) " + "AS iconUrl FROM `menuitem` WHERE `ISACTIVE`=1 AND `module_id`=? AND `id` IN ("+menuitem+")"; System.out.println(SqlQuery); @@ -422,7 +428,7 @@ public class OfficialAPIService { String SqlQuery = ""; - SqlQuery="SELECT *,CONCAT('https://gccservices.chennaicorporation.gov.in/gccofficialapp/files/app_icon/menu/', icon_url) AS iconUrl FROM `submenuitem` WHERE `ISACTIVE`=1 AND `module_id`=? AND `menuitem_id`=?"; + SqlQuery="SELECT *,CONCAT('https://gccservices.in/gccofficialapp/files/app_icon/menu/', icon_url) AS iconUrl FROM `submenuitem` WHERE `ISACTIVE`=1 AND `module_id`=? AND `menuitem_id`=?"; List> result = jdbcActivityTemplate.queryForList(SqlQuery,menuId,submenuId); return result; diff --git a/mobileservice/src/main/resources/application.properties b/mobileservice/src/main/resources/application.properties index 0e493c4..550e6d8 100644 --- a/mobileservice/src/main/resources/application.properties +++ b/mobileservice/src/main/resources/application.properties @@ -18,6 +18,7 @@ server.error.include-stacktrace= on_param logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE +spring.jackson.time-zone=Asia/Kolkata # Maximum file size spring.servlet.multipart.max-file-size=20MB @@ -26,10 +27,16 @@ spring.servlet.multipart.max-file-size=20MB spring.servlet.multipart.max-request-size=20MB +fileBaseUrl=https://gccservices.in + file.upload.directory=${user.dir}/gcc_mobile_service_uploads/ activity_foldername = asset_activity/ activity_new_asset_foldername = asset_images/ brr_activity_foldername= brr_activity_images/ sos_activity_foldername= sos_rescue_activity_images/ -penalty_foldername=penalty_activity/ \ No newline at end of file +penalty_foldername=penalty_activity/ +straydogs_foldername=stray_dogs/ +gccschools_foldername=schools_images/ +parks_playground_foldername=parks_playground_images/ +