data

package
v0.0.0-...-3a789ea Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 20, 2026 License: Apache-2.0 Imports: 19 Imported by: 0

Documentation

Index

Constants

View Source
const (
	ProjectStatusIdeating   = "ideating"
	ProjectStatusPlanned    = "planned"
	ProjectStatusQuoted     = "quoted"
	ProjectStatusInProgress = "underway"
	ProjectStatusDelayed    = "delayed"
	ProjectStatusCompleted  = "completed"
	ProjectStatusAbandoned  = "abandoned"
)
View Source
const (
	DeletionEntityProject     = "project"
	DeletionEntityQuote       = "quote"
	DeletionEntityMaintenance = "maintenance"
	DeletionEntityAppliance   = "appliance"
	DeletionEntityServiceLog  = "service_log"
	DeletionEntityVendor      = "vendor"
	DeletionEntityDocument    = "document"
	DeletionEntityIncident    = "incident"
)
View Source
const (
	ColID                = "id"
	ColName              = "name"
	ColCreatedAt         = "created_at"
	ColUpdatedAt         = "updated_at"
	ColDeletedAt         = "deleted_at"
	ColStatus            = "status"
	ColActualCents       = "actual_cents"
	ColBudgetCents       = "budget_cents"
	ColCostCents         = "cost_cents"
	ColTotalCents        = "total_cents"
	ColIntervalMonths    = "interval_months"
	ColLastServicedAt    = "last_serviced_at"
	ColWarrantyExpiry    = "warranty_expiry"
	ColServicedAt        = "serviced_at"
	ColReceivedDate      = "received_date"
	ColRestoredAt        = "restored_at"
	ColVendorID          = "vendor_id"
	ColProjectID         = "project_id"
	ColProjectTypeID     = "project_type_id"
	ColApplianceID       = "appliance_id"
	ColMaintenanceItemID = "maintenance_item_id"
	ColEntityKind        = "entity_kind"
	ColEntityID          = "entity_id"
	ColEntity            = "entity"
	ColTargetID          = "target_id"
	ColContactName       = "contact_name"
	ColEmail             = "email"
	ColPhone             = "phone"
	ColWebsite           = "website"
	ColNotes             = "notes"
	ColTitle             = "title"
	ColFileName          = "file_name"
	ColMIMEType          = "mime_type"
	ColSizeBytes         = "size_bytes"
	ColChecksum          = "sha256"
	ColData              = "data"
	ColSeverity          = "severity"
	ColDescription       = "description"
	ColDateNoticed       = "date_noticed"
	ColDateResolved      = "date_resolved"
	ColLocation          = "location"
	ColIncidentID        = "incident_id"
)

Column name constants for use in raw SQL queries. Centralising these prevents drift between struct fields and hand-written SQL fragments.

View Source
const (
	IncidentStatusOpen       = "open"
	IncidentStatusInProgress = "in_progress"
)
View Source
const (
	IncidentSeverityUrgent   = "urgent"
	IncidentSeveritySoon     = "soon"
	IncidentSeverityWhenever = "whenever"
)
View Source
const (
	DocumentEntityNone        = ""
	DocumentEntityProject     = "project"
	DocumentEntityQuote       = "quote"
	DocumentEntityMaintenance = "maintenance"
	DocumentEntityAppliance   = "appliance"
	DocumentEntityServiceLog  = "service_log"
	DocumentEntityVendor      = "vendor"
	DocumentEntityIncident    = "incident"
)

Document entity kind values for polymorphic linking.

View Source
const AppName = "micasa"
View Source
const DateLayout = "2006-01-02"
View Source
const MaxDocumentSize int64 = 50 << 20 // 50 MiB

MaxDocumentSize is the largest file that can be imported as a document attachment. SQLite handles arbitrarily large BLOBs, but reading a huge file into memory would be a bad experience.

Variables

View Source
var (
	// ErrParentDeleted indicates the parent record exists but is soft-deleted.
	ErrParentDeleted = errors.New("parent record is deleted")
	// ErrParentNotFound indicates the parent record doesn't exist at all.
	ErrParentNotFound = errors.New("parent record not found")
)
View Source
var (
	ErrInvalidMoney    = errors.New("invalid money value")
	ErrNegativeMoney   = errors.New("negative money value")
	ErrInvalidDate     = errors.New("invalid date value")
	ErrInvalidInt      = errors.New("invalid integer value")
	ErrInvalidFloat    = errors.New("invalid decimal value")
	ErrInvalidInterval = errors.New("invalid interval value")
)

