Files
backend_jupiter/domain/invoice.go
2026-05-25 11:45:56 +05:30

208 lines
5.9 KiB
Go

package domain
import (
"nearle/db"
"nearle/models"
"nearle/utils"
"strconv"
)
func GetAllInvoice(stat, tid int) []models.Tenantsales {
var q1 string
var data []models.Tenantsales
const (
base = `select a.* from tenantsales a`
)
if stat == 1 {
if tid != 0 {
q1 = base + ` where a.billstatus=0 and a.tenantid=` + strconv.Itoa(tid) + ` and a.duedate::date > CURRENT_DATE order by salesid desc `
} else {
q1 = base + ` where a.billstatus=0 and a.duedate::date > CURRENT_DATE order by salesid desc `
}
} else if stat == 2 {
if tid != 0 {
q1 = base + ` where a.billstatus=0 and a.tenantid=` + strconv.Itoa(tid) + ` and a.duedate::date < CURRENT_DATE order by salesid desc `
} else {
q1 = base + ` where a.billstatus=0 and a.duedate::date < CURRENT_DATE order by salesid desc `
}
} else if stat == 3 {
if tid != 0 {
q1 = base + ` where a.billstatus=2 and a.tenantid=` + strconv.Itoa(tid) + ` order by salesid desc `
} else {
q1 = base + ` where a.billstatus=2 order by salesid desc `
}
} else {
if tid != 0 {
q1 = base + ` where a.tenantid=` + strconv.Itoa(tid) + ` order by salesid desc `
} else {
q1 = base + ` order by salesid desc `
}
}
// print(q1)
db.DB.Raw(q1).Preload("Tenantsalesdetails").Find(&data)
return data
}
func GetInvoiceOrders(tid int, fdate, tdate string) models.InvoiceOrders {
var q1 string
var data models.InvoiceOrders
q1 = `SELECT round(SUM(actualkms),0) AS actualkms,round(SUM(kms),0) AS kms,count(*) as deliveries FROM deliveries
WHERE orderstatus='delivered' and tenantid=` + strconv.Itoa(tid) + ` and date(deliverydate) between '` + fdate + `' and '` + tdate + `'`
utils.Logger.Debugf("Query: %s", q1)
db.DB.Raw(q1).Find(&data)
return data
}
func GetInvoiceInsight(tid int) models.InvoiceInsight {
var q1 string
var data models.InvoiceInsight
if tid != 0 {
q1 = `Select COUNT(*) AS totalcount,
SUM(totalamount) AS total,
SUM(CASE WHEN billstatus=0 and status='pending' AND duedate > CURRENT_DATE THEN 1 ELSE 0 END) AS pendingcount,
SUM(CASE WHEN billstatus IN (0) and status='pending' AND duedate > CURRENT_DATE THEN totalamount ELSE 0 END) AS pending,
(SUM(CASE WHEN billstatus IN (0) and status='pending' AND duedate > CURRENT_DATE THEN totalamount ELSE 0 END) / SUM(totalamount) * 100) AS pendingpercent,
SUM(CASE WHEN billstatus = 1 THEN 1 ELSE 0 END) AS confirmedcount,
SUM(CASE WHEN billstatus = 1 THEN totalamount ELSE 0 END) AS confirmed,
(SUM(CASE WHEN billstatus = 1 THEN totalamount ELSE 0 END) / SUM(totalamount) * 100) AS confrimedpercent,
SUM(CASE WHEN billstatus = 2 THEN 1 ELSE 0 END) AS paidcount,
SUM(CASE WHEN billstatus = 2 THEN totalamount ELSE 0 END) AS paid,
(SUM(CASE WHEN billstatus = 2 THEN totalamount ELSE 0 END) / SUM(totalamount) * 100) AS paidpercent,
SUM(CASE WHEN billstatus IN (0) and status='pending' AND duedate <= CURRENT_DATE THEN 1 ELSE 0 END) AS overduecount,
SUM(CASE WHEN billstatus IN(0) and status='pending' AND duedate <= CURRENT_DATE THEN totalamount ELSE 0 END) AS overdue,
(SUM(CASE WHEN billstatus IN(0) and status='pending' AND duedate <= CURRENT_DATE THEN totalamount ELSE 0 END) / SUM(totalamount) * 100) AS overduepercent
FROM tenantsales where tenantid=` + strconv.Itoa(tid)
} else {
q1 = `Select COUNT(*) AS totalcount,
SUM(totalamount) AS total,
SUM(CASE WHEN billstatus=0 and status='pending' AND duedate > CURRENT_DATE THEN 1 ELSE 0 END) AS pendingcount,
SUM(CASE WHEN billstatus IN (0) and status='pending' AND duedate > CURRENT_DATE THEN totalamount ELSE 0 END) AS pending,
(SUM(CASE WHEN billstatus IN (0) and status='pending' AND duedate > CURRENT_DATE THEN totalamount ELSE 0 END) / SUM(totalamount) * 100) AS pendingpercent,
SUM(CASE WHEN billstatus = 1 THEN 1 ELSE 0 END) AS confirmedcount,
SUM(CASE WHEN billstatus = 1 THEN totalamount ELSE 0 END) AS confirmed,
(SUM(CASE WHEN billstatus = 1 THEN totalamount ELSE 0 END) / SUM(totalamount) * 100) AS confrimedpercent,
SUM(CASE WHEN billstatus = 2 THEN 1 ELSE 0 END) AS paidcount,
SUM(CASE WHEN billstatus = 2 THEN totalamount ELSE 0 END) AS paid,
(SUM(CASE WHEN billstatus = 2 THEN totalamount ELSE 0 END) / SUM(totalamount) * 100) AS paidpercent,
SUM(CASE WHEN billstatus IN (0) and status='pending' AND duedate <= CURRENT_DATE THEN 1 ELSE 0 END) AS overduecount,
SUM(CASE WHEN billstatus IN(0) and status='pending' AND duedate <= CURRENT_DATE THEN totalamount ELSE 0 END) AS overdue,
(SUM(CASE WHEN billstatus IN(0) and status='pending' AND duedate <= CURRENT_DATE THEN totalamount ELSE 0 END) / SUM(totalamount) * 100) AS overduepercent
FROM tenantsales`
}
// print(q1)
db.DB.Raw(q1).Find(&data)
return data
}
func CreateInvoice(data models.Tenantsales) error {
tx := db.DB.Begin()
t1 := tx.Create(&data)
if t1.Error != nil {
utils.Error("CreateInvoice error", "error", t1.Error)
tx.Rollback()
return t1.Error
}
t2 := tx.Table("deliveries").Where("deliverydate>=? and deliverydate<=?", data.Tenantsalesdetails[0].Fromdate, data.Tenantsalesdetails[0].Todate).Update("settlementid", data.Salesid)
if t2.Error != nil {
utils.Error("CreateInvoice deliveries update error", "error", t2.Error)
tx.Rollback()
return t2.Error
}
UpdateSeqno(data.Tenantid, "INV")
err := tx.Commit().Error
if err != nil {
return err
}
return nil
}
func UpdateInvoice(data models.Tenantsales) error {
tx := db.DB.Begin()
t1 := tx.Where("salesid=?", data.Salesid).Updates(&data)
if t1.Error != nil {
utils.Error("UpdateInvoice error", "error", t1.Error)
tx.Rollback()
}
err := tx.Commit().Error
if err != nil {
return err
}
return nil
}
func UpdateInvoiceStatus(data models.InvoiceStatus) error {
tx := db.DB.Begin()
t1 := tx.Table("tenantsales").Where("salesid=?", data.Salesid).Updates(&data)
if t1.Error != nil {
utils.Error("UpdateInvoiceStatus error", "error", t1.Error)
tx.Rollback()
}
err := tx.Commit().Error
if err != nil {
return err
}
return nil
}