From d09ba49e93f8f6474d7bff567f330f209e5ce93d Mon Sep 17 00:00:00 2001 From: yoga-agoy Date: Mon, 29 Jun 2026 15:47:28 +0530 Subject: [PATCH] added elcot oc files upload option --- .env | 17 +- .../controller/OCFileDataController.java | 41 ++++ .../springboot/mapper/OCFileDataMapper.java | 47 ++++ .../springboot/model/FileData.java | 7 +- .../springboot/model/OCFileData.java | 118 ++++++++++ .../repository/FileDataRepository.java | 4 + .../repository/OCFileDataRepository.java | 11 + .../request_dto/AddOCFileDataRequestDTO.java | 25 +++ .../request_dto/OCFileDataRequestDTO.java | 21 ++ .../response_dto/OCFileDataResponseDTO.java | 27 +++ .../OCFileDataRestController.java | 48 ++++ .../springboot/service/FileDataService.java | 16 +- .../springboot/service/OCFileDataService.java | 195 ++++++++++++++++ src/main/resources/application.properties | 6 +- .../resources/static/js/add-oc-file-script.js | 51 +++++ .../resources/static/js/view-file-script.js | 16 +- .../static/js/view-oc-file-script.js | 211 ++++++++++++++++++ .../resources/templates/file/reports.html | 14 ++ .../resources/templates/file/view-file.html | 14 ++ .../resources/templates/fragments/navbar.html | 4 + src/main/resources/templates/home/home.html | 4 + .../templates/oc-file/add-oc-file.html | 78 +++++++ .../templates/oc-file/view-oc-file.html | 139 ++++++++++++ 23 files changed, 1092 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/adjustment_file_management_system/springboot/controller/OCFileDataController.java create mode 100644 src/main/java/com/adjustment_file_management_system/springboot/mapper/OCFileDataMapper.java create mode 100644 src/main/java/com/adjustment_file_management_system/springboot/model/OCFileData.java create mode 100644 src/main/java/com/adjustment_file_management_system/springboot/repository/OCFileDataRepository.java create mode 100644 src/main/java/com/adjustment_file_management_system/springboot/request_dto/AddOCFileDataRequestDTO.java create mode 100644 src/main/java/com/adjustment_file_management_system/springboot/request_dto/OCFileDataRequestDTO.java create mode 100644 src/main/java/com/adjustment_file_management_system/springboot/response_dto/OCFileDataResponseDTO.java create mode 100644 src/main/java/com/adjustment_file_management_system/springboot/rest_controller/OCFileDataRestController.java create mode 100644 src/main/java/com/adjustment_file_management_system/springboot/service/OCFileDataService.java create mode 100644 src/main/resources/static/js/add-oc-file-script.js create mode 100644 src/main/resources/static/js/view-oc-file-script.js create mode 100644 src/main/resources/templates/oc-file/add-oc-file.html create mode 100644 src/main/resources/templates/oc-file/view-oc-file.html diff --git a/.env b/.env index 7e88e56..36ff0b9 100644 --- a/.env +++ b/.env @@ -1,9 +1,10 @@ -# DB_URL=jdbc:oracle:thin:@10.1.0.14:1521:chncorp -# DB_USERNAME=fileadjust -# DB_PASSWORD=fileadjust -# FORCE_HTTPS=false +DB_URL=jdbc:oracle:thin:@10.1.0.14:1521:chncorp +DB_USERNAME=fileadjust +DB_PASSWORD=fileadjust +FORCE_HTTPS=false -DB_URL=jdbc:oracle:thin:@//localhost:1522/XEPDB1 -DB_USERNAME=system -DB_PASSWORD=root -FORCE_HTTPS=false \ No newline at end of file +##### testing db connection ##### +# DB_URL=jdbc:oracle:thin:@//localhost:1522/XEPDB1 +# DB_USERNAME=fileadjust +# DB_PASSWORD=root +# FORCE_HTTPS=false \ No newline at end of file diff --git a/src/main/java/com/adjustment_file_management_system/springboot/controller/OCFileDataController.java b/src/main/java/com/adjustment_file_management_system/springboot/controller/OCFileDataController.java new file mode 100644 index 0000000..135d952 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/controller/OCFileDataController.java @@ -0,0 +1,41 @@ +package com.adjustment_file_management_system.springboot.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +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 com.adjustment_file_management_system.springboot.response_dto.FileDataResponseDTO; +import com.adjustment_file_management_system.springboot.response_dto.OCFileDataResponseDTO; +import com.adjustment_file_management_system.springboot.service.FileDataService; +import com.adjustment_file_management_system.springboot.service.OCFileDataService; + +@Controller +@RequestMapping("/oc-file") +public class OCFileDataController { + + @Autowired + FileDataService fileDataSer; + + @Autowired + OCFileDataService ocFileDataSer; + + @GetMapping("/view-oc-file") + public String ocFile(Model model) { + List ocFileDataList = ocFileDataSer.getAllOcFileData(); + model.addAttribute("ocFileDataList", ocFileDataList); + model.addAttribute("curPage", "view-oc-file"); + return "oc-file/view-oc-file"; + } + + @GetMapping("/add-oc-file") + public String addOcFile(Model model) { + List fileDataResDTOs = fileDataSer.getAllFileData(); + model.addAttribute("fileDatum", fileDataResDTOs); + return "oc-file/add-oc-file"; + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/mapper/OCFileDataMapper.java b/src/main/java/com/adjustment_file_management_system/springboot/mapper/OCFileDataMapper.java new file mode 100644 index 0000000..501a693 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/mapper/OCFileDataMapper.java @@ -0,0 +1,47 @@ +package com.adjustment_file_management_system.springboot.mapper; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.adjustment_file_management_system.springboot.model.OCFileData; +import com.adjustment_file_management_system.springboot.repository.FileDataRepository; +import com.adjustment_file_management_system.springboot.request_dto.OCFileDataRequestDTO; +import com.adjustment_file_management_system.springboot.response_dto.OCFileDataResponseDTO; + +@Component +public class OCFileDataMapper { + + @Autowired + private FileDataRepository fileDataRepo; + + public OCFileData toOcFileDataEnt(OCFileDataRequestDTO ocFileDataRequestDTO, Long fileDataId) { + OCFileData ocFileData = new OCFileData(); + ocFileData.setOcFileSub(ocFileDataRequestDTO.getOcFileSub()); + ocFileData.setOcFileUplDate(ocFileDataRequestDTO.getOcFileUplDate()); + ocFileData.setOcFilePath(ocFileDataRequestDTO.getOcFilePath()); + ocFileData.setFileData(fileDataRepo.findById(fileDataId).get()); + return ocFileData; + } + + public OCFileDataResponseDTO toOcFileDataResDTO(OCFileData ocFileData) { + OCFileDataResponseDTO dto = new OCFileDataResponseDTO(); + dto.setOcFileDataId(ocFileData.getOcFileDataId()); + dto.setOcFileSub(ocFileData.getOcFileSub()); + dto.setOcFilePath(ocFileData.getOcFilePath()); + dto.setOcFileUplDate(ocFileData.getOcFileUplDate()); + if (ocFileData.getFileData() != null) { + dto.setFileDataId(ocFileData.getFileData().getFileDataId()); + dto.setFileDataNum(ocFileData.getFileData().getFileDataNum()); + dto.setFinYear(ocFileData.getFileData().getFinYear()); + if (ocFileData.getFileData().getAdvType() != null) { + dto.setAdvType(ocFileData.getFileData().getAdvType().getAdvType()); + } + if (ocFileData.getFileData().getFundType() != null) { + dto.setFundType(ocFileData.getFileData().getFundType().getFundType()); + } + dto.setVendName(ocFileData.getFileData().getVendName()); + } + return dto; + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/model/FileData.java b/src/main/java/com/adjustment_file_management_system/springboot/model/FileData.java index f629a55..3a47d2c 100644 --- a/src/main/java/com/adjustment_file_management_system/springboot/model/FileData.java +++ b/src/main/java/com/adjustment_file_management_system/springboot/model/FileData.java @@ -8,6 +8,7 @@ import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EntityListeners; @@ -17,6 +18,7 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToOne; import jakarta.persistence.PrePersist; import jakarta.persistence.PreUpdate; import jakarta.persistence.SequenceGenerator; @@ -36,7 +38,7 @@ import lombok.ToString; @Getter @Setter @ToString(doNotUseGetters = true, includeFieldNames = true, exclude = { "advType", "fundType", "createdBy", - "updatedBy" }) + "updatedBy", "ocFileData" }) @AllArgsConstructor @NoArgsConstructor // For local DB Server @@ -169,6 +171,9 @@ public class FileData { @NotBlank private String vendName; + @OneToOne(mappedBy = "fileData", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true) + private OCFileData ocFileData; + @CreatedBy @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "created_by_usr_id", referencedColumnName = "usr_id", updatable = false, nullable = false) diff --git a/src/main/java/com/adjustment_file_management_system/springboot/model/OCFileData.java b/src/main/java/com/adjustment_file_management_system/springboot/model/OCFileData.java new file mode 100644 index 0000000..585b1eb --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/model/OCFileData.java @@ -0,0 +1,118 @@ +package com.adjustment_file_management_system.springboot.model; + +import java.util.Date; + +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToOne; +import jakarta.persistence.PrePersist; +import jakarta.persistence.PreUpdate; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Entity +@EntityListeners(AuditingEntityListener.class) +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true, exclude = { "fileData", "createdBy", + "updatedBy" }) +@AllArgsConstructor +@NoArgsConstructor +// For local DB Server +/* @Table(name = "tbl_file_data_det", schema = "GCC") */ +// For Production DB Server +@Table(name = "tbl_oc_file_data_det", schema = "fileadjust") +public class OCFileData { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "oc_file_data_seq") + /* + * @SequenceGenerator(name = "oc_file_data_seq", sequenceName = + * "oc_file_data_id_seq", + * allocationSize = 1, schema = "GCC") + */ + @SequenceGenerator(name = "oc_file_data_seq", sequenceName = "oc_file_data_id_seq", allocationSize = 1, schema = "fileadjust") + @Column(name = "oc_file_data_id", nullable = false, updatable = false) + private Long ocFileDataId; + + @Column(name = "oc_file_sub", nullable = false, length = 1000) + @NotBlank + private String ocFileSub; + + @Column(name = "oc_file_path", nullable = false, length = 1000) + @NotBlank + private String ocFilePath; + + @Column(name = "oc_file_upl_date", nullable = false) + @Temporal(TemporalType.DATE) + @NotNull + private Date ocFileUplDate; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "file_data_id", referencedColumnName = "file_data_id", nullable = false, unique = true) + private FileData fileData; + + @CreatedBy + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "created_by_usr_id", referencedColumnName = "usr_id", updatable = false, nullable = false) + private AppUser createdBy; + + @LastModifiedBy + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "updated_by_usr_id", referencedColumnName = "usr_id", nullable = false) + private AppUser updatedBy; + + // User timestamp + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "usr_created_timestamp", nullable = false, updatable = false) + private Date usrCreatedTimestamp; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "usr_updated_timestamp", nullable = false) + private Date usrUpdatedTimestamp; + + // DB-managed timestamps + @CreatedDate + @Temporal(TemporalType.TIMESTAMP) + @Column(updatable = false, nullable = false, name = "db_created_timestamp") + private Date dbCreatedTimestamp; + + @LastModifiedDate + @Temporal(TemporalType.TIMESTAMP) + @Column(nullable = false, name = "db_updated_timestamp") + private Date dbUpdatedTimestamp; + + @PrePersist + public void onCreate() { + this.usrCreatedTimestamp = new Date(); + this.usrUpdatedTimestamp = new Date(); + } + + @PreUpdate + public void onUpdate() { + this.usrUpdatedTimestamp = new Date(); + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/repository/FileDataRepository.java b/src/main/java/com/adjustment_file_management_system/springboot/repository/FileDataRepository.java index 112c112..ba6e000 100644 --- a/src/main/java/com/adjustment_file_management_system/springboot/repository/FileDataRepository.java +++ b/src/main/java/com/adjustment_file_management_system/springboot/repository/FileDataRepository.java @@ -2,6 +2,7 @@ package com.adjustment_file_management_system.springboot.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import com.adjustment_file_management_system.springboot.model.FileData; @@ -12,4 +13,7 @@ public interface FileDataRepository extends JpaRepository { @Query(value = "SELECT fd FROM FileData fd WHERE fd.fileDataNum = ?1") FileData findFileDataByFileDataNum(String fileDataNum); + @Query(value = "SELECT file_data_id FROM TBL_FILE_DATA_DET WHERE file_data_num = :fileNum", nativeQuery = true) + Long findFileDataIdByFileNum(@Param("fileNum") String fileNum); + } diff --git a/src/main/java/com/adjustment_file_management_system/springboot/repository/OCFileDataRepository.java b/src/main/java/com/adjustment_file_management_system/springboot/repository/OCFileDataRepository.java new file mode 100644 index 0000000..2eee0af --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/repository/OCFileDataRepository.java @@ -0,0 +1,11 @@ +package com.adjustment_file_management_system.springboot.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.adjustment_file_management_system.springboot.model.OCFileData; + +@Repository +public interface OCFileDataRepository extends JpaRepository { + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/request_dto/AddOCFileDataRequestDTO.java b/src/main/java/com/adjustment_file_management_system/springboot/request_dto/AddOCFileDataRequestDTO.java new file mode 100644 index 0000000..9f0466c --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/request_dto/AddOCFileDataRequestDTO.java @@ -0,0 +1,25 @@ +package com.adjustment_file_management_system.springboot.request_dto; + +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.multipart.MultipartFile; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true) +@AllArgsConstructor +@NoArgsConstructor +public class AddOCFileDataRequestDTO { + private MultipartFile ocFile; + @DateTimeFormat(pattern = "dd-MM-yyyy") + private Date ocFileUplDate; + private String ocFileSub; + private String fileNum; +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/request_dto/OCFileDataRequestDTO.java b/src/main/java/com/adjustment_file_management_system/springboot/request_dto/OCFileDataRequestDTO.java new file mode 100644 index 0000000..e5cd7da --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/request_dto/OCFileDataRequestDTO.java @@ -0,0 +1,21 @@ +package com.adjustment_file_management_system.springboot.request_dto; + +import java.util.Date; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true) +@NoArgsConstructor +@AllArgsConstructor +public class OCFileDataRequestDTO { + private String fileNum; + private Date ocFileUplDate; + private String ocFileSub; + private String ocFilePath; +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/response_dto/OCFileDataResponseDTO.java b/src/main/java/com/adjustment_file_management_system/springboot/response_dto/OCFileDataResponseDTO.java new file mode 100644 index 0000000..66aedf1 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/response_dto/OCFileDataResponseDTO.java @@ -0,0 +1,27 @@ +package com.adjustment_file_management_system.springboot.response_dto; + +import java.util.Date; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true) +@AllArgsConstructor +@NoArgsConstructor +public class OCFileDataResponseDTO { + private Long ocFileDataId; + private String ocFileSub; + private String ocFilePath; + private Date ocFileUplDate; + private Long fileDataId; + private String fileDataNum; + private String finYear; + private String advType; + private String fundType; + private String vendName; +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/rest_controller/OCFileDataRestController.java b/src/main/java/com/adjustment_file_management_system/springboot/rest_controller/OCFileDataRestController.java new file mode 100644 index 0000000..7bad2b2 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/rest_controller/OCFileDataRestController.java @@ -0,0 +1,48 @@ +package com.adjustment_file_management_system.springboot.rest_controller; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.propertyeditors.CustomDateEditor; +import org.springframework.beans.propertyeditors.CustomNumberEditor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.adjustment_file_management_system.springboot.request_dto.AddOCFileDataRequestDTO; +import com.adjustment_file_management_system.springboot.response_dto.ServiceResponseDTO; +import com.adjustment_file_management_system.springboot.service.OCFileDataService; + +@RestController +@RequestMapping("/api/oc-file") +public class OCFileDataRestController { + + @Autowired + private OCFileDataService OcFileDataSer; + + @InitBinder + public void initBinder(WebDataBinder binder) { + SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + sdf.setLenient(false); + // true = allow empty string to be converted to null + binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true)); + binder.registerCustomEditor(Double.class, new CustomNumberEditor(Double.class, true)); + } + + @PostMapping("/add-oc-file") + public ResponseEntity addFile(@ModelAttribute AddOCFileDataRequestDTO addOcFileDataReqDTO) { + ServiceResponseDTO serResDTO = OcFileDataSer.addOcFileData(addOcFileDataReqDTO); + if (serResDTO.isResStat()) { + return ResponseEntity.ok(serResDTO); + } else { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(serResDTO); + } + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/service/FileDataService.java b/src/main/java/com/adjustment_file_management_system/springboot/service/FileDataService.java index 68cf204..b7c3716 100644 --- a/src/main/java/com/adjustment_file_management_system/springboot/service/FileDataService.java +++ b/src/main/java/com/adjustment_file_management_system/springboot/service/FileDataService.java @@ -33,6 +33,7 @@ import com.adjustment_file_management_system.springboot.repository.AdvanceTypeRe import com.adjustment_file_management_system.springboot.repository.FileDataRepository; import com.adjustment_file_management_system.springboot.repository.FundTypeRepository; import com.adjustment_file_management_system.springboot.request_dto.AddFileDataRequestDTO; +import com.adjustment_file_management_system.springboot.request_dto.AddOCFileDataRequestDTO; import com.adjustment_file_management_system.springboot.request_dto.AdvanceTypeRequestDTO; import com.adjustment_file_management_system.springboot.request_dto.FileDataRequestDTO; import com.adjustment_file_management_system.springboot.request_dto.UpdateFileDataRequestDTO; @@ -75,7 +76,7 @@ public class FileDataService { private static final Date placeHolderDate = new Date(0); // Clean file if error occurrs while adding file - private void cleanUpFiles(String... paths) { + public void cleanUpFiles(String... paths) { for (String path : paths) { folderSer.deleteFileIfExists(path); } @@ -107,7 +108,7 @@ public class FileDataService { /** * Helper method for file uploads, tracks uploaded files automatically. */ - private void handleFileUpload(String fileNum, String type, Date date, MultipartFile file, + public void handleFileUpload(String fileNum, String type, Date date, MultipartFile file, Consumer pathSetter, List uploadedFiles) throws IOException { if (file == null || file.isEmpty()) { return; @@ -123,7 +124,7 @@ public class FileDataService { /** * Utility method for choosing first non-null value. */ - private T firstNonNull(T a, T b) { + public T firstNonNull(T a, T b) { return (a != null) ? a : b; } @@ -159,7 +160,7 @@ public class FileDataService { /** * Returns the file from Respective File Data Request DTO by type */ - private MultipartFile getFileByType(Object obj, String type) { + public MultipartFile getFileByType(Object obj, String type) { if (obj instanceof AddFileDataRequestDTO addFileDataReqDTO) { return switch (type) { case "AS" -> addFileDataReqDTO.getAsFile(); @@ -175,6 +176,11 @@ public class FileDataService { case "TC" -> updFileDataReqDTO.getTcFile(); default -> null; }; + } else if (obj instanceof AddOCFileDataRequestDTO addOcFileDataReqDTO) { + return switch (type) { + case "OC" -> addOcFileDataReqDTO.getOcFile(); + default -> null; + }; } return null; } @@ -244,7 +250,7 @@ public class FileDataService { } switch (fileType) { - case "AS", "PI", "RTGS", "PO", "DC", "SR", "IR", "EJV-Number", "AS-Final", "FI", "TC" -> { + case "AS", "PI", "RTGS", "PO", "DC", "SR", "IR", "EJV-Number", "AS-Final", "FI", "TC", "OC" -> { // Remove duplicate prefix from filePath if present if (filePath.startsWith("/uploads/file-data/")) { diff --git a/src/main/java/com/adjustment_file_management_system/springboot/service/OCFileDataService.java b/src/main/java/com/adjustment_file_management_system/springboot/service/OCFileDataService.java new file mode 100644 index 0000000..cead3a5 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/service/OCFileDataService.java @@ -0,0 +1,195 @@ +package com.adjustment_file_management_system.springboot.service; + +import java.io.IOException; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import com.adjustment_file_management_system.springboot.mapper.FileDataMapper; +import com.adjustment_file_management_system.springboot.mapper.OCFileDataMapper; +import com.adjustment_file_management_system.springboot.repository.FileDataRepository; +import com.adjustment_file_management_system.springboot.repository.OCFileDataRepository; +import com.adjustment_file_management_system.springboot.repository.AdvanceTypeRepository; +import com.adjustment_file_management_system.springboot.repository.FundTypeRepository; +import com.adjustment_file_management_system.springboot.model.FileData; +import com.adjustment_file_management_system.springboot.model.AdvanceType; +import com.adjustment_file_management_system.springboot.model.FundType; +import com.adjustment_file_management_system.springboot.request_dto.AddOCFileDataRequestDTO; +import com.adjustment_file_management_system.springboot.request_dto.OCFileDataRequestDTO; +import com.adjustment_file_management_system.springboot.response_dto.FileDataResponseDTO; +import com.adjustment_file_management_system.springboot.response_dto.OCFileDataResponseDTO; +import com.adjustment_file_management_system.springboot.response_dto.ServiceResponseDTO; +import java.util.Calendar; + +@Service +public class OCFileDataService { + + private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + + private static final Logger logger = LoggerFactory.getLogger(FileDataService.class); + + private static final Date placeHolderDate = new Date(0); + + @Autowired + private FileDataService fileDataSer; + + @Autowired + private FileDataMapper fileDataMap; + + @Autowired + private FileDataRepository fileDataRepo; + + @Autowired + private OCFileDataRepository ocFileDataRepo; + + @Autowired + private AdvanceTypeRepository advTypeRepo; + + @Autowired + private FundTypeRepository fundTypeRepo; + + @Autowired + private OCFileDataMapper ocFileDataMap; + + @Transactional(rollbackFor = Exception.class) + public ServiceResponseDTO addOcFileData(AddOCFileDataRequestDTO addOcFileDataReqDTO) { + List uploadedFiles = new ArrayList(); // Track uploaded file paths + try { + String fileNum = addOcFileDataReqDTO.getFileNum().trim(); + + Long fileDataId = fileDataRepo.findFileDataIdByFileNum(fileNum); + + if (fileDataId == null) { + // Create parent FileData entity + FileData newFileData = new FileData(); + newFileData.setFileDataNum(fileNum); + newFileData.setFinYear(determineFinYear(fileNum)); + + // Get or create AdvanceType + AdvanceType advType = advTypeRepo.findAdvTypeByAdvType("ELCOT") + .orElseGet(() -> advTypeRepo.findAdvTypeByAdvType("OTHER") + .orElseGet(() -> { + List all = advTypeRepo.findAll(); + if (!all.isEmpty()) return all.get(0); + AdvanceType newType = new AdvanceType(); + newType.setAdvType("ELCOT"); + return advTypeRepo.save(newType); + })); + newFileData.setAdvType(advType); + + // Get or create FundType + FundType fundType = fundTypeRepo.findAll().stream().findFirst().orElseGet(() -> { + FundType newType = new FundType(); + newType.setFundType("GENERAL FUND"); + return fundTypeRepo.save(newType); + }); + newFileData.setFundType(fundType); + + newFileData.setVendName("ELCOT"); + newFileData.setAsFilePath("-"); + newFileData.setAsFileGenDate(placeHolderDate); + newFileData.setPiFilePath("-"); + newFileData.setPiFileGenDate(placeHolderDate); + newFileData.setPiAmt(0.0); + newFileData.setFiFilePath("-"); + newFileData.setFiAmt(0.0); + newFileData.setFiFileGenDate(placeHolderDate); + newFileData.setBalAmt(0.0); + newFileData.setRtgsFilePath("-"); + newFileData.setPoFilePath("-"); + newFileData.setDcFilePath("-"); + newFileData.setSrFilePath("-"); + newFileData.setIrFilePath("-"); + newFileData.setAsFinalFilePath("-"); + newFileData.setAsFinalFileGenDate(placeHolderDate); + newFileData.setEjvNum("-"); + newFileData.setEjvNumFilePath("-"); + newFileData.setEjvNumFileGenDate(placeHolderDate); + newFileData.setTcFilePath("-"); + newFileData.setTcFileGenDate(placeHolderDate); + newFileData.setFileRmrk("-"); + + FileData savedFileData = fileDataRepo.save(newFileData); + fileDataId = savedFileData.getFileDataId(); + } + + Date ocFileUplDate = addOcFileDataReqDTO.getOcFileUplDate() != null + ? addOcFileDataReqDTO.getOcFileUplDate() + : placeHolderDate; + String ocFileSub = (addOcFileDataReqDTO.getOcFileSub() != null + && !addOcFileDataReqDTO.getOcFileSub().trim().isEmpty()) + ? addOcFileDataReqDTO.getOcFileSub().trim() + : "-"; + + // Prepare DTO + OCFileDataRequestDTO ocFileDataRequestDTO = new OCFileDataRequestDTO(); + ocFileDataRequestDTO.setFileNum(fileNum); + ocFileDataRequestDTO.setOcFileUplDate(ocFileUplDate); + ocFileDataRequestDTO.setOcFileSub(ocFileSub); + + // Handle file uploads + Map files = new HashMap(); + if (addOcFileDataReqDTO.getOcFile() != null) { + files.put("OC", addOcFileDataReqDTO.getOcFile()); + } + Map> pathSetters = Map.of("OC", ocFileDataRequestDTO::setOcFilePath); + for (String type : files.keySet()) { + MultipartFile file = files.get(type); + // use the dates already set + fileDataSer.handleFileUpload(fileNum, type, "OC".equals(type) ? ocFileUplDate : ocFileUplDate, file, + pathSetters.get(type), uploadedFiles); + } + // Save to DB + ocFileDataRepo.save(ocFileDataMap.toOcFileDataEnt(ocFileDataRequestDTO, fileDataId)); + logger.info("OC File saved for file number: {}", fileNum); + return new ServiceResponseDTO(true, "OC File added successfully"); + } catch (IOException ioe) { + logger.error("Exception occurred in file upload part: {}", ioe.getMessage(), ioe); + ioe.printStackTrace(); + fileDataSer.cleanUpFiles(uploadedFiles.toArray(new String[0])); // Delete all uploaded files + return new ServiceResponseDTO(false, "Failed to add the file. Error in file upload: " + + ioe.getMessage()); + } catch (Exception e) { + logger.error("Exception occurred: {}", e.getMessage(), e); + e.printStackTrace(); + fileDataSer.cleanUpFiles(uploadedFiles.toArray(new String[0])); // Delete all uploaded files + return new ServiceResponseDTO(false, "Failed to add the file. Error: " + e.getMessage()); + } + } + + private String determineFinYear(String fileNum) { + java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("\\b(20\\d{2})\\b"); + java.util.regex.Matcher matcher = pattern.matcher(fileNum); + if (matcher.find()) { + int year = Integer.parseInt(matcher.group(1)); + return year + "-" + (year + 1); + } + Calendar cal = Calendar.getInstance(); + int year = cal.get(Calendar.YEAR); + int month = cal.get(Calendar.MONTH); + if (month >= Calendar.APRIL) { + return year + "-" + (year + 1); + } else { + return (year - 1) + "-" + year; + } + } + + @Transactional(readOnly = true) + public List getAllOcFileData() { + return ocFileDataRepo.findAll().stream() + .map(ocFileDataMap::toOcFileDataResDTO) + .toList(); + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e629843..d0255e6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -21,12 +21,12 @@ spring.datasource.password=${DB_PASSWORD} spring.datasource.driver-class-name=oracle.jdbc.OracleDriver # =============================== -# JPA / Hibernate Config +# JPA / Hibernate Config # =============================== # spring.jpa.database-platform=org.hibernate.dialect.OracleDialect -# spring.jpa.hibernate.ddl-auto=update +spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true -# spring.jpa.properties.hibernate.format_sql=true +spring.jpa.properties.hibernate.format_sql=true spring.jpa.open-in-view=true logging.level.org.hibernate.SQL=DEBUG # logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE diff --git a/src/main/resources/static/js/add-oc-file-script.js b/src/main/resources/static/js/add-oc-file-script.js new file mode 100644 index 0000000..72baefc --- /dev/null +++ b/src/main/resources/static/js/add-oc-file-script.js @@ -0,0 +1,51 @@ +// Initialize date pickers +["ocFileUplDate"].forEach(id => { + flatpickr("#" + id, { + dateFormat: "d-m-Y", + enableTime: false, + noCalendar: false, + allowInput: true + }); +}); + +document.addEventListener("DOMContentLoaded", function () { + const form = document.getElementById("frm-oc-file-det"); + + // Existing form submission logic... + form.addEventListener("submit", function (e) { + e.preventDefault(); // Prevent default form submission + + const formData = new FormData(form); + + fetch(form.getAttribute("action"), { + method: "POST", + body: formData + }) + .then(response => { + if (!response.ok) { + throw new Error("Network response was not ok: " + response.statusText); + } + return response.json(); + }) + .then(data => { + if (data.resStat) { + alert("Success: " + data.res); + form.reset(); + + // Reset flatpickr + if (flatpickr) { + ["#ocFileUplDate"].forEach(selector => { + const fp = document.querySelector(selector)?._flatpickr; + if (fp) fp.clear(); + }); + } + } else { + alert("Failed: " + data.res); + } + }) + .catch(error => { + console.error("Error submitting file:", error); + alert("Error submitting file. Please try again."); + }); + }); +}); \ No newline at end of file diff --git a/src/main/resources/static/js/view-file-script.js b/src/main/resources/static/js/view-file-script.js index 188aff3..65f64c5 100644 --- a/src/main/resources/static/js/view-file-script.js +++ b/src/main/resources/static/js/view-file-script.js @@ -32,7 +32,10 @@ $(document).ready(function () { if (column === 0) { return row + 1; // row is 0-based index of **visible filtered rows** } - return data; // leave other columns unchanged + + // Remove HTML tags from all columns + return $('
').html(data).text().trim(); + //return data; // leave other columns unchanged } } } @@ -43,11 +46,14 @@ $(document).ready(function () { // --- SEQUENTIAL S.NO FIX --- table.on('order.dt search.dt draw.dt', function () { - var pageInfo = table.page.info(); // get current page info - table.column(0, { search: 'applied', order: 'applied' }).nodes().each(function (cell, i) { - cell.innerHTML = i + 1 + pageInfo.start; // keep numbering continuous across pages + + var pageInfo = table.page.info(); + + table.column(0, { page: 'current' }).nodes().each(function (cell, i) { + cell.innerHTML = pageInfo.start + i + 1; }); - }).draw(); + + }).draw() // Move DataTable controls to custom container $('#custom-pagination').html($('.dataTables_paginate')); diff --git a/src/main/resources/static/js/view-oc-file-script.js b/src/main/resources/static/js/view-oc-file-script.js new file mode 100644 index 0000000..8168dfa --- /dev/null +++ b/src/main/resources/static/js/view-oc-file-script.js @@ -0,0 +1,211 @@ +$(document).ready(function () { + // Initialize DataTable + var table = $('#oc-file-det-tbl').DataTable({ + paging: true, + searching: true, + ordering: true, + lengthChange: true, + pageLength: 10, + language: { + emptyTable: "No data available", + lengthMenu: "Display _MENU_ records per page", + info: "Showing _START_ to _END_ of _TOTAL_ entries", + infoEmpty: "No records to show", + infoFiltered: "(filtered from _MAX_ total records)" + }, + columnDefs: [ + { + orderable: false, + targets: [0, 5] // S.No and OC File columns + } + ], + buttons: [ + { + extend: 'excelHtml5', + title: "OC File Details", + filename: "OC File Details", + exportOptions: { + columns: ':visible:not(:eq(5))', // exclude OC File column + format: { + body: function (data, row, column, node) { + if (column === 0) { + return row + 1; + } + return $('
').html(data).text().trim(); + } + } + } + }, + 'pdfHtml5' + ] + }); + + // --- SEQUENTIAL S.NO FIX --- + table.on('order.dt search.dt draw.dt', function () { + var pageInfo = table.page.info(); + table.column(0, { page: 'current' }).nodes().each(function (cell, i) { + cell.innerHTML = pageInfo.start + i + 1; + }); + }).draw(); + + // Move DataTable controls to custom containers + $('#custom-pagination').html($('.dataTables_paginate')); + $('#custom-info').html($('.dataTables_info')); + $('#custom-length').html($('.dataTables_length')); + $('.dataTables_filter').hide(); // hide default search + + // Custom search / filtering on the datatable + $('#export-excel').on('click', function () { + table.button('.buttons-excel').trigger(); + }); + + $('#export-pdf').on('click', function () { + var originalLength = table.page.len(); + table.one('draw', function () { + var tableClone = $('#oc-file-det-tbl').clone(); + tableClone.removeClass('dataTable'); + tableClone.find('thead, tbody, tfoot').removeAttr('style'); + + // Remove "OC File" column (6th col = index 5) + tableClone.find('tr').each(function () { + $(this).find('th:eq(5), td:eq(5)').remove(); + }); + + var pdfContainer = $('#pdf-print-container'); + if (!pdfContainer.length) { + $('body').append(''); + pdfContainer = $('#pdf-print-container'); + } + pdfContainer.html('

