diff --git a/build.gradle.kts b/build.gradle.kts index 5abd28d..bdbc8a3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -36,10 +36,9 @@ dependencies { implementation("org.yaml:snakeyaml:2.2") implementation("io.minio:minio:8.5.7") implementation("org.apache.httpcomponents:httpclient:4.5.14") - implementation("org.apache.poi:poi:5.0.0") - implementation("org.apache.poi:poi-ooxml:5.0.0") + implementation("org.apache.poi:poi:5.2.3") + implementation("org.apache.poi:poi-ooxml:5.2.3") implementation("com.google.code.gson:gson:2.8.8") - api ("net.cactusthorn.config:config-core:0.81") api ("net.cactusthorn.config:config-yaml:0.81") kapt("net.cactusthorn.config:config-compiler:0.81") diff --git a/src/main/kotlin/com/restapi/controllers/Excel.kt b/src/main/kotlin/com/restapi/controllers/Excel.kt index 6cd621b..6bccc55 100644 --- a/src/main/kotlin/com/restapi/controllers/Excel.kt +++ b/src/main/kotlin/com/restapi/controllers/Excel.kt @@ -1,4 +1,7 @@ package com.restapi.controllers +import com.fasterxml.jackson.databind.DeserializationFeature +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.google.gson.Gson import com.restapi.domain.* import com.restapi.domain.Document @@ -11,15 +14,10 @@ import com.restapi.domain.Session.database import com.restapi.domain.Vendor import org.apache.poi.hssf.usermodel.DVConstraint import org.apache.poi.hssf.usermodel.HSSFDataValidation -import org.apache.poi.ss.usermodel.Cell -import org.apache.poi.ss.usermodel.CellType -import org.apache.poi.ss.usermodel.DateUtil -import org.apache.poi.ss.usermodel.Workbook -import org.apache.poi.ss.usermodel.WorkbookFactory +import org.apache.poi.ss.usermodel.* import org.apache.poi.ss.util.CellRangeAddressList -import java.io.File -import java.io.FileInputStream -import java.io.FileOutputStream +import org.apache.poi.xssf.usermodel.XSSFWorkbook +import java.io.* import java.text.SimpleDateFormat import java.time.LocalDate import java.time.ZoneId @@ -389,7 +387,7 @@ fun ImportFromExcel(fileType: FileType, filePath : String) { "nos" -> UOM.NOS "ltr" -> UOM.LTR "mtr" -> UOM.MTR - else -> UOM.ALL + else -> UOM.LTR } } } @@ -416,4 +414,168 @@ fun ImportFromExcel(fileType: FileType, filePath : String) { } } } +} + +data class validateExcel( + val name: String, + val description: String, + val hsnCode: String, + val ok: Boolean, + val err: String, +) + +val app_common_om = jacksonObjectMapper().apply { + registerModule(JavaTimeModule()) + configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) +} + +fun ExcelRead(): String{ + val inputStream = FileInputStream("C:\\Users\\vinay\\IdeaProjects\\readymixerp_modules_api_git\\Untitled 1.xlsx") + val workbook = WorkbookFactory.create(inputStream) + val workSheet = workbook.getSheetAt(0) + var h = true + //Header check + if(workSheet.getRow(0).getCell(0).stringCellValue.equals("Name")) { + if (workSheet.getRow(0).getCell(1).stringCellValue.equals("Description")) { + if (workSheet.getRow(0).getCell(2).stringCellValue.equals("HSN")) { + if (workSheet.getRow(0).getCell(3).stringCellValue.equals("UOM")) { + h = false + }else return "Header UOM mismatch" + }else return "Header-HSN mismatch" + }else return "Header-Desc mismatch" + }else return "Header-Name mismatch" + + val resp = arrayListOf() + + if(h==false) { + workSheet.rowIterator().forEach { row -> + + if (row == null) return@forEach + + if (h) { + + val pName = row.getCell(0).run { + when { + this == null -> "" + this.cellType == CellType.STRING -> this.stringCellValue + else -> "" + } + } + + val pDesc = row.getCell(1).run { + when { + this == null -> "" + this.cellType == CellType.STRING -> this.stringCellValue + else -> "" + } + } + val pHsn = row.getCell(2).run { + when { + this == null -> "" + this.cellType == CellType.STRING -> this.stringCellValue + else -> "" + } + } + + if (pName.isEmpty() && pDesc.isEmpty() && pHsn.isEmpty()) { + return@forEach + } + if (pName.isEmpty()) { + resp.add( + validateExcel( + name = pName, + description = pDesc, + hsnCode = pHsn, + ok = false, + err = "Product name is required" + ) + ) + return@forEach + } + if (pDesc.isEmpty()) { + resp.add( + validateExcel( + name = pName, + description = pDesc, + hsnCode = pHsn, + ok = false, + err = "Product description is required" + ) + ) + return@forEach + } + if (pHsn.isEmpty()) { + resp.add( + validateExcel( + name = pName, + description = pDesc, + hsnCode = pHsn, + ok = false, + err = "Product HSN is required" + ) + ) + return@forEach + } + } + h = true + } + } + return app_common_om.writeValueAsString(resp) +} + + +fun CreateExcel(productList: List): InputStream { + val wb = XSSFWorkbook() + val sh = wb.createSheet() + val rows: Row = sh.createRow(0) + rows.createCell(0).setCellValue("Name") + rows.createCell(1).setCellValue("Description") + rows.createCell(2).setCellValue("HSN") + rows.createCell(3).setCellValue("UOM") + + var rowNum = 1 + for (product in productList) { + val row: Row = sh.createRow(rowNum++) + + row.createCell(0).setCellValue(product.name) + row.createCell(1).setCellValue(product.description) + row.createCell(2).setCellValue(product.hsnCode) + + val uomCell: Cell = row.createCell(3) + uomCell.setCellValue(product.uom?.name ?: "") + } + + val baos = ByteArrayOutputStream() + wb.write(baos) + wb.close() + + return ByteArrayInputStream(baos.toByteArray()) + +} + +fun excelToDb(): List { + val inputStream = FileInputStream("C:\\Users\\vinay\\IdeaProjects\\readymixerp_modules_api_git\\Untitled 1.xlsx") + val workbook = WorkbookFactory.create(inputStream) + val workSheet = workbook.getSheetAt(0) + + for (row in workSheet) { + val cell1Value = row.getCell(0).stringCellValue + val cell2Value = row.getCell(1).stringCellValue + val cell3Value = row.getCell(2).stringCellValue + val cell4Value = row?.getCell(3)?.stringCellValue + + val prod = Product() + prod.name = cell1Value + prod.description = cell2Value + prod.hsnCode = cell3Value + prod.uom = when(cell4Value) { + "nos" -> UOM.NOS + "ltr" -> UOM.LTR + "mtr" -> UOM.MTR + else -> UOM.ALL + } + database.saveAll(prod) + } + val productList = Session.database.find(Product::class.java).findList() + return productList } \ No newline at end of file diff --git a/src/main/kotlin/com/restapi/controllers/Filters.kt b/src/main/kotlin/com/restapi/controllers/Filters.kt index b2ad26c..32b7d07 100644 --- a/src/main/kotlin/com/restapi/controllers/Filters.kt +++ b/src/main/kotlin/com/restapi/controllers/Filters.kt @@ -29,10 +29,14 @@ data class POFilters ( val validBefore: LocalDate = maxDate, val refQuotation :String = IGNORE, ) : CustomFilters + +enum class UOMFilter { + ALL //fixme: later +} data class ProductFilters ( val nameLike :String = IGNORE, val hsnLike :String = IGNORE, - val uom :UOM = UOM.ALL, + val uom :UOMFilter = UOMFilter.ALL, ) : CustomFilters data class DocumentFilters ( val nameLike :String = IGNORE, @@ -146,4 +150,13 @@ fun searchRFQ(commonFilters: CommonFilters, rfqFilters: RFQFilters) : List { + val p = database.find(Product::class.java) + .where() + .ilike("hsnCode", productFilters.hsnLike) + .ilike("Pname", productFilters.nameLike) + applySortHelper(p, commonFilters.sortBy, commonFilters.sortAsc) + return p.findList() } \ No newline at end of file diff --git a/src/main/kotlin/com/restapi/domain/models.kt b/src/main/kotlin/com/restapi/domain/models.kt index a861a24..eef9914 100644 --- a/src/main/kotlin/com/restapi/domain/models.kt +++ b/src/main/kotlin/com/restapi/domain/models.kt @@ -9,6 +9,7 @@ import io.ebean.annotation.* import io.ebean.annotation.Index import java.time.LocalDate import java.time.LocalDateTime +import java.util.* import javax.persistence.* data class Comments(val text: String = "", val by: String = "", val at: LocalDateTime = LocalDateTime.now()) @@ -274,6 +275,7 @@ open class PurchaseOrder :BaseTenantModel() { enum class UOM { NOS, LTR, MTR, ALL } + @Entity open class Product :BaseTenantModel() { var id: Long? = null