41 lines
1.4 KiB
Go
41 lines
1.4 KiB
Go
package models
|
|
|
|
import "gorm.io/gorm"
|
|
|
|
// SystemCategory represents system-level categories that cannot be deleted by users
|
|
// Feature: accounting-feature-upgrade
|
|
// Validates: Requirements 8.19, 8.20
|
|
type SystemCategory struct {
|
|
ID uint `gorm:"primarykey" json:"id"`
|
|
Code string `gorm:"size:50;uniqueIndex;not null" json:"code"` // refund, reimbursement
|
|
Name string `gorm:"size:100;not null" json:"name"`
|
|
Icon string `gorm:"size:100" json:"icon"`
|
|
Type string `gorm:"size:20;not null" json:"type"` // income, expense
|
|
IsSystem bool `gorm:"default:true" json:"is_system"`
|
|
}
|
|
|
|
// TableName specifies the table name for SystemCategory
|
|
func (SystemCategory) TableName() string {
|
|
return "system_categories"
|
|
}
|
|
|
|
// InitSystemCategories initializes the system categories (refund and reimbursement)
|
|
// This function should be called during application startup or migration
|
|
// Feature: accounting-feature-upgrade
|
|
// Validates: Requirements 8.19, 8.20
|
|
func InitSystemCategories(db *gorm.DB) error {
|
|
categories := []SystemCategory{
|
|
{Code: "refund", Name: "退款", Icon: "mdi:cash-refund", Type: "income", IsSystem: true},
|
|
{Code: "reimbursement", Name: "报销", Icon: "mdi:receipt-text-check", Type: "income", IsSystem: true},
|
|
}
|
|
|
|
for _, cat := range categories {
|
|
// Use FirstOrCreate to avoid duplicates
|
|
if err := db.FirstOrCreate(&cat, SystemCategory{Code: cat.Code}).Error; err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|