| package controllers |
|
|
| import ( |
| "net/http" |
| "service-warungpos-go/config" |
| "service-warungpos-go/models" |
|
|
| "github.com/gin-gonic/gin" |
| "gorm.io/gorm" |
| ) |
|
|
| |
| func ListMembers(c *gin.Context) { |
| userVal, exists := c.Get("user") |
| if !exists { |
| c.JSON(http.StatusUnauthorized, gin.H{"detail": "Unauthorized"}) |
| return |
| } |
| user := userVal.(*models.User) |
| companyID := *user.CompanyID |
|
|
| var members []models.Member |
| if err := config.DB.Preload("Branch").Preload("CreatedBy").Where("company_id = ?", companyID).Order("created_at desc").Find(&members).Error; err != nil { |
| c.JSON(http.StatusInternalServerError, gin.H{"detail": "Gagal mengambil data member"}) |
| return |
| } |
|
|
| c.JSON(http.StatusOK, members) |
| } |
|
|
| |
| func CreateMember(c *gin.Context) { |
| userVal, exists := c.Get("user") |
| if !exists { |
| c.JSON(http.StatusUnauthorized, gin.H{"detail": "Unauthorized"}) |
| return |
| } |
| user := userVal.(*models.User) |
| companyID := *user.CompanyID |
|
|
| var input struct { |
| MemberID string `json:"member_id" binding:"required"` |
| Name string `json:"name" binding:"required"` |
| Phone string `json:"phone"` |
| CreatedByName string `json:"created_by_name"` |
| } |
|
|
| if err := c.ShouldBindJSON(&input); err != nil { |
| c.JSON(http.StatusBadRequest, gin.H{"detail": "Data tidak valid", "error": err.Error()}) |
| return |
| } |
|
|
| |
| var existing models.Member |
| if err := config.DB.Where("company_id = ? AND member_id = ?", companyID, input.MemberID).First(&existing).Error; err == nil { |
| c.JSON(http.StatusBadRequest, gin.H{"detail": "ID Member sudah digunakan"}) |
| return |
| } |
|
|
| newMember := models.Member{ |
| CompanyID: companyID, |
| MemberCode: input.MemberID, |
| Name: input.Name, |
| Phone: input.Phone, |
| Points: 0, |
| CreatedByID: &user.ID, |
| CreatedByName: input.CreatedByName, |
| BranchID: user.BranchID, |
| } |
|
|
| if err := config.DB.Create(&newMember).Error; err != nil { |
| c.JSON(http.StatusInternalServerError, gin.H{"detail": "Gagal membuat member"}) |
| return |
| } |
|
|
| c.JSON(http.StatusCreated, newMember) |
| } |
|
|
| |
| func UpdateMember(c *gin.Context) { |
| userVal, exists := c.Get("user") |
| if !exists { |
| c.JSON(http.StatusUnauthorized, gin.H{"detail": "Unauthorized"}) |
| return |
| } |
| user := userVal.(*models.User) |
| companyID := *user.CompanyID |
| memberID := c.Param("member_id") |
|
|
| var member models.Member |
| if err := config.DB.Where("company_id = ? AND id = ?", companyID, memberID).First(&member).Error; err != nil { |
| c.JSON(http.StatusNotFound, gin.H{"detail": "Member tidak ditemukan"}) |
| return |
| } |
|
|
| var input struct { |
| Name string `json:"name" binding:"required"` |
| Phone string `json:"phone"` |
| } |
|
|
| if err := c.ShouldBindJSON(&input); err != nil { |
| c.JSON(http.StatusBadRequest, gin.H{"detail": "Data tidak valid"}) |
| return |
| } |
|
|
| member.Name = input.Name |
| member.Phone = input.Phone |
|
|
| if err := config.DB.Save(&member).Error; err != nil { |
| c.JSON(http.StatusInternalServerError, gin.H{"detail": "Gagal update member"}) |
| return |
| } |
|
|
| c.JSON(http.StatusOK, member) |
| } |
|
|
| |
| func SetPoints(c *gin.Context) { |
| userVal, exists := c.Get("user") |
| if !exists { |
| c.JSON(http.StatusUnauthorized, gin.H{"detail": "Unauthorized"}) |
| return |
| } |
| user := userVal.(*models.User) |
| companyID := *user.CompanyID |
| memberID := c.Param("member_id") |
|
|
| var member models.Member |
| if err := config.DB.Where("company_id = ? AND id = ?", companyID, memberID).First(&member).Error; err != nil { |
| c.JSON(http.StatusNotFound, gin.H{"detail": "Member tidak ditemukan"}) |
| return |
| } |
|
|
| var input struct { |
| Points int `json:"points"` |
| } |
|
|
| if err := c.ShouldBindJSON(&input); err != nil { |
| c.JSON(http.StatusBadRequest, gin.H{"detail": "Data tidak valid"}) |
| return |
| } |
|
|
| delta := input.Points - member.Points |
|
|
| member.Points = input.Points |
|
|
| if err := config.DB.Save(&member).Error; err != nil { |
| c.JSON(http.StatusInternalServerError, gin.H{"detail": "Gagal update poin"}) |
| return |
| } |
|
|
| if delta != 0 { |
| var branch models.Branch |
| branchName := "Pusat" |
| if user.BranchID != nil { |
| if err := config.DB.First(&branch, *user.BranchID).Error; err == nil { |
| branchName = branch.Name |
| } |
| } |
|
|
| history := models.PointHistory{ |
| CompanyID: companyID, |
| MemberID: member.ID, |
| PointsDelta: delta, |
| Reason: "Penyesuaian manual oleh " + user.Name + " (Cabang " + branchName + ")", |
| } |
| config.DB.Create(&history) |
| } |
|
|
| c.JSON(http.StatusOK, member) |
| } |
|
|
| |
| func GetPointHistory(c *gin.Context) { |
| userVal, exists := c.Get("user") |
| if !exists { |
| c.JSON(http.StatusUnauthorized, gin.H{"detail": "Unauthorized"}) |
| return |
| } |
| user := userVal.(*models.User) |
| companyID := *user.CompanyID |
| memberID := c.Param("member_id") |
|
|
| var history []models.PointHistory |
| if err := config.DB.Where("company_id = ? AND member_id = ?", companyID, memberID).Order("created_at desc").Find(&history).Error; err != nil { |
| c.JSON(http.StatusInternalServerError, gin.H{"detail": "Gagal mengambil riwayat poin"}) |
| return |
| } |
|
|
| c.JSON(http.StatusOK, history) |
| } |
|
|
| |
| func DeleteMember(c *gin.Context) { |
| userVal, exists := c.Get("user") |
| if !exists { |
| c.JSON(http.StatusUnauthorized, gin.H{"detail": "Unauthorized"}) |
| return |
| } |
| user := userVal.(*models.User) |
| companyID := *user.CompanyID |
| memberID := c.Param("member_id") |
|
|
| if err := config.DB.Where("company_id = ? AND id = ?", companyID, memberID).Delete(&models.Member{}).Error; err != nil { |
| c.JSON(http.StatusInternalServerError, gin.H{"detail": "Gagal menghapus member"}) |
| return |
| } |
|
|
| c.JSON(http.StatusOK, gin.H{"detail": "Member dihapus"}) |
| } |
|
|
| |
| func CheckMember(c *gin.Context) { |
| userVal, exists := c.Get("user") |
| if !exists { |
| c.JSON(http.StatusUnauthorized, gin.H{"detail": "Unauthorized"}) |
| return |
| } |
| user := userVal.(*models.User) |
| companyID := *user.CompanyID |
| query := c.Query("query") |
|
|
| if query == "" { |
| c.JSON(http.StatusBadRequest, gin.H{"detail": "Query pencarian wajib diisi"}) |
| return |
| } |
|
|
| var member models.Member |
| if err := config.DB.Preload("Branch").Preload("CreatedBy").Preload("PointHistories", func(db *gorm.DB) *gorm.DB { |
| return db.Order("created_at DESC").Limit(10) |
| }).Where("company_id = ? AND (member_id = ? OR phone = ?)", companyID, query, query).First(&member).Error; err != nil { |
| c.JSON(http.StatusNotFound, gin.H{"detail": "Member tidak ditemukan"}) |
| return |
| } |
|
|
| c.JSON(http.StatusOK, member) |
| } |
|
|