Functions

func AddMonths

func AddMonths(t time.Time, months int) time.Time

AddMonths adds the given number of months to t, clamping the day to the last day of the target month. This avoids the time.AddDate gotcha where Jan 31 + 1 month = March 3 instead of Feb 28.

func ComputeNextDue

func ComputeNextDue(last *time.Time, intervalMonths int) *time.Time

func DefaultDBPath

func DefaultDBPath() (string, error)

func DocumentCacheDir

func DocumentCacheDir() (string, error)

DocumentCacheDir returns the directory used for extracted document BLOBs. On Linux: $XDG_CACHE_HOME/micasa/documents (default ~/.cache/micasa/documents)

func EvictStaleCache

func EvictStaleCache(dir string, ttlDays int) (int, error)

EvictStaleCache removes cached document files from dir that haven't been modified in the given number of days. A ttlDays of 0 disables eviction. Returns the number of files removed and any error encountered while listing the directory (individual file removal errors are skipped).

func FormatCents

func FormatCents(cents int64) string

func FormatCompactCents

func FormatCompactCents(cents int64) string

FormatCompactCents formats cents using abbreviated notation for large values: $1.2k, $45k, $1.3M. Values under $1,000 use full precision. Uses go-humanize for SI prefix formatting.

func FormatCompactOptionalCents

func FormatCompactOptionalCents(cents *int64) string

FormatCompactOptionalCents formats optional cents compactly.

func FormatDate

func FormatDate(value *time.Time) string

func FormatOptionalCents

func FormatOptionalCents(cents *int64) string

func ParseIntervalMonths

func ParseIntervalMonths(input string) (int, error)

ParseIntervalMonths parses a human-friendly interval into months. Accepts bare integers ("12"), month suffix ("6m"), year suffix ("1y"), or combined ("2y 6m", "1y6m"). Case-insensitive, whitespace-flexible. Returns (0, nil) for empty/blank input (non-recurring).

func ParseOptionalCents

func ParseOptionalCents(input string) (*int64, error)

func ParseOptionalDate

func ParseOptionalDate(input string) (*time.Time, error)

func ParseOptionalFloat

func ParseOptionalFloat(input string) (float64, error)

func ParseOptionalInt

func ParseOptionalInt(input string) (int, error)

func ParseRequiredCents

func ParseRequiredCents(input string) (int64, error)

func ParseRequiredDate

func ParseRequiredDate(input string) (time.Time, error)

func ParseRequiredFloat

func ParseRequiredFloat(input string) (float64, error)

func ParseRequiredInt

func ParseRequiredInt(input string) (int, error)

func TitleFromFilename

func TitleFromFilename(name string) string

TitleFromFilename derives a human-friendly title from a filename by stripping extensions (including compound ones like .tar.gz), splitting on word boundaries via strcase, and title-casing each word.

func ValidateDBPath

func ValidateDBPath(path string) error

ValidateDBPath rejects paths that could be interpreted as URIs by the SQLite driver. The underlying go-sqlite driver passes query strings through net/url.ParseQuery (subject to CVE GO-2026-4341) and enables SQLITE_OPEN_URI, so both file:// URIs and scheme://... URLs must be blocked. Only plain filesystem paths and the special ":memory:" value are accepted.

Types

type Appliance

type Appliance struct {
	ID             uint `gorm:"primaryKey"`
	Name           string
	Brand          string
	ModelNumber    string
	SerialNumber   string
	PurchaseDate   *time.Time
	WarrantyExpiry *time.Time `gorm:"index"`
	Location       string
	CostCents      *int64
	Notes          string
	CreatedAt      time.Time
	UpdatedAt      time.Time
	DeletedAt      gorm.DeletedAt `gorm:"index"`
}

type ChatInput

type ChatInput struct {
	ID        uint   `gorm:"primaryKey"`
	Input     string `gorm:"not null"`
	CreatedAt time.Time
}

ChatInput stores a single chat prompt for cross-session history. Ordered by creation time, newest last.

type DeletionRecord

type DeletionRecord struct {
	ID         uint       `gorm:"primaryKey"`
	Entity     string     `gorm:"index:idx_entity_restored,priority:1"`
	TargetID   uint       `gorm:"index"`
	DeletedAt  time.Time  `gorm:"index"`
	RestoredAt *time.Time `gorm:"index:idx_entity_restored,priority:2"`
}

