intial commit

This commit is contained in:
2026-05-25 11:45:56 +05:30
commit 6ab508560f
73 changed files with 23713 additions and 0 deletions

View 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,
})
}