new revenue getters
This commit is contained in:
@@ -55,7 +55,8 @@ func InitDB(db *sql.DB) {
|
||||
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)
|
||||
FOREIGN KEY (period_id) REFERENCES periods(id),
|
||||
UNIQUE(company_id, category_id, period_id)
|
||||
);`
|
||||
|
||||
if _, err := db.Exec(schema); err != nil {
|
||||
@@ -63,3 +64,37 @@ func InitDB(db *sql.DB) {
|
||||
}
|
||||
fmt.Println("Tables ready")
|
||||
}
|
||||
|
||||
func MigrateAddUniqueToRevenueEntries(db *sql.DB) error {
|
||||
steps := []string{
|
||||
// 1. copy existing data into a temp table with the new constraint
|
||||
`CREATE TABLE IF NOT EXISTS revenue_entries_new (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
company_id INTEGER NOT NULL,
|
||||
currency_id INTEGER NOT NULL,
|
||||
category_id INTEGER NOT NULL,
|
||||
period_id INTEGER NOT NULL,
|
||||
value REAL NOT NULL,
|
||||
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),
|
||||
UNIQUE(company_id, category_id, period_id)
|
||||
)`,
|
||||
// 2. copy data over
|
||||
`INSERT OR IGNORE INTO revenue_entries_new
|
||||
SELECT id, company_id, currency_id, category_id, period_id, value
|
||||
FROM revenue_entries`,
|
||||
// 3. drop old table
|
||||
`DROP TABLE revenue_entries`,
|
||||
// 4. rename new table
|
||||
`ALTER TABLE revenue_entries_new RENAME TO revenue_entries`,
|
||||
}
|
||||
|
||||
for _, step := range steps {
|
||||
if _, err := db.Exec(step); err != nil {
|
||||
return fmt.Errorf("migration failed: %w", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -57,3 +57,59 @@ func GetPeriodByID(db *sql.DB, periodID int) (model.Period, error) {
|
||||
p.End, _ = time.Parse("2006-01-02", end)
|
||||
return p, nil
|
||||
}
|
||||
|
||||
func GetRevenueByPeriod(db *sql.DB, companyID int, periodID int) ([]model.Revenue, error) {
|
||||
rows, err := db.Query(
|
||||
`SELECT id, company_id, currency_id, period_id, value FROM revenue_entries WHERE company_id = ? AND period_id = ?`,
|
||||
companyID, periodID,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("query revenue by period: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var revenues []model.Revenue
|
||||
for rows.Next() {
|
||||
var rc model.Revenue
|
||||
if err := rows.Scan(&rc.ID, &rc.Company, &rc.Currency, &rc.Period, &rc.Value); err != nil {
|
||||
return nil, fmt.Errorf("scan revenue row: %w", err)
|
||||
}
|
||||
revenues = append(revenues, rc)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, fmt.Errorf("iterate revenue rows: %w", err)
|
||||
}
|
||||
if len(revenues) == 0 {
|
||||
return nil, fmt.Errorf("revenue by company %d and period_id %d not found", companyID, periodID)
|
||||
}
|
||||
|
||||
return revenues, nil
|
||||
}
|
||||
|
||||
func GetRevenueByCategory(db *sql.DB, companyID int, categoryID int) ([]model.Revenue, error) {
|
||||
rows, err := db.Query(
|
||||
`SELECT id, company_id, currency_id, category_id, value FROM revenue_entries WHERE company_id = ? AND category_id = ?`,
|
||||
companyID, categoryID,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("query revenue by category: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var revenues []model.Revenue
|
||||
for rows.Next() {
|
||||
var rc model.Revenue
|
||||
if err := rows.Scan(&rc.ID, &rc.Company, &rc.Currency, &rc.Category, &rc.Value); err != nil {
|
||||
return nil, fmt.Errorf("scan revenue row: %w", err)
|
||||
}
|
||||
revenues = append(revenues, rc)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, fmt.Errorf("iterate revenue rows: %w", err)
|
||||
}
|
||||
if len(revenues) == 0 {
|
||||
return nil, fmt.Errorf("revenue by company %d and category_id %d not found", companyID, categoryID)
|
||||
}
|
||||
|
||||
return revenues, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user