type Document

type Document struct {
	ID             uint `gorm:"primaryKey"`
	Title          string
	FileName       string `gorm:"column:file_name"`
	EntityKind     string `gorm:"index:idx_doc_entity"`
	EntityID       uint   `gorm:"index:idx_doc_entity"`
	MIMEType       string
	SizeBytes      int64
	ChecksumSHA256 string `gorm:"column:sha256"`
	Data           []byte
	Notes          string
	CreatedAt      time.Time
	UpdatedAt      time.Time
	DeletedAt      gorm.DeletedAt `gorm:"index"`
}

type HouseProfile

type HouseProfile struct {
	ID               uint `gorm:"primaryKey"`
	Nickname         string
	AddressLine1     string
	AddressLine2     string
	City             string
	State            string
	PostalCode       string
	YearBuilt        int
	SquareFeet       int
	LotSquareFeet    int
	Bedrooms         int
	Bathrooms        float64
	FoundationType   string
	WiringType       string
	RoofType         string
	ExteriorType     string
	HeatingType      string
	CoolingType      string
	WaterSource      string
	SewerType        string
	ParkingType      string
	BasementType     string
	InsuranceCarrier string
	InsurancePolicy  string
	InsuranceRenewal *time.Time
	PropertyTaxCents *int64
	HOAName          string
	HOAFeeCents      *int64
	CreatedAt        time.Time
	UpdatedAt        time.Time
}

type Incident

type Incident struct {
	ID           uint `gorm:"primaryKey"`
	Title        string
	Description  string
	Status       string
	Severity     string
	DateNoticed  time.Time
	DateResolved *time.Time
	Location     string
	CostCents    *int64
	ApplianceID  *uint     `gorm:"index"`
	Appliance    Appliance `gorm:"constraint:OnDelete:SET NULL;"`
	VendorID     *uint     `gorm:"index"`
	Vendor       Vendor    `gorm:"constraint:OnDelete:SET NULL;"`
	Notes        string
	CreatedAt    time.Time
	UpdatedAt    time.Time
	DeletedAt    gorm.DeletedAt `gorm:"index"`
}

type MaintenanceCategory

type MaintenanceCategory struct {
	ID        uint   `gorm:"primaryKey"`
	Name      string `gorm:"uniqueIndex"`
	CreatedAt time.Time
	UpdatedAt time.Time
}

type MaintenanceItem

type MaintenanceItem struct {
	ID             uint `gorm:"primaryKey"`
	Name           string
	CategoryID     uint                `gorm:"index"`
	Category       MaintenanceCategory `gorm:"constraint:OnDelete:RESTRICT;"`
	ApplianceID    *uint               `gorm:"index"`
	Appliance      Appliance           `gorm:"constraint:OnDelete:SET NULL;"`
	LastServicedAt *time.Time
	IntervalMonths int
	ManualURL      string
	ManualText     string
	Notes          string
	CostCents      *int64
	CreatedAt      time.Time
	UpdatedAt      time.Time
	DeletedAt      gorm.DeletedAt `gorm:"index"`
}

type PragmaColumn

type PragmaColumn struct {
	CID       int     `gorm:"column:cid"`
	Name      string  `gorm:"column:name"`
	Type      string  `gorm:"column:type"`
	NotNull   bool    `gorm:"column:notnull"`
	DfltValue *string `gorm:"column:dflt_value"`
	PK        int     `gorm:"column:pk"`
}

PragmaColumn mirrors the output of PRAGMA table_info.

type Project

type Project struct {
	ID            uint `gorm:"primaryKey"`
	Title         string
	ProjectTypeID uint
	ProjectType   ProjectType `gorm:"constraint:OnDelete:RESTRICT;"`
	Status        string
	Description   string
	StartDate     *time.Time
	EndDate       *time.Time
	BudgetCents   *int64
	ActualCents   *int64
	CreatedAt     time.Time
	UpdatedAt     time.Time
	DeletedAt     gorm.DeletedAt `gorm:"index"`
}

type ProjectType

type ProjectType struct {
	ID        uint   `gorm:"primaryKey"`
	Name      string `gorm:"uniqueIndex"`
	CreatedAt time.Time
	UpdatedAt time.Time
}

type Quote

