2025-11-20 14:56:34 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"github.com/Gleipnir-Technology/nidus-sync/models"
|
|
|
|
|
"github.com/aarondl/opt/null"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type BreedingSourceDetail struct {
|
|
|
|
|
// Basic Information
|
|
|
|
|
OrganizationID int32 `json:"organizationId"`
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
Description string `json:"description"`
|
|
|
|
|
LocationNumber int64 `json:"locationNumber"`
|
|
|
|
|
ObjectID int32 `json:"objectId"`
|
|
|
|
|
GlobalID string `json:"globalId"`
|
|
|
|
|
ExternalID string `json:"externalId"`
|
|
|
|
|
|
|
|
|
|
// Status Information
|
|
|
|
|
Active bool `json:"active"`
|
|
|
|
|
DeactivateReason string `json:"deactivateReason"`
|
|
|
|
|
SourceStatus string `json:"sourceStatus"`
|
|
|
|
|
Priority string `json:"priority"`
|
|
|
|
|
ScalarPriority int64 `json:"scalarPriority"`
|
|
|
|
|
|
|
|
|
|
// Classification
|
|
|
|
|
SourceType string `json:"sourceType"`
|
|
|
|
|
Habitat string `json:"habitat"`
|
|
|
|
|
UseType string `json:"useType"`
|
|
|
|
|
WaterOrigin string `json:"waterOrigin"`
|
|
|
|
|
Symbology string `json:"symbology"`
|
|
|
|
|
|
|
|
|
|
// Geographical Data
|
|
|
|
|
X float64 `json:"x"`
|
|
|
|
|
Y float64 `json:"y"`
|
|
|
|
|
GeometryX float64 `json:"geometryX"`
|
|
|
|
|
GeometryY float64 `json:"geometryY"`
|
|
|
|
|
Zone string `json:"zone"`
|
|
|
|
|
Zone2 string `json:"zone2"`
|
|
|
|
|
Jurisdiction string `json:"jurisdiction"`
|
|
|
|
|
AccessDescription string `json:"accessDescription"`
|
|
|
|
|
|
|
|
|
|
// Inspection Data
|
|
|
|
|
LarvaeInspectInterval int16 `json:"larvaeInspectInterval"`
|
|
|
|
|
LastInspectionDate time.Time `json:"lastInspectionDate"`
|
|
|
|
|
LastInspectionActivity string `json:"lastInspectionActivity"`
|
|
|
|
|
LastInspectionActionTaken string `json:"lastInspectionActionTaken"`
|
|
|
|
|
LastInspectionAverageLarvae float64 `json:"lastInspectionAverageLarvae"`
|
|
|
|
|
LastInspectionAveragePupae float64 `json:"lastInspectionAveragePupae"`
|
|
|
|
|
LastInspectionBreeding string `json:"lastInspectionBreeding"`
|
|
|
|
|
LastInspectionConditions string `json:"lastInspectionConditions"`
|
|
|
|
|
LastInspectionFieldSpecies string `json:"lastInspectionFieldSpecies"`
|
|
|
|
|
LastInspectionLifeStages string `json:"lastInspectionLifeStages"`
|
|
|
|
|
|
|
|
|
|
// Treatment Data
|
|
|
|
|
LastTreatmentDate time.Time `json:"lastTreatmentDate"`
|
|
|
|
|
LastTreatmentActivity string `json:"lastTreatmentActivity"`
|
|
|
|
|
LastTreatmentProduct string `json:"lastTreatmentProduct"`
|
|
|
|
|
LastTreatmentQuantity float64 `json:"lastTreatmentQuantity"`
|
|
|
|
|
LastTreatmentQuantityUnit string `json:"lastTreatmentQuantityUnit"`
|
|
|
|
|
|
|
|
|
|
// Assignment & Schedule
|
|
|
|
|
AssignedTechnician string `json:"assignedTechnician"`
|
|
|
|
|
NextActionScheduledDate time.Time `json:"nextActionScheduledDate"`
|
|
|
|
|
|
|
|
|
|
// Metadata
|
|
|
|
|
Created time.Time `json:"created"`
|
|
|
|
|
Creator string `json:"creator"`
|
|
|
|
|
EditedAt time.Time `json:"editedAt"`
|
|
|
|
|
Editor string `json:"editor"`
|
|
|
|
|
Updated time.Time `json:"updated"`
|
|
|
|
|
Comments string `json:"comments"`
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-20 15:24:54 +00:00
|
|
|
func toTemplateTreatment(rows models.FSTreatmentSlice) ([]Treatment, error) {
|
|
|
|
|
var results []Treatment
|
|
|
|
|
for _, r := range rows {
|
|
|
|
|
results = append(results, Treatment{
|
|
|
|
|
Date: *fsTimestampToTime(r.Enddatetime),
|
|
|
|
|
LocationID: r.Pointlocid.GetOr("none"),
|
|
|
|
|
Notes: r.Comments.GetOr("none"),
|
|
|
|
|
Product: r.Product.GetOr("none"),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
return results, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func toTemplateInspection(rows models.FSMosquitoinspectionSlice) ([]Inspection, error) {
|
|
|
|
|
var results []Inspection
|
|
|
|
|
for _, r := range rows {
|
|
|
|
|
results = append(results, Inspection{
|
|
|
|
|
Action: r.Actiontaken.GetOr("none"),
|
|
|
|
|
Date: *fsTimestampToTime(r.Enddatetime),
|
|
|
|
|
Notes: r.Comments.GetOr("none"),
|
|
|
|
|
Location: r.Locationname.GetOr("none"),
|
|
|
|
|
LocationID: r.Pointlocid.GetOr(""),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
return results, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// toTemplateBreedingSource transforms the DB model into the display model
|
|
|
|
|
func toTemplateBreedingSource(source *models.FSPointlocation) *BreedingSourceDetail {
|
2025-11-20 14:56:34 +00:00
|
|
|
// Helper function to convert unix timestamp to time.Time
|
|
|
|
|
toTime := func(val null.Val[int64]) time.Time {
|
|
|
|
|
v, ok := val.Get()
|
|
|
|
|
if !ok {
|
|
|
|
|
return time.UnixMilli(0)
|
|
|
|
|
}
|
|
|
|
|
t := time.UnixMilli(v)
|
|
|
|
|
return t
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Helper function to convert int16 to bool
|
|
|
|
|
toBool := func(val null.Val[int16]) bool {
|
|
|
|
|
if !val.IsValue() {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
b := val.MustGet() != 0
|
|
|
|
|
return b
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &BreedingSourceDetail{
|
|
|
|
|
// Basic Information
|
|
|
|
|
OrganizationID: source.OrganizationID,
|
|
|
|
|
Name: source.Name.MustGet(),
|
|
|
|
|
Description: source.Description.MustGet(),
|
|
|
|
|
LocationNumber: source.Locationnumber.GetOr(0),
|
|
|
|
|
ObjectID: source.Objectid,
|
|
|
|
|
GlobalID: source.Globalid,
|
|
|
|
|
ExternalID: source.Externalid.GetOr(""),
|
|
|
|
|
|
|
|
|
|
// Status Information
|
|
|
|
|
Active: toBool(source.Active),
|
|
|
|
|
DeactivateReason: source.DeactivateReason.GetOr(""),
|
|
|
|
|
SourceStatus: source.Sourcestatus.GetOr(""),
|
|
|
|
|
Priority: source.Priority.GetOr(""),
|
|
|
|
|
ScalarPriority: source.Scalarpriority.GetOr(0),
|
|
|
|
|
|
|
|
|
|
// Classification
|
|
|
|
|
SourceType: source.Stype.GetOr(""),
|
|
|
|
|
Habitat: source.Habitat.GetOr(""),
|
|
|
|
|
UseType: source.Usetype.GetOr(""),
|
|
|
|
|
WaterOrigin: source.Waterorigin.GetOr(""),
|
|
|
|
|
Symbology: source.Symbology.GetOr(""),
|
|
|
|
|
|
|
|
|
|
// Geographical Data
|
|
|
|
|
X: source.X.GetOr(0),
|
|
|
|
|
Y: source.Y.GetOr(0),
|
|
|
|
|
GeometryX: source.GeometryX,
|
|
|
|
|
GeometryY: source.GeometryY,
|
|
|
|
|
Zone: source.Zone.GetOr(""),
|
|
|
|
|
Zone2: source.Zone2.GetOr(""),
|
|
|
|
|
Jurisdiction: source.Jurisdiction.GetOr(""),
|
|
|
|
|
AccessDescription: source.Accessdesc.GetOr(""),
|
|
|
|
|
|
|
|
|
|
// Inspection Data
|
|
|
|
|
LarvaeInspectInterval: source.Larvinspectinterval.GetOr(0),
|
|
|
|
|
LastInspectionDate: toTime(source.Lastinspectdate),
|
|
|
|
|
LastInspectionActivity: source.Lastinspectactivity.GetOr(""),
|
|
|
|
|
LastInspectionActionTaken: source.Lastinspectactiontaken.GetOr(""),
|
|
|
|
|
LastInspectionAverageLarvae: source.Lastinspectavglarvae.GetOr(0),
|
|
|
|
|
LastInspectionAveragePupae: source.Lastinspectavgpupae.GetOr(0),
|
|
|
|
|
LastInspectionBreeding: source.Lastinspectbreeding.GetOr(""),
|
|
|
|
|
LastInspectionConditions: source.Lastinspectconditions.GetOr(""),
|
|
|
|
|
LastInspectionFieldSpecies: source.Lastinspectfieldspecies.GetOr(""),
|
|
|
|
|
LastInspectionLifeStages: source.Lastinspectlstages.GetOr(""),
|
|
|
|
|
|
|
|
|
|
// Treatment Data
|
|
|
|
|
LastTreatmentDate: toTime(source.Lasttreatdate),
|
|
|
|
|
LastTreatmentActivity: source.Lasttreatactivity.GetOr(""),
|
|
|
|
|
LastTreatmentProduct: source.Lasttreatproduct.GetOr(""),
|
|
|
|
|
LastTreatmentQuantity: source.Lasttreatqty.GetOr(0),
|
|
|
|
|
LastTreatmentQuantityUnit: source.Lasttreatqtyunit.GetOr(""),
|
|
|
|
|
|
|
|
|
|
// Assignment & Schedule
|
|
|
|
|
AssignedTechnician: source.Assignedtech.GetOr(""),
|
|
|
|
|
NextActionScheduledDate: toTime(source.Nextactiondatescheduled),
|
|
|
|
|
|
|
|
|
|
// Metadata
|
|
|
|
|
Created: toTime(source.Creationdate),
|
|
|
|
|
Creator: source.Creator.GetOr(""),
|
|
|
|
|
EditedAt: toTime(source.Editdate),
|
|
|
|
|
Editor: source.Editor.GetOr(""),
|
|
|
|
|
Updated: source.Updated,
|
|
|
|
|
Comments: source.Comments.GetOr(""),
|
|
|
|
|
}
|
|
|
|
|
}
|