@@ -0,0 +1,40 @@ | |||||
package com.ffii.fpsms.modules.common.mail.entity | |||||
import com.ffii.core.entity.BaseEntity | |||||
import jakarta.persistence.* | |||||
import jakarta.validation.constraints.NotNull | |||||
import jakarta.validation.constraints.Size | |||||
import java.time.LocalDateTime | |||||
@Entity | |||||
@Table(name = "mail_send_log") | |||||
open class MailSendLog : BaseEntity<Long>() { | |||||
@NotNull | |||||
@ManyToOne | |||||
@JoinColumn(name = "tempId", nullable = false) | |||||
open var temp: MailSendLog? = null | |||||
@Size(max = 255) | |||||
@NotNull | |||||
@Column(name = "tempDesc", nullable = false) | |||||
open var tempDesc: String? = null | |||||
@Size(max = 255) | |||||
@Column(name = "senderMail") | |||||
open var senderMail: String? = null | |||||
@Column(name = "subject") | |||||
open var subject: String? = null | |||||
@Lob | |||||
@Column(name = "content") | |||||
open var content: String? = null | |||||
@Column(name = "sendDate") | |||||
open var sendDate: LocalDateTime? = null | |||||
@Lob | |||||
@Column(name = "errorMessage") | |||||
open var errorMessage: String? = null | |||||
} |
@@ -0,0 +1,24 @@ | |||||
package com.ffii.fpsms.modules.common.mail.entity | |||||
import com.ffii.core.entity.BaseEntity | |||||
import jakarta.persistence.* | |||||
import jakarta.validation.constraints.NotNull | |||||
import jakarta.validation.constraints.Size | |||||
@Entity | |||||
@Table(name = "mail_send_log_line") | |||||
open class MailSendLogLine : BaseEntity<Long>() { | |||||
@NotNull | |||||
@ManyToOne | |||||
@JoinColumn(name = "sendMailLogId", nullable = false) | |||||
open var sendMailLog: MailSendLog? = null | |||||
@Size(max = 255) | |||||
@Column(name = "toMail") | |||||
open var toMail: String? = null | |||||
@Lob | |||||
@Column(name = "errorMessage") | |||||
open var errorMessage: String? = null | |||||
} |
@@ -0,0 +1,8 @@ | |||||
package com.ffii.fpsms.modules.common.mail.entity | |||||
import com.ffii.core.support.AbstractRepository | |||||
import org.springframework.stereotype.Repository | |||||
@Repository | |||||
interface MailSendLogLineRepository : AbstractRepository<MailSendLogLine, Long> { | |||||
} |
@@ -0,0 +1,8 @@ | |||||
package com.ffii.fpsms.modules.common.mail.entity | |||||
import com.ffii.core.support.AbstractRepository | |||||
import org.springframework.stereotype.Repository | |||||
@Repository | |||||
interface MailSendLogRepository : AbstractRepository<MailSendLog, Long> { | |||||
} |
@@ -0,0 +1,48 @@ | |||||
package com.ffii.fpsms.modules.common.mail.entity | |||||
import com.ffii.core.entity.BaseEntity | |||||
import jakarta.persistence.* | |||||
import jakarta.validation.constraints.NotNull | |||||
import jakarta.validation.constraints.Size | |||||
@Entity | |||||
@Table(name = "mail_template") | |||||
open class MailTemplate : BaseEntity<Long>() { | |||||
@Column(name = "`to`") | |||||
open var to: String? = null | |||||
@Column(name = "cc") | |||||
open var cc: String? = null | |||||
@Size(max = 255) | |||||
@NotNull | |||||
@Column(name = "code", nullable = false) | |||||
open var code: String? = null | |||||
@Size(max = 255) | |||||
@NotNull | |||||
@Column(name = "description", nullable = false) | |||||
open var description: String? = null | |||||
@Size(max = 30) | |||||
@Column(name = "type", length = 30) | |||||
open var type: String? = null | |||||
@Size(max = 255) | |||||
@Column(name = "params") | |||||
open var params: String? = null | |||||
@Column(name = "subjectCht") | |||||
open var subjectCht: String? = null | |||||
@Column(name = "subjectEng") | |||||
open var subjectEng: String? = null | |||||
@Lob | |||||
@Column(name = "contentCht") | |||||
open var contentCht: String? = null | |||||
@Lob | |||||
@Column(name = "contentEng") | |||||
open var contentEng: String? = null | |||||
} |
@@ -0,0 +1,12 @@ | |||||
package com.ffii.fpsms.modules.common.mail.entity | |||||
import com.ffii.core.support.AbstractRepository | |||||
import org.springframework.stereotype.Repository | |||||
import java.io.Serializable | |||||
@Repository | |||||
interface MailTemplateRepository : AbstractRepository<MailTemplate, Long> { | |||||
fun findAllByDeletedIsFalse(): List<MailTemplate> | |||||
fun findByIdAndDeletedIsFalse(id: Serializable): MailTemplate? | |||||
} |
@@ -0,0 +1,5 @@ | |||||
package com.ffii.fpsms.modules.common.mail.enums | |||||
enum class MailTemplateType(val value: String) { | |||||
PURCHASE_ORDER("po"), | |||||
} |
@@ -23,43 +23,20 @@ open class MailReminderService( | |||||
val settingsService: SettingsService, | val settingsService: SettingsService, | ||||
) { | ) { | ||||
protected val logger: Log = LogFactory.getLog(javaClass) | protected val logger: Log = LogFactory.getLog(javaClass) | ||||
private val FULLTIME = "FT" | |||||
private val PARTTIME = "PT" | |||||
private val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") | private val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") | ||||
private fun isSettingsConfigValid(): Boolean { | private fun isSettingsConfigValid(): Boolean { | ||||
try { | try { | ||||
val username = settingsService.findByName(SettingNames.MAIL_SMTP_USERNAME).orElseThrow().value | val username = settingsService.findByName(SettingNames.MAIL_SMTP_USERNAME).orElseThrow().value | ||||
val pw = settingsService.findByName(SettingNames.MAIL_SMTP_USERNAME).orElseThrow().value | |||||
val pw = settingsService.findByName(SettingNames.MAIL_SMTP_PASSWORD).orElseThrow().value | |||||
return !username.isNullOrEmpty() && !pw.isNullOrEmpty() | return !username.isNullOrEmpty() && !pw.isNullOrEmpty() | ||||
} catch (e: Error) { | } catch (e: Error) { | ||||
return false | return false | ||||
} | } | ||||
} | } | ||||
private fun createHTMLTable(naughtyList: MutableList<TableRow>): String { | |||||
val tableStarter = StringBuilder(" <table width='100%' border='1' align='center'> ") | |||||
val header = StringBuilder( | |||||
" <tr> " | |||||
+ " <th>StaffId</th> " | |||||
+ " <th>Name</th> " | |||||
+ " <th>Missing Dates</th> " | |||||
+ " </tr> " | |||||
) | |||||
tableStarter.append(header) | |||||
for (per in naughtyList) { | |||||
tableStarter.append( | |||||
" <tr> " | |||||
+ " <td>${per.staffId}</td>" | |||||
+ " <td>${per.name}</td>" | |||||
+ " <td>${per.missingDates.joinToString(", ")}</td>" | |||||
+ " </tr> " | |||||
) | |||||
} | |||||
val footer = StringBuilder(" </table> ") | |||||
return tableStarter.toString() | |||||
} | |||||
open fun createEmailRequest(content: String, emailTo: List<String>) { | open fun createEmailRequest(content: String, emailTo: List<String>) { | ||||
if (!isSettingsConfigValid()) return; | |||||
// val subject = settingsService.findByName(SettingNames.TIMESHEET_MAIL_SUBJECT).orElseThrow().value | // val subject = settingsService.findByName(SettingNames.TIMESHEET_MAIL_SUBJECT).orElseThrow().value | ||||
// val template = settingsService.findByName(SettingNames.TIMESHEET_MAIL_TEMPLATE).orElseThrow().value | // val template = settingsService.findByName(SettingNames.TIMESHEET_MAIL_TEMPLATE).orElseThrow().value | ||||
// val cc = settingsService.findByName(SettingNames.TIMESHEET_MAIL_CC).orElseThrow().value.split(",") | // val cc = settingsService.findByName(SettingNames.TIMESHEET_MAIL_CC).orElseThrow().value.split(",") | ||||
@@ -5,7 +5,7 @@ import com.ffii.core.utils.LocaleUtils | |||||
import com.ffii.fpsms.modules.common.ErrorCodes | import com.ffii.fpsms.modules.common.ErrorCodes | ||||
import com.ffii.fpsms.modules.common.SettingNames | import com.ffii.fpsms.modules.common.SettingNames | ||||
import com.ffii.fpsms.modules.common.mail.pojo.MailRequest | import com.ffii.fpsms.modules.common.mail.pojo.MailRequest | ||||
import com.ffii.fpsms.modules.common.mail.web.models.MailSave | |||||
import com.ffii.fpsms.modules.common.mail.web.models.MailSaveRequest | |||||
import com.ffii.fpsms.modules.settings.entity.Settings | import com.ffii.fpsms.modules.settings.entity.Settings | ||||
import com.ffii.fpsms.modules.settings.entity.SettingsRepository | import com.ffii.fpsms.modules.settings.entity.SettingsRepository | ||||
import com.ffii.fpsms.modules.settings.service.SettingsService | import com.ffii.fpsms.modules.settings.service.SettingsService | ||||
@@ -32,6 +32,7 @@ open class MailService( | |||||
private val settingsService: SettingsService, | private val settingsService: SettingsService, | ||||
private val passwordEncoder: PasswordEncoder, | private val passwordEncoder: PasswordEncoder, | ||||
private val settingsRepository: SettingsRepository, | private val settingsRepository: SettingsRepository, | ||||
private val mailTemplateService: MailTemplateService, | |||||
) { | ) { | ||||
protected val logger: Log = LogFactory.getLog(javaClass) | protected val logger: Log = LogFactory.getLog(javaClass) | ||||
@@ -171,45 +172,22 @@ open class MailService( | |||||
asyncSend(mutableListOf(mailRequest)) | asyncSend(mutableListOf(mailRequest)) | ||||
} | } | ||||
open fun saveMail(mailSave: MailSave): List<Settings> { | |||||
open fun saveMail(request: MailSaveRequest): List<Settings> { | |||||
// ------------------ save mail settings ------------------ // | // ------------------ save mail settings ------------------ // | ||||
val settings = mutableListOf<Settings>() | val settings = mutableListOf<Settings>() | ||||
mailSave.settings.forEach { setting -> | |||||
request.settings.forEach { setting -> | |||||
val tempSetting = settingsRepository.findById(setting.id).orElseThrow() | val tempSetting = settingsRepository.findById(setting.id).orElseThrow() | ||||
settings += tempSetting.apply { | settings += tempSetting.apply { | ||||
value = setting.value | value = setting.value | ||||
} | } | ||||
} | } | ||||
// ------------------ save timesheet mail details ------------------ // | |||||
// val mailCc = settingsRepository.findByName("TIMESHEET.mail.cc").orElseThrow() | |||||
// | |||||
// settings += mailCc.apply { | |||||
// value = mailSave.template.cc | |||||
// } | |||||
// | |||||
// val mailBcc = settingsRepository.findByName("TIMESHEET.mail.bcc").orElseThrow() | |||||
// | |||||
// settings += mailBcc.apply { | |||||
// value = mailSave.template.bcc | |||||
// } | |||||
// | |||||
// val mailSubject = settingsRepository.findByName("TIMESHEET.mail.subject").orElseThrow() | |||||
// | |||||
// settings += mailSubject.apply { | |||||
// value = mailSave.template.subject | |||||
// } | |||||
// | |||||
// val mailTemplate = settingsRepository.findByName("TIMESHEET.mail.template").orElseThrow() | |||||
// | |||||
// settings += mailTemplate.apply { | |||||
// value = mailSave.template.template | |||||
// } | |||||
// ------------------ save all ------------------ // | |||||
settingsRepository.saveAll(settings) | settingsRepository.saveAll(settings) | ||||
// ------------------ save mail templates' details ------------------ // | |||||
mailTemplateService.saveMailTemplates(request.templates) | |||||
return settings | return settings | ||||
} | } | ||||
} | } |
@@ -0,0 +1,62 @@ | |||||
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.MailTemplateRequest | |||||
import org.springframework.stereotype.Service | |||||
@Service | |||||
open class MailTemplateService( | |||||
private val mailTemplateRepository: MailTemplateRepository, | |||||
) { | |||||
fun allMailTemplates(): List<MailTemplate> { | |||||
return mailTemplateRepository.findAllByDeletedIsFalse(); | |||||
} | |||||
fun findById(id: Long): MailTemplate? { | |||||
return mailTemplateRepository.findByIdAndDeletedIsFalse(id); | |||||
} | |||||
fun saveMailTemplate(request: MailTemplateRequest): MailTemplate { | |||||
val mailTemplate = request.id?.let { findById(it) } ?: MailTemplate() | |||||
mailTemplate.apply { | |||||
to = request.to | |||||
cc = request.cc | |||||
code = request.code | |||||
description = request.description | |||||
type = request.type | |||||
params = request.params | |||||
subjectCht = request.subjectCht | |||||
subjectEng = request.subjectEng | |||||
contentCht = request.contentCht | |||||
contentEng = request.contentEng | |||||
} | |||||
val response = mailTemplateRepository.saveAndFlush(mailTemplate) | |||||
return response | |||||
} | |||||
fun saveMailTemplates(requests: List<MailTemplateRequest>) { | |||||
val mailTemplates: List<MailTemplate> = mutableListOf() | |||||
requests.forEach { request -> | |||||
val mailTemplate = request.id?.let { findById(it) } ?: MailTemplate() | |||||
mailTemplate.apply { | |||||
to = request.to | |||||
cc = request.cc | |||||
code = request.code | |||||
description = request.description | |||||
type = request.type | |||||
params = request.params | |||||
subjectCht = request.subjectCht | |||||
subjectEng = request.subjectEng | |||||
contentCht = request.contentCht | |||||
contentEng = request.contentEng | |||||
}.let { mailTemplates.plus(it) } | |||||
} | |||||
mailTemplateRepository.saveAll(mailTemplates) | |||||
} | |||||
} |
@@ -1,8 +1,10 @@ | |||||
package com.ffii.fpsms.modules.common.mail.web | package com.ffii.fpsms.modules.common.mail.web | ||||
import com.ffii.fpsms.modules.common.mail.entity.MailTemplate | |||||
import com.ffii.fpsms.modules.common.mail.service.MailReminderService | import com.ffii.fpsms.modules.common.mail.service.MailReminderService | ||||
import com.ffii.fpsms.modules.common.mail.service.MailService | import com.ffii.fpsms.modules.common.mail.service.MailService | ||||
import com.ffii.fpsms.modules.common.mail.web.models.MailSave | |||||
import com.ffii.fpsms.modules.common.mail.service.MailTemplateService | |||||
import com.ffii.fpsms.modules.common.mail.web.models.MailSaveRequest | |||||
import com.ffii.fpsms.modules.common.mail.web.models.Setting | import com.ffii.fpsms.modules.common.mail.web.models.Setting | ||||
import com.ffii.fpsms.modules.settings.entity.Settings | import com.ffii.fpsms.modules.settings.entity.Settings | ||||
import com.ffii.fpsms.modules.settings.service.SettingsService | import com.ffii.fpsms.modules.settings.service.SettingsService | ||||
@@ -16,7 +18,7 @@ import java.util.Date | |||||
class MailController( | class MailController( | ||||
private val settingsService: SettingsService, | private val settingsService: SettingsService, | ||||
private val mailService: MailService, | private val mailService: MailService, | ||||
private val mailReminderService: MailReminderService, | |||||
private val mailReminderService: MailReminderService | |||||
) { | ) { | ||||
@GetMapping("/setting") | @GetMapping("/setting") | ||||
fun mailSetting(): List<Settings> { | fun mailSetting(): List<Settings> { | ||||
@@ -29,7 +31,7 @@ class MailController( | |||||
} | } | ||||
@PostMapping("/save") | @PostMapping("/save") | ||||
fun saveMail(@Valid @RequestBody mailSave: MailSave): List<Settings> { | |||||
fun saveMail(@Valid @RequestBody mailSave: MailSaveRequest): List<Settings> { | |||||
return mailService.saveMail(mailSave) | return mailService.saveMail(mailSave) | ||||
} | } | ||||
} | } |
@@ -0,0 +1,25 @@ | |||||
package com.ffii.fpsms.modules.common.mail.web | |||||
import com.ffii.fpsms.modules.common.mail.entity.MailTemplate | |||||
import com.ffii.fpsms.modules.common.mail.web.models.MailTemplateRequest | |||||
import com.ffii.fpsms.modules.common.mail.service.MailTemplateService | |||||
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.RestController | |||||
@RequestMapping("/mailTemplates") | |||||
@RestController | |||||
class MailTemplateController( | |||||
private val mailTemplateService: MailTemplateService, | |||||
) { | |||||
@GetMapping | |||||
fun allMailTemplates(): List<MailTemplate> { | |||||
return mailTemplateService.allMailTemplates(); | |||||
} | |||||
@PostMapping("/save") | |||||
fun saveMailTemplate(request: MailTemplateRequest): MailTemplate { | |||||
return mailTemplateService.saveMailTemplate(request); | |||||
} | |||||
} |
@@ -15,7 +15,8 @@ data class Template ( | |||||
val template: String?, | val template: String?, | ||||
) | ) | ||||
data class MailSave ( | |||||
data class MailSaveRequest ( | |||||
val settings: List<Setting>, | val settings: List<Setting>, | ||||
val templates: List<MailTemplateRequest>, | |||||
// val template: Template | // val template: Template | ||||
) | ) |
@@ -0,0 +1,19 @@ | |||||
package com.ffii.fpsms.modules.common.mail.web.models | |||||
import jakarta.validation.constraints.NotNull | |||||
data class MailTemplateRequest( | |||||
val id: Long?, | |||||
val to: String?, | |||||
val cc: String?, | |||||
@field:NotNull(message = "code cannot be null") | |||||
val code: String, | |||||
@field:NotNull(message = "description cannot be null") | |||||
val description: String?, | |||||
val type: String?, | |||||
val params: String?, | |||||
val subjectCht: String?, | |||||
val subjectEng: String?, | |||||
val contentCht: String?, | |||||
val contentEng: String?, | |||||
) |
@@ -0,0 +1,24 @@ | |||||
-- liquibase formatted sql | |||||
-- changeset cyril:create mail template | |||||
CREATE TABLE `mail_template` | |||||
( | |||||
`id` INT NOT NULL AUTO_INCREMENT, | |||||
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
`createdBy` VARCHAR(30) NULL DEFAULT NULL, | |||||
`version` INT NOT NULL DEFAULT '0', | |||||
`modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
`modifiedBy` VARCHAR(30) NULL DEFAULT NULL, | |||||
`deleted` TINYINT(1) NOT NULL DEFAULT '0', | |||||
`to` VARCHAR(255) NULL, | |||||
`cc` VARCHAR(255) NULL, | |||||
`code` VARCHAR(255) NOT NULL, | |||||
`description` VARCHAR(255) NOT NULL, | |||||
`type` VARCHAR(30) NULL, | |||||
`params` VARCHAR(255) NULL, | |||||
`subjectCht` VARCHAR(255) NULL, | |||||
`subjectEng` VARCHAR(255) NULL, | |||||
`contentCht` TEXT NULL, | |||||
`contentEng` TEXT NULL, | |||||
CONSTRAINT pk_mail_template PRIMARY KEY (id) | |||||
); |
@@ -0,0 +1,38 @@ | |||||
-- liquibase formatted sql | |||||
-- changeset cyril:create send mail log | |||||
CREATE TABLE `mail_send_log` | |||||
( | |||||
`id` INT NOT NULL AUTO_INCREMENT, | |||||
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
`createdBy` VARCHAR(30) NULL DEFAULT NULL, | |||||
`version` INT NOT NULL DEFAULT '0', | |||||
`modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
`modifiedBy` VARCHAR(30) NULL DEFAULT NULL, | |||||
`deleted` TINYINT(1) NOT NULL DEFAULT '0', | |||||
`tempId` INT NOT NULL, | |||||
`tempDesc` VARCHAR(255) NOT NULL, | |||||
`senderMail` VARCHAR(255) NULL, | |||||
`subject` VARCHAR(255) NULL, | |||||
`content` TEXT NULL, | |||||
`sendDate` DATETIME NULL, | |||||
`errorMessage` TEXT NULL, | |||||
CONSTRAINT pk_mail_send_log PRIMARY KEY (id), | |||||
CONSTRAINT `FK_MAIL_SEND_LOG_ON_TEMPID` FOREIGN KEY (`tempId`) REFERENCES `mail_send_log` (`id`) | |||||
); | |||||
CREATE TABLE `mail_send_log_line` | |||||
( | |||||
`id` INT NOT NULL AUTO_INCREMENT, | |||||
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
`createdBy` VARCHAR(30) NULL DEFAULT NULL, | |||||
`version` INT NOT NULL DEFAULT '0', | |||||
`modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
`modifiedBy` VARCHAR(30) NULL DEFAULT NULL, | |||||
`deleted` TINYINT(1) NOT NULL DEFAULT '0', | |||||
`sendMailLogId` INT NOT NULL, | |||||
`toMail` VARCHAR(255) NULL, | |||||
`errorMessage` TEXT NULL, | |||||
CONSTRAINT pk_mail_send_log_line PRIMARY KEY (id), | |||||
CONSTRAINT `FK_MAIL_SEND_LOG_LINE_ON_SENDMAILLOGID` FOREIGN KEY (`sendMailLogId`) REFERENCES `mail_send_log` (`id`) | |||||
); |