type Quote struct {
	ID             uint    `gorm:"primaryKey"`
	ProjectID      uint    `gorm:"index"`
	Project        Project `gorm:"constraint:OnDelete:RESTRICT;"`
	VendorID       uint    `gorm:"index"`
	Vendor         Vendor  `gorm:"constraint:OnDelete:RESTRICT;"`
	TotalCents     int64
	LaborCents     *int64
	MaterialsCents *int64
	OtherCents     *int64
	ReceivedDate   *time.Time
	Notes          string
	CreatedAt      time.Time
	UpdatedAt      time.Time
	DeletedAt      gorm.DeletedAt `gorm:"index"`
}

type SeedSummary

type SeedSummary struct {
	Vendors     int
	Projects    int
	Quotes      int
	Appliances  int
	Maintenance int
	Incidents   int
	ServiceLogs int
	Documents   int
}

SeedSummary holds counts of generated entities for display after seeding.

type ServiceLogEntry

type ServiceLogEntry struct {
	ID                uint            `gorm:"primaryKey"`
	MaintenanceItemID uint            `gorm:"index"`
	MaintenanceItem   MaintenanceItem `gorm:"constraint:OnDelete:CASCADE;"`
	ServicedAt        time.Time
	VendorID          *uint  `gorm:"index"`
	Vendor            Vendor `gorm:"constraint:OnDelete:SET NULL;"`
	CostCents         *int64
	Notes             string
	CreatedAt         time.Time
	UpdatedAt         time.Time
	DeletedAt         gorm.DeletedAt `gorm:"index"`
}

type Setting

type Setting struct {
	Key       string `gorm:"primaryKey"`
	Value     string
	UpdatedAt time.Time
}

Setting is a simple key-value store for app preferences that persist across sessions (e.g. last-used LLM model). Stored in SQLite so a single "cp micasa.db backup.db" captures everything.

type Store

type Store struct {
	// contains filtered or unexported fields
}

func Open

func Open(path string) (*Store, error)

func (*Store) AppendChatInput

func (s *Store) AppendChatInput(input string) error

AppendChatInput adds a prompt to the persistent history, deduplicating consecutive repeats. Trims old entries beyond chatHistoryMax.

func (*Store) AutoMigrate

func (s *Store) AutoMigrate() error

func (*Store) Close

func (s *Store) Close() error

Close closes the underlying database connection.

func (*Store) ColumnHints

func (s *Store) ColumnHints() string

ColumnHints queries the database for distinct values in key columns and returns them as a formatted string suitable for inclusion in an LLM prompt. Returns empty string if no hints are available.

func (*Store) CountDocumentsByEntity

func (s *Store) CountDocumentsByEntity(
	entityKind string,
	entityIDs []uint,
) (map[uint]int, error)

CountDocumentsByEntity counts non-deleted documents grouped by entity_id where entity_kind matches. Uses a custom query because documents use two-column polymorphic keys that countByFK can't handle.

func (*Store) CountIncidentsByAppliance

func (s *Store) CountIncidentsByAppliance(applianceIDs []uint) (map[uint]int, error)

func (*Store) CountIncidentsByVendor

func (s *Store) CountIncidentsByVendor(vendorIDs []uint) (map[uint]int, error)

func (*Store) CountMaintenanceByAppliance

func (s *Store) CountMaintenanceByAppliance(applianceIDs []uint) (map[uint]int, error)

CountMaintenanceByAppliance returns the count of non-deleted maintenance items for each appliance ID.

func (*Store) CountQuotesByProject

func (s *Store) CountQuotesByProject(projectIDs []uint) (map[uint]int, error)

CountQuotesByProject returns the number of non-deleted quotes per project ID.

func (*Store) CountQuotesByVendor

func (s *Store) CountQuotesByVendor(vendorIDs []uint) (map[uint]int, error)

CountQuotesByVendor returns the number of non-deleted quotes per vendor ID.

func (*Store) CountServiceLogs

func (s *Store) CountServiceLogs(itemIDs []uint) (map[uint]int, error)

CountServiceLogs returns the number of non-deleted service log entries per maintenance item ID for the given set of IDs.

func (*Store) CountServiceLogsByVendor

func (s *Store) CountServiceLogsByVendor(vendorIDs []uint) (map[uint]int, error)

CountServiceLogsByVendor returns the number of non-deleted service log entries per vendor ID.

func (*Store) CreateAppliance

