|
|
@@ -2,13 +2,29 @@ package com.ffii.fpsms.modules.common.mail.service |
|
|
|
|
|
|
|
import com.ffii.fpsms.modules.common.mail.entity.MailTemplate |
|
|
|
import com.ffii.fpsms.modules.common.mail.entity.MailTemplateRepository |
|
|
|
import com.ffii.fpsms.modules.common.mail.web.models.DownloadMailTemplateResponse |
|
|
|
import com.ffii.fpsms.modules.common.mail.web.models.MailTemplateRequest |
|
|
|
import com.ffii.fpsms.modules.qc.service.QcResultService |
|
|
|
import com.ffii.fpsms.modules.stock.entity.StockInLineRepository |
|
|
|
import com.ffii.fpsms.modules.stock.service.InventoryLotService |
|
|
|
import com.itextpdf.html2pdf.ConverterProperties |
|
|
|
import com.itextpdf.html2pdf.HtmlConverter |
|
|
|
import com.itextpdf.layout.font.FontProvider |
|
|
|
import org.jsoup.Jsoup |
|
|
|
import org.springframework.stereotype.Service |
|
|
|
import java.io.ByteArrayOutputStream |
|
|
|
import java.math.BigDecimal |
|
|
|
import java.time.format.DateTimeFormatter |
|
|
|
import kotlin.jvm.optionals.getOrNull |
|
|
|
|
|
|
|
@Service |
|
|
|
open class MailTemplateService( |
|
|
|
private val mailTemplateRepository: MailTemplateRepository, |
|
|
|
private val stockInLineRepository: StockInLineRepository, |
|
|
|
private val inventoryLotService: InventoryLotService, |
|
|
|
private val qcResultService: QcResultService |
|
|
|
) { |
|
|
|
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") |
|
|
|
fun allMailTemplates(): List<MailTemplate> { |
|
|
|
return mailTemplateRepository.findAllByDeletedIsFalse(); |
|
|
|
} |
|
|
@@ -17,6 +33,10 @@ open class MailTemplateService( |
|
|
|
return mailTemplateRepository.findByIdAndDeletedIsFalse(id); |
|
|
|
} |
|
|
|
|
|
|
|
fun findByCode(code: String): MailTemplate? { |
|
|
|
return mailTemplateRepository.findByCodeAndDeletedIsFalse(code); |
|
|
|
} |
|
|
|
|
|
|
|
fun saveMailTemplate(request: MailTemplateRequest): MailTemplate { |
|
|
|
val mailTemplate = request.id?.let { findById(it) } ?: MailTemplate() |
|
|
|
|
|
|
@@ -59,4 +79,102 @@ open class MailTemplateService( |
|
|
|
|
|
|
|
mailTemplateRepository.saveAll(mailTemplates) |
|
|
|
} |
|
|
|
|
|
|
|
fun getMailTemplateForStockInLine(stockInLineId: Long): DownloadMailTemplateResponse { |
|
|
|
val emailTemplate = findByCode("RM-01") ?: throw NoSuchElementException("No RP-01 Email Template") |
|
|
|
val stockInLine = stockInLineRepository.findById(stockInLineId).getOrNull() ?: throw NoSuchElementException("Cant find this stock in line.") |
|
|
|
|
|
|
|
// Value |
|
|
|
val zero = BigDecimal.ZERO |
|
|
|
val po = stockInLine.purchaseOrder |
|
|
|
val pol = stockInLine.purchaseOrderLine |
|
|
|
val item = stockInLine.item |
|
|
|
val supplierName = po?.supplier?.name ?: "N/A" |
|
|
|
val supplierEmail = if((po?.supplier?.contactEmail).isNullOrEmpty()) "N/A" else po?.supplier?.contactEmail |
|
|
|
val dnDate = formatter.format(stockInLine.dnDate) ?: "N/A" |
|
|
|
val poNo = po?.code ?: "N/A" |
|
|
|
val supplierId = po?.supplier?.code ?: "N/A" // Id? |
|
|
|
val itemNo = item?.code ?: "N/A" |
|
|
|
val itemQty = (pol?.qty ?: zero).toString() |
|
|
|
val uom = pol?.uom?.udfudesc ?: "N/A" |
|
|
|
val planDnDate = po?.estimatedArrivalDate?.let { formatter.format(it) } ?: "N/A" |
|
|
|
val unitPrice = (pol?.up ?: zero).toString() |
|
|
|
val receivedCompany = po?.shop?.name ?: "N/A" |
|
|
|
val lotNo = stockInLine.productLotNo ?: "N/A" |
|
|
|
var qcDate = "N/A" |
|
|
|
val qcResult = qcResultService.getAllQcResultInfoByStockInLineId(stockInLineId).let { qcResults -> |
|
|
|
val filteredResult = qcResults |
|
|
|
.groupBy { Pair(it.stockInLineId, it.qcItemId) } |
|
|
|
.mapValues { (_, group) -> |
|
|
|
group.maxByOrNull { it.recordDate } |
|
|
|
} |
|
|
|
.values |
|
|
|
.filterNotNull() |
|
|
|
.filter { !it.qcPassed } |
|
|
|
if (filteredResult.isNotEmpty()) { |
|
|
|
qcDate = formatter.format(filteredResult.maxOf { it.recordDate }) |
|
|
|
|
|
|
|
val tempDoc = Jsoup.parse("") |
|
|
|
val element = tempDoc.appendElement("ul") |
|
|
|
for (result in filteredResult) { |
|
|
|
element.appendElement("li") |
|
|
|
.text("${result.name} - ${result.description}") |
|
|
|
} |
|
|
|
tempDoc.outerHtml() |
|
|
|
} else { |
|
|
|
"N/A" |
|
|
|
} |
|
|
|
} ?: "N/A" |
|
|
|
val acceptedQty = (stockInLine.acceptedQty ?: zero).minus(stockInLine.demandQty ?: zero).toString() |
|
|
|
val rejectedQty = (stockInLine.demandQty ?: zero).toString() // reject? |
|
|
|
val nonDelieveredQty = (zero).toString() |
|
|
|
|
|
|
|
// HTML |
|
|
|
val to = supplierEmail |
|
|
|
val toHtmlStr = Jsoup.parse("").appendElement("p").text("To: $to").outerHtml() |
|
|
|
|
|
|
|
val subject = (emailTemplate.subjectCht ?: "N/A") |
|
|
|
// .replace("{supplierName}", supplierName) |
|
|
|
.replace("{poNo}", poNo) |
|
|
|
.replace("{itemNo}", itemNo) |
|
|
|
val subjectHtmlStr = Jsoup.parse("").appendElement("p").text("Subject: $subject").outerHtml() |
|
|
|
|
|
|
|
val content = (emailTemplate.contentCht ?: "N/A") |
|
|
|
.replace("{supplierName}", supplierName) |
|
|
|
.replace("{dnDate}", dnDate) |
|
|
|
.replace("{poNo}", poNo) |
|
|
|
.replace("{supplierId}", supplierId) |
|
|
|
.replace("{itemNo}", itemNo) |
|
|
|
.replace("{itemQty}", itemQty) |
|
|
|
.replace("{uom}", uom) |
|
|
|
.replace("{planDnDate}", planDnDate) |
|
|
|
.replace("{unitPrice}", unitPrice) |
|
|
|
.replace("{receivedCompany}", receivedCompany) |
|
|
|
.replace("{lotNo}", lotNo) |
|
|
|
.replace("{qcResult}", qcResult) |
|
|
|
.replace("{acceptedQty}", acceptedQty) |
|
|
|
.replace("{nonDelieveredQty}", nonDelieveredQty) |
|
|
|
.replace("{rejectedQty}", rejectedQty) |
|
|
|
.replace("{qcDate}", qcDate) |
|
|
|
val contentHtmlStr = Jsoup.parse("").appendElement("p").append("Content: $content").outerHtml() |
|
|
|
|
|
|
|
// Result |
|
|
|
val resultHtmlStr = toHtmlStr + subjectHtmlStr + contentHtmlStr |
|
|
|
// println(resultHtmlStr) |
|
|
|
|
|
|
|
val resultPdf = ByteArrayOutputStream() |
|
|
|
val fp = FontProvider(); |
|
|
|
fp.addStandardPdfFonts() |
|
|
|
fp.addFont("/fonts/msjh_0.ttf") |
|
|
|
val converterProperties = ConverterProperties() |
|
|
|
converterProperties.apply { |
|
|
|
fontProvider = fp |
|
|
|
} |
|
|
|
HtmlConverter.convertToPdf(resultHtmlStr, resultPdf, converterProperties) |
|
|
|
|
|
|
|
return DownloadMailTemplateResponse( |
|
|
|
file = resultPdf.toByteArray(), |
|
|
|
fileName = subject ?: "N/A" |
|
|
|
); |
|
|
|
} |
|
|
|
} |