diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/entity/PurchaseQuotation.kt b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/entity/PurchaseQuotation.kt new file mode 100644 index 0000000..05f227a --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/entity/PurchaseQuotation.kt @@ -0,0 +1,38 @@ +package com.ffii.fpsms.modules.purchaseQuotation.entity + +import com.ffii.core.entity.BaseEntity +import com.ffii.fpsms.modules.master.entity.Shop +import jakarta.persistence.* +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Size +import java.time.Instant +import java.time.LocalDateTime + +@Entity +@Table(name = "purchase_quotation") +open class PurchaseQuotation : BaseEntity(){ + @Size(max = 30) + @NotNull + @Column(name = "code", nullable = false, length = 30) + open var code: String? = null + + @Column(name = "expiryDate") + open var expiryDate: LocalDateTime? = null + + @Column(name = "effectiveDate") + open var effectiveDate: LocalDateTime? = null + + @ManyToOne + @JoinColumn(name = "shopId") + open var shop: Shop? = null + + @Size(max = 500) + @Column(name = "remarks", length = 500) + open var remarks: String? = null + + @Column(name = "m18Id") + open var m18Id: Long? = null + + @Column(name = "m18LastModifyDate") + open var m18LastModifyDate: LocalDateTime? = null +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/entity/PurchaseQuotationLine.kt b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/entity/PurchaseQuotationLine.kt new file mode 100644 index 0000000..56686a5 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/entity/PurchaseQuotationLine.kt @@ -0,0 +1,39 @@ +package com.ffii.fpsms.modules.purchaseQuotation.entity + +import com.ffii.core.entity.BaseEntity +import com.ffii.fpsms.modules.master.entity.Items +import com.ffii.fpsms.modules.master.entity.UomConversion +import jakarta.persistence.* +import jakarta.validation.constraints.Size +import java.time.Instant +import java.time.LocalDateTime + +@Entity +@Table(name = "purchase_quotation_line") +open class PurchaseQuotationLine : BaseEntity() { + @ManyToOne + @JoinColumn(name = "purchaseQuotationId") + open var purchaseQuotation: PurchaseQuotation? = null + + @ManyToOne + @JoinColumn(name = "itemId") + open var item: Items? = null + + @Size(max = 30) + @Column(name = "code", length = 30) + open var code: String? = null + + @Size(max = 30) + @Column(name = "description", length = 30) + open var description: String? = null + + @ManyToOne + @JoinColumn(name = "uomId") + open var uom: UomConversion? = null + + @Column(name = "m18Id") + open var m18Id: Long? = null + + @Column(name = "m18LastModifyDate") + open var m18LastModifyDate: LocalDateTime? = null +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/entity/PurchaseQuotationLineRepository.kt b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/entity/PurchaseQuotationLineRepository.kt new file mode 100644 index 0000000..5ca0083 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/entity/PurchaseQuotationLineRepository.kt @@ -0,0 +1,12 @@ +package com.ffii.fpsms.modules.purchaseQuotation.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.stereotype.Repository +import java.io.Serializable + +@Repository +interface PurchaseQuotationLineRepository : AbstractRepository{ + fun findByM18IdAndDeletedIsFalse(m18Id: Long): PurchaseQuotationLine? + + fun findByIdAndDeletedIsFalse(id: Serializable): PurchaseQuotationLine? +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/entity/PurchaseQuotationRepository.kt b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/entity/PurchaseQuotationRepository.kt new file mode 100644 index 0000000..cb3d097 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/entity/PurchaseQuotationRepository.kt @@ -0,0 +1,12 @@ +package com.ffii.fpsms.modules.purchaseQuotation.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.stereotype.Repository +import java.io.Serializable + +@Repository +interface PurchaseQuotationRepository : AbstractRepository { + fun findByIdAndDeletedIsFalse(id: Serializable): PurchaseQuotation? + + fun findByM18IdAndDeletedIsFalse(m18Id: Long): PurchaseQuotation? +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/service/PurchaseQuotationLineService.kt b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/service/PurchaseQuotationLineService.kt new file mode 100644 index 0000000..294ad4a --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/service/PurchaseQuotationLineService.kt @@ -0,0 +1,56 @@ +package com.ffii.fpsms.modules.purchaseQuotation.service + +import com.ffii.fpsms.modules.master.service.ItemUomService +import com.ffii.fpsms.modules.master.service.ItemsService +import com.ffii.fpsms.modules.master.service.UomConversionService +import com.ffii.fpsms.modules.purchaseQuotation.entity.PurchaseQuotationLine +import com.ffii.fpsms.modules.purchaseQuotation.entity.PurchaseQuotationLineRepository +import com.ffii.fpsms.modules.purchaseQuotation.web.model.SavePurchaseQuotationLineRequest +import com.ffii.fpsms.modules.purchaseQuotation.web.model.SavePurchaseQuotationLineResponse +import org.springframework.stereotype.Service + +@Service +open class PurchaseQuotationLineService ( + private val purchaseQuotationLineRepository: PurchaseQuotationLineRepository, + private val purchaseQuotationService: PurchaseQuotationService, + private val itemsService: ItemsService, + private val uomConversionService: UomConversionService, + private val itemUomService: ItemUomService, +) { + open fun findById(id: Long): PurchaseQuotationLine? { + return purchaseQuotationLineRepository.findByIdAndDeletedIsFalse(id); + } + + open fun findByM18Id(m18Id: Long): PurchaseQuotationLine? { + return purchaseQuotationLineRepository.findByM18IdAndDeletedIsFalse(m18Id); + } + + open fun savePurchaseQuotationLine(request: SavePurchaseQuotationLineRequest): SavePurchaseQuotationLineResponse { + val purchaseQuotationLine = request.m18Id?.let { findByM18Id(it) } ?: request.id?.let { findById(it) } ?: PurchaseQuotationLine() + val purchaseQuotation = request.purchaseQuotationId?.let { purchaseQuotationService.findById(it) } + val item = request.m18ItemId?.let { itemsService.findByM18Id(it) } ?: request.itemId?.let { itemsService.findById(it) } + val uom = request.uomId?.let { uomConversionService.findById(it) } ?: item?.id?.let { itemUomService.findPurchaseUnitByM18ItemId(it)?.uom } + + purchaseQuotationLine.apply { + this.purchaseQuotation = purchaseQuotation + this.item = item + code = request.code + description = request.description + this.uom = uom + m18Id = request.m18Id ?: this.m18Id + m18LastModifyDate = request.m18LastModifyDate ?: this.m18LastModifyDate + } + + val response = purchaseQuotationLineRepository.saveAndFlush(purchaseQuotationLine).let { + SavePurchaseQuotationLineResponse( + id = it.id, + itemCode = it.item?.code, + code = it.code, + description = it.description, + uomCode = it.uom?.code + ) + } + + return response + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/service/PurchaseQuotationService.kt b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/service/PurchaseQuotationService.kt new file mode 100644 index 0000000..1b84192 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/service/PurchaseQuotationService.kt @@ -0,0 +1,50 @@ +package com.ffii.fpsms.modules.purchaseQuotation.service + +import com.ffii.fpsms.modules.master.service.ShopService +import com.ffii.fpsms.modules.purchaseQuotation.entity.PurchaseQuotation +import com.ffii.fpsms.modules.purchaseQuotation.entity.PurchaseQuotationRepository +import com.ffii.fpsms.modules.purchaseQuotation.web.model.SavePurchaseQuotationRequest +import com.ffii.fpsms.modules.purchaseQuotation.web.model.SavePurchaseQuotationResponse +import org.springframework.stereotype.Service + +@Service +open class PurchaseQuotationService( + private val purchaseQuotationRepository: PurchaseQuotationRepository, + private val shopService: ShopService, +) { + open fun findById(id: Long): PurchaseQuotation? { + return purchaseQuotationRepository.findByIdAndDeletedIsFalse(id); + } + + open fun findByM18Id(m18Id: Long): PurchaseQuotation? { + return purchaseQuotationRepository.findByM18IdAndDeletedIsFalse(m18Id); + } + + open fun savePurchaseQuotation(request: SavePurchaseQuotationRequest): SavePurchaseQuotationResponse { + val purchaseQuotation = request.m18Id?.let { findByM18Id(it) } ?: request.id?.let { findById(it) } ?: PurchaseQuotation() + val shop = request.m18ShopId?.let { shopService.findVendorByM18Id(it) } ?: request.shopId?.let { shopService.findById(it) } + + purchaseQuotation.apply { + code = request.code + expiryDate = request.expiryDate + effectiveDate = request.effectiveDate + this.shop = shop + remarks = request.remarks + m18Id = request.m18Id + m18LastModifyDate = request.m18LastModifyDate + } + + val response = purchaseQuotationRepository.saveAndFlush(purchaseQuotation).let { + SavePurchaseQuotationResponse( + id = it.id, + code = it.code, + expiryDate = it.expiryDate, + effectiveDate = it.effectiveDate, + shopCode = it.shop?.code, + remarks = it.remarks + ) + } + + return response + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/web/model/SavePurchaseQuotationLineRequest.kt b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/web/model/SavePurchaseQuotationLineRequest.kt new file mode 100644 index 0000000..3b65376 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/web/model/SavePurchaseQuotationLineRequest.kt @@ -0,0 +1,16 @@ +package com.ffii.fpsms.modules.purchaseQuotation.web.model + +import java.time.LocalDateTime + +data class SavePurchaseQuotationLineRequest( + val id: Long? = null, + val purchaseQuotationId: Long? = null, + val itemId: Long? = null, + val m18ItemId: Long? = null, + val code: String? = null, + val description: String? = null, + val uomId: Long? = null, + val m18UomId: Long? = null, + val m18Id: Long? = null, + val m18LastModifyDate: LocalDateTime? = null +) diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/web/model/SavePurchaseQuotationLineResponse.kt b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/web/model/SavePurchaseQuotationLineResponse.kt new file mode 100644 index 0000000..97a640e --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/web/model/SavePurchaseQuotationLineResponse.kt @@ -0,0 +1,11 @@ +package com.ffii.fpsms.modules.purchaseQuotation.web.model + +import java.time.LocalDateTime + +data class SavePurchaseQuotationLineResponse ( + val id: Long? = null, + val itemCode: String? = null, + val code: String? = null, + val description: String? = null, + val uomCode: String? = null, +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/web/model/SavePurchaseQuotationRequest.kt b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/web/model/SavePurchaseQuotationRequest.kt new file mode 100644 index 0000000..ac9ceb1 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/web/model/SavePurchaseQuotationRequest.kt @@ -0,0 +1,15 @@ +package com.ffii.fpsms.modules.purchaseQuotation.web.model + +import java.time.LocalDateTime + +data class SavePurchaseQuotationRequest( + val id: Long? = null, + val code: String? = null, + val expiryDate: LocalDateTime? = null, + val effectiveDate: LocalDateTime? = null, + val shopId: Long? = null, + val m18ShopId: Long? = null, + val remarks: String? = null, + val m18Id: Long? = null, + val m18LastModifyDate: LocalDateTime? = null, +) diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/web/model/SavePurchaseQuotationResponse.kt b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/web/model/SavePurchaseQuotationResponse.kt new file mode 100644 index 0000000..f61b762 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseQuotation/web/model/SavePurchaseQuotationResponse.kt @@ -0,0 +1,12 @@ +package com.ffii.fpsms.modules.purchaseQuotation.web.model + +import java.time.LocalDateTime + +data class SavePurchaseQuotationResponse( + val id: Long? = null, + val code: String? = null, + val expiryDate: LocalDateTime? = null, + val effectiveDate: LocalDateTime? = null, + val shopCode: String? = null, + val remarks: String? = null, +)