func (s *Store) CreateAppliance(item *Appliance) error

func (*Store) CreateDocument

func (s *Store) CreateDocument(doc *Document) error

func (*Store) CreateHouseProfile

func (s *Store) CreateHouseProfile(profile HouseProfile) error

func (*Store) CreateIncident

func (s *Store) CreateIncident(item *Incident) error

func (*Store) CreateMaintenance

func (s *Store) CreateMaintenance(item *MaintenanceItem) error

func (*Store) CreateProject

func (s *Store) CreateProject(project *Project) error

func (*Store) CreateQuote

func (s *Store) CreateQuote(quote *Quote, vendor Vendor) error

func (*Store) CreateServiceLog

func (s *Store) CreateServiceLog(entry *ServiceLogEntry, vendor Vendor) error

func (*Store) CreateVendor

func (s *Store) CreateVendor(vendor *Vendor) error

func (*Store) DataDump

func (s *Store) DataDump() string

DataDump exports every row of every user table as readable text, suitable for stuffing into an LLM context window. For a home-scale database this is small enough to fit comfortably.

Unlike ReadOnlyQuery this bypasses the row cap and keyword filter -- table names come from sqlite_master so the queries are fully trusted.

The output is optimized for small LLMs: null/empty values are omitted, money columns (ending in "_ct") are formatted as dollars, and internal columns (id, created_at, updated_at, deleted_at) are excluded to reduce noise.

func (*Store) DeleteAppliance

func (s *Store) DeleteAppliance(id uint) error

func (*Store) DeleteDocument

func (s *Store) DeleteDocument(id uint) error

func (*Store) DeleteIncident

func (s *Store) DeleteIncident(id uint) error

func (*Store) DeleteMaintenance

func (s *Store) DeleteMaintenance(id uint) error

func (*Store) DeleteProject

func (s *Store) DeleteProject(id uint) error

func (*Store) DeleteQuote

func (s *Store) DeleteQuote(id uint) error

func (*Store) DeleteServiceLog

func (s *Store) DeleteServiceLog(id uint) error

func (*Store) DeleteVendor

func (s *Store) DeleteVendor(id uint) error

func (*Store) ExtractDocument

func (s *Store) ExtractDocument(id uint) (string, error)

ExtractDocument writes the document's BLOB content to the XDG cache directory and returns the resulting filesystem path. If the cached file already exists and has the expected size, the extraction is skipped.

func (*Store) GetAppliance

func (s *Store) GetAppliance(id uint) (Appliance, error)

func (*Store) GetDocument

func (s *Store) GetDocument(id uint) (Document, error)

func (*Store) GetIncident

func (s *Store) GetIncident(id uint) (Incident, error)

func (*Store) GetLastModel

func (s *Store) GetLastModel() (string, error)

GetLastModel returns the persisted LLM model name, or "" if none.

func (*Store) GetMaintenance

func (s *Store) GetMaintenance(id uint) (MaintenanceItem, error)

func (*Store) GetProject

func (s *Store) GetProject(id uint) (Project, error)

func (*Store) GetQuote

func (s *Store) GetQuote(id uint) (Quote, error)

func (*Store) GetServiceLog

func (s *Store) GetServiceLog(id uint) (ServiceLogEntry, error)

func (*Store) GetSetting

func (s *Store) GetSetting(key string) (string, error)

GetSetting retrieves a setting by key. Returns ("", nil) if not found.

func (*Store) GetShowDashboard

func (s *Store) GetShowDashboard() (bool, error)

GetShowDashboard returns whether the dashboard should be shown on startup. Defaults to true when no preference has been saved.

func (*Store) GetVendor

func (s *Store) GetVendor(id uint) (Vendor, error)

func (*Store) HouseProfile

func (s *Store) HouseProfile() (HouseProfile, error)

func (*Store) LastDeletion

func (s *Store) LastDeletion(entity string) (DeletionRecord, error)

func (*Store) ListActiveProjects

func (s *Store) ListActiveProjects() ([]Project, error)

ListActiveProjects returns non-deleted projects with status "underway" or "delayed", preloading ProjectType.

func (*Store) ListAppliances

func (s *Store) ListAppliances(includeDeleted bool) ([]Appliance, error)

func (*Store) ListDocuments

func (s *Store) ListDocuments(includeDeleted bool) ([]Document, error)

func (*Store) ListDocumentsByEntity

