intial commit
This commit is contained in:
448
controllers/customerController.go
Normal file
448
controllers/customerController.go
Normal file
@@ -0,0 +1,448 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"nearle/db"
|
||||
"nearle/domain"
|
||||
"nearle/models"
|
||||
"nearle/utils"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
func CreateCustomer(c *fiber.Ctx) error {
|
||||
|
||||
var data models.Customers
|
||||
var id int
|
||||
|
||||
if err := c.BodyParser(&data); err != nil {
|
||||
utils.Error("CreateCustomer body parse error", "error", err)
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
||||
"code": http.StatusBadRequest,
|
||||
"message": err.Error(),
|
||||
"status": false,
|
||||
})
|
||||
}
|
||||
|
||||
// return c.JSON(fiber.Map{
|
||||
// "status": false,
|
||||
// "code": http.StatusConflict,
|
||||
// "message": "Customer Already available",
|
||||
// })
|
||||
|
||||
cid := domain.CheckCustomer(data.Contactno)
|
||||
if cid != 0 {
|
||||
|
||||
data.Customerid = cid
|
||||
|
||||
tcid := domain.CheckTenantCustomer(data.Customerid, data.Tenantid)
|
||||
if tcid == 0 {
|
||||
|
||||
id = domain.CreateTenantCustomer(data)
|
||||
|
||||
} else {
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"status": false,
|
||||
"code": http.StatusConflict,
|
||||
"message": "Customer Already available",
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
id = domain.CreateCustomer(data)
|
||||
|
||||
}
|
||||
|
||||
if id != 0 {
|
||||
|
||||
result := domain.GetCustomer(id, "")
|
||||
return c.JSON(fiber.Map{
|
||||
"status": true,
|
||||
"code": http.StatusCreated,
|
||||
"message": "Successful",
|
||||
"details": result,
|
||||
})
|
||||
|
||||
} else {
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"status": false,
|
||||
"code": http.StatusConflict,
|
||||
"message": "Failed",
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func UpdateCustomer(c *fiber.Ctx) error {
|
||||
|
||||
var data models.Customers
|
||||
|
||||
if err := c.BodyParser(&data); err != nil {
|
||||
utils.Error("UpdateCustomer body parse error", "error", err)
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
||||
"code": http.StatusBadRequest,
|
||||
"message": err.Error(),
|
||||
"status": false,
|
||||
})
|
||||
}
|
||||
|
||||
result := domain.UpdateCustomer(data)
|
||||
|
||||
if !result.Status {
|
||||
return c.JSON(fiber.Map{
|
||||
"status": false,
|
||||
"code": http.StatusConflict,
|
||||
"message": "Failed",
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"status": true,
|
||||
"code": http.StatusAccepted,
|
||||
"message": "Customer update successful",
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
func GetCustomer(c *fiber.Ctx) error {
|
||||
|
||||
cid, _ := strconv.Atoi(c.Query("customerid"))
|
||||
cno := c.Query("contactno")
|
||||
|
||||
result := domain.GetCustomer(cid, cno)
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"code": http.StatusOK,
|
||||
"message": "Success",
|
||||
"status": true,
|
||||
"details": result,
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
func GetTenantCustomers(c *fiber.Ctx) error {
|
||||
tid, _ := strconv.Atoi(c.Query("tenantid"))
|
||||
lid, _ := strconv.Atoi(c.Query("locationid"))
|
||||
aid, _ := strconv.Atoi(c.Query("applocationid"))
|
||||
pageno, _ := strconv.Atoi(c.Query("pageno"))
|
||||
pagesize, _ := strconv.Atoi(c.Query("pagesize"))
|
||||
keyword := c.Query("keyword")
|
||||
|
||||
result := domain.GetTenantCustomers(tid, lid, aid, pageno, pagesize, keyword)
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"code": http.StatusOK,
|
||||
"message": "Success",
|
||||
"status": true,
|
||||
"details": result,
|
||||
})
|
||||
}
|
||||
|
||||
func GetCustomersbytenent(c *fiber.Ctx) error {
|
||||
|
||||
tid, _ := strconv.Atoi(c.Query("tenantid"))
|
||||
lid, _ := strconv.Atoi(c.Query("locationid"))
|
||||
|
||||
//aid, _ := strconv.Atoi(c.Query("applocationid"))
|
||||
|
||||
result := domain.GetCustomerbytenant(tid, lid)
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"code": http.StatusOK,
|
||||
"message": "Success",
|
||||
"status": true,
|
||||
"details": result,
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
func GetCustomersbyapplocation(c *fiber.Ctx) error {
|
||||
|
||||
tid, _ := strconv.Atoi(c.Query("applocationid"))
|
||||
|
||||
result := domain.GetCustomerbyApplocation(tid)
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"code": http.StatusOK,
|
||||
"message": "Success",
|
||||
"status": true,
|
||||
"details": result,
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
func GetallCustomers(c *fiber.Ctx) error {
|
||||
pageno, _ := strconv.Atoi(c.Query("pageno"))
|
||||
pagesize, _ := strconv.Atoi(c.Query("pagesize"))
|
||||
aid, _ := strconv.Atoi(c.Query("applocationid"))
|
||||
keyword := c.Query("keyword") // <-- new param
|
||||
|
||||
result := domain.GetallCustomers(aid, pageno, pagesize, keyword)
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"code": http.StatusOK,
|
||||
"message": "Success",
|
||||
"status": true,
|
||||
"details": result,
|
||||
})
|
||||
}
|
||||
|
||||
func SearchCustomer(c *fiber.Ctx) error {
|
||||
|
||||
keyword := c.Query("keyword")
|
||||
tid, _ := strconv.Atoi(c.Query("tenantid"))
|
||||
|
||||
result := domain.SearchCustomer(keyword, tid)
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"code": http.StatusOK,
|
||||
"message": "Success",
|
||||
"status": true,
|
||||
"details": result,
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
func DeleteCustomer(c *fiber.Ctx) error {
|
||||
|
||||
cid, _ := strconv.Atoi(c.Query("customerid"))
|
||||
|
||||
count := GetCustomerOrderCount(cid)
|
||||
|
||||
if count == 0 {
|
||||
|
||||
tx := db.DB.Begin()
|
||||
t1 := tx.Table("customers").Where("customerid = ?", cid).Delete(&models.Customers{})
|
||||
if t1.Error != nil {
|
||||
utils.Error("DeleteCustomer t1 delete error", "error", t1.Error)
|
||||
tx.Rollback()
|
||||
return c.JSON(fiber.Map{
|
||||
"code": http.StatusInternalServerError,
|
||||
"message": "Error deleting customer",
|
||||
"status": false,
|
||||
})
|
||||
}
|
||||
|
||||
t2 := tx.Table("customerlocations").Where("customerid = ?", cid).Delete(&models.Customerlocations{})
|
||||
if t2.Error != nil {
|
||||
utils.Error("DeleteCustomer t2 delete error", "error", t2.Error)
|
||||
tx.Rollback()
|
||||
return c.JSON(fiber.Map{
|
||||
"code": http.StatusInternalServerError,
|
||||
"message": "Error deleting customer",
|
||||
"status": false,
|
||||
})
|
||||
}
|
||||
|
||||
t3 := tx.Table("tenantcustomers").Where("customerid = ?", cid).Delete(&models.Tenantcustomers{})
|
||||
if t3.Error != nil {
|
||||
utils.Error("DeleteCustomer t3 delete error", "error", t3.Error)
|
||||
tx.Rollback()
|
||||
return c.JSON(fiber.Map{
|
||||
"code": http.StatusInternalServerError,
|
||||
"message": "Error deleting customer",
|
||||
"status": false,
|
||||
})
|
||||
}
|
||||
|
||||
tx.Commit()
|
||||
return c.JSON(fiber.Map{
|
||||
"code": http.StatusOK,
|
||||
"message": "Success",
|
||||
"status": true,
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"code": http.StatusConflict,
|
||||
"message": "Orders available for customers",
|
||||
"status": false,
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
func CreateCustomerLocation(c *fiber.Ctx) error {
|
||||
|
||||
var data models.Customerlocations
|
||||
|
||||
if err := c.BodyParser(&data); err != nil {
|
||||
utils.Error("CreateCustomerLocation body parse error", "error", err)
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
||||
"code": http.StatusBadRequest,
|
||||
"message": err.Error(),
|
||||
"status": false,
|
||||
})
|
||||
}
|
||||
|
||||
id := domain.CreateCustomerLocation(data)
|
||||
if id != 0 {
|
||||
|
||||
result := domain.GetCustomerLocation(id)
|
||||
return c.JSON(result)
|
||||
|
||||
} else {
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"status": false,
|
||||
"code": http.StatusConflict,
|
||||
"message": "Failed",
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func GetCustomerLocations(c *fiber.Ctx) error {
|
||||
|
||||
cid, _ := strconv.Atoi(c.Query("customerid"))
|
||||
|
||||
result := domain.GetCustomerLocation(cid)
|
||||
return c.JSON(result)
|
||||
|
||||
}
|
||||
|
||||
func CreateCustomerRequest(c *fiber.Ctx) error {
|
||||
var req models.CustomerRequest
|
||||
|
||||
if err := c.BodyParser(&req); err != nil {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
||||
"code": 400,
|
||||
"message": "Invalid request body",
|
||||
"status": false,
|
||||
})
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
req.Created = now
|
||||
req.Updated = now
|
||||
|
||||
// Insert into database
|
||||
if err := db.DB.Table("customerrequest").Create(&req).Error; err != nil {
|
||||
utils.Error("CreateCustomerRequest DB error", "error", err)
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
||||
"code": 500,
|
||||
"message": "Failed to create customer request",
|
||||
"status": false,
|
||||
})
|
||||
}
|
||||
|
||||
return c.Status(fiber.StatusCreated).JSON(fiber.Map{
|
||||
"code": 201,
|
||||
"message": "Customer request created successfully",
|
||||
"status": true,
|
||||
"data": req,
|
||||
})
|
||||
}
|
||||
|
||||
func GetCustomerRequests(c *fiber.Ctx) error {
|
||||
customerIDStr := c.Query("customerid")
|
||||
pageNoStr := c.Query("pageno", "1")
|
||||
pageSizeStr := c.Query("pagesize", "10")
|
||||
|
||||
pageNo, _ := strconv.Atoi(pageNoStr)
|
||||
pageSize, _ := strconv.Atoi(pageSizeStr)
|
||||
|
||||
if pageNo < 1 {
|
||||
pageNo = 1
|
||||
}
|
||||
if pageSize < 1 {
|
||||
pageSize = 10
|
||||
}
|
||||
offset := (pageNo - 1) * pageSize
|
||||
|
||||
var requests []models.CustomerRequest
|
||||
query := db.DB.Table("customerrequest")
|
||||
|
||||
// Optional filter by customerid
|
||||
if customerIDStr != "" {
|
||||
customerID, err := strconv.Atoi(customerIDStr)
|
||||
if err != nil {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
||||
"code": 400,
|
||||
"message": "Invalid customerid",
|
||||
"status": false,
|
||||
})
|
||||
}
|
||||
if customerID != 0 {
|
||||
query = query.Where("customerid = ?", customerID)
|
||||
}
|
||||
}
|
||||
|
||||
var total int64
|
||||
query.Count(&total)
|
||||
|
||||
if err := query.Order("created desc").Offset(offset).Limit(pageSize).Find(&requests).Error; err != nil {
|
||||
utils.Error("GetCustomerRequests DB error", "error", err)
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
||||
"code": 500,
|
||||
"message": "Failed to fetch customer requests",
|
||||
"status": false,
|
||||
})
|
||||
}
|
||||
|
||||
return c.Status(fiber.StatusOK).JSON(fiber.Map{
|
||||
"code": 200,
|
||||
"message": "Customer requests fetched successfully",
|
||||
"status": true,
|
||||
"data": requests,
|
||||
})
|
||||
}
|
||||
|
||||
func GetCustomerSummary(c *fiber.Ctx) error {
|
||||
aid, _ := strconv.Atoi(c.Query("applocationid", "0"))
|
||||
tid, _ := strconv.Atoi(c.Query("tenantid", "0"))
|
||||
|
||||
// Initialize query builder
|
||||
query := db.DB.Table("customers as a").
|
||||
Joins("INNER JOIN customerlocations b ON a.customerid = b.customerid").
|
||||
Where("b.primaryaddress = 1")
|
||||
|
||||
if aid != 0 {
|
||||
query = query.Where("a.applocationid = ?", aid)
|
||||
}
|
||||
|
||||
if tid != 0 {
|
||||
query = query.Joins("INNER JOIN tenantcustomers ct ON a.customerid = ct.customerid").
|
||||
Where("ct.tenantid = ?", tid)
|
||||
}
|
||||
|
||||
type Summary struct {
|
||||
Total int64
|
||||
Active int64
|
||||
Inactive int64
|
||||
}
|
||||
|
||||
var summary Summary
|
||||
|
||||
// Execute consolidated summary counts
|
||||
err := query.Select(`
|
||||
COUNT(DISTINCT a.customerid) AS total,
|
||||
COUNT(DISTINCT CASE WHEN a.status = 0 THEN a.customerid END) AS active,
|
||||
COUNT(DISTINCT CASE WHEN a.status = 1 THEN a.customerid END) AS inactive`).
|
||||
Scan(&summary).Error
|
||||
|
||||
if err != nil {
|
||||
utils.Error("GetCustomerSummary DB error", "error", err)
|
||||
return c.Status(http.StatusInternalServerError).JSON(fiber.Map{
|
||||
"code": http.StatusInternalServerError,
|
||||
"message": "Failed to fetch customer summary",
|
||||
"status": false,
|
||||
})
|
||||
}
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"code": http.StatusOK,
|
||||
"message": "Customer summary fetched successfully",
|
||||
"status": true,
|
||||
"summary": summary,
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user