OC File Details

'); + pdfContainer.append(tableClone).css({ display: 'block', padding: '20px' }); + + tableClone.css({ width: '100%', borderCollapse: 'collapse' }); + tableClone.find('th, td').css({ + border: '1px solid #ccc', + padding: '5px', + fontSize: '10px', + textAlign: 'left', + verticalAlign: 'top' + }); + tableClone.find('tr').css({ pageBreakInside: 'avoid', breakInside: 'avoid', webkitBreakInside: 'avoid' }); + + html2pdf().set({ + margin: 0.5, + filename: 'OC File Details.pdf', + image: { type: 'jpeg', quality: 0.98 }, + html2canvas: { scale: 2, useCORS: true }, + jsPDF: { unit: 'in', format: 'a3', orientation: 'landscape' } + }).from(pdfContainer[0]).save().then(function () { + table.page.len(originalLength).draw(); + pdfContainer.hide(); + }); + }); + table.page.len(-1).draw(); // show all rows for PDF + }); + + function populateFilters() { + var numSet = {}, vendSet = {}; + + table.rows().every(function () { + var data = this.data(); + var fileNum = data[1] ? $('
').html(data[1]).text().trim() : ''; + var vendName = data[2] ? $('
').html(data[2]).text().trim() : ''; + + if (fileNum) numSet[fileNum] = true; + if (vendName) vendSet[vendName] = true; + }); + + Object.keys(numSet).sort().forEach(val => $('#file-num-list').append(`

diff --git a/src/main/resources/templates/oc-file/add-oc-file.html b/src/main/resources/templates/oc-file/add-oc-file.html new file mode 100644 index 0000000..6cb5616 --- /dev/null +++ b/src/main/resources/templates/oc-file/add-oc-file.html @@ -0,0 +1,78 @@ + + + + + + + Adjustment File Management System + + + + + + + + + + + + + + + + + + +
+
+
+ +
+

Add New Elcot Remainder OC File

+
+
+ +
+ + + + + + + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+ +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/oc-file/view-oc-file.html b/src/main/resources/templates/oc-file/view-oc-file.html new file mode 100644 index 0000000..da4f8eb --- /dev/null +++ b/src/main/resources/templates/oc-file/view-oc-file.html @@ -0,0 +1,139 @@ + + + + + + + Adjustment File Management System + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+

Elcot OC Remainders Details

+ +
+ +
+ +
+ + + +
+
+ +
+
+
+ + + + + +
+
+ + + + + +
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
S.NoFile NumberVendor NameSubjectUpload DateOC File
+ + + +
+
+ +
+
+
+
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file