func (s *Store) ListDocumentsByEntity(
	entityKind string,
	entityID uint,
	includeDeleted bool,
) ([]Document, error)

ListDocumentsByEntity returns documents scoped to a specific entity, excluding the BLOB data.

func (*Store) ListExpiringWarranties

func (s *Store) ListExpiringWarranties(
	now time.Time,
	lookBack, horizon time.Duration,
) ([]Appliance, error)

ListExpiringWarranties returns non-deleted appliances whose warranty expires between (now - lookBack) and (now + horizon).

func (*Store) ListIncidents

func (s *Store) ListIncidents(includeDeleted bool) ([]Incident, error)

func (*Store) ListMaintenance

func (s *Store) ListMaintenance(includeDeleted bool) ([]MaintenanceItem, error)

func (*Store) ListMaintenanceByAppliance

func (s *Store) ListMaintenanceByAppliance(
	applianceID uint,
	includeDeleted bool,
) ([]MaintenanceItem, error)

func (*Store) ListMaintenanceWithSchedule

func (s *Store) ListMaintenanceWithSchedule() ([]MaintenanceItem, error)

ListMaintenanceWithSchedule returns all non-deleted maintenance items that have a positive interval, preloading Category and Appliance. These are the items eligible for overdue/upcoming computation.

func (*Store) ListOpenIncidents

func (s *Store) ListOpenIncidents() ([]Incident, error)

ListOpenIncidents returns non-deleted incidents (open or in-progress), preloading Appliance and Vendor. Ordered by severity (urgent first) then most recently updated.

func (*Store) ListProjects

func (s *Store) ListProjects(includeDeleted bool) ([]Project, error)

func (*Store) ListQuotes

func (s *Store) ListQuotes(includeDeleted bool) ([]Quote, error)

func (*Store) ListQuotesByProject

func (s *Store) ListQuotesByProject(
	projectID uint,
	includeDeleted bool,
) ([]Quote, error)

ListQuotesByProject returns all quotes for a specific project.

func (*Store) ListQuotesByVendor

func (s *Store) ListQuotesByVendor(
	vendorID uint,
	includeDeleted bool,
) ([]Quote, error)

ListQuotesByVendor returns all quotes for a specific vendor.

func (*Store) ListRecentServiceLogs

func (s *Store) ListRecentServiceLogs(limit int) ([]ServiceLogEntry, error)

ListRecentServiceLogs returns the most recent service log entries across all maintenance items, preloading MaintenanceItem and Vendor.

func (*Store) ListServiceLog

func (s *Store) ListServiceLog(
	maintenanceItemID uint,
	includeDeleted bool,
) ([]ServiceLogEntry, error)

func (*Store) ListServiceLogsByVendor

func (s *Store) ListServiceLogsByVendor(
	vendorID uint,
	includeDeleted bool,
) ([]ServiceLogEntry, error)

ListServiceLogsByVendor returns all service log entries for a specific vendor.

func (*Store) ListVendors

func (s *Store) ListVendors(includeDeleted bool) ([]Vendor, error)

func (*Store) LoadChatHistory

func (s *Store) LoadChatHistory() ([]string, error)

LoadChatHistory returns all persisted chat inputs, oldest first.

func (*Store) MaintenanceCategories

func (s *Store) MaintenanceCategories() ([]MaintenanceCategory, error)

func (*Store) MaxDocumentSize

func (s *Store) MaxDocumentSize() int64

MaxDocumentSize returns the configured maximum file size for document imports.

func (*Store) ProjectTypes

func (s *Store) ProjectTypes() ([]ProjectType, error)

func (*Store) PutLastModel

func (s *Store) PutLastModel(model string) error

PutLastModel persists the LLM model name.

func (*Store) PutSetting

func (s *Store) PutSetting(key, value string) error

PutSetting upserts a setting.

func (*Store) PutShowDashboard

func (s *Store) PutShowDashboard(show bool) error

PutShowDashboard persists the user's dashboard visibility preference.

func (*Store) ReadOnlyQuery

func (s *Store) ReadOnlyQuery(query string) (columns []string, rows [][]string, err error)

ReadOnlyQuery executes a validated SELECT query and returns the results as string slices. Only SELECT statements are allowed; result rows are capped at maxQueryRows.

func (*Store) RestoreAppliance

func (s *Store) RestoreAppliance(id uint) error

func (*Store) RestoreDocument

