Files
old-backend/models/contract.go
Nedim d40b225e4e Added measurements, and devices statsh
Added stats endpoints
2023-10-24 18:26:10 +02:00

324 lines
11 KiB
Go

package models
import (
"time"
"github.com/lib/pq"
)
type Contract struct {
BaseModel
Name string `json:"name"`
DeviceIDs pq.Int64Array `json:"deviceIds" gorm:"type:integer[]"`
BuyerID uint `json:"buyerId"`
SellerID uint `json:"sellerId"`
Description string `json:"description"`
StartPlaceName string `json:"startPlaceName"`
StartLat float64 `json:"startLat"`
StartLon float64 `json:"startLon"`
EndPlaceName string `json:"endPlaceName"`
EndLat float64 `json:"endLat"`
EndLon float64 `json:"endLon"`
StartTime time.Time `json:"startTime"`
EndTime time.Time `json:"endTime"`
Status string `json:"status"`
BlockchainSecret string `json:"blockchainSecret"`
ContractInfos []ContractInfo `json:"contractInfos"`
ProductID uint `json:"productId"`
TemplateID uint `json:"templateId"`
MaxTemp float64 `json:"maxTemp"`
MinTemp float64 `json:"minTemp"`
ArrivalDate time.Time `json:"arrivalDate"`
PenaltyType string `json:"penaltyType"`
PenaltyValue int `json:"penaltyValue"`
PenaltyRec string `json:"penaltyRec"`
BuyerName string `json:"buyerName" gorm:"-"`
SellerName string `json:"sellerName" gorm:"-"`
ProductName string `json:"productName" gorm:"-"`
NumberOfDevices int `json:"numberOfDevices" gorm:"-"`
}
type DashboardContractResponse struct {
BaseModel
Name string `json:"name"`
DeviceIDs pq.Int64Array `json:"deviceIds" gorm:"type:integer[]"`
BuyerID uint `json:"buyerId"`
SellerID uint `json:"sellerId"`
Description string `json:"description"`
StartLat float64 `json:"startLat"`
StartLon float64 `json:"startLon"`
EndLat float64 `json:"endLat"`
EndLon float64 `json:"endLon"`
StartTime time.Time `json:"startTime"`
EndTime time.Time `json:"endTime"`
Status string `json:"status"`
BlockchainID string `json:"blockchainId"`
ContractInfos []ContractInfo `json:"contractInfos"`
ProductID uint `json:"productId"`
MaxTemp float64 `json:"maxTemp"`
MinTemp float64 `json:"minTemp"`
ArrivalDate time.Time `json:"arrivalDate"`
PenaltyType string `json:"penaltyType"`
PenaltyValue int `json:"penaltyValue"`
PenaltyRec string `json:"penaltyRec"`
BuyerName string `json:"buyerName" gorm:"-"`
NumberOfDevices int `json:"numberOfDevices" gorm:"-"`
}
type ContractResponse struct {
BaseModel
Name string `json:"name"`
DeviceIDs pq.Int64Array `json:"deviceIds" gorm:"type:integer[]"`
Seller struct {
ID uint `json:"id"`
Name string `json:"name"`
} `json:"seller"`
Buyer struct {
ID uint `json:"id"`
Name string `json:"name"`
} `json:"buyer"`
Start struct {
Name string `json:"name"`
Lat float64 `json:"lat"`
Lon float64 `json:"lon"`
Time time.Time `json:"time"`
} `json:"start"`
End struct {
Name string `json:"name"`
Lat float64 `json:"lat"`
Lon float64 `json:"lon"`
Time time.Time `json:"time"`
} `json:"end"`
Product struct {
ID uint `json:"id"`
Name string `json:"name"`
} `json:"product"`
Description string `json:"description"`
Status string `json:"status"`
BlockchainID string `json:"blockchainId"`
ContractInfos []ContractInfo `json:"contractInfos"`
MaxTemp float64 `json:"maxTemp"`
MinTemp float64 `json:"minTemp"`
ArrivalDate time.Time `json:"arrivalDate"`
PenaltyType string `json:"penaltyType"`
PenaltyValue int `json:"penaltyValue"`
PenaltyRec string `json:"penaltyRec"`
}
func ConvertContractsToContractResponse(contracts []Contract) []ContractResponse {
contractResponses := []ContractResponse{}
for _, contract := range contracts {
contractResponse := ConvertContractToContractResponse(contract)
contractResponses = append(contractResponses, contractResponse)
}
return contractResponses
}
func ConvertContractToContractResponse(contract Contract) ContractResponse {
contractResponse := ContractResponse{
BaseModel: BaseModel{ID: contract.ID, CreatedAt: contract.CreatedAt, UpdatedAt: contract.UpdatedAt},
Name: contract.Name,
DeviceIDs: contract.DeviceIDs,
Seller: struct {
ID uint "json:\"id\""
Name string "json:\"name\""
}{
ID: contract.SellerID,
Name: contract.SellerName,
},
Buyer: struct {
ID uint "json:\"id\""
Name string "json:\"name\""
}{
ID: contract.BuyerID,
Name: contract.BuyerName,
},
Start: struct {
Name string "json:\"name\""
Lat float64 "json:\"lat\""
Lon float64 "json:\"lon\""
Time time.Time "json:\"time\""
}{
Name: contract.StartPlaceName,
Lat: contract.StartLat,
Lon: contract.StartLon,
Time: contract.StartTime,
},
End: struct {
Name string "json:\"name\""
Lat float64 "json:\"lat\""
Lon float64 "json:\"lon\""
Time time.Time "json:\"time\""
}{
Name: contract.EndPlaceName,
Lat: contract.EndLat,
Lon: contract.EndLon,
Time: contract.EndTime,
},
Product: struct {
ID uint "json:\"id\""
Name string "json:\"name\""
}{
ID: contract.ProductID,
Name: contract.ProductName,
},
Description: contract.Description,
Status: contract.Status,
BlockchainID: contract.BlockchainSecret,
ContractInfos: contract.ContractInfos,
MaxTemp: contract.MaxTemp,
MinTemp: contract.MinTemp,
ArrivalDate: contract.ArrivalDate,
PenaltyType: contract.PenaltyType,
PenaltyValue: contract.PenaltyValue,
PenaltyRec: contract.PenaltyRec,
}
return contractResponse
}
func ConvertContractToDashboardResponse(contracts []Contract) []DashboardContractResponse {
contractResponses := []DashboardContractResponse{}
for _, contract := range contracts {
contractResponse := DashboardContractResponse{
BaseModel: BaseModel{
ID: contract.ID,
CreatedAt: contract.CreatedAt,
UpdatedAt: contract.UpdatedAt,
},
Name: contract.Name,
DeviceIDs: contract.DeviceIDs,
BuyerID: contract.BuyerID,
SellerID: contract.SellerID,
Description: contract.Description,
StartLat: contract.StartLat,
StartLon: contract.StartLon,
EndLat: contract.EndLat,
EndLon: contract.EndLon,
StartTime: contract.StartTime,
EndTime: contract.EndTime,
Status: contract.Status,
BlockchainID: contract.BlockchainSecret,
ContractInfos: contract.ContractInfos,
ProductID: contract.ProductID,
MaxTemp: contract.MaxTemp,
MinTemp: contract.MinTemp,
ArrivalDate: contract.ArrivalDate,
PenaltyType: contract.PenaltyType,
PenaltyValue: contract.PenaltyValue,
PenaltyRec: contract.PenaltyRec,
BuyerName: contract.BuyerName,
NumberOfDevices: contract.NumberOfDevices,
}
contractResponses = append(contractResponses, contractResponse)
}
return contractResponses
}
func ConvertContractToListResponse(contracts []Contract) []ListContractResponse {
listInvoiceResponses := []ListContractResponse{}
// Get all statuses
statuses := GetContractStatuses()
statusMap := make(map[string]Status)
for _, s := range statuses {
statusMap[s.Key] = s
}
for _, contract := range contracts {
// Get the status based on Value in the DB
status, ok := statusMap[contract.Status]
if !ok {
status = Status{Key: "", Value: ""}
}
listInvoiceResponse := ListContractResponse{
Status: KeyValue{Key: status.Key, Value: status.Value},
Buyer: CompanyShortResponse{ID: int(contract.BuyerID), Name: contract.BuyerName},
ContractID: int(contract.ID),
ContractName: contract.Name,
DateCreated: contract.CreatedAt,
NumberOfDevices: contract.NumberOfDevices,
}
listInvoiceResponses = append(listInvoiceResponses, listInvoiceResponse)
}
return listInvoiceResponses
}
const ContractStatusActive = "active"
const ContractStatusPending = "pending"
const ContractStatusDraft = "draft"
const ContractStatusSigned = "signed"
const ContractStatusReadyForActivation = "ready_for_activation"
const ContractStatusExecuted = "executed"
const ContractStatusRevoked = "revoked"
const PenaltyTypeAmount = "amount"
const PenaltyTypePercentage = "percentage"
const PenaltyRecDaily = "daily"
const PenaltyRecMonthly = "monthly"
type Status struct {
Key string `json:"key"`
Value string `json:"value"`
}
type ActiveContractsResponse struct {
ActiveCount int64 `json:"active"`
ExecutedCount int64 `json:"executed"`
MonthlyContracts map[string]map[string]int64 `json:"monthly"`
}
func GetContractStatuses() []Status {
return []Status{
{Value: "Active", Key: "active"},
{Value: "Pending signature", Key: "pending"},
{Value: "Draft", Key: "draft"},
{Value: "Signed", Key: "signed"},
{Value: "Ready for Activation", Key: "ready_for_activation"},
{Value: "Executed", Key: "executed"},
{Value: "Revoked", Key: "revoked"},
}
}
type ListContractResponse struct {
Status KeyValue `json:"status"`
Buyer CompanyShortResponse `json:"buyer"`
ContractID int `json:"contractID"`
ContractName string `json:"contractName"`
NumberOfDevices int `json:"numberOfDevices"`
DateCreated time.Time `json:"dateCreated"`
}
type CreateContractRequestPayload struct {
SellerID uint `json:"sellerId" binding:"required"`
BuyerID uint `json:"buyerId" binding:"required"`
Description string `json:"description"`
ProductID uint `json:"productId"`
MinTemp float64 `json:"minTemp" binding:"required"`
MaxTemp float64 `json:"maxTemp" binding:"required"`
ArrivalDate int64 `json:"arrivalDate"`
PenaltyType string `json:"penaltyType"`
PenaltyValue int `json:"penaltyValue"`
PenaltyRec string `json:"penaltyRec"`
StartPlaceName string `json:"startPlaceName"`
StartLat float64 `json:"startLat"`
StartLon float64 `json:"startLon"`
EndPlaceName string `json:"endPlaceName"`
EndLat float64 `json:"endLat"`
EndLon float64 `json:"endLon"`
Name string `json:"name"`
}
func (Contract) Update() (bool, error) {
return false, nil
}
func (Contract) Create() (bool, error) {
return false, nil
}
func (Contract) Delete() (bool, error) {
return false, nil
}