package entity import ( "furtuna-be/internal/constants/role" "furtuna-be/internal/constants/userstatus" "time" ) type CreatePartnerRequest struct { Name string `json:"name" validate:"required"` Address string `json:"address"` FullName string `json:"full_name"` Email string `json:"email"` Password string `json:"password" validate:"required"` NIK string `json:"nik"` PhoneNumber string `json:"phone_number"` BankName string `json:"bank_name"` BankAccountNumber string `json:"bank_account_number"` Status string `json:"status"` BankAccountHolderName string `json:"bank_account_holder_name"` Logo string `json:"logo"` } type Partner struct { ID int64 `gorm:"primaryKey;autoIncrement;column:id"` Name string `gorm:"type:varchar(255);not null;column:name"` Status string `gorm:"type:varchar(50);column:status"` LicenseExpiredDate *time.Time `gorm:"type:date;column:license_expired_date"` Address string `gorm:"type:varchar(255);column:address"` BankName string `gorm:"type:varchar(255);column:bank_name"` BankAccountNumber string `gorm:"type:varchar(50);column:bank_account_number"` BankAccountHolderName string `gorm:"type:varchar(255);column:bank_account_holder_name"` CreatedAt time.Time `gorm:"autoCreateTime;column:created_at"` UpdatedAt time.Time `gorm:"autoUpdateTime;column:updated_at"` DeletedAt *time.Time `gorm:"column:deleted_at"` CreatedBy int64 `gorm:"type:int;column:created_by"` UpdatedBy int64 `gorm:"type:int;column:updated_by"` AdminUserID int64 `gorm:"type:int;column:admin_user_id"` Balance float64 `gorm:"-"` AdminName string `gorm:"-"` AdminPhoneNumber string `gorm:"-"` AdminEmail string `gorm:"-"` Logo string `gorm:"type:varchar;column:logo"` } type PartnerUpdate struct { ID int64 Email string Name string Status string Address string PhoneNumber string BankName string BankAccountHolderNumber string BankAccountHolderName string NIK string AdminUserID int64 AdminName string Password string Logo string } func (c *PartnerUpdate) ToUserAdmin(partnerID *int64) *User { return &User{ ID: c.AdminUserID, Name: c.Name, Password: c.Password, Email: c.Email, NIK: c.NIK, PhoneNumber: c.PhoneNumber, Status: userstatus.UserStatus(c.Status), PartnerID: partnerID, } } func (Partner) TableName() string { return "partners" } type PartnerSearch struct { Search string PartnerID *int64 Name string Limit int Offset int } type PartnerList []*PartnerDB type PartnerDB struct { Partner } type PartnerDBSearch struct { Partner WalletBalance float64 `gorm:"type:number;column:wallet_balance"` AdminName string `gorm:"type:varchar;column:admin_name"` AdminEmail string `gorm:"type:varchar;column:admin_email"` AdminPhoneNumber string `gorm:"type:varchar;column:admin_phone_number"` } func (p *Partner) ToPartnerDB() *PartnerDB { return &PartnerDB{ Partner: *p, } } func (PartnerDB) TableName() string { return "partners" } func (e *PartnerDB) ToPartner() *Partner { return &Partner{ ID: e.ID, Name: e.Name, Status: e.Status, Address: e.Address, CreatedAt: e.CreatedAt, UpdatedAt: e.UpdatedAt, CreatedBy: e.CreatedBy, Balance: e.Balance, AdminEmail: e.AdminEmail, AdminPhoneNumber: e.AdminPhoneNumber, AdminName: e.AdminName, BankAccountHolderName: e.BankAccountHolderName, BankName: e.BankName, BankAccountNumber: e.BankAccountNumber, Logo: e.Logo, } } func (p *PartnerList) ToPartnerList() []*Partner { var partners []*Partner for _, partner := range *p { partners = append(partners, partner.ToPartner()) } return partners } func (o *PartnerDB) ToUpdatedPartner(updatedBy int64, req Partner) { o.UpdatedBy = updatedBy if req.Name != "" { o.Name = req.Name } if req.Status != "" { o.Status = req.Status } if req.Address != "" { o.Address = req.Address } if req.BankAccountNumber != "" { o.BankAccountNumber = req.BankAccountNumber } if req.BankAccountHolderName != "" { o.BankAccountHolderName = req.BankAccountHolderName } if req.Status != "" { o.Status = req.Status } } func (o *PartnerDB) ToUpdatedPartnerData(updatedBy int64, req PartnerUpdate) { o.UpdatedBy = updatedBy if req.Name != "" { o.Name = req.Name } if req.Status != "" { o.Status = req.Status } if req.Address != "" { o.Address = req.Address } if req.BankName != "" { o.BankName = req.BankName } if req.BankAccountHolderNumber != "" { o.BankAccountNumber = req.BankAccountHolderNumber } if req.BankAccountHolderName != "" { o.BankAccountHolderName = req.BankAccountHolderName } if req.Status != "" { o.Status = req.Status } } func (o *PartnerDB) SetDeleted(updatedBy int64) { currentTime := time.Now() o.DeletedAt = ¤tTime o.UpdatedBy = updatedBy } func (c *CreatePartnerRequest) ToUserAdmin(partnerID int64) *User { return &User{ Name: c.FullName, Password: c.Password, Email: c.Email, NIK: c.NIK, PhoneNumber: c.PhoneNumber, Status: "Active", RoleID: role.PartnerAdmin, PartnerID: &partnerID, } } func (e *CreatePartnerRequest) ToPartnerDB(createdBy int64) *PartnerDB { twoDays := 48 * time.Hour licenseExpiredDate := time.Now().Add(twoDays) return &PartnerDB{ Partner: Partner{ Name: e.Name, Status: e.Status, Address: e.Address, CreatedBy: createdBy, CreatedAt: time.Now(), UpdatedAt: time.Now(), BankAccountHolderName: e.BankAccountHolderName, BankAccountNumber: e.BankAccountNumber, BankName: e.BankName, LicenseExpiredDate: &licenseExpiredDate, Logo: e.Logo, }, } } func (e *CreatePartnerRequest) ToWallet(partnerID int64) *Wallet { return &Wallet{ PartnerID: partnerID, Balance: 0, Currency: "IDR", Status: "active", CreatedAt: time.Now(), UpdatedAt: time.Now(), } }