923 lines
28 KiB
Go
923 lines
28 KiB
Go
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
|
|
}
|