func (s *Store) RestoreDocument(id uint) error

func (*Store) RestoreIncident

func (s *Store) RestoreIncident(id uint) error

func (*Store) RestoreMaintenance

func (s *Store) RestoreMaintenance(id uint) error

func (*Store) RestoreProject

func (s *Store) RestoreProject(id uint) error

func (*Store) RestoreQuote

func (s *Store) RestoreQuote(id uint) error

func (*Store) RestoreServiceLog

func (s *Store) RestoreServiceLog(id uint) error

func (*Store) RestoreVendor

func (s *Store) RestoreVendor(id uint) error

func (*Store) SeedDefaults

func (s *Store) SeedDefaults() error

func (*Store) SeedDemoData

func (s *Store) SeedDemoData() error

SeedDemoData populates the database with realistic demo data using a fixed seed so the demo always looks the same. Skips if data already exists.

func (*Store) SeedDemoDataFrom

func (s *Store) SeedDemoDataFrom(h *fake.HomeFaker) error

SeedDemoDataFrom populates the database with demo data generated by the given HomeFaker. Callers can pass different seeds for varied test data.

func (*Store) SeedScaledData

func (s *Store) SeedScaledData(years int) (SeedSummary, error)

SeedScaledData populates the database with years of simulated home ownership data using a fixed seed for deterministic output. Skips if data already exists.

func (*Store) SeedScaledDataFrom

func (s *Store) SeedScaledDataFrom(h *fake.HomeFaker, years int) (SeedSummary, error)

SeedScaledDataFrom populates the database with scaled demo data generated by the given HomeFaker. The years parameter controls how many years of simulated home ownership to generate.

func (*Store) SetMaxDocumentSize

func (s *Store) SetMaxDocumentSize(n int64) error

SetMaxDocumentSize overrides the maximum allowed file size for document imports. The value must be positive; invalid values are rejected.

func (*Store) TableColumns

func (s *Store) TableColumns(table string) ([]PragmaColumn, error)

TableColumns returns column metadata for the named table via PRAGMA. The table name is validated to contain only safe characters.

func (*Store) TableNames

func (s *Store) TableNames() ([]string, error)

TableNames returns the names of all non-internal tables in the database.

func (*Store) TotalProjectSpendCents

func (s *Store) TotalProjectSpendCents() (int64, error)

TotalProjectSpendCents returns the total actual spend across all non-deleted projects. Unlike service log entries (which have a serviced_at date), projects have no per-transaction date, so YTD filtering is not meaningful. The previous updated_at filter was incorrect: editing any project field (e.g. description) would cause its spend to appear/disappear from the total.

func (*Store) UpdateAppliance

func (s *Store) UpdateAppliance(item Appliance) error

func (*Store) UpdateDocument

func (s *Store) UpdateDocument(doc Document) error

UpdateDocument persists changes to a document. Entity linkage (EntityID, EntityKind) is always preserved -- callers must use a dedicated method to re-link a document. When Data is empty the existing BLOB and file metadata columns are also preserved, so metadata-only edits don't erase the file.

func (*Store) UpdateHouseProfile

func (s *Store) UpdateHouseProfile(profile HouseProfile) error

func (*Store) UpdateIncident

func (s *Store) UpdateIncident(item Incident) error

func (*Store) UpdateMaintenance

func (s *Store) UpdateMaintenance(item MaintenanceItem) error

func (*Store) UpdateProject

func (s *Store) UpdateProject(project Project) error

func (*Store) UpdateQuote

func (s *Store) UpdateQuote(quote Quote, vendor Vendor) error

func (*Store) UpdateServiceLog

func (s *Store) UpdateServiceLog(entry ServiceLogEntry, vendor Vendor) error

func (*Store) UpdateVendor

func (s *Store) UpdateVendor(vendor Vendor) error

func (*Store) YTDServiceSpendCents

func (s *Store) YTDServiceSpendCents(yearStart time.Time) (int64, error)

YTDServiceSpendCents returns the total cost of service log entries with ServicedAt on or after the given start-of-year.

type Vendor

type Vendor struct {
	ID          uint   `gorm:"primaryKey"`
	Name        string `gorm:"uniqueIndex"`
	ContactName string
	Email       string
	Phone       string
	Website     string
	Notes       string
	CreatedAt   time.Time
	UpdatedAt   time.Time
	DeletedAt   gorm.DeletedAt `gorm:"index"`
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL