initial commit
This commit is contained in:
359
repositories/customerRepository.go
Normal file
359
repositories/customerRepository.go
Normal file
@@ -0,0 +1,359 @@
|
||||
package repositories
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"nearle/models"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type CustomerRepository interface {
|
||||
GetCustomer(cid int, cno string) (*models.CustomerInfo, error)
|
||||
UpdateCustomer(input models.Customers) error
|
||||
GetCustomerLocations(cid int) ([]models.Customerlocations, error)
|
||||
CreateCustomerLocation(input models.Customerlocations) (int, error)
|
||||
CreateCustomerRequest(req *models.CustomerRequest) error
|
||||
GetCustomerRequests(customerID int, pageNo, pageSize int) ([]models.CustomerRequest, int64, error)
|
||||
GetTenantCustomers(tid, lid, pageno, pagesize int, keyword string) []models.CustomerInfo
|
||||
SearchCustomer(keyword string, tid int) []models.CustomerInfo
|
||||
CheckCustomer(contactno string) int
|
||||
CheckTenantCustomer(cid, tid int) int
|
||||
CreateTenantCustomer(input models.Customers) int
|
||||
CreateCustomer(input models.Customers) int
|
||||
GetCustomerByContactNo(contactNo string) (*models.Customers, error)
|
||||
}
|
||||
|
||||
type customerRepository struct {
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
func NewCustomerRepository(db *gorm.DB) CustomerRepository {
|
||||
return &customerRepository{db: db}
|
||||
}
|
||||
|
||||
func (r *customerRepository) GetCustomer(cid int, cno string) (*models.CustomerInfo, error) {
|
||||
var data models.CustomerInfo
|
||||
|
||||
q := `
|
||||
SELECT a.customerid,a.firstname,a.lastname,a.contactno,a.email,a.profileimage,a.dialcode,
|
||||
a.deviceid,a.devicetype,a.authmode,a.configid,a.customertoken,a.intro,a.gender,a.dob,
|
||||
b.locationid as deliverylocationid,b.address,b.suburb,b.city,b.state,b.landmark,b.doorno,b.postcode,
|
||||
b.latitude,b.longitude,a.applocationid,
|
||||
c.locationid as tenantlocationid,c.tenantid,
|
||||
a.status,
|
||||
d.qrmode,d.latitude as selectedlatitude,d.longitude as selectedlongitude,d.radius,d.applocationid,
|
||||
e.allocationid
|
||||
FROM customers a
|
||||
INNER JOIN customerlocations b ON a.customerid=b.customerid AND b.primaryaddress=1
|
||||
INNER JOIN tenantcustomers c ON a.customerid=c.customerid
|
||||
LEFT JOIN app_location d ON a.applocationid=d.applocationid
|
||||
LEFT JOIN tenants e ON e.tenantid=c.tenantid
|
||||
WHERE %s LIMIT 1
|
||||
`
|
||||
|
||||
var err error
|
||||
if cid != 0 {
|
||||
err = r.db.Raw(fmt.Sprintf(q, "a.customerid = ?"), cid).Scan(&data).Error
|
||||
} else {
|
||||
err = r.db.Raw(fmt.Sprintf(q, "a.contactno = ?"), cno).Scan(&data).Error
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func (r *customerRepository) UpdateCustomer(input models.Customers) error {
|
||||
var custloc models.Customerlocations
|
||||
tx := r.db.Begin()
|
||||
|
||||
if err := tx.Where("customerid=?", input.Customerid).Updates(&input).Error; err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
custloc.Customerid = input.Customerid
|
||||
custloc.Address = input.Address
|
||||
custloc.Suburb = input.Suburb
|
||||
custloc.City = input.City
|
||||
custloc.State = input.State
|
||||
custloc.Postcode = input.Postcode
|
||||
custloc.Latitude = input.Latitude
|
||||
custloc.Longitude = input.Longitude
|
||||
custloc.Doorno = input.Doorno
|
||||
custloc.Landmark = input.Landmark
|
||||
|
||||
if err := tx.Table("customerlocations").
|
||||
Where("customerid=? and primaryaddress=?", input.Customerid, 1).
|
||||
Updates(&custloc).Error; err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
if err := tx.Commit().Error; err != nil {
|
||||
fmt.Println("Commit failed:", err)
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *customerRepository) GetCustomerLocations(cid int) ([]models.Customerlocations, error) {
|
||||
var data []models.Customerlocations
|
||||
|
||||
if cid == 0 {
|
||||
return data, nil
|
||||
}
|
||||
|
||||
query := `SELECT a.locationid, a.customerid, b.applocationid, a.address, a.suburb,
|
||||
a.city, a.state, a.landmark, a.doorno, a.postcode, a.latitude,
|
||||
a.longitude, a.defaultaddress, a.primaryaddress, a.status
|
||||
FROM customerlocations a
|
||||
LEFT JOIN customers b ON a.customerid = b.customerid
|
||||
WHERE a.customerid = ?`
|
||||
|
||||
if err := r.db.Raw(query, cid).Scan(&data).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return data, nil
|
||||
}
|
||||
|
||||
func (r *customerRepository) CreateCustomerLocation(input models.Customerlocations) (int, error) {
|
||||
|
||||
// Duplicate address checking
|
||||
var count int
|
||||
err := r.db.Raw(`
|
||||
SELECT COUNT(*) FROM customerlocations
|
||||
WHERE customerid = ?
|
||||
AND address = ?
|
||||
AND suburb = ?
|
||||
AND city = ?
|
||||
AND state = ?
|
||||
AND postcode = ?
|
||||
AND landmark = ?
|
||||
AND doorno = ?
|
||||
`, input.Customerid, input.Address, input.Suburb, input.City, input.State,
|
||||
input.Postcode, input.Landmark, input.Doorno).
|
||||
Scan(&count).Error
|
||||
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
if count > 0 {
|
||||
// Duplicate found
|
||||
return -1, nil
|
||||
}
|
||||
|
||||
// Insert new address
|
||||
if err := r.db.Create(&input).Error; err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return input.Customerid, nil
|
||||
}
|
||||
|
||||
func (r *customerRepository) CreateCustomerRequest(req *models.CustomerRequest) error {
|
||||
return r.db.Table("customerrequest").Create(req).Error
|
||||
}
|
||||
|
||||
func (r *customerRepository) GetCustomerRequests(customerID, pageNo, pageSize int) ([]models.CustomerRequest, int64, error) {
|
||||
var requests []models.CustomerRequest
|
||||
var total int64
|
||||
|
||||
query := r.db.Table("customerrequest")
|
||||
|
||||
if customerID != 0 {
|
||||
query = query.Where("customerid = ?", customerID)
|
||||
}
|
||||
|
||||
query.Count(&total)
|
||||
|
||||
offset := (pageNo - 1) * pageSize
|
||||
if err := query.Order("created desc").Offset(offset).Limit(pageSize).Find(&requests).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
return requests, total, nil
|
||||
}
|
||||
|
||||
func (r *customerRepository) GetTenantCustomers(tid, lid, pageno, pagesize int, keyword string) []models.CustomerInfo {
|
||||
var data []models.CustomerInfo
|
||||
offset := (pageno - 1) * pagesize
|
||||
|
||||
var q1 string
|
||||
var args []interface{}
|
||||
searchLike := "%" + keyword + "%"
|
||||
|
||||
if lid != 0 {
|
||||
q1 = `SELECT a.customerid,a.firstname,a.lastname,a.contactno,a.email,
|
||||
b.locationid as deliverylocationid,b.address,b.suburb,b.city,b.state,b.landmark,b.doorno,b.postcode,
|
||||
b.latitude,b.longitude,a.applocationid,c.locationid as tenantlocationid,a.status
|
||||
FROM customers a
|
||||
LEFT JOIN customerlocations b ON a.customerid=b.customerid
|
||||
INNER JOIN tenantcustomers c ON a.customerid=c.customerid
|
||||
WHERE c.locationid = ? AND c.tenantid = ?`
|
||||
|
||||
args = append(args, lid, tid)
|
||||
|
||||
if keyword != "" {
|
||||
q1 += ` AND (a.firstname LIKE ? OR a.contactno LIKE ? OR b.suburb LIKE ?)`
|
||||
args = append(args, searchLike, searchLike, searchLike)
|
||||
}
|
||||
|
||||
q1 += ` ORDER BY a.customerid DESC LIMIT ? OFFSET ?`
|
||||
args = append(args, pagesize, offset)
|
||||
|
||||
} else {
|
||||
q1 = `SELECT a.customerid,a.firstname,a.lastname,a.contactno,a.email,
|
||||
a.address,a.suburb,a.city,a.state,a.landmark,a.doorno,a.postcode,
|
||||
a.latitude,a.longitude,a.applocationid,c.locationid as tenantlocationid,a.status
|
||||
FROM customers a
|
||||
INNER JOIN tenantcustomers c ON a.customerid=c.customerid
|
||||
WHERE c.tenantid = ?`
|
||||
|
||||
args = append(args, tid)
|
||||
|
||||
if keyword != "" {
|
||||
searchLike := "%" + strings.ToLower(keyword) + "%"
|
||||
q1 += ` AND (LOWER(a.firstname) LIKE ? OR LOWER(a.contactno) LIKE ? OR LOWER(a.suburb) LIKE ?)`
|
||||
args = append(args, searchLike, searchLike, searchLike)
|
||||
}
|
||||
|
||||
q1 += ` ORDER BY a.customerid DESC LIMIT ? OFFSET ?`
|
||||
args = append(args, pagesize, offset)
|
||||
}
|
||||
|
||||
print(q1)
|
||||
|
||||
r.db.Raw(q1, args...).Find(&data)
|
||||
return data
|
||||
}
|
||||
|
||||
func (r *customerRepository) SearchCustomer(keyword string, tid int) []models.CustomerInfo {
|
||||
var data []models.CustomerInfo
|
||||
searchLike := strings.ToLower(keyword) + "%"
|
||||
|
||||
var q1 string
|
||||
var args []interface{}
|
||||
|
||||
if tid != 0 {
|
||||
q1 = `SELECT a.customerid,a.firstname,a.lastname,a.contactno,a.email,
|
||||
a.address,a.suburb,a.city,a.state,a.landmark,a.doorno,a.postcode,
|
||||
a.latitude,a.longitude,a.applocationid,c.locationid as tenantlocationid,a.status
|
||||
FROM customers a
|
||||
INNER JOIN tenantcustomers c ON a.customerid=c.customerid
|
||||
WHERE c.tenantid = ? AND (LOWER(a.firstname) LIKE ? OR LOWER(a.contactno) LIKE ?)`
|
||||
args = append(args, tid, searchLike, searchLike)
|
||||
} else {
|
||||
q1 = `SELECT a.customerid,a.firstname,a.lastname,a.contactno,a.email,
|
||||
a.address,a.suburb,a.city,a.state,a.landmark,a.doorno,a.postcode,
|
||||
a.latitude,a.longitude,a.applocationid,c.locationid as tenantlocationid,a.status
|
||||
FROM customers a
|
||||
INNER JOIN tenantcustomers c ON a.customerid=c.customerid
|
||||
WHERE (LOWER(a.firstname) LIKE ? OR LOWER(a.contactno) LIKE ?)`
|
||||
args = append(args, searchLike, searchLike)
|
||||
}
|
||||
|
||||
r.db.Raw(q1, args...).Find(&data)
|
||||
return data
|
||||
}
|
||||
|
||||
func (r *customerRepository) CheckCustomer(contactno string) int {
|
||||
var data models.Customers
|
||||
q1 := `SELECT a.customerid FROM customers a WHERE a.contactno = ?`
|
||||
r.db.Raw(q1, contactno).Find(&data)
|
||||
return data.Customerid
|
||||
}
|
||||
|
||||
func (r *customerRepository) CheckTenantCustomer(cid, tid int) int {
|
||||
var data models.Customers
|
||||
q1 := `SELECT a.customerid FROM tenantcustomers a WHERE a.customerid = ? AND a.tenantid = ?`
|
||||
r.db.Raw(q1, cid, tid).Find(&data)
|
||||
return data.Customerid
|
||||
}
|
||||
|
||||
func (r *customerRepository) CreateTenantCustomer(input models.Customers) int {
|
||||
var tcust models.Tenantcustomers
|
||||
tcust.Customerid = input.Customerid
|
||||
tcust.Tenantid = input.Tenantid
|
||||
|
||||
tx := r.db.Begin()
|
||||
if err := tx.Table("tenantcustomers").Create(&tcust).Error; err != nil {
|
||||
fmt.Println(err)
|
||||
tx.Rollback()
|
||||
return 0
|
||||
}
|
||||
tx.Commit()
|
||||
return input.Customerid
|
||||
}
|
||||
|
||||
func (r *customerRepository) CreateCustomer(input models.Customers) int {
|
||||
var custloc models.Customerlocations
|
||||
var tcust models.Tenantcustomers
|
||||
|
||||
tx := r.db.Begin()
|
||||
if err := tx.Create(&input).Error; err != nil {
|
||||
fmt.Println(err)
|
||||
tx.Rollback()
|
||||
return 0
|
||||
}
|
||||
|
||||
custloc = models.Customerlocations{
|
||||
Customerid: input.Customerid,
|
||||
Address: input.Address,
|
||||
Suburb: input.Suburb,
|
||||
City: input.City,
|
||||
State: input.State,
|
||||
Postcode: input.Postcode,
|
||||
Latitude: input.Latitude,
|
||||
Longitude: input.Longitude,
|
||||
Doorno: input.Doorno,
|
||||
Landmark: input.Landmark,
|
||||
Primaryaddress: 1,
|
||||
}
|
||||
if err := tx.Table("customerlocations").Create(&custloc).Error; err != nil {
|
||||
fmt.Println(err)
|
||||
tx.Rollback()
|
||||
return 0
|
||||
}
|
||||
|
||||
tcust = models.Tenantcustomers{
|
||||
Customerid: input.Customerid,
|
||||
Tenantid: input.Tenantid,
|
||||
}
|
||||
if err := tx.Table("tenantcustomers").Create(&tcust).Error; err != nil {
|
||||
fmt.Println(err)
|
||||
tx.Rollback()
|
||||
return 0
|
||||
}
|
||||
|
||||
tx.Commit()
|
||||
return input.Customerid
|
||||
}
|
||||
|
||||
func (r *customerRepository) GetCustomerByContactNo(contactNo string) (*models.Customers, error) {
|
||||
var customer models.Customers
|
||||
|
||||
query := `
|
||||
SELECT a.customerid, a.authmode, a.configid, a.deviceid, a.devicetype, a.customertoken,
|
||||
a.firstname, a.lastname, a.contactno, a.profileimage, a.address, a.suburb,
|
||||
a.city, a.state, a.landmark, a.doorno, a.postcode, a.latitude, a.longitude,
|
||||
a.applocationid, a.status, a.profileimage, a.dialcode, a.intro,
|
||||
b.tenantid, b.locationid,
|
||||
c.qrmode
|
||||
FROM customers a
|
||||
INNER JOIN tenantcustomers b ON a.customerid = b.customerid
|
||||
LEFT JOIN app_location c ON a.applocationid = c.applocationid
|
||||
WHERE a.configid = 2 AND a.contactno = ?
|
||||
`
|
||||
|
||||
if err := r.db.Raw(query, contactNo).Scan(&customer).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &customer, nil
|
||||
}
|
||||
Reference in New Issue
Block a user