data

package
v1.29.5 Latest Latest
Warning

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

Go to latest
Published: Feb 17, 2026 License: Apache-2.0 Imports: 18 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"
)
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"
)

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

View Source
const (
	DocumentEntityNone        = ""
	DocumentEntityProject     = "project"
	DocumentEntityQuote       = "quote"
	DocumentEntityMaintenance = "maintenance"
	DocumentEntityAppliance   = "appliance"
	DocumentEntityServiceLog  = "service_log"
	DocumentEntityVendor      = "vendor"
)

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")
)

Functions

func AddMonths added in v1.29.0

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 added in v1.27.0

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 added in v1.29.0

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 added in v1.17.0

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 added in v1.17.0

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 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 added in v1.27.0

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 added in v1.10.1

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 added in v1.22.0

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 added in v1.27.0

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 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 added in v1.22.0

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
	PreferredVendorID *uint
	PreferredVendor   Vendor `gorm:"constraint:OnDelete:SET NULL;"`
	CreatedAt         time.Time
	UpdatedAt         time.Time
	DeletedAt         gorm.DeletedAt `gorm:"index"`
}

type ProjectType

type ProjectType struct {
	ID          uint   `gorm:"primaryKey"`
	Name        string `gorm:"uniqueIndex"`
	Description string
	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 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 added in v1.22.0

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 added in v1.22.0

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 added in v1.22.0

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 added in v1.27.0

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) 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 added in v1.18.0

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

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

func (*Store) CountQuotesByVendor added in v1.6.0

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 added in v1.6.0

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 added in v1.27.0

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

func (*Store) CreateHouseProfile

func (s *Store) CreateHouseProfile(profile HouseProfile) 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 added in v1.6.0

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

func (*Store) DataDump added in v1.22.0

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 added in v1.27.0

func (s *Store) DeleteDocument(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 added in v1.11.0

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

func (*Store) ExtractDocument added in v1.27.0

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 added in v1.27.0

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

func (*Store) GetLastModel added in v1.22.0

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 added in v1.22.0

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

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

func (*Store) GetShowDashboard added in v1.24.0

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 added in v1.6.0

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 added in v1.27.0

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

func (*Store) ListDocumentsByEntity added in v1.27.0

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) 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) ListProjects

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

func (*Store) ListQuotes

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

func (*Store) ListQuotesByProject added in v1.18.0

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

ListQuotesByProject returns all quotes for a specific project.

func (*Store) ListQuotesByVendor added in v1.18.0

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 added in v1.18.0

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 added in v1.22.0

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 added in v1.29.0

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 added in v1.22.0

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

PutLastModel persists the LLM model name.

func (*Store) PutSetting added in v1.22.0

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

PutSetting upserts a setting.

func (*Store) PutShowDashboard added in v1.24.0

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

PutShowDashboard persists the user's dashboard visibility preference.

func (*Store) ReadOnlyQuery added in v1.22.0

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 added in v1.27.0

func (s *Store) RestoreDocument(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 added in v1.11.0

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 added in v1.10.0

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) SetMaxDocumentSize added in v1.27.0

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 added in v1.22.0

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 added in v1.22.0

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

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

func (*Store) TotalProjectSpendCents added in v1.29.0

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 added in v1.27.0

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

UpdateDocument persists changes to a document. When Data is empty the existing BLOB and file metadata columns are preserved, so callers that only modify Title/Notes/EntityKind don't accidentally erase the file.

func (*Store) UpdateHouseProfile

func (s *Store) UpdateHouseProfile(profile HouseProfile) 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 added in v1.6.0

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