You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
433 lines
13 KiB
433 lines
13 KiB
3 years ago
|
package invoiceManager
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"net/http"
|
||
|
"strings"
|
||
|
"time"
|
||
|
|
||
|
"github.com/go-openapi/runtime/middleware"
|
||
|
"github.com/go-openapi/strfmt"
|
||
|
"github.com/prometheus/client_golang/prometheus"
|
||
|
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/billing/models"
|
||
|
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/billing/restapi/operations/invoice_management"
|
||
|
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/billing/server/dbManager"
|
||
|
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/billing/server/statusManager"
|
||
|
l "gitlab.com/cyclops-utilities/logging"
|
||
|
)
|
||
|
|
||
|
// InvoiceManager is the struct defined to group and contain all the methods
|
||
|
// that interact with the invoice subsystem.
|
||
|
// Parameters:
|
||
|
// - db: a DbParameter reference to be able to use the DBManager methods.
|
||
|
// - monit: a StatusManager reference to be able to use the status subsystem methods.
|
||
|
// - BasePath: a string with the base path of the system.
|
||
|
type InvoiceManager struct {
|
||
|
db *dbManager.DbParameter
|
||
|
monit *statusManager.StatusManager
|
||
|
BasePath string
|
||
|
}
|
||
|
|
||
|
// New is the function to create the struct InvoiceManager.
|
||
|
// Parameters:
|
||
|
// - DbParameter: reference pointing to the DbParameter that allows the interaction
|
||
|
// with the DBManager methods.
|
||
|
// - StatusParameter: reference poining to the StatusManager that allows the
|
||
|
// interaction with the StatusManager methods.
|
||
|
// - bp: a string containing the base path of the service.
|
||
|
// Returns:
|
||
|
// - InvoiceManager: struct to interact with InvoiceManager subsystem functionalities.
|
||
|
func New(db *dbManager.DbParameter, monit *statusManager.StatusManager, bp string) *InvoiceManager {
|
||
|
|
||
|
l.Trace.Printf("[InvoiceManager] Generating new invoiceManager.\n")
|
||
|
|
||
|
monit.InitEndpoint("invoice")
|
||
|
|
||
|
return &InvoiceManager{
|
||
|
db: db,
|
||
|
monit: monit,
|
||
|
BasePath: bp,
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
func (m *InvoiceManager) getToken(param *http.Request) (token string) {
|
||
|
|
||
|
if len(param.Header.Get("Authorization")) > 0 {
|
||
|
|
||
|
token = strings.Fields(param.Header.Get("Authorization"))[1]
|
||
|
|
||
|
}
|
||
|
|
||
|
return
|
||
|
|
||
|
}
|
||
|
|
||
|
// GenerateInvoiceForCustomer (Swagger func) is the function behind
|
||
|
// the (POST) endpoint /invoice/customer/{id}
|
||
|
// It's job is to start the generation of the invoices associated with the
|
||
|
// requested customer in the system within the optional declared time-window.
|
||
|
func (m *InvoiceManager) GenerateInvoiceForCustomer(ctx context.Context, params invoice_management.GenerateInvoiceForCustomerParams) middleware.Responder {
|
||
|
|
||
|
l.Trace.Printf("[InvoiceManager] GenerateInvoiceForCustomer endpoint invoked.\n")
|
||
|
|
||
|
callTime := time.Now()
|
||
|
m.monit.APIHit("invoice", callTime)
|
||
|
|
||
|
var from, to strfmt.DateTime
|
||
|
|
||
|
token := m.getToken(params.HTTPRequest)
|
||
|
|
||
|
if params.From != nil {
|
||
|
|
||
|
from = *params.From
|
||
|
|
||
|
}
|
||
|
|
||
|
if params.To != nil {
|
||
|
|
||
|
to = *params.To
|
||
|
|
||
|
}
|
||
|
|
||
|
billrun, e := m.db.GenerateInvoicesBy("customer", params.ID, token, from, to)
|
||
|
|
||
|
if e != nil {
|
||
|
|
||
|
s := "Problem while trying to generate the Invoice: " + e.Error()
|
||
|
errorReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "POST", "route": "/invoice/customer/" + string(params.ID)}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewGenerateInvoiceForCustomerInternalServerError().WithPayload(&errorReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
acceptedReturn := models.ItemCreatedResponse{
|
||
|
APILink: m.BasePath + "/billrun/" + billrun,
|
||
|
Message: "The request has been added to the queue",
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "202", "method": "POST", "route": "/invoice/customer/" + string(params.ID)}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewGenerateInvoiceForCustomerAccepted().WithPayload(&acceptedReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
// GenerateInvoiceForReseller (Swagger func) is the function behind
|
||
|
// the (POST) endpoint /invoice/reseller/{id}
|
||
|
// It's job is to start the generation of the invoices associated with the
|
||
|
// requested reseller in the system within the optional declared time-window.
|
||
|
func (m *InvoiceManager) GenerateInvoiceForReseller(ctx context.Context, params invoice_management.GenerateInvoiceForResellerParams) middleware.Responder {
|
||
|
|
||
|
l.Trace.Printf("[InvoiceManager] GenerateInvoiceForReseller endpoint invoked.\n")
|
||
|
|
||
|
callTime := time.Now()
|
||
|
m.monit.APIHit("invoice", callTime)
|
||
|
|
||
|
var from, to strfmt.DateTime
|
||
|
|
||
|
token := m.getToken(params.HTTPRequest)
|
||
|
|
||
|
if params.From != nil {
|
||
|
|
||
|
from = *params.From
|
||
|
|
||
|
}
|
||
|
|
||
|
if params.To != nil {
|
||
|
|
||
|
to = *params.To
|
||
|
|
||
|
}
|
||
|
|
||
|
billrun, e := m.db.GenerateInvoicesBy("reseller", params.ID, token, from, to)
|
||
|
|
||
|
if e != nil {
|
||
|
|
||
|
s := "Problem while trying to generate the Invoice: " + e.Error()
|
||
|
errorReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "POST", "route": "/invoice/reseller/" + string(params.ID)}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewGenerateInvoiceForResellerInternalServerError().WithPayload(&errorReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
acceptedReturn := models.ItemCreatedResponse{
|
||
|
APILink: m.BasePath + "/billrun/" + billrun,
|
||
|
Message: "The request has been added to the queue",
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "202", "method": "POST", "route": "/invoice/reseller/" + string(params.ID)}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewGenerateInvoiceForResellerAccepted().WithPayload(&acceptedReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
// GetInvoice (Swagger func) is the function behind the (GET) endpoint
|
||
|
// /invoice/{id}
|
||
|
// It's job is to provide the requested invoice from the system
|
||
|
func (m *InvoiceManager) GetInvoice(ctx context.Context, params invoice_management.GetInvoiceParams) middleware.Responder {
|
||
|
|
||
|
l.Trace.Printf("[InvoiceManager] GetInvoice endpoint invoked.\n")
|
||
|
|
||
|
callTime := time.Now()
|
||
|
m.monit.APIHit("invoice", callTime)
|
||
|
|
||
|
object, e := m.db.GetInvoice(params.ID)
|
||
|
|
||
|
if e != nil {
|
||
|
|
||
|
s := "Problem while retrieving the Invoice from the db: " + e.Error()
|
||
|
errorReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/invoice/" + string(params.ID)}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewGetInvoiceInternalServerError().WithPayload(&errorReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
if object != nil {
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/invoice/" + string(params.ID)}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewGetInvoiceOK().WithPayload(object)
|
||
|
}
|
||
|
|
||
|
s := "The Invoice doesn't exists in the system."
|
||
|
missingReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/invoice/" + string(params.ID)}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewGetInvoiceNotFound().WithPayload(&missingReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
// GetInvoicesByCustomer (Swagger func) is the function behind
|
||
|
// the (GET) endpoint /invoice/customer/{id}
|
||
|
// It's job is to provide the invoices associated to the requested customer
|
||
|
// in the system.
|
||
|
func (m *InvoiceManager) GetInvoicesByCustomer(ctx context.Context, params invoice_management.GetInvoicesByCustomerParams) middleware.Responder {
|
||
|
|
||
|
l.Trace.Printf("[InvoiceManager] GetInvoicesByCustomer endpoint invoked.\n")
|
||
|
|
||
|
callTime := time.Now()
|
||
|
m.monit.APIHit("invoice", callTime)
|
||
|
|
||
|
object, e := m.db.GetInvoicesByOrganization(params.ID, params.Months)
|
||
|
|
||
|
if e != nil {
|
||
|
|
||
|
s := "Problem while retrieving the Invoice from the db: " + e.Error()
|
||
|
errorReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/invoice/customer/" + string(params.ID)}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewGetInvoicesByCustomerInternalServerError().WithPayload(&errorReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
if object != nil {
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/invoice/customer/" + string(params.ID)}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewGetInvoicesByCustomerOK().WithPayload(object)
|
||
|
}
|
||
|
|
||
|
s := "The invoice doesn't exists in the system."
|
||
|
missingReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/invoice/customer/" + string(params.ID)}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewGetInvoicesByCustomerNotFound().WithPayload(&missingReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
// GetInvoicesByReseller (Swagger func) is the function behind
|
||
|
// the (GET) endpoint /invoice/reseller/{id}
|
||
|
// It's job is to provide the invoices associated to the requested reseller
|
||
|
// in the system.
|
||
|
func (m *InvoiceManager) GetInvoicesByReseller(ctx context.Context, params invoice_management.GetInvoicesByResellerParams) middleware.Responder {
|
||
|
|
||
|
l.Trace.Printf("[InvoiceManager] GetInvoicesByReseller endpoint invoked.\n")
|
||
|
|
||
|
callTime := time.Now()
|
||
|
m.monit.APIHit("invoice", callTime)
|
||
|
|
||
|
object, e := m.db.GetInvoicesByOrganization(params.ID, params.Months)
|
||
|
|
||
|
if e != nil {
|
||
|
|
||
|
s := "Problem while retrieving the Invoice from the db: " + e.Error()
|
||
|
errorReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/invoice/reseller/" + string(params.ID)}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewGetInvoicesByResellerInternalServerError().WithPayload(&errorReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
if object != nil {
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/invoice/reseller/" + string(params.ID)}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewGetInvoicesByResellerOK().WithPayload(object)
|
||
|
}
|
||
|
|
||
|
s := "The Invoice doesn't exists in the system."
|
||
|
missingReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/invoice/reseller/" + string(params.ID)}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewGetInvoicesByResellerNotFound().WithPayload(&missingReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
// ListInvoices (Swagger func) is the function behind the (GET) endpoint
|
||
|
// /invoice
|
||
|
// It's job is to provide all the invoices contained in the system.
|
||
|
func (m *InvoiceManager) ListInvoices(ctx context.Context, params invoice_management.ListInvoicesParams) middleware.Responder {
|
||
|
|
||
|
l.Trace.Printf("[InvoiceManager] ListInvoices endpoint invoked.\n")
|
||
|
|
||
|
callTime := time.Now()
|
||
|
m.monit.APIHit("invoice", callTime)
|
||
|
|
||
|
object, e := m.db.ListInvoices(params.Model)
|
||
|
|
||
|
if e != nil {
|
||
|
|
||
|
s := "Problem while retrieving the Invoices from the system: " + e.Error()
|
||
|
errorReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/invoice"}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewListInvoicesInternalServerError().WithPayload(&errorReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/invoice"}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewListInvoicesOK().WithPayload(object)
|
||
|
|
||
|
}
|
||
|
|
||
|
// ListCustomerInvoices (Swagger func) is the function behind the (GET) endpoint
|
||
|
// /invoice/customer
|
||
|
// It's job is to provide all the customers invoices contained in the system.
|
||
|
func (m *InvoiceManager) ListCustomerInvoices(ctx context.Context, params invoice_management.ListCustomerInvoicesParams) middleware.Responder {
|
||
|
|
||
|
l.Trace.Printf("[InvoiceManager] ListCustomerInvoices endpoint invoked.\n")
|
||
|
|
||
|
callTime := time.Now()
|
||
|
m.monit.APIHit("invoice", callTime)
|
||
|
|
||
|
object, e := m.db.ListInvoices(&models.Invoice{OrganizationType: "customer"})
|
||
|
|
||
|
if e != nil {
|
||
|
|
||
|
s := "Problem while retrieving the Customers Invoices from the system: " + e.Error()
|
||
|
errorReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/invoice/customer"}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewListCustomerInvoicesInternalServerError().WithPayload(&errorReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/invoice/customer"}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewListCustomerInvoicesOK().WithPayload(object)
|
||
|
|
||
|
}
|
||
|
|
||
|
// ListResellerInvoices (Swagger func) is the function behind the (GET) endpoint
|
||
|
// /invoice/reseller
|
||
|
// It's job is to provide all the resellers invoices contained in the system.
|
||
|
func (m *InvoiceManager) ListResellerInvoices(ctx context.Context, params invoice_management.ListResellerInvoicesParams) middleware.Responder {
|
||
|
|
||
|
l.Trace.Printf("[InvoiceManager] ListResellerInvoices endpoint invoked.\n")
|
||
|
|
||
|
callTime := time.Now()
|
||
|
m.monit.APIHit("invoice", callTime)
|
||
|
|
||
|
object, e := m.db.ListInvoices(&models.Invoice{OrganizationType: "reseller"})
|
||
|
|
||
|
if e != nil {
|
||
|
|
||
|
s := "Problem while retrieving the Resellers Invoices from the system: " + e.Error()
|
||
|
errorReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/invoice/reseller"}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewListResellerInvoicesInternalServerError().WithPayload(&errorReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/invoice/reseller"}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("invoice", callTime)
|
||
|
|
||
|
return invoice_management.NewListResellerInvoicesOK().WithPayload(object)
|
||
|
|
||
|
}
|