2023-09-27 19:20:44 +02:00
package invoice
import (
"fmt"
"strings"
2023-10-20 12:03:59 +02:00
"time"
2023-09-27 19:20:44 +02:00
"gitlab.com/pactual1/backend/models"
"gitlab.com/pactual1/backend/shared"
)
2023-10-17 10:32:52 +02:00
func GetInvoices ( buyerName string , sortBy string , limit int , offset int , ids [ ] int64 , status [ ] string ) ( [ ] models . Invoice , int64 , error ) {
2023-10-13 11:48:14 +02:00
var invoices [ ] models . Invoice
// Default sort by InvoiceDate DESC
sortField := "invoice_date"
sortOrder := "desc"
if sortBy == "InvoiceDate" || sortBy == "InvoiceDueDate" {
sortField = strings . ToLower ( sortBy )
}
dbOrder := fmt . Sprintf ( "%s %s" , sortField , sortOrder )
db := shared . GetDb ( )
countDb := db
if buyerName != "" {
db = db . Where ( "buyer_name LIKE ?" , "%" + buyerName + "%" )
countDb = countDb . Where ( "buyer_name LIKE ?" , "%" + buyerName + "%" )
}
// Added conditional for ID search
if len ( ids ) > 0 {
db = db . Where ( "id in (?)" , ids )
countDb = countDb . Where ( "id in (?)" , ids )
}
2023-10-17 10:32:52 +02:00
// Added conditional for status search
if len ( status ) > 0 {
db = db . Where ( "status in (?)" , status )
countDb = countDb . Where ( "status in (?)" , status )
}
2023-10-13 11:48:14 +02:00
var total int64
if err := countDb . Model ( & models . Invoice { } ) . Count ( & total ) . Error ; err != nil {
return nil , 0 , err
}
if err := db . Preload ( "InvoiceItem" ) .
Order ( dbOrder ) .
Limit ( limit ) .
Offset ( offset ) .
Find ( & invoices ) . Error ; err != nil {
return nil , 0 , err
}
for i := range invoices {
var sum int64
if invoices [ i ] . InvoiceItem != nil {
2023-10-16 12:03:47 +02:00
for _ , item := range invoices [ i ] . InvoiceItem {
2023-10-13 11:48:14 +02:00
sum += item . PriceCents * item . Quantity
}
invoices [ i ] . PriceCents = sum
}
}
return invoices , total , nil
2023-09-27 19:20:44 +02:00
}
2023-10-20 12:03:59 +02:00
func CountInvoicesByMultipleStatuses ( companyID uint , startTime , endTime time . Time ) ( int64 , int64 , map [ string ] map [ string ] int64 , error ) {
var claimed , issued int64
monthlyCounts := make ( map [ string ] map [ string ] int64 )
// Iterate through each month within the specified date range
for dt := startTime ; dt . Before ( endTime ) ; dt = dt . AddDate ( 0 , 1 , 0 ) {
monthEnd := dt . AddDate ( 0 , 1 , 0 )
if monthEnd . After ( endTime ) {
monthEnd = endTime
}
// Initialize monthlyCounts for the current month
monthKey := dt . Format ( "2006-01" )
monthlyCounts [ monthKey ] = map [ string ] int64 { "insurance_claimed" : 0 , "invoice_issued" : 0 }
// Query for 'insurance_claimed' invoices for the current month
var monthlyClaimed int64
err := shared . GetDb ( ) . Model ( & models . Invoice { } ) .
Where ( "status = ? AND (buyer_id = ? OR seller_id = ?) AND invoice_date >= ? AND invoice_due_date <= ?" , "insurance_claimed" , companyID , companyID , dt , monthEnd ) .
Count ( & monthlyClaimed ) . Error
if err != nil {
return 0 , 0 , nil , err
}
// Query for 'invoice_issued' invoices for the current month
var monthlyIssued int64
err = shared . GetDb ( ) . Model ( & models . Invoice { } ) .
Where ( "status = ? AND (buyer_id = ? OR seller_id = ?) AND invoice_date >= ? AND invoice_due_date <= ?" , "invoice_issued" , companyID , companyID , dt , monthEnd ) .
Count ( & monthlyIssued ) . Error
if err != nil {
return 0 , 0 , nil , err
}
// Update the counts for the current month
monthlyCounts [ monthKey ] [ "insurance_claimed" ] = monthlyClaimed
monthlyCounts [ monthKey ] [ "invoice_issued" ] = monthlyIssued
// Update the total counts
claimed += monthlyClaimed
issued += monthlyIssued
}
return claimed , issued , monthlyCounts , nil
}