feat(entities): Add new entities for inventory management and update migration scripts

This commit is contained in:
Habib Fatkhul Rohman 2025-11-13 11:10:12 +07:00
parent 46706e655a
commit 189994bf9a
11 changed files with 297 additions and 3 deletions

View File

@ -32,6 +32,7 @@ type Authorization struct {
type Audit struct {
CreatedBy uuid.UUID `gorm:"type:uuid;not null" json:"created_by"`
UpdatedBy uuid.UUID `gorm:"type:uuid;not null" json:"updated_by"`
DeletedBy uuid.UUID `gorm:"type:uuid;" json:"deleted_by,omitempty"`
}
// TimestampWithAudit menggabungkan timestamp dan audit

View File

@ -0,0 +1,29 @@
package entities
import "github.com/google/uuid"
type InventoryStorageEntity struct {
ID uuid.UUID `gorm:"primaryKey;type:uuid;default:uuid_generate_v4()" json:"id"`
OnHandQuantity float64 `gorm:"type:numeric;not null;default:0" json:"on_hand_quantity"`
AvailableQuantity float64 `gorm:"type:numeric;not null;default:0" json:"available_quantity"`
ProductID uuid.UUID `gorm:"type:uuid;index;" json:"product_id"`
AisleID uuid.UUID `gorm:"type:uuid;index;" json:"aisle_id"`
UomID uuid.UUID `gorm:"type:uuid;index;" json:"uom_id"`
ClientID uuid.UUID `gorm:"type:uuid;index;" json:"client_id"`
InvRequestID uuid.UUID `gorm:"type:uuid;index;" json:"inv_request_id"`
InvReceiptID uuid.UUID `gorm:"type:uuid;index;" json:"inv_receipt_id"`
Product MProductEntity `gorm:"foreignKey:ProductID;references:ID"`
Aisle MAisleEntity `gorm:"foreignKey:AisleID;references:ID"`
Uom MUomEntity `gorm:"foreignKey:UomID;references:ID"`
Client M_Client `gorm:"foreignKey:ClientID;references:ID"`
InvRequest TInventoryRequestEntity `gorm:"foreignKey:InvRequestID;references:ID"`
InvReceipt TInventoryReceiptEntity `gorm:"foreignKey:InvReceiptID;references:ID"`
FullAuditTrail
}
func (InventoryStorageEntity) TableName() string {
return "m_inventory_storages"
}

View File

@ -0,0 +1,32 @@
package entities
import (
"time"
"github.com/google/uuid"
)
type InventoryTransactionEntity struct {
ID uuid.UUID `gorm:"primaryKey;type:uuid;default:uuid_generate_v4()" json:"id"`
TransactionDate time.Time `gorm:"type:timestamp;" json:"transaction_date"`
TransactionType string `gorm:"type:varchar(100);" json:"transaction_type"`
ProductID uuid.UUID `gorm:"type:uuid;index;" json:"product_id"`
AisleID uuid.UUID `gorm:"type:uuid;index;" json:"aisle_id"`
ClientID uuid.UUID `gorm:"type:uuid;index;" json:"client_id"`
InvReceiptID uuid.UUID `gorm:"type:uuid;index;" json:"inv_receipt_id"`
InvIssueID uuid.UUID `gorm:"type:uuid;index;" json:"inv_issue_id"`
InvMoveID uuid.UUID `gorm:"type:uuid;index;" json:"inv_move_id"`
Product MProductEntity `gorm:"foreignKey:ProductID;references:ID"`
Aisle MAisleEntity `gorm:"foreignKey:AisleID;references:ID"`
Client M_Client `gorm:"foreignKey:ClientID;references:ID"`
InvReceipt TInventoryReceiptEntity `gorm:"foreignKey:InvReceiptID;references:ID"`
Issue TInventoryIssueEntity `gorm:"foreignKey:InvIssueID;references:ID"`
FullAuditTrail
}
func (InventoryTransactionEntity) TableName() string {
return "m_inventory_transactions"
}

View File

@ -0,0 +1,50 @@
package entities
import (
"fmt"
"github.com/google/uuid"
"gorm.io/gorm"
)
type TAssignmentEntity struct {
ID uuid.UUID `gorm:"primaryKey;type:uuid;default:uuid_generate_v4()" json:"id"`
DocumentType string `gorm:"type:varchar(100);" json:"document_type"`
DocumentID uuid.UUID `gorm:"type:uuid;index;" json:"document_id"`
UserID uuid.UUID `gorm:"type:uuid;index;" json:"user_id"`
RoleID uuid.UUID `gorm:"type:uuid;index;" json:"role_id"`
ClientID uuid.UUID `gorm:"type:uuid;index;" json:"client_id"`
// Document TInventoryRequestEntity `gorm:"foreignKey:DocumentID;references:ID"`
User M_User `gorm:"foreignKey:UserID;references:ID"`
Role M_Role `gorm:"foreignKey:RoleID;references:ID"`
Client M_Client `gorm:"foreignKey:ClientID;references:ID"`
FullAuditTrail
}
func (TAssignmentEntity) TableName() string {
return "t_assignments"
}
// Contoh fungsi switch-case untuk ambil dokumen
func GetDocumentByAssignment(db *gorm.DB, assignment TAssignmentEntity) (interface{}, error) {
switch assignment.DocumentType {
// case "SOHeader":
// var so SOHeader
// if err := db.First(&so, "id = ?", assignment.DocumentID).Error; err != nil {
// return nil, err
// }
// return so, nil
// case "GRHeader":
// var gr GRHeader
// if err := db.First(&gr, "id = ?", assignment.DocumentID).Error; err != nil {
// return nil, err
// }
// return gr, nil
// Tambahkan case lain sesuai kebutuhan
default:
return nil, fmt.Errorf("unknown document type: %s", assignment.DocumentType)
}
}

View File

@ -0,0 +1,29 @@
package entities
import (
"time"
"github.com/google/uuid"
)
type TInventoryIssueEntity struct {
ID uuid.UUID `gorm:"primaryKey;type:uuid;default:uuid_generate_v4()" json:"id"`
DocumentNumber string `gorm:"type:varchar(100);" json:"document_number"`
DocumentDate time.Time `gorm:"type:timestamp;" json:"document_date"`
DueDate time.Time `gorm:"type:timestamp;" json:"due_date"`
Status string `gorm:"type:varchar(50);" json:"status"`
IssuerBy uuid.UUID `gorm:"type:uuid;index;" json:"issuer_by"`
InvRequestID uuid.UUID `gorm:"type:uuid;index;" json:"inv_request_id"`
ClientID uuid.UUID `gorm:"type:uuid;index;" json:"client_id"`
Issuer M_User `gorm:"foreignKey:IssuerBy;references:ID"`
InvRequest TInventoryRequestEntity `gorm:"foreignKey:InvRequestID;references:ID"`
Client M_Client `gorm:"foreignKey:ClientID;references:ID"`
FullAuditTrail
}
func (TInventoryIssueEntity) TableName() string {
return "t_inventory_issues"
}

View File

@ -0,0 +1,30 @@
package entities
import (
"github.com/google/uuid"
)
type TInventoryIssueLineEntity struct {
ID uuid.UUID `gorm:"primaryKey;type:uuid;default:uuid_generate_v4()" json:"id"`
CurrentStock float64 `gorm:"type:numeric;default:0" json:"current_stock"`
MinStock float64 `gorm:"type:numeric;default:0" json:"min_stock"`
RequestQuantity float64 `gorm:"type:numeric;default:0" json:"request_quantity"`
IssuedQuantity float64 `gorm:"type:numeric;default:0" json:"issued_quantity"`
Remarks string `gorm:"type:text;" json:"remarks"`
IssueID uuid.UUID `gorm:"type:uuid;index;" json:"issue_id"`
ProductID uuid.UUID `gorm:"type:uuid;index;" json:"product_id"`
WarehouseID uuid.UUID `gorm:"type:uuid;index;" json:"warehouse_id"`
ClientID uuid.UUID `gorm:"type:uuid;index;" json:"client_id"`
Product MProductEntity `gorm:"foreignKey:ProductID;references:ID"`
Issue TInventoryIssueEntity `gorm:"foreignKey:IssueID;references:ID"`
Warehouse MWarehouseEntity `gorm:"foreignKey:WarehouseID;references:ID"`
Client M_Client `gorm:"foreignKey:ClientID;references:ID"`
FullAuditTrail
}
func (TInventoryIssueLineEntity) TableName() string {
return "t_inventory_issue_lines"
}

View File

@ -0,0 +1,26 @@
package entities
import (
"time"
"github.com/google/uuid"
)
type TInventoryReceiptEntity struct {
ID uuid.UUID `gorm:"primaryKey;type:uuid;default:uuid_generate_v4()" json:"id"`
ReferenceNumber string `gorm:"type:varchar(100);" json:"reference_number"`
DocumentNumber string `gorm:"type:varchar(100);" json:"document_number"`
ReceiptDate time.Time `gorm:"type:timestamp;" json:"receipt_date"`
Source string `gorm:"type:varchar(50);" json:"source"`
QrCodeFile string `gorm:"type:text;" json:"qr_code_file"`
ClientID uuid.UUID `gorm:"type:uuid;index;" json:"client_id"`
Client M_Client `gorm:"foreignKey:ClientID;references:ID"`
FullAuditTrail
}
func (TInventoryReceiptEntity) TableName() string {
return "t_inventory_receipts"
}

View File

@ -0,0 +1,28 @@
package entities
import (
"github.com/google/uuid"
)
type TInventoryReceiptLineEntity struct {
ID uuid.UUID `gorm:"primaryKey;type:uuid;default:uuid_generate_v4()" json:"id"`
Quantity float64 `gorm:"type:numeric;not null;default:0" json:"quantity"`
BatchNumber string `gorm:"type:varchar(100);" json:"batch_number"`
RepackingSuggestion string `gorm:"type:text;" json:"repacking_suggestion"`
RepackUomID uuid.UUID `gorm:"type:uuid;index;" json:"repack_uom_id"`
InvReceiptID uuid.UUID `gorm:"type:uuid;index;" json:"inv_receipt_id"`
ProductID uuid.UUID `gorm:"type:uuid;index;" json:"product_id"`
ClientID uuid.UUID `gorm:"type:uuid;index;" json:"client_id"`
Product MProductEntity `gorm:"foreignKey:ProductID;references:ID"`
RepackUom MUomEntity `gorm:"foreignKey:RepackUomID;references:ID"`
InvReceipt TInventoryReceiptEntity `gorm:"foreignKey:InvReceiptID;references:ID"`
Client M_Client `gorm:"foreignKey:ClientID;references:ID"`
FullAuditTrail
}
func (TInventoryReceiptLineEntity) TableName() string {
return "t_inventory_receipt_lines"
}

View File

@ -0,0 +1,27 @@
package entities
import (
"time"
"github.com/google/uuid"
)
type TInventoryRequestEntity struct {
ID uuid.UUID `gorm:"primaryKey;type:uuid;default:uuid_generate_v4()" json:"id"`
ReferenceNumber string `gorm:"type:varchar(100);" json:"reference_number"`
DocumentNumber string `gorm:"type:varchar(100);" json:"document_number"`
DueDate time.Time `gorm:"type:timestamp;" json:"due_date"`
RequestType string `gorm:"type:varchar(50);" json:"request_type"`
Note string `gorm:"type:text;" json:"note"`
Status string `gorm:"type:varchar(50);" json:"status"`
ClientID uuid.UUID `gorm:"type:uuid;index;" json:"client_id"`
Client M_Client `gorm:"foreignKey:ClientID;references:ID"`
FullAuditTrail
}
func (TInventoryRequestEntity) TableName() string {
return "t_inventory_requests"
}

View File

@ -0,0 +1,24 @@
package entities
import (
"github.com/google/uuid"
)
type TInventoryRequestLineEntity struct {
ID uuid.UUID `gorm:"primaryKey;type:uuid;default:uuid_generate_v4()" json:"id"`
Quantity float64 `gorm:"type:numeric;not null;default:0" json:"quantity"`
ProductID uuid.UUID `gorm:"type:uuid;index;" json:"product_id"`
InvRequestID uuid.UUID `gorm:"type:uuid;index;" json:"inv_request_id"`
ClientID uuid.UUID `gorm:"type:uuid;index;" json:"client_id"`
Product MProductEntity `gorm:"foreignKey:ProductID;references:ID"`
InvRequest TInventoryRequestEntity `gorm:"foreignKey:InvRequestID;references:ID"`
Client M_Client `gorm:"foreignKey:ClientID;references:ID"`
FullAuditTrail
}
func (TInventoryRequestLineEntity) TableName() string {
return "t_inventory_request_lines"
}

View File

@ -28,6 +28,15 @@ func Migrate(db *gorm.DB) error {
&entities.MWarehouseEntity{},
&entities.MZonaEntity{},
&entities.MAisleEntity{},
&entities.TAssignmentEntity{},
&entities.TInventoryReceiptEntity{},
&entities.TInventoryReceiptLineEntity{},
// &entities.TInventoryRequestEntity{},
// &entities.TInventoryRequestLineEntity{},
// &entities.TInventoryIssueEntity{},
// &entities.TInventoryIssueLineEntity{},
// &entities.InventoryTransactionEntity{},
// &entities.InventoryStorageEntity{},
); err != nil {
return err
}
@ -56,9 +65,18 @@ func MigrateFresh(db *gorm.DB) error {
// &entities.MUomEntity{},
// &entities.MVendorEntity{},
// &entities.MCrossReferenceEntity{},
&entities.MWarehouseEntity{},
&entities.MZonaEntity{},
&entities.MAisleEntity{},
// &entities.MWarehouseEntity{},
// &entities.MZonaEntity{},
// &entities.MAisleEntity{},
&entities.TAssignmentEntity{},
&entities.TInventoryReceiptEntity{},
&entities.TInventoryReceiptLineEntity{},
&entities.TInventoryRequestEntity{},
&entities.TInventoryRequestLineEntity{},
&entities.TInventoryIssueEntity{},
&entities.TInventoryIssueLineEntity{},
&entities.InventoryTransactionEntity{},
&entities.InventoryStorageEntity{},
); err != nil {
return err
}