package database import ( "Portifolio/internal/model" "database/sql" "fmt" "time" _ "github.com/mattn/go-sqlite3" ) func GetCategoryByID(db *sql.DB, companyID int, ID int) (*model.RevenueCategory, error) { var rc model.RevenueCategory err := db.QueryRow( `SELECT id, company_id, parent_id, name FROM category WHERE company_id = ? AND id = ?`, companyID, ID, ).Scan(&rc.ID, &rc.CompanyID, &rc.ParentID, &rc.Name) if err == sql.ErrNoRows { return &rc, fmt.Errorf("category %q not found for company %d", ID, companyID) } if err != nil { return &rc, fmt.Errorf("get category by name: %w", err) } return &rc, nil } 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 } 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 }