initial commit

This commit is contained in:
2026-05-25 11:52:26 +05:30
commit 0d42ac84e1
53 changed files with 11222 additions and 0 deletions

View File

@@ -0,0 +1,922 @@
package repositories
import (
"fmt"
"log"
"nearle/models"
"strconv"
"strings"
"github.com/jinzhu/copier"
"gorm.io/gorm"
)
type DeliveriesRepository interface {
CreateDeliveries(data []models.Deliveries) error
UpdateDelivery(data models.UpdateDeliveryStatus) error
GetDeliverySummary(tid, pid, uid, aid, lid int, fdate, tdate string) (models.DeliverySummary, error)
GetDeliveryInsight(tid int) ([]models.OrderInsightv1, error)
GetLocationDeliverySummary(tenantID int) ([]models.Ordersummarylocation, error)
GetReportSummary(tid, pid, uid, aid int, fdate, tdate string) ([]models.ReportSummary, error)
GetRiderSummary(aid, pid, tid int, fdate, tdate string) ([]models.Ridersummary, error)
GetTenantDeliveries(input models.DeliveryQuery) []models.Deliveryinfo
GetPartnerDeliveries(input models.DeliveryQuery) []models.Deliveryinfo
GetCustomerDeliveries(input models.DeliveryQuery) []models.Deliveryinfo
GetAdminDeliveries(input models.DeliveryQuery) []models.Deliveryinfo
GetUserDeliveries(input models.DeliveryQuery) []models.Deliveryinfo
GetAppUserDeliveries(input models.DeliveryQuery) []models.Deliveryinfo
GetDeliveries(input models.DeliveryQuery) []models.Deliveryinfo
GetDeliveryQueues(uid int, fdate, tdate string) ([]models.Deliveryinfo, error)
GetTenantLocationDeliveries(input models.DeliveryQuery) []models.Deliveryinfo
}
type deliveriesRepository struct {
db *gorm.DB
}
func NewDeliveriesRepository(db *gorm.DB) DeliveriesRepository {
return &deliveriesRepository{db: db}
}
const (
core = `SELECT COUNT(*) AS total,
SUM(CASE WHEN orderstatus = 'pending' THEN 1 ELSE 0 END) AS pending,
SUM(CASE WHEN orderstatus = 'accepted' THEN 1 ELSE 0 END) AS accepted,
SUM(CASE WHEN orderstatus = 'arrived' THEN 1 ELSE 0 END) AS arrived,
SUM(CASE WHEN orderstatus = 'picked' THEN 1 ELSE 0 END) AS picked,
SUM(CASE WHEN orderstatus = 'active' THEN 1 ELSE 0 END) AS active,
SUM(CASE WHEN orderstatus = 'delivered' THEN 1 ELSE 0 END) AS delivered,
SUM(CASE WHEN orderstatus = 'cancelled' THEN 1 ELSE 0 END) AS cancelled`
reports = `SELECT b.tenantid,b.tenantname,
COUNT(*) AS totalorders,
SUM(CASE WHEN a.orderstatus = 'created' THEN 1 ELSE 0 END) AS orderscreated,
SUM(CASE WHEN a.orderstatus = 'pending' THEN 1 ELSE 0 END) AS orderspending,
SUM(CASE WHEN a.orderstatus = 'cancelled' THEN 1 ELSE 0 END) AS orderscancelled,
SUM(CASE WHEN a.orderstatus = 'delivered' THEN 1 ELSE 0 END) AS orderscompleted,
SUM(CASE WHEN c.orderstatus = 'pending' THEN 1 ELSE 0 END) AS deliveriespending,
SUM(CASE WHEN c.orderstatus = 'delivered' THEN 1 ELSE 0 END) AS deliveriescompleted,
SUM(CASE WHEN c.orderstatus = 'cancelled' THEN 1 ELSE 0 END) AS deliveriescancelled,
SUM(CASE WHEN c.paymenttype = 64 THEN c.deliveryamt ELSE 0 END) AS paylater,
SUM(CASE WHEN c.paymenttype = 43 THEN c.deliveryamt ELSE 0 END) AS payondelivery,
ROUND(SUM(c.kms), 2) AS kms,
ROUND(SUM(c.actualkms), 2) AS actualkms,
SUM(c.deliveryamt) AS charges
FROM
tenants b
right JOIN orders a ON b.tenantid = a.tenantid
right JOIN deliveries c ON a.orderheaderid = c.orderheaderid `
Ridersummary = `SELECT a.userid, a.firstname, a.lastname,
CONCAT(a.firstname, ' ', a.lastname) AS fullname,a.status,
SUM(CASE WHEN b.orderstatus = 'pending' THEN 1 ELSE 0 END) AS deliveries,
SUM(CASE WHEN b.orderstatus = 'assigned' THEN 1 ELSE 0 END) AS assigned,
SUM(CASE WHEN b.orderstatus = 'accepted' THEN 1 ELSE 0 END) AS accepted,
SUM(CASE WHEN b.orderstatus = 'arrived' THEN 1 ELSE 0 END) AS arrived,
SUM(CASE WHEN b.orderstatus = 'picked' THEN 1 ELSE 0 END) AS picked,
SUM(CASE WHEN b.orderstatus = 'delivered' THEN 1 ELSE 0 END) AS delivered,
SUM(CASE WHEN b.orderstatus = 'delivered' THEN b.actualkms ELSE 0 END) AS actualkms,
SUM(CASE WHEN b.orderstatus = 'delivered' THEN b.kms ELSE 0 END) AS kms,
SUM(CASE WHEN b.paymenttype = 64 THEN b.deliveryamt ELSE 0 END) AS paylater,
SUM(CASE WHEN b.paymenttype = 43 THEN b.deliveryamt ELSE 0 END) AS payondelivery,
SUM(CASE WHEN b.orderstatus = 'delivered' THEN b.deliveryamt ELSE 0 END) AS deliveryamt
FROM app_users a
LEFT JOIN deliveries b ON a.userid = b.userid`
)
const (
deliveries = `SELECT distinct a.deliveryid,a.applocationid,f.locationname AS applocation,a.orderheaderid,a.configid,a.tenantid,a.partnerid,a.locationid,a.userid,a.categoryid,a.subcategoryid,a.moduleid,
a.orderid,a.deliverydate,a.orderstatus,a.assigntime,a.starttime,a.arrivaltime,a.pickuptime,a.deliverytime,a.canceltime,
a.customerid,a.pickupcustomer,a.pickupcontactno,a.pickuplocationid,a.pickupaddress,a.pickuplocation,a.pickuplat,a.pickuplon,
a.deliverycustomerid,a.deliverycustomer,a.deliverycontactno,a.deliverylocationid,a.deliveryaddress,a.deliverylocation,
a.droplat,a.droplon,a.deliverylat,a.deliverylong,
a.riderslat,a.riderslon,a.deliveryamt,a.kms,a.actualkms,a.riderkms,a.deliverycharges,a.deliverytype,a.paymenttype,a.smsdelivery,
a.expecteddeliverytime,a.profit,a.transitminutes,a.calculationdistancekm,
a.notes,a.ordernotes,b.tenantname,b.primarycontact as tenantcontactno,b.tenanttoken,b.suburb as tenantsuburb,b.city as tenantcity,
c.firstname AS ridername,c.userfcmtoken,e.locationname,e.suburb AS locationsuburb,e.contactno AS locationcontactno
FROM deliveries a
INNER JOIN tenants b ON a.tenantid=b.tenantid
INNER JOIN app_users c ON a.userid=c.userid
INNER JOIN tenantlocations e ON a.locationid=e.locationid
INNER JOIN app_location f ON a.applocationid = f.applocationid
INNER JOIN app_locationconfig g ON f.applocationid = g.applocationid`
)
func (r *deliveriesRepository) CreateDeliveries(data []models.Deliveries) error {
var que []models.Deliveryqueues
var ord models.Updateorderstatus
tx := r.db.Begin()
for i := range data {
if err := tx.Create(&data[i]).Error; err != nil {
tx.Rollback()
return err
}
if err := copier.Copy(&que, &data[i]); err != nil {
tx.Rollback()
return err
}
if err := tx.Create(&que).Error; err != nil {
tx.Rollback()
return err
}
ord.Orderstatus = data[i].Orderstatus
ord.Pending = data[i].Deliverydate
if err := tx.Table("orders").
Where("orderheaderid=?", data[i].Orderheaderid).
Updates(&ord).Error; err != nil {
tx.Rollback()
return err
}
}
if err := tx.Commit().Error; err != nil {
return err
}
return nil
}
func (r *deliveriesRepository) UpdateDelivery(data models.UpdateDeliveryStatus) error {
var ord models.Updateorderstatus
var cloc models.Customerlocations
tx := r.db.Begin()
if err := tx.Table("deliveries").Where("deliveryid = ?", data.Deliveryid).Updates(&data).Error; err != nil {
tx.Rollback()
return err
}
switch data.Orderstatus {
case "pending":
ord.Orderstatus = data.Orderstatus
ord.Pending = data.Assigntime
if err := tx.Table("orders").Where("orderheaderid = ?", data.Orderheaderid).Updates(&ord).Error; err != nil {
tx.Rollback()
return err
}
case "picked":
if data.Pickuplocationid != 0 && data.Deliverytype != "B" {
cloc.Latitude = data.Riderslat
cloc.Longitude = data.Riderslon
cloc.Address = data.Address
cloc.Suburb = data.Suburb
cloc.City = data.City
cloc.State = data.State
cloc.Postcode = data.Postcode
if err := tx.Table("customerlocations").Where("locationid = ?", data.Pickuplocationid).Updates(&cloc).Error; err != nil {
tx.Rollback()
return err
}
}
case "delivered":
ord.Orderstatus = data.Orderstatus
ord.Delivered = data.Deliverytime
if err := tx.Table("orders").Where("orderheaderid = ?", data.Orderheaderid).Updates(&ord).Error; err != nil {
tx.Rollback()
return err
}
if data.Deliverylocationid != 0 && data.Deliverytype != "B" {
cloc.Latitude = data.Deliverylat
cloc.Longitude = data.Deliverylong
cloc.Address = data.Address
cloc.Suburb = data.Suburb
cloc.City = data.City
cloc.State = data.State
cloc.Postcode = data.Postcode
if err := tx.Table("customerlocations").Where("locationid = ?", data.Deliverylocationid).Updates(&cloc).Error; err != nil {
tx.Rollback()
return err
}
}
case "cancelled":
ord.Orderstatus = data.Orderstatus
ord.Cancelled = data.Canceltime
if err := tx.Table("orders").Where("orderheaderid = ?", data.Orderheaderid).Updates(&ord).Error; err != nil {
tx.Rollback()
return err
}
}
if err := tx.Commit().Error; err != nil {
return err
}
return nil
}
func (r *deliveriesRepository) GetDeliverySummary(tid, pid, uid, aid, lid int, fdate, tdate string) (models.DeliverySummary, error) {
var data models.DeliverySummary
var q1 string
var params []interface{}
// Base query
q1 = core + " FROM deliveries WHERE configid = 1"
// Filters (allow multiple together)
if tid != 0 {
q1 += " AND tenantid = ?"
params = append(params, tid)
}
if pid != 0 {
q1 += " AND partnerid = ?"
params = append(params, pid)
}
if uid != 0 {
q1 += " AND userid = ?"
params = append(params, uid)
}
if aid != 0 {
q1 += " AND applocationid = ?"
params = append(params, aid)
}
if lid != 0 {
q1 += " AND locationid = ?"
params = append(params, lid)
}
// Date filter
if fdate != "" && tdate != "" {
q1 += " AND deliverydate::date BETWEEN ? AND ?"
params = append(params, fdate, tdate)
}
// Execute query
if err := r.db.Raw(q1, params...).Scan(&data).Error; err != nil {
return data, err
}
print(q1)
return data, nil
}
func (r *deliveriesRepository) GetDeliveryInsight(tenantID int) ([]models.OrderInsightv1, error) {
var locations []models.OrderInsightv1
var params []interface{}
// Base query for fetching active locations
q1 := `
SELECT DISTINCT l.locationid, l.locationname
FROM tenantlocations l
LEFT JOIN deliveries d ON l.locationid = d.locationid
WHERE l.status = 'Active'
`
// Add tenant filter if provided
if tenantID != 0 {
q1 += " AND l.tenantid = ?"
params = append(params, tenantID)
}
if err := r.db.Raw(q1, params...).Scan(&locations).Error; err != nil {
return nil, err
}
// Query for monthly deliveries
q2 := `
SELECT
COALESCE(SUM(CASE WHEN EXTRACT(MONTH FROM d.deliverydate) = 1 THEN 1 ELSE 0 END), 0) AS jan,
COALESCE(SUM(CASE WHEN EXTRACT(MONTH FROM d.deliverydate) = 2 THEN 1 ELSE 0 END), 0) AS feb,
COALESCE(SUM(CASE WHEN EXTRACT(MONTH FROM d.deliverydate) = 3 THEN 1 ELSE 0 END), 0) AS mar,
COALESCE(SUM(CASE WHEN EXTRACT(MONTH FROM d.deliverydate) = 4 THEN 1 ELSE 0 END), 0) AS apr,
COALESCE(SUM(CASE WHEN EXTRACT(MONTH FROM d.deliverydate) = 5 THEN 1 ELSE 0 END), 0) AS may,
COALESCE(SUM(CASE WHEN EXTRACT(MONTH FROM d.deliverydate) = 6 THEN 1 ELSE 0 END), 0) AS jun,
COALESCE(SUM(CASE WHEN EXTRACT(MONTH FROM d.deliverydate) = 7 THEN 1 ELSE 0 END), 0) AS jul,
COALESCE(SUM(CASE WHEN EXTRACT(MONTH FROM d.deliverydate) = 8 THEN 1 ELSE 0 END), 0) AS aug,
COALESCE(SUM(CASE WHEN EXTRACT(MONTH FROM d.deliverydate) = 9 THEN 1 ELSE 0 END), 0) AS sep,
COALESCE(SUM(CASE WHEN EXTRACT(MONTH FROM d.deliverydate) = 10 THEN 1 ELSE 0 END), 0) AS oct,
COALESCE(SUM(CASE WHEN EXTRACT(MONTH FROM d.deliverydate) = 11 THEN 1 ELSE 0 END), 0) AS nov,
COALESCE(SUM(CASE WHEN EXTRACT(MONTH FROM d.deliverydate) = 12 THEN 1 ELSE 0 END), 0) AS dece
FROM deliveries d
WHERE d.locationid = ?
AND EXTRACT(YEAR FROM d.deliverydate) = EXTRACT(YEAR FROM CURRENT_DATE)
`
if tenantID != 0 {
q2 += " AND d.tenantid = ?"
}
// Attach month-wise insights for each location
for i := range locations {
var orderMonths models.Ordermonths
var err error
if tenantID != 0 {
err = r.db.Raw(q2, locations[i].Locationid, tenantID).Scan(&orderMonths).Error
} else {
err = r.db.Raw(q2, locations[i].Locationid).Scan(&orderMonths).Error
}
if err != nil {
return nil, err
}
locations[i].Ordermonths = &orderMonths
}
return locations, nil
}
func (r *deliveriesRepository) GetLocationDeliverySummary(tenantID int) ([]models.Ordersummarylocation, error) {
var data []models.Ordersummarylocation
var params []interface{}
q1 := `
SELECT
b.locationid,
b.locationname,
COALESCE(COUNT(a.orderid), 0) AS total,
COALESCE(SUM(CASE WHEN a.orderstatus = 'created' THEN 1 ELSE 0 END), 0) AS created,
COALESCE(SUM(CASE WHEN a.orderstatus = 'pending' THEN 1 ELSE 0 END), 0) AS pending,
COALESCE(SUM(CASE WHEN a.orderstatus = 'processing' THEN 1 ELSE 0 END), 0) AS processing,
COALESCE(SUM(CASE WHEN a.orderstatus = 'delivered' THEN 1 ELSE 0 END), 0) AS delivered,
COALESCE(SUM(CASE WHEN a.orderstatus = 'cancelled' THEN 1 ELSE 0 END), 0) AS cancelled
FROM tenantlocations b
LEFT JOIN deliveries a
ON a.locationid = b.locationid
AND a.configid = 1
`
// ✅ Only filter tenant locations in WHERE
if tenantID != 0 {
q1 += " WHERE b.tenantid = ?"
params = append(params, tenantID)
}
q1 += " GROUP BY b.locationid, b.locationname ORDER BY b.locationid"
if err := r.db.Raw(q1, params...).Scan(&data).Error; err != nil {
return nil, err
}
return data, nil
}
func (r *deliveriesRepository) GetReportSummary(tid, pid, uid, aid int, fdate, tdate string) ([]models.ReportSummary, error) {
var data []models.ReportSummary
var q1 string
switch {
case tid != 0:
if fdate != "" && tdate != "" {
q1 = reports + ` WHERE a.tenantid=` + strconv.Itoa(tid) +
` AND a.orderdate::date BETWEEN '` + fdate + `' AND '` + tdate + `' GROUP BY a.tenantid, b.tenantname`
} else {
q1 = reports + ` WHERE a.tenantid=` + strconv.Itoa(tid) + ` GROUP BY a.tenantid, b.tenantname`
}
case pid != 0:
if fdate != "" && tdate != "" {
q1 = reports + ` WHERE a.partnerid=` + strconv.Itoa(pid) +
` AND a.orderdate::date BETWEEN '` + fdate + `' AND '` + tdate + `' GROUP BY a.tenantid, b.tenantname`
} else {
q1 = reports + ` WHERE a.partnerid=` + strconv.Itoa(pid) + ` GROUP BY a.tenantid, b.tenantname`
}
case uid != 0:
if fdate != "" && tdate != "" {
q1 = reports + ` WHERE c.userid=` + strconv.Itoa(uid) +
` AND a.orderdate::date BETWEEN '` + fdate + `' AND '` + tdate + `' GROUP BY a.tenantid, b.tenantname`
} else {
q1 = reports + ` WHERE c.userid=` + strconv.Itoa(uid) + ` GROUP BY a.tenantid, b.tenantname`
}
case aid != 0:
if fdate != "" && tdate != "" {
q1 = reports + ` WHERE c.applocationid=` + strconv.Itoa(aid) +
` AND a.orderdate::date BETWEEN '` + fdate + `' AND '` + tdate + `' GROUP BY a.tenantid, b.tenantname`
} else {
q1 = reports + ` WHERE c.applocationid=` + strconv.Itoa(aid) + ` GROUP BY a.tenantid, b.tenantname`
}
default:
if fdate != "" && tdate != "" {
q1 = reports + ` WHERE a.orderdate::date BETWEEN '` + fdate + `' AND '` + tdate + `' GROUP BY a.tenantid, b.tenantname`
} else {
q1 = reports + ` GROUP BY a.tenantid, b.tenantname`
}
}
if err := r.db.Raw(q1).Scan(&data).Error; err != nil {
return nil, err
}
return data, nil
}
func (r *deliveriesRepository) GetRiderSummary(aid, pid, tid int, fdate, tdate string) ([]models.Ridersummary, error) {
var data []models.Ridersummary
var q1 string
switch {
case aid != 0:
if fdate != "" && tdate != "" {
q1 = Ridersummary + ` WHERE a.configid=6 AND a.applocationid=` + strconv.Itoa(aid) +
` AND b.deliverydate::date BETWEEN '` + fdate + `' AND '` + tdate + `' GROUP BY a.userid, a.firstname, a.lastname`
} else {
q1 = Ridersummary + ` WHERE a.configid=6 AND a.applocationid=` + strconv.Itoa(aid) +
` GROUP BY a.userid, a.firstname, a.lastname`
}
case pid != 0:
if fdate != "" && tdate != "" {
q1 = Ridersummary + ` WHERE a.configid=6 AND a.partnerid=` + strconv.Itoa(pid) +
` AND b.deliverydate::date BETWEEN '` + fdate + `' AND '` + tdate + `' GROUP BY a.userid, a.firstname, a.lastname`
} else {
q1 = Ridersummary + ` WHERE a.configid=6 AND a.partnerid=` + strconv.Itoa(pid) +
` GROUP BY a.userid, a.firstname, a.lastname`
}
case tid != 0:
if fdate != "" && tdate != "" {
q1 = Ridersummary + ` WHERE a.configid=6 AND b.tenantid=` + strconv.Itoa(tid) +
` AND b.deliverydate::date BETWEEN '` + fdate + `' AND '` + tdate + `' GROUP BY a.userid, a.firstname, a.lastname`
} else {
q1 = Ridersummary + ` WHERE a.configid=6 AND b.tenantid=` + strconv.Itoa(tid) +
` GROUP BY a.userid, a.firstname, a.lastname`
}
default:
if fdate != "" && tdate != "" {
q1 = Ridersummary + ` WHERE a.configid=6 AND b.deliverydate::date BETWEEN '` + fdate + `' AND '` + tdate + `' GROUP BY a.userid, a.firstname, a.lastname`
} else {
q1 = Ridersummary + ` WHERE a.configid=6 GROUP BY a.userid, a.firstname, a.lastname`
}
}
if err := r.db.Raw(q1).Scan(&data).Error; err != nil {
return nil, err
}
return data, nil
}
func (r *deliveriesRepository) GetTenantDeliveries(input models.DeliveryQuery) []models.Deliveryinfo {
fmt.Println("🔍 Fetching Tenant Deliveries")
var data []models.Deliveryinfo
var queryBuilder strings.Builder
var params []interface{}
offset := (input.Pageno - 1) * input.Pagesize
baseQuery := `
SELECT a.*, b.tenantname, c.firstname AS ridername, c.contactno AS ridercontact
FROM deliveries a
JOIN tenants b ON a.tenantid = b.tenantid
JOIN app_users c ON a.userid = c.userid
WHERE a.tenantid = ?
`
queryBuilder.WriteString(baseQuery)
params = append(params, input.Tenantid)
if input.Status != "" {
queryBuilder.WriteString(" AND a.orderstatus = ?")
params = append(params, input.Status)
}
if input.Fromdate != "" && input.ToDate != "" {
queryBuilder.WriteString(" AND a.deliverydate::date BETWEEN ? AND ?")
params = append(params, input.Fromdate, input.ToDate)
}
if input.Keyword != "" {
k := "%" + input.Keyword + "%"
queryBuilder.WriteString(`
AND (
a.pickupcustomer LIKE ? OR
a.deliverycustomer LIKE ? OR
a.pickupcontactno LIKE ? OR
a.deliverycontactno LIKE ? OR
a.orderid LIKE ?
)
`)
for i := 0; i < 5; i++ {
params = append(params, k)
}
}
queryBuilder.WriteString(" ORDER BY a.deliveryid DESC")
if input.Pagesize != 0 {
queryBuilder.WriteString(" LIMIT ? OFFSET ?")
params = append(params, input.Pagesize, offset)
}
query := queryBuilder.String()
fmt.Println("Final query:", query)
fmt.Println("Params:", params)
r.db.Raw(query, params...).Scan(&data)
return data
}
func (r *deliveriesRepository) GetPartnerDeliveries(input models.DeliveryQuery) []models.Deliveryinfo {
fmt.Println("🔍 Fetching Partner Deliveries")
var data []models.Deliveryinfo
var queryBuilder strings.Builder
var params []interface{}
offset := (input.Pageno - 1) * input.Pagesize
queryBuilder.WriteString(deliveries + ` WHERE a.partnerid = ?`)
params = append(params, input.Partnerid)
if input.Status != "" {
queryBuilder.WriteString(" AND a.orderstatus = ?")
params = append(params, input.Status)
}
if input.Fromdate != "" && input.ToDate != "" {
queryBuilder.WriteString(" AND a.deliverydate::date BETWEEN ? AND ?")
params = append(params, input.Fromdate, input.ToDate)
}
queryBuilder.WriteString(" ORDER BY a.deliveryid DESC")
if input.Pagesize > 0 {
queryBuilder.WriteString(" LIMIT ? OFFSET ?")
params = append(params, input.Pagesize, offset)
}
finalQuery := queryBuilder.String()
log.Println("Final Partner Query:", finalQuery, "Params:", params)
r.db.Raw(finalQuery, params...).Scan(&data)
return data
}
func (r *deliveriesRepository) GetCustomerDeliveries(input models.DeliveryQuery) []models.Deliveryinfo {
fmt.Println("🔍 Fetching Customer Deliveries")
var data []models.Deliveryinfo
var queryBuilder strings.Builder
var params []interface{}
offset := (input.Pageno - 1) * input.Pagesize
queryBuilder.WriteString(deliveries + ` WHERE a.customerid = ?`)
params = append(params, input.Customerid)
if input.Partnerid != 0 {
queryBuilder.WriteString(" AND a.partnerid = ?")
params = append(params, input.Partnerid)
}
if input.Status != "" {
queryBuilder.WriteString(" AND a.orderstatus = ?")
params = append(params, input.Status)
}
if input.Fromdate != "" && input.ToDate != "" {
queryBuilder.WriteString(" AND a.deliverydate::date BETWEEN ? AND ?")
params = append(params, input.Fromdate, input.ToDate)
}
if input.Keyword != "" {
k := "%" + input.Keyword + "%"
queryBuilder.WriteString(` AND (
a.pickupcustomer LIKE ? OR
a.deliverycustomer LIKE ? OR
a.pickupcontactno LIKE ? OR
a.deliverycontactno LIKE ? OR
a.orderid LIKE ?
)`)
for i := 0; i < 5; i++ {
params = append(params, k)
}
}
queryBuilder.WriteString(" ORDER BY a.deliveryid DESC")
if input.Pagesize != 0 {
queryBuilder.WriteString(" LIMIT ? OFFSET ?")
params = append(params, input.Pagesize, offset)
}
query := queryBuilder.String()
fmt.Println("Final query:", query)
fmt.Println("Params:", params)
r.db.Raw(query, params...).Scan(&data)
return data
}
func (r *deliveriesRepository) GetAdminDeliveries(input models.DeliveryQuery) []models.Deliveryinfo {
fmt.Println("Admin Deliveries")
var data []models.Deliveryinfo
var queryBuilder strings.Builder
var params []interface{}
offset := (input.Pageno - 1) * input.Pagesize
queryBuilder.WriteString(`
SELECT a.*, b.tenantname, c.firstname as ridername
FROM deliveries a
JOIN tenants b ON a.tenantid = b.tenantid
JOIN app_users c ON c.userid = a.userid
WHERE a.applocationid = ?
`)
params = append(params, input.Applocationid)
if input.Status != "" {
queryBuilder.WriteString(" AND a.orderstatus = ?")
params = append(params, input.Status)
}
if input.Fromdate != "" && input.ToDate != "" {
queryBuilder.WriteString(" AND a.deliverydate::date BETWEEN ? AND ?")
params = append(params, input.Fromdate, input.ToDate)
}
if input.Keyword != "" {
k := "%" + input.Keyword + "%"
queryBuilder.WriteString(`
AND (
a.pickupcustomer LIKE ? OR
b.tenantname LIKE ? OR
a.deliverycustomer LIKE ? OR
a.pickupcontactno LIKE ? OR
a.deliverycontactno LIKE ? OR
a.orderid LIKE ?
)
`)
for i := 0; i < 6; i++ {
params = append(params, k)
}
}
queryBuilder.WriteString(" ORDER BY a.deliveryid DESC")
if input.Pagesize > 0 {
queryBuilder.WriteString(" LIMIT ? OFFSET ?")
params = append(params, input.Pagesize, offset)
}
finalQuery := queryBuilder.String()
log.Println("AdminDeliveries query:", finalQuery)
log.Println("Params:", params)
r.db.Raw(finalQuery, params...).Scan(&data)
return data
}
func (r *deliveriesRepository) GetUserDeliveries(input models.DeliveryQuery) []models.Deliveryinfo {
var q1 string
offset := (input.Pageno - 1) * input.Pagesize
var data []models.Deliveryinfo
if input.Status != "" {
if input.Pagesize != 0 {
fmt.Println("Rider Deliveriesv2")
q1 = deliveries + ` where a.userid=` + strconv.Itoa(input.UserID) + ` and a.orderstatus='` + input.Status + `'
and a.deliverydate::date between '` + input.Fromdate + `' and '` + input.ToDate + `' order by deliveryid
desc LIMIT ` + strconv.Itoa(input.Pagesize) + ` OFFSET ` + strconv.Itoa(offset)
} else {
fmt.Println("Rider Deliveriesv1")
q1 = deliveries + ` where a.userid=` + strconv.Itoa(input.UserID) + ` and a.orderstatus='` + input.Status + `'
and a.deliverydate::date between '` + input.Fromdate + `' and '` + input.ToDate + `' order by deliveryid asc`
}
} else {
if input.Pagesize != 0 {
fmt.Println("Rider Deliveriesv2")
q1 = deliveries + ` where a.orderstatus in ('accepted','arrived','picked') and a.userid=` + strconv.Itoa(input.UserID) + ` and
a.deliverydate::date between '` + input.Fromdate + `' and '` + input.ToDate + `' order by deliveryid
desc LIMIT ` + strconv.Itoa(input.Pagesize) + ` OFFSET ` + strconv.Itoa(offset)
} else {
fmt.Println("Rider Deliveriesv1")
q1 = deliveries + ` where a.orderstatus in ('accepted','arrived','picked') and a.userid=` + strconv.Itoa(input.UserID) + ` and
a.deliverydate::date between '` + input.Fromdate + `' and '` + input.ToDate + `' order by deliveryid desc`
}
}
r.db.Raw(q1).Find(&data)
return data
}
func (r *deliveriesRepository) GetAppUserDeliveries(input models.DeliveryQuery) []models.Deliveryinfo {
var data []models.Deliveryinfo
fmt.Println("Appsuser Deliveries -new")
var q1 string
offset := (input.Pageno - 1) * input.Pagesize
q1 = deliveries + ` WHERE g.status = 'Active' AND g.userid=` + strconv.Itoa(input.Appuserid)
if input.Status != "" {
q1 += ` AND a.orderstatus='` + input.Status + `'`
}
if input.Fromdate != "" && input.ToDate != "" {
q1 += ` AND a.deliverydate::date BETWEEN '` + input.Fromdate + `' AND '` + input.ToDate + `'`
}
if input.Keyword != "" {
k := "%" + input.Keyword + "%"
q1 += ` AND (
a.pickupcustomer LIKE '` + k + `' OR
b.tenantname LIKE '` + k + `' OR
a.deliverycustomer LIKE '` + k + `' OR
a.pickupcontactno LIKE '` + k + `' OR
a.deliverycontactno LIKE '` + k + `' OR
CAST(a.orderid AS TEXT) LIKE '` + k + `'
)`
}
q1 += ` ORDER BY a.deliveryid DESC`
if input.Pagesize != 0 {
q1 += ` LIMIT ` + strconv.Itoa(input.Pagesize) + ` OFFSET ` + strconv.Itoa(offset)
}
log.Println("Final Query:", q1)
r.db.Raw(q1).Find(&data)
return data
}
func (r *deliveriesRepository) GetDeliveries(input models.DeliveryQuery) []models.Deliveryinfo {
var data []models.Deliveryinfo
var queryBuilder strings.Builder
var params []interface{}
offset := (input.Pageno - 1) * input.Pagesize
baseQuery := `
SELECT a.*, b.tenantname, c.firstname as ridername, c.contactno as ridercontact, d.customertoken
FROM deliveries a
JOIN tenants b ON a.tenantid = b.tenantid
Join app_users c ON a.userid = c.userid
JOIN customer d ON a.deliverycustomerid = d.customerid
WHERE 1=1
`
queryBuilder.WriteString(baseQuery)
if input.Fromdate != "" && input.ToDate != "" {
queryBuilder.WriteString(" AND a.deliverydate::date BETWEEN ? AND ?")
params = append(params, input.Fromdate, input.ToDate)
}
if input.Status != "" {
queryBuilder.WriteString(" AND a.orderstatus = ?")
params = append(params, input.Status)
}
if input.Keyword != "" {
k := "%" + input.Keyword + "%"
queryBuilder.WriteString(`
AND (
a.pickupcustomer LIKE ? OR
b.tenantname LIKE ? OR
a.deliverycustomer LIKE ? OR
a.pickupcontactno LIKE ? OR
a.deliverycontactno LIKE ? OR
a.orderid LIKE ?
)
`)
for i := 0; i < 6; i++ {
params = append(params, k)
}
}
queryBuilder.WriteString(" ORDER BY a.deliveryid DESC")
if input.Pagesize != 0 {
queryBuilder.WriteString(" LIMIT ? OFFSET ?")
params = append(params, input.Pagesize, offset)
}
query := queryBuilder.String()
log.Println("Final query:", query)
log.Println("With params:", params)
r.db.Raw(query, params...).Scan(&data)
return data
}
func (r *deliveriesRepository) GetDeliveryQueues(uid int, fdate, tdate string) ([]models.Deliveryinfo, error) {
var data []models.Deliveryinfo
var q1 string
if fdate != "" && tdate != "" {
q1 = deliveries + `
WHERE a.orderstatus='pending'
AND a.userid=?
AND DATE(a.deliverydate) BETWEEN ? AND ?
ORDER BY a.deliveryid ASC`
if err := r.db.Raw(q1, uid, fdate, tdate).Find(&data).Error; err != nil {
return nil, err
}
} else {
q1 = deliveries + `
WHERE a.orderstatus='pending'
AND a.userid=?
AND DATE(a.deliverydate)=CURDATE()
ORDER BY a.deliveryid ASC`
if err := r.db.Raw(q1, uid).Find(&data).Error; err != nil {
return nil, err
}
}
return data, nil
}
func (r *deliveriesRepository) GetTenantLocationDeliveries(input models.DeliveryQuery) []models.Deliveryinfo {
var data []models.Deliveryinfo
var params []interface{}
var qb strings.Builder
offset := (input.Pageno - 1) * input.Pagesize
qb.WriteString(`
SELECT a.*, b.tenantname, c.firstname AS ridername,
c.contactno AS ridercontact, d.customertoken
FROM deliveries a
JOIN tenants b ON a.tenantid = b.tenantid
JOIN app_users c ON a.userid = c.userid
JOIN customers d ON a.deliverycustomerid = d.customerid
WHERE a.tenantid = ? AND a.locationid = ?
`)
params = append(params, input.Tenantid, input.Locationid)
if input.Fromdate != "" && input.ToDate != "" {
qb.WriteString(" AND DATE(a.deliverydate) BETWEEN ? AND ?")
params = append(params, input.Fromdate, input.ToDate)
}
if input.Status != "" {
qb.WriteString(" AND a.orderstatus = ?")
params = append(params, input.Status)
}
if input.Keyword != "" {
like := "%" + input.Keyword + "%"
qb.WriteString(`
AND (
a.pickupcustomer LIKE ? OR
b.tenantname LIKE ? OR
a.deliverycustomer LIKE ? OR m
a.pickupcontactno LIKE ? OR
a.deliverycontactno LIKE ? OR
a.orderid LIKE ?
)
`)
for i := 0; i < 6; i++ {
params = append(params, like)
}
}
qb.WriteString(" ORDER BY a.deliveryid DESC")
if input.Pagesize != 0 {
qb.WriteString(" LIMIT ? OFFSET ?")
params = append(params, input.Pagesize, offset)
}
query := qb.String()
log.Println("Tenant+Location Query:", query)
log.Println("Params:", params)
r.db.Raw(query, params...).Scan(&data)
return data
}