Skip to content

"Fees" doctype references non-existent income_account field on "Fee Structure", causing OperationalError(1054) on Fees creation #439

Description

@sato-sama-dono

Repository: https://github.com/frappe/education

Version: education v16.0.1

Component: Fees doctype

Description

fees.json declares an income_account field with fetch_from: fee_structure.income_account:

// education/education/doctype/fees/fees.json
{
  "fetch_from": "fee_structure.income_account",
  "fieldname": "income_account",
  "fieldtype": "Link",
  "label": "Income Account",
  "options": "Account",
  "print_hide": 1
} 

However, fee_structure.json has no income_account field. Its only account-related fields are receivable_account and an accounts child table:

// education/education/doctype/fee_structure/fee_structure.json
// Fields: naming_series, program, student_category, academic_term, academic_year,
//         components, total_amount, accounts, receivable_account, cost_center, company, ...
// → no income_account field anywhere

Because the DB column for income_account is never created on tabFee Structure, any attempt to create a Fees record fails with:

OperationalError: (1054, "Unknown column 'income_account' in 'SELECT'")

This makes the Fees doctype completely unusable.

Steps to Reproduce

Install education v16.0.1 on a fresh ERPNext site
Create a Fee Structure (fills in successfully, no income_account field visible)
Create a Fees record linking to that Fee Structure
→ OperationalError(1054, "Unknown column 'income_account' in 'SELECT'") is raised

Root Cause

fees.json was updated to add income_account with a fetch_from pointing to fee_structure.income_account, but the corresponding field was never added to fee_structure.json. The DB column therefore doesn't exist on tabFee Structure.

Additionally, fees.py references self.income_account in the validate() method and in the GL entry construction, so the field is load-bearing — not cosmetic.

Expected Behavior

Either:

Option A: Add income_account (Link → Account) to Fee Structure so the fetch works, or
Option B: Remove the fetch_from from fees.json and let income_account be set manually on the Fees record (as fees.py already has a fallback to default_income_account from Company settings)

Environment

Education app: v16.0.1
Frappe/ERPNext: v16 branch

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions