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"`
|
DeletedAt *time.Time `gorm:"column:deleted_at"`
|
||||||
CreatedBy int64 `gorm:"type:int;column:created_by"`
|
CreatedBy int64 `gorm:"type:int;column:created_by"`
|
||||||
UpdatedBy int64 `gorm:"type:int;column:updated_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 {
|
func (Partner) TableName() string {
|
||||||
@ -52,6 +57,14 @@ type PartnerDB struct {
|
|||||||
Partner
|
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 {
|
func (p *Partner) ToPartnerDB() *PartnerDB {
|
||||||
return &PartnerDB{
|
return &PartnerDB{
|
||||||
Partner: *p,
|
Partner: *p,
|
||||||
@ -64,13 +77,17 @@ func (PartnerDB) TableName() string {
|
|||||||
|
|
||||||
func (e *PartnerDB) ToPartner() *Partner {
|
func (e *PartnerDB) ToPartner() *Partner {
|
||||||
return &Partner{
|
return &Partner{
|
||||||
ID: e.ID,
|
ID: e.ID,
|
||||||
Name: e.Name,
|
Name: e.Name,
|
||||||
Status: e.Status,
|
Status: e.Status,
|
||||||
Address: e.Address,
|
Address: e.Address,
|
||||||
CreatedAt: e.CreatedAt,
|
CreatedAt: e.CreatedAt,
|
||||||
UpdatedAt: e.UpdatedAt,
|
UpdatedAt: e.UpdatedAt,
|
||||||
CreatedBy: e.CreatedBy,
|
CreatedBy: e.CreatedBy,
|
||||||
|
Balance: e.Balance,
|
||||||
|
AdminEmail: e.AdminEmail,
|
||||||
|
AdminPhoneNumber: e.AdminPhoneNumber,
|
||||||
|
AdminName: e.AdminName,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,13 +123,14 @@ func (o *PartnerDB) SetDeleted(updatedBy int64) {
|
|||||||
|
|
||||||
func (c *CreatePartnerRequest) ToUserAdmin(partnerID int64) *User {
|
func (c *CreatePartnerRequest) ToUserAdmin(partnerID int64) *User {
|
||||||
return &User{
|
return &User{
|
||||||
Name: c.FullName,
|
Name: c.FullName,
|
||||||
Password: c.Password,
|
Password: c.Password,
|
||||||
Email: c.Email,
|
Email: c.Email,
|
||||||
NIK: c.NIK,
|
NIK: c.NIK,
|
||||||
Status: "active",
|
PhoneNumber: c.PhoneNumber,
|
||||||
RoleID: role.PartnerAdmin,
|
Status: "active",
|
||||||
PartnerID: &partnerID,
|
RoleID: role.PartnerAdmin,
|
||||||
|
PartnerID: &partnerID,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -19,6 +19,7 @@ type User struct {
|
|||||||
CreatedAt time.Time
|
CreatedAt time.Time
|
||||||
UpdatedAt time.Time
|
UpdatedAt time.Time
|
||||||
RoleID role.Role
|
RoleID role.Role
|
||||||
|
PhoneNumber string
|
||||||
RoleName string
|
RoleName string
|
||||||
PartnerID *int64
|
PartnerID *int64
|
||||||
SiteID *int64
|
SiteID *int64
|
||||||
@ -66,14 +67,16 @@ func (u *User) ToUserDB(createdBy int64) (*UserDB, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &UserDB{
|
return &UserDB{
|
||||||
Name: u.Name,
|
Name: u.Name,
|
||||||
Email: u.Email,
|
Email: u.Email,
|
||||||
Password: hashedPassword,
|
Password: hashedPassword,
|
||||||
RoleID: int64(u.RoleID),
|
RoleID: int64(u.RoleID),
|
||||||
PartnerID: u.PartnerID,
|
PartnerID: u.PartnerID,
|
||||||
Status: userstatus.Active,
|
Status: userstatus.Active,
|
||||||
CreatedBy: createdBy,
|
CreatedBy: createdBy,
|
||||||
SiteID: u.SiteID,
|
SiteID: u.SiteID,
|
||||||
|
PhoneNumber: u.PhoneNumber,
|
||||||
|
NIK: u.NIK,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -242,11 +242,15 @@ func (h *Handler) GetByID(c *gin.Context) {
|
|||||||
|
|
||||||
func (h *Handler) toPartnerResponse(resp *entity.Partner) response.Partner {
|
func (h *Handler) toPartnerResponse(resp *entity.Partner) response.Partner {
|
||||||
return response.Partner{
|
return response.Partner{
|
||||||
ID: &resp.ID,
|
ID: &resp.ID,
|
||||||
Name: resp.Name,
|
Name: resp.Name,
|
||||||
Status: resp.Status,
|
Status: resp.Status,
|
||||||
CreatedAt: resp.CreatedAt.Format(time.RFC3339),
|
CreatedAt: resp.CreatedAt.Format(time.RFC3339),
|
||||||
UpdatedAt: 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 {
|
type Partner struct {
|
||||||
Name string `json:"name" validate:"required"`
|
Name string `json:"name"`
|
||||||
Address string `json:"address" validate:"required"`
|
Address string `json:"address"`
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
|
Email string `json:"email"`
|
||||||
|
PhoneNumber string `json:"phone_number"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type CreatePartnerRequest struct {
|
type CreatePartnerRequest struct {
|
||||||
|
|||||||
@ -1,12 +1,16 @@
|
|||||||
package response
|
package response
|
||||||
|
|
||||||
type Partner struct {
|
type Partner struct {
|
||||||
ID *int64 `json:"id"`
|
ID *int64 `json:"id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
Address string `json:"address,omitempty"`
|
Address string `json:"address,omitempty"`
|
||||||
CreatedAt string `json:"created_at,omitempty"`
|
CreatedAt string `json:"created_at,omitempty"`
|
||||||
UpdatedAt string `json:"updated_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 {
|
type PartnerList struct {
|
||||||
|
|||||||
@ -45,6 +45,14 @@ func (b *PartnerRepository) Update(ctx context.Context, Partner *entity.PartnerD
|
|||||||
return Partner, nil
|
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) {
|
func (b *PartnerRepository) GetByID(ctx context.Context, id int64) (*entity.PartnerDB, error) {
|
||||||
Partner := new(entity.PartnerDB)
|
Partner := new(entity.PartnerDB)
|
||||||
if err := b.db.First(Partner, id).Error; err != nil {
|
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) {
|
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
|
var total int64
|
||||||
|
|
||||||
query := b.db
|
query := b.db.Table("partners p").
|
||||||
query = query.Where("deleted_at is null")
|
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 != "" {
|
if req.Search != "" {
|
||||||
query = query.Where("name ILIKE ?", "%"+req.Search+"%")
|
query = query.Where("p.name ILIKE ?", "%"+req.Search+"%")
|
||||||
}
|
}
|
||||||
|
|
||||||
if req.Name != "" {
|
if req.Name != "" {
|
||||||
query = query.Where("name ILIKE ?", "%"+req.Name+"%")
|
query = query.Where("p.name ILIKE ?", "%"+req.Name+"%")
|
||||||
}
|
}
|
||||||
|
|
||||||
if req.Limit > 0 {
|
if req.Limit > 0 {
|
||||||
@ -77,19 +88,31 @@ func (b *PartnerRepository) GetAll(ctx context.Context, req entity.PartnerSearch
|
|||||||
query = query.Offset(req.Offset)
|
query = query.Offset(req.Offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := query.Find(&Partneres).Error; err != nil {
|
// Find partners with joined wallet balances
|
||||||
logger.ContextLogger(ctx).Error("error when get all Partneres", zap.Error(err))
|
if err := query.Find(&partners).Error; err != nil {
|
||||||
|
logger.ContextLogger(ctx).Error("error when getting all partners", zap.Error(err))
|
||||||
return nil, 0, err
|
return nil, 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := b.db.Model(&entity.PartnerDB{}).Where(query).Count(&total).Error; err != nil {
|
// Counting total records
|
||||||
logger.ContextLogger(ctx).Error("error when count Partneres", zap.Error(err))
|
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 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 {
|
func (b *PartnerRepository) Delete(ctx context.Context, id int64) error {
|
||||||
Partner := new(entity.PartnerDB)
|
Partner := new(entity.PartnerDB)
|
||||||
Partner.ID = id
|
Partner.ID = id
|
||||||
|
|||||||
@ -148,6 +148,7 @@ type OSSRepository interface {
|
|||||||
type PartnerRepository interface {
|
type PartnerRepository interface {
|
||||||
Create(ctx context.Context, branch *entity.PartnerDB) (*entity.PartnerDB, error)
|
Create(ctx context.Context, branch *entity.PartnerDB) (*entity.PartnerDB, error)
|
||||||
CreateWithTx(ctx context.Context, tx *gorm.DB, Partner *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)
|
Update(ctx context.Context, branch *entity.PartnerDB) (*entity.PartnerDB, error)
|
||||||
GetByID(ctx context.Context, id int64) (*entity.PartnerDB, error)
|
GetByID(ctx context.Context, id int64) (*entity.PartnerDB, error)
|
||||||
GetAll(ctx context.Context, req entity.PartnerSearch) (entity.PartnerList, int, 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
|
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)
|
partnerWallet := partnerReq.ToWallet(partnerDB.ID)
|
||||||
if partnerWallet, err = s.walletRepo.Create(ctx, tx, partnerWallet); err != nil {
|
if partnerWallet, err = s.walletRepo.Create(ctx, tx, partnerWallet); err != nil {
|
||||||
logger.ContextLogger(ctx).Error("error when creating wallet", zap.Error(err))
|
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,
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
created_by INTEGER,
|
created_by INTEGER,
|
||||||
updated_by INTEGER,
|
updated_by INTEGER,
|
||||||
|
admin_user_id INTEGER,
|
||||||
deleted_at TIMESTAMP
|
deleted_at TIMESTAMP
|
||||||
);
|
);
|
||||||
Loading…
x
Reference in New Issue
Block a user