package database import ( "billit/internal/models" "database/sql" ) // CreateProduct inserts a new product for a user func (s *service) CreateProduct(p models.Product, userID string) error { _, err := s.db.Exec(` INSERT INTO products (sku, name, hsn_code, base_price, wholesale_price, gst_rate, small_order_qty, small_order_fee, unit, user_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) `, p.SKU, p.Name, p.HSNCode, p.BasePrice, p.WholesalePrice, p.GSTRate, p.SmallOrderQty, p.SmallOrderFee, p.Unit, userID) return err } // UpdateProduct updates an existing product for a user func (s *service) UpdateProduct(p models.Product, userID string) error { _, err := s.db.Exec(` UPDATE products SET name=?, hsn_code=?, base_price=?, wholesale_price=?, gst_rate=?, small_order_qty=?, small_order_fee=?, unit=? WHERE sku=? AND user_id=? `, p.Name, p.HSNCode, p.BasePrice, p.WholesalePrice, p.GSTRate, p.SmallOrderQty, p.SmallOrderFee, p.Unit, p.SKU, userID) return err } // GetAllProducts returns all products for a user func (s *service) GetAllProducts(userID string) ([]models.Product, error) { rows, err := s.db.Query(`SELECT sku, name, hsn_code, base_price, wholesale_price, gst_rate, small_order_qty, small_order_fee, unit, user_id, created_at FROM products WHERE user_id=? ORDER BY name`, userID) if err != nil { return nil, err } defer rows.Close() var products []models.Product for rows.Next() { var p models.Product if err := rows.Scan(&p.SKU, &p.Name, &p.HSNCode, &p.BasePrice, &p.WholesalePrice, &p.GSTRate, &p.SmallOrderQty, &p.SmallOrderFee, &p.Unit, &p.UserID, &p.CreatedAt); err != nil { return nil, err } products = append(products, p) } return products, nil } // GetProductBySKU returns a single product by SKU for a user func (s *service) GetProductBySKU(sku string, userID string) (*models.Product, error) { var p models.Product err := s.db.QueryRow(`SELECT sku, name, hsn_code, base_price, wholesale_price, gst_rate, small_order_qty, small_order_fee, unit, user_id, created_at FROM products WHERE sku=? AND user_id=?`, sku, userID). Scan(&p.SKU, &p.Name, &p.HSNCode, &p.BasePrice, &p.WholesalePrice, &p.GSTRate, &p.SmallOrderQty, &p.SmallOrderFee, &p.Unit, &p.UserID, &p.CreatedAt) if err == sql.ErrNoRows { return nil, nil } if err != nil { return nil, err } return &p, nil } // DeleteProduct removes a product by SKU for a user func (s *service) DeleteProduct(sku string, userID string) error { _, err := s.db.Exec(`DELETE FROM products WHERE sku=? AND user_id=?`, sku, userID) return err } // GetRecentProducts returns the most recently added products for a user func (s *service) GetRecentProducts(userID string, limit int) ([]models.Product, error) { rows, err := s.db.Query(`SELECT sku, name, hsn_code, base_price, wholesale_price, gst_rate, small_order_qty, small_order_fee, unit, user_id, created_at FROM products WHERE user_id=? ORDER BY created_at DESC LIMIT ?`, userID, limit) if err != nil { return nil, err } defer rows.Close() var products []models.Product for rows.Next() { var p models.Product if err := rows.Scan(&p.SKU, &p.Name, &p.HSNCode, &p.BasePrice, &p.WholesalePrice, &p.GSTRate, &p.SmallOrderQty, &p.SmallOrderFee, &p.Unit, &p.UserID, &p.CreatedAt); err != nil { return nil, err } products = append(products, p) } return products, nil }