Add coa purchase and vendors

This commit is contained in:
Aditya Siregar
2025-09-12 01:12:11 +07:00
parent c107733add
commit efe09c21e4
86 changed files with 8517 additions and 212 deletions
@@ -0,0 +1,154 @@
package transformer
import (
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/models"
)
// Request transformations
func CreateIngredientUnitConverterRequestToModel(req *contract.CreateIngredientUnitConverterRequest) *models.CreateIngredientUnitConverterRequest {
if req == nil {
return nil
}
return &models.CreateIngredientUnitConverterRequest{
IngredientID: req.IngredientID,
FromUnitID: req.FromUnitID,
ToUnitID: req.ToUnitID,
ConversionFactor: req.ConversionFactor,
IsActive: req.IsActive,
}
}
func UpdateIngredientUnitConverterRequestToModel(req *contract.UpdateIngredientUnitConverterRequest) *models.UpdateIngredientUnitConverterRequest {
if req == nil {
return nil
}
return &models.UpdateIngredientUnitConverterRequest{
FromUnitID: req.FromUnitID,
ToUnitID: req.ToUnitID,
ConversionFactor: req.ConversionFactor,
IsActive: req.IsActive,
}
}
func ListIngredientUnitConvertersRequestToModel(req *contract.ListIngredientUnitConvertersRequest) *models.ListIngredientUnitConvertersRequest {
if req == nil {
return nil
}
return &models.ListIngredientUnitConvertersRequest{
IngredientID: req.IngredientID,
FromUnitID: req.FromUnitID,
ToUnitID: req.ToUnitID,
IsActive: req.IsActive,
Search: req.Search,
Page: req.Page,
Limit: req.Limit,
}
}
func ConvertUnitRequestToModel(req *contract.ConvertUnitRequest) *models.ConvertUnitRequest {
if req == nil {
return nil
}
return &models.ConvertUnitRequest{
IngredientID: req.IngredientID,
FromUnitID: req.FromUnitID,
ToUnitID: req.ToUnitID,
Quantity: req.Quantity,
}
}
// Response transformations
func IngredientUnitConverterModelResponseToResponse(model *models.IngredientUnitConverterResponse) contract.IngredientUnitConverterResponse {
if model == nil {
return contract.IngredientUnitConverterResponse{}
}
response := contract.IngredientUnitConverterResponse{
ID: model.ID,
OrganizationID: model.OrganizationID,
IngredientID: model.IngredientID,
FromUnitID: model.FromUnitID,
ToUnitID: model.ToUnitID,
ConversionFactor: model.ConversionFactor,
IsActive: model.IsActive,
CreatedAt: model.CreatedAt,
UpdatedAt: model.UpdatedAt,
CreatedBy: model.CreatedBy,
UpdatedBy: model.UpdatedBy,
}
// Map related entities
if model.Ingredient != nil {
ingredientResp := IngredientModelResponseToResponse(model.Ingredient)
response.Ingredient = &ingredientResp
}
if model.FromUnit != nil {
fromUnitResp := UnitModelResponseToResponse(model.FromUnit)
response.FromUnit = &fromUnitResp
}
if model.ToUnit != nil {
toUnitResp := UnitModelResponseToResponse(model.ToUnit)
response.ToUnit = &toUnitResp
}
return response
}
func ConvertUnitModelResponseToResponse(model *models.ConvertUnitResponse) contract.ConvertUnitResponse {
if model == nil {
return contract.ConvertUnitResponse{}
}
response := contract.ConvertUnitResponse{
FromQuantity: model.FromQuantity,
ToQuantity: model.ToQuantity,
ConversionFactor: model.ConversionFactor,
}
// Map units
if model.FromUnit != nil {
fromUnitResp := UnitModelResponseToResponse(model.FromUnit)
response.FromUnit = &fromUnitResp
}
if model.ToUnit != nil {
toUnitResp := UnitModelResponseToResponse(model.ToUnit)
response.ToUnit = &toUnitResp
}
// Map ingredient
if model.Ingredient != nil {
ingredientResp := IngredientModelResponseToResponse(model.Ingredient)
response.Ingredient = &ingredientResp
}
return response
}
// Helper functions for related entities
func IngredientModelResponseToResponse(model *models.IngredientResponse) contract.IngredientResponse {
if model == nil {
return contract.IngredientResponse{}
}
return contract.IngredientResponse{
ID: model.ID,
Name: model.Name,
}
}
func UnitModelResponseToResponse(model *models.UnitResponse) contract.UnitResponse {
if model == nil {
return contract.UnitResponse{}
}
return contract.UnitResponse{
ID: model.ID,
Name: model.Name,
}
}
@@ -0,0 +1,204 @@
package transformer
import (
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/models"
)
// Contract to Model conversions
func CreatePurchaseOrderRequestToModel(req *contract.CreatePurchaseOrderRequest) *models.CreatePurchaseOrderRequest {
items := make([]models.CreatePurchaseOrderItemRequest, len(req.Items))
for i, item := range req.Items {
items[i] = models.CreatePurchaseOrderItemRequest{
IngredientID: item.IngredientID,
Description: item.Description,
Quantity: item.Quantity,
UnitID: item.UnitID,
Amount: item.Amount,
}
}
return &models.CreatePurchaseOrderRequest{
VendorID: req.VendorID,
PONumber: req.PONumber,
TransactionDate: req.TransactionDate,
DueDate: req.DueDate,
Reference: req.Reference,
Status: req.Status,
Message: req.Message,
Items: items,
AttachmentFileIDs: req.AttachmentFileIDs,
}
}
func UpdatePurchaseOrderRequestToModel(req *contract.UpdatePurchaseOrderRequest) *models.UpdatePurchaseOrderRequest {
var items []models.UpdatePurchaseOrderItemRequest
if req.Items != nil {
items = make([]models.UpdatePurchaseOrderItemRequest, len(req.Items))
for i, item := range req.Items {
items[i] = models.UpdatePurchaseOrderItemRequest{
ID: item.ID,
IngredientID: item.IngredientID,
Description: item.Description,
Quantity: item.Quantity,
UnitID: item.UnitID,
Amount: item.Amount,
}
}
}
return &models.UpdatePurchaseOrderRequest{
VendorID: req.VendorID,
PONumber: req.PONumber,
TransactionDate: req.TransactionDate,
DueDate: req.DueDate,
Reference: req.Reference,
Status: req.Status,
Message: req.Message,
Items: items,
AttachmentFileIDs: req.AttachmentFileIDs,
}
}
func ListPurchaseOrdersRequestToModel(req *contract.ListPurchaseOrdersRequest) *models.ListPurchaseOrdersRequest {
return &models.ListPurchaseOrdersRequest{
Page: req.Page,
Limit: req.Limit,
Search: req.Search,
Status: req.Status,
VendorID: req.VendorID,
StartDate: req.StartDate,
EndDate: req.EndDate,
}
}
// Model to Contract conversions
func PurchaseOrderModelResponseToResponse(po *models.PurchaseOrderResponse) *contract.PurchaseOrderResponse {
if po == nil {
return nil
}
response := &contract.PurchaseOrderResponse{
ID: po.ID,
OrganizationID: po.OrganizationID,
VendorID: po.VendorID,
PONumber: po.PONumber,
TransactionDate: po.TransactionDate,
DueDate: po.DueDate,
Reference: po.Reference,
Status: po.Status,
Message: po.Message,
TotalAmount: po.TotalAmount,
CreatedAt: po.CreatedAt,
UpdatedAt: po.UpdatedAt,
}
// Map vendor if present
if po.Vendor != nil {
response.Vendor = &contract.VendorResponse{
ID: po.Vendor.ID,
OrganizationID: po.Vendor.OrganizationID,
Name: po.Vendor.Name,
Email: po.Vendor.Email,
PhoneNumber: po.Vendor.PhoneNumber,
Address: po.Vendor.Address,
ContactPerson: po.Vendor.ContactPerson,
TaxNumber: po.Vendor.TaxNumber,
PaymentTerms: po.Vendor.PaymentTerms,
Notes: po.Vendor.Notes,
IsActive: po.Vendor.IsActive,
CreatedAt: po.Vendor.CreatedAt,
UpdatedAt: po.Vendor.UpdatedAt,
}
}
// Map items if present
if po.Items != nil {
response.Items = make([]contract.PurchaseOrderItemResponse, len(po.Items))
for i, item := range po.Items {
response.Items[i] = contract.PurchaseOrderItemResponse{
ID: item.ID,
PurchaseOrderID: item.PurchaseOrderID,
IngredientID: item.IngredientID,
Description: item.Description,
Quantity: item.Quantity,
UnitID: item.UnitID,
Amount: item.Amount,
CreatedAt: item.CreatedAt,
UpdatedAt: item.UpdatedAt,
}
// Map ingredient if present
if item.Ingredient != nil {
response.Items[i].Ingredient = &contract.IngredientResponse{
ID: item.Ingredient.ID,
Name: item.Ingredient.Name,
}
}
// Map unit if present
if item.Unit != nil {
response.Items[i].Unit = &contract.UnitResponse{
ID: item.Unit.ID,
Name: item.Unit.Name,
}
}
}
}
// Map attachments if present
if po.Attachments != nil {
response.Attachments = make([]contract.PurchaseOrderAttachmentResponse, len(po.Attachments))
for i, attachment := range po.Attachments {
response.Attachments[i] = contract.PurchaseOrderAttachmentResponse{
ID: attachment.ID,
PurchaseOrderID: attachment.PurchaseOrderID,
FileID: attachment.FileID,
CreatedAt: attachment.CreatedAt,
}
// Map file if present
if attachment.File != nil {
response.Attachments[i].File = &contract.FileResponse{
ID: attachment.File.ID,
FileName: attachment.File.FileName,
OriginalName: attachment.File.OriginalName,
FileURL: attachment.File.FileURL,
FileSize: attachment.File.FileSize,
MimeType: attachment.File.MimeType,
FileType: attachment.File.FileType,
IsPublic: attachment.File.IsPublic,
CreatedAt: attachment.File.CreatedAt,
UpdatedAt: attachment.File.UpdatedAt,
}
}
}
}
return response
}
func PurchaseOrderModelResponsesToResponses(pos []models.PurchaseOrderResponse) []contract.PurchaseOrderResponse {
if pos == nil {
return nil
}
responses := make([]contract.PurchaseOrderResponse, len(pos))
for i, po := range pos {
response := PurchaseOrderModelResponseToResponse(&po)
if response != nil {
responses[i] = *response
}
}
return responses
}
func ListPurchaseOrdersModelResponseToResponse(resp *models.ListPurchaseOrdersResponse) *contract.ListPurchaseOrdersResponse {
return &contract.ListPurchaseOrdersResponse{
PurchaseOrders: PurchaseOrderModelResponsesToResponses(resp.PurchaseOrders),
TotalCount: resp.TotalCount,
Page: resp.Page,
Limit: resp.Limit,
TotalPages: resp.TotalPages,
}
}
@@ -0,0 +1,89 @@
package transformer
import (
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/models"
)
// Contract to Model conversions
func CreateVendorRequestToModel(req *contract.CreateVendorRequest) *models.CreateVendorRequest {
return &models.CreateVendorRequest{
Name: req.Name,
Email: req.Email,
PhoneNumber: req.PhoneNumber,
Address: req.Address,
ContactPerson: req.ContactPerson,
TaxNumber: req.TaxNumber,
PaymentTerms: req.PaymentTerms,
Notes: req.Notes,
IsActive: req.IsActive,
}
}
func UpdateVendorRequestToModel(req *contract.UpdateVendorRequest) *models.UpdateVendorRequest {
return &models.UpdateVendorRequest{
Name: req.Name,
Email: req.Email,
PhoneNumber: req.PhoneNumber,
Address: req.Address,
ContactPerson: req.ContactPerson,
TaxNumber: req.TaxNumber,
PaymentTerms: req.PaymentTerms,
Notes: req.Notes,
IsActive: req.IsActive,
}
}
func ListVendorsRequestToModel(req *contract.ListVendorsRequest) *models.ListVendorsRequest {
return &models.ListVendorsRequest{
Page: req.Page,
Limit: req.Limit,
Search: req.Search,
IsActive: req.IsActive,
}
}
// Model to Contract conversions
func VendorModelResponseToResponse(vendor *models.VendorResponse) *contract.VendorResponse {
return &contract.VendorResponse{
ID: vendor.ID,
OrganizationID: vendor.OrganizationID,
Name: vendor.Name,
Email: vendor.Email,
PhoneNumber: vendor.PhoneNumber,
Address: vendor.Address,
ContactPerson: vendor.ContactPerson,
TaxNumber: vendor.TaxNumber,
PaymentTerms: vendor.PaymentTerms,
Notes: vendor.Notes,
IsActive: vendor.IsActive,
CreatedAt: vendor.CreatedAt,
UpdatedAt: vendor.UpdatedAt,
}
}
func VendorModelResponsesToResponses(vendors []*models.VendorResponse) []contract.VendorResponse {
if vendors == nil {
return nil
}
responses := make([]contract.VendorResponse, len(vendors))
for i, vendor := range vendors {
response := VendorModelResponseToResponse(vendor)
if response != nil {
responses[i] = *response
}
}
return responses
}
func ListVendorsModelResponseToResponse(resp *models.ListVendorsResponse) *contract.ListVendorsResponse {
contractVendors := VendorModelResponsesToResponses(resp.Vendors)
return &contract.ListVendorsResponse{
Vendors: contractVendors,
TotalCount: resp.TotalCount,
Page: resp.Page,
Limit: resp.Limit,
TotalPages: resp.TotalPages,
}
}