Add partners
This commit is contained in:
parent
2d1c450f65
commit
e9ed9c0dd1
@ -33,6 +33,11 @@ type Partner struct {
|
||||
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 `json:"admin_name"`
|
||||
AdminPhoneNumber string `json:"admin_phone_number"`
|
||||
AdminEmail string `json:"admin_email"`
|
||||
}
|
||||
|
||||
func (Partner) TableName() string {
|
||||
@ -52,6 +57,14 @@ 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,
|
||||
@ -71,6 +84,10 @@ func (e *PartnerDB) ToPartner() *Partner {
|
||||
CreatedAt: e.CreatedAt,
|
||||
UpdatedAt: e.UpdatedAt,
|
||||
CreatedBy: e.CreatedBy,
|
||||
Balance: e.Balance,
|
||||
AdminEmail: e.AdminEmail,
|
||||
AdminPhoneNumber: e.AdminPhoneNumber,
|
||||
AdminName: e.AdminName,
|
||||
}
|
||||
}
|
||||
|
||||
@ -110,6 +127,7 @@ func (c *CreatePartnerRequest) ToUserAdmin(partnerID int64) *User {
|
||||
Password: c.Password,
|
||||
Email: c.Email,
|
||||
NIK: c.NIK,
|
||||
PhoneNumber: c.PhoneNumber,
|
||||
Status: "active",
|
||||
RoleID: role.PartnerAdmin,
|
||||
PartnerID: &partnerID,
|
||||
|
||||
@ -19,6 +19,7 @@ type User struct {
|
||||
CreatedAt time.Time
|
||||
UpdatedAt time.Time
|
||||
RoleID role.Role
|
||||
PhoneNumber string
|
||||
RoleName string
|
||||
PartnerID *int64
|
||||
SiteID *int64
|
||||
@ -74,6 +75,8 @@ func (u *User) ToUserDB(createdBy int64) (*UserDB, error) {
|
||||
Status: userstatus.Active,
|
||||
CreatedBy: createdBy,
|
||||
SiteID: u.SiteID,
|
||||
PhoneNumber: u.PhoneNumber,
|
||||
NIK: u.NIK,
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
||||
@ -247,6 +247,10 @@ func (h *Handler) toPartnerResponse(resp *entity.Partner) response.Partner {
|
||||
Status: resp.Status,
|
||||
CreatedAt: resp.CreatedAt.Format(time.RFC3339),
|
||||
UpdatedAt: resp.CreatedAt.Format(time.RFC3339),
|
||||
Balance: resp.Balance,
|
||||
AdminName: resp.AdminName,
|
||||
AdminPhoneNumber: resp.AdminPhoneNumber,
|
||||
AdminEmail: resp.AdminEmail,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -21,9 +21,11 @@ func (p *PartnerParam) ToEntity() entity.PartnerSearch {
|
||||
}
|
||||
|
||||
type Partner struct {
|
||||
Name string `json:"name" validate:"required"`
|
||||
Address string `json:"address" validate:"required"`
|
||||
Name string `json:"name"`
|
||||
Address string `json:"address"`
|
||||
Status string `json:"status"`
|
||||
Email string `json:"email"`
|
||||
PhoneNumber string `json:"phone_number"`
|
||||
}
|
||||
|
||||
type CreatePartnerRequest struct {
|
||||
|
||||
@ -7,6 +7,10 @@ type Partner struct {
|
||||
Address string `json:"address,omitempty"`
|
||||
CreatedAt string `json:"created_at,omitempty"`
|
||||
UpdatedAt string `json:"updated_at,omitempty"`
|
||||
AdminName string `json:"admin_name"`
|
||||
AdminPhoneNumber string `json:"admin_phone_number"`
|
||||
AdminEmail string `json:"admin_email"`
|
||||
Balance float64 `json:"balance"`
|
||||
}
|
||||
|
||||
type PartnerList struct {
|
||||
|
||||
@ -45,6 +45,14 @@ func (b *PartnerRepository) Update(ctx context.Context, Partner *entity.PartnerD
|
||||
return Partner, nil
|
||||
}
|
||||
|
||||
func (b *PartnerRepository) UpdateWithTx(ctx context.Context, tx *gorm.DB, Partner *entity.PartnerDB) (*entity.PartnerDB, error) {
|
||||
if err := tx.Save(Partner).Error; err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when update Partner", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
return Partner, nil
|
||||
}
|
||||
|
||||
func (b *PartnerRepository) GetByID(ctx context.Context, id int64) (*entity.PartnerDB, error) {
|
||||
Partner := new(entity.PartnerDB)
|
||||
if err := b.db.First(Partner, id).Error; err != nil {
|
||||
@ -55,18 +63,21 @@ func (b *PartnerRepository) GetByID(ctx context.Context, id int64) (*entity.Part
|
||||
}
|
||||
|
||||
func (b *PartnerRepository) GetAll(ctx context.Context, req entity.PartnerSearch) (entity.PartnerList, int, error) {
|
||||
var Partneres []*entity.PartnerDB
|
||||
var partners []*entity.PartnerDBSearch
|
||||
var total int64
|
||||
|
||||
query := b.db
|
||||
query = query.Where("deleted_at is null")
|
||||
query := b.db.Table("partners p").
|
||||
Select("p.*, w.balance as wallet_balance, u.name as admin_name, u.email as admin_email, u.phone_number as admin_phone_number").
|
||||
Joins("LEFT JOIN wallets w ON w.partner_id = p.id").
|
||||
Joins("LEFT JOIN users u ON p.admin_user_id = u.id").
|
||||
Where("p.deleted_at IS NULL")
|
||||
|
||||
if req.Search != "" {
|
||||
query = query.Where("name ILIKE ?", "%"+req.Search+"%")
|
||||
query = query.Where("p.name ILIKE ?", "%"+req.Search+"%")
|
||||
}
|
||||
|
||||
if req.Name != "" {
|
||||
query = query.Where("name ILIKE ?", "%"+req.Name+"%")
|
||||
query = query.Where("p.name ILIKE ?", "%"+req.Name+"%")
|
||||
}
|
||||
|
||||
if req.Limit > 0 {
|
||||
@ -77,19 +88,31 @@ func (b *PartnerRepository) GetAll(ctx context.Context, req entity.PartnerSearch
|
||||
query = query.Offset(req.Offset)
|
||||
}
|
||||
|
||||
if err := query.Find(&Partneres).Error; err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when get all Partneres", zap.Error(err))
|
||||
// Find partners with joined wallet balances
|
||||
if err := query.Find(&partners).Error; err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when getting all partners", zap.Error(err))
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
if err := b.db.Model(&entity.PartnerDB{}).Where(query).Count(&total).Error; err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when count Partneres", zap.Error(err))
|
||||
// Counting total records
|
||||
if err := b.db.Table("partners p").
|
||||
Joins("LEFT JOIN wallets w ON w.partner_id = p.id").
|
||||
Where("p.deleted_at IS NULL").
|
||||
Count(&total).Error; err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when counting partners", zap.Error(err))
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
return Partneres, int(total), nil
|
||||
partnersSearchResult := entity.PartnerList{}
|
||||
|
||||
for _, partner := range partners {
|
||||
partner.Balance = partner.WalletBalance
|
||||
partnersSearchResult = append(partnersSearchResult, &entity.PartnerDB{partner.Partner})
|
||||
}
|
||||
|
||||
return partnersSearchResult, int(total), nil
|
||||
|
||||
}
|
||||
func (b *PartnerRepository) Delete(ctx context.Context, id int64) error {
|
||||
Partner := new(entity.PartnerDB)
|
||||
Partner.ID = id
|
||||
|
||||
@ -148,6 +148,7 @@ type OSSRepository interface {
|
||||
type PartnerRepository interface {
|
||||
Create(ctx context.Context, branch *entity.PartnerDB) (*entity.PartnerDB, error)
|
||||
CreateWithTx(ctx context.Context, tx *gorm.DB, Partner *entity.PartnerDB) (*entity.PartnerDB, error)
|
||||
UpdateWithTx(ctx context.Context, tx *gorm.DB, Partner *entity.PartnerDB) (*entity.PartnerDB, error)
|
||||
Update(ctx context.Context, branch *entity.PartnerDB) (*entity.PartnerDB, error)
|
||||
GetByID(ctx context.Context, id int64) (*entity.PartnerDB, error)
|
||||
GetAll(ctx context.Context, req entity.PartnerSearch) (entity.PartnerList, int, error)
|
||||
|
||||
@ -61,6 +61,12 @@ func (s *PartnerService) Create(ctx mycontext.Context, partnerReq *entity.Create
|
||||
return nil, err
|
||||
}
|
||||
|
||||
partnerDB.AdminUserID = adminUser.ID
|
||||
if partnerDB, err = s.repo.UpdateWithTx(ctx, tx, partnerDB); err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when creating partner", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
partnerWallet := partnerReq.ToWallet(partnerDB.ID)
|
||||
if partnerWallet, err = s.walletRepo.Create(ctx, tx, partnerWallet); err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when creating wallet", zap.Error(err))
|
||||
|
||||
@ -12,5 +12,6 @@ CREATE TABLE partners
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
created_by INTEGER,
|
||||
updated_by INTEGER,
|
||||
admin_user_id INTEGER,
|
||||
deleted_at TIMESTAMP
|
||||
);
|
||||
Loading…
x
Reference in New Issue
Block a user