new rev sys
This commit is contained in:
@@ -11,9 +11,9 @@ import (
|
||||
func InitDB(db *sql.DB) {
|
||||
schema := `
|
||||
CREATE TABLE IF NOT EXISTS currencies (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
code TEXT NOT NULL UNIQUE,
|
||||
name TEXT NOT NULL
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
code TEXT NOT NULL UNIQUE,
|
||||
name TEXT NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS companies (
|
||||
@@ -35,46 +35,28 @@ func InitDB(db *sql.DB) {
|
||||
UNIQUE(type, year, idx)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS revenue_reports (
|
||||
CREATE TABLE IF NOT EXISTS category (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
company_id INTEGER NOT NULL,
|
||||
period_id INTEGER NOT NULL,
|
||||
parent_id INTEGER,
|
||||
name TEXT NOT NULL,
|
||||
FOREIGN KEY (company_id) REFERENCES companies(id),
|
||||
FOREIGN KEY (period_id) REFERENCES periods(id),
|
||||
UNIQUE(company_id, period_id)
|
||||
FOREIGN KEY (parent_id) REFERENCES category(id),
|
||||
UNIQUE(company_id, name)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS revenue_entries (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
report_id INTEGER NOT NULL,
|
||||
company_id INTEGER NOT NULL,
|
||||
currency_id INTEGER NOT NULL,
|
||||
category TEXT NOT NULL CHECK(category IN ('product', 'location', 'total')),
|
||||
label TEXT NOT NULL,
|
||||
category_id INTEGER NOT NULL,
|
||||
period_id INTEGER NOT NULL,
|
||||
value REAL NOT NULL,
|
||||
FOREIGN KEY (report_id) REFERENCES revenue_reports(id),
|
||||
FOREIGN KEY (currency_id) REFERENCES currencies(id)
|
||||
);
|
||||
|
||||
-- one row per category type per company
|
||||
-- e.g. Apple has "product" and "location"
|
||||
CREATE TABLE IF NOT EXISTS category_defs (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
company_id INTEGER NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
FOREIGN KEY (company_id) REFERENCES companies(id),
|
||||
UNIQUE(company_id, name)
|
||||
);
|
||||
|
||||
-- the actual labels belonging to each category
|
||||
-- e.g. category_def "product" → "iPhone", "Mac", "Services"
|
||||
CREATE TABLE IF NOT EXISTS category_labels (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
category_def_id INTEGER NOT NULL,
|
||||
label TEXT NOT NULL,
|
||||
FOREIGN KEY (category_def_id) REFERENCES category_defs(id),
|
||||
UNIQUE(category_def_id, label)
|
||||
);
|
||||
`
|
||||
FOREIGN KEY (company_id) REFERENCES companies(id),
|
||||
FOREIGN KEY (currency_id) REFERENCES currencies(id),
|
||||
FOREIGN KEY (category_id) REFERENCES category(id),
|
||||
FOREIGN KEY (period_id) REFERENCES periods(id)
|
||||
);`
|
||||
|
||||
if _, err := db.Exec(schema); err != nil {
|
||||
log.Fatal("Failed to create tables:", err)
|
||||
|
||||
43
internal/database/revenue.go
Normal file
43
internal/database/revenue.go
Normal file
@@ -0,0 +1,43 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"Portifolio/internal/model"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
)
|
||||
|
||||
func GetCategoryByName(db *sql.DB, companyID int, name string) (model.RevenueCategory, error) {
|
||||
var rc model.RevenueCategory
|
||||
err := db.QueryRow(
|
||||
`SELECT id, company_id, parent_id, name FROM category WHERE company_id = ? AND name = ?`,
|
||||
companyID, name,
|
||||
).Scan(&rc.ID, &rc.CompanyID, &rc.ParentID, &rc.Name)
|
||||
if err == sql.ErrNoRows {
|
||||
return rc, fmt.Errorf("category %q not found for company %d", name, companyID)
|
||||
}
|
||||
if err != nil {
|
||||
return rc, fmt.Errorf("get category by name: %w", err)
|
||||
}
|
||||
return rc, nil
|
||||
}
|
||||
|
||||
func GetPeriodByID(db *sql.DB, periodID int) (model.Period, error) {
|
||||
var p model.Period
|
||||
var start, end string
|
||||
err := db.QueryRow(
|
||||
`SELECT type, year, idx, start_date, end_date FROM periods WHERE id = ?`,
|
||||
periodID,
|
||||
).Scan(&p.Type, &p.Year, &p.Index, &start, &end)
|
||||
if err == sql.ErrNoRows {
|
||||
return p, fmt.Errorf("period %d not found", periodID)
|
||||
}
|
||||
if err != nil {
|
||||
return p, fmt.Errorf("get period by id: %w", err)
|
||||
}
|
||||
p.Start, _ = time.Parse("2006-01-02", start)
|
||||
p.End, _ = time.Parse("2006-01-02", end)
|
||||
return p, nil
|
||||
}
|
||||
Reference in New Issue
Block a user