#ifndef CASHFLOW_H #define CASHFLOW_H #include #include #include #include #include #include #include #include #include "database.h" #include "transaction.h" QT_BEGIN_NAMESPACE namespace Ui { class CashFlow; } QT_END_NAMESPACE class CashFlow : public QMainWindow { Q_OBJECT public: CashFlow(QWidget *parent = nullptr, const QString &filePath = QString()); ~CashFlow(); protected: void keyPressEvent(QKeyEvent *event) override; bool eventFilter(QObject *watched, QEvent *event) override; private slots: void onDateRangeChanged(); void onTransactionSelected(); void onSaveTransaction(); void onNewTransaction(); void onDeleteTransaction(); void onRecurringSelected(); void onSaveRecurring(); void onNewRecurring(); void onDeleteRecurring(); void onPeriodChanged(); void onNewFile(); void onOpenFile(); void onSaveAs(); void onExportCSV(); void onQuit(); void onPreferences(); void onRecurringRuleChanged(); void onTransactionDateChanged(); void onCreateAdjustment(); void onSearchTextChanged(); void onCollapseAll(); void onExpandAll(); void onJumpToToday(); void onTransactionTableDoubleClicked(int row, int column); void onImportCSV(); private: enum PeriodType { Daily, Weekly, Monthly, Quarterly }; Ui::CashFlow *ui; Database *database; int currentTransactionId; int currentRecurringId; double startingBalance; QFont currentAmountFont; int weekStartDay; QString currentFilePath; QMap> collapsedPeriods; // Track which period end rows are collapsed per period type QChartView *chartView; QChart *chart; void setupConnections(); void refreshView(); void refreshTransactionTable(); void refreshRecurringTable(); void refreshCharts(); void calculateAndDisplayBalance(); QList getAllTransactionsInRange(); void clearTransactionEntry(); void loadTransactionToEntry(const Transaction &t); void clearRecurringEntry(); void loadRecurringToEntry(const RecurringRule &r); QDate getPeriodEnd(const QDate &date, PeriodType periodType); QDate getPeriodStart(const QDate &date, PeriodType periodType); QString getPeriodLabel(const QDate &date, PeriodType periodType, int count); void insertPeriodEndRow(const QString &label, double balance, const QMap &accountBalances, int periodId); void updateAmountColors(); void loadSettings(); QString formatCurrency(double amount) const; double calculateBalanceUpTo(const QDate &date, const QString &account); void recalculateAllReconciliations(); bool openDatabase(const QString &filePath); void populateRecurringRulesCombo(); void updateOccurrenceKey(); QString generateOccurrenceKey(const QDate &date, RecurrenceFrequency frequency) const; void jumpToDateInTable(const QDate &date); }; #endif // CASHFLOW_H