benrnz / budgetanalyser Goto Github PK
View Code? Open in Web Editor NEWA monthly budget analyser. It helps you keep to a budget, see how much you can spend and analyse past data to improve your budget.
License: MIT License
A monthly budget analyser. It helps you keep to a budget, see how much you can spend and analyse past data to improve your budget.
License: MIT License
Weird error, not always reproducable, but seems to happen frequently enough to manifest once per session. Throws NullReferenceException in Application, and with null inner exception.
at System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary
2..ctor(IDictionary2 dictionary, IEqualityComparer
1 comparer)
at System.Windows.Controls.Primitives.Selector.InternalSelectedItemsStorage..ctor(InternalSelectedItemsStorage collection, IEqualityComparer`1 equalityComparer)
at System.Windows.Controls.Primitives.Selector.SelectionChanger.ApplyCanSelectMultiple()
at System.Windows.Controls.Primitives.Selector.SelectionChanger.End()
at System.Windows.Controls.Primitives.Selector.SetSelectedHelper(Object item, FrameworkElement UI, Boolean selected)
at System.Windows.Controls.Primitives.Selector.NotifyIsSelectedChanged(FrameworkElement container, Boolean selected, RoutedEventArgs e)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.Controls.ListBoxItem.OnSelected(RoutedEventArgs e)
at System.Windows.Controls.ListBoxItem.OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
at System.Windows.DependencyObject.SetCurrentValueInternal(DependencyProperty dp, Object value)
at System.Windows.Controls.ListBox.NotifyListItemClicked(ListBoxItem item, MouseButton mouseButton)
at System.Windows.Controls.ListBoxItem.OnMouseLeftButtonDown(MouseButtonEventArgs e)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
at System.Windows.Input.InputManager.ProcessStagingArea()
at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run()
at BudgetAnalyser.App.Main() in c:\Development\GitRepositories\BudgetAnalyserProject\Trunk\BudgetAnalyser\obj\Debug\App.g.cs:line 0
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Would be better to allocate a bucket to an account, and the whole bucket balance is stored in that account.
So that I can check rules are applied predictably.
I suspect rules are not applied in the order they are displayed. As the rules list grows, its going to be more important to know which rules are defunct or erroneous.
Convert remaining OS modal dialogs to inline scoped dialogs that only prevent local scoped features but not unrelated functions.
After budget change some time ago, this report isnt choosing the correct budget, its simply using the first.
Creating a new ledger book does not allow user to give it a name other than "LedgerBook1" and cannot choose storage location.
So that the actual balance of an account is calculatable.
After Transaction refactor some time ago, the dirty * flag isn't popping when changes are made.
Either always allow the top (most recent) ledger line to be always edited; or add a feature to unlock it.
Add events that optionally can be assigned a command line to run when they occur. Used for SVN or GIT commit when a Ledger, Budget, or Statement file is saved.
So that I can find trends in my spending.
The Saved Up For Expenses when graphed using the Spending Trend Analyser, only shows the monthly contribution to that expense ledger. Where as the actual balance of that SavedUpForExpense ledger will probably have a much higher balance that could be spent. Clothes expense is a good example.
On budget maintenance view adding a new income or expense to an existing long list doesn't show it.
So that I can confirm transactions I think should be there.
Need a means to search and highlight, maybe filter to show only matched transactions in the statement view. Possibly using simple search maybe also a regex. Simple search preferred to keep ensure usability.
So that I can ad-hoc analyse/total various buckets onto one form.
Change the Statement Budget Bucket filter to allow filtering by multiple buckets.
So it prevents accidental changes going unnoticed. There were some transactions in my data that somehow had their bucket assignments nulled sometime in Feb. I didn't notice until now.
The WPF controllers contain some logic mostly for Commands. This needs to be separated into services to allow reuse and easier testing.
The plan: Focus on segregating commands out of controllers into static classes, one per view (or maybe per area). The commands can stay RelayCommands, but should call services to action their behaviour. Controllers should morph over time to be nothing more than a view model with no model mutation other than data binding.
When changing the Date filter.
They only update on App restart.
Tool tip is updated ok.
So a single transaction can be split to go into two or more buckets.
So I can transfer longer term saved up for expenses into a savings or on-call interest earning account.
When adding a new rule, the new rule doesn't appear in the edit-rules-view until the app restarts.
So that the code is more efficient, elegant and easier to test.
This is more about elegant code from a coder's perspective than it is about performance from a user's perspective. Even with large statements (more than a year's worth of personal transactions greater than 1000 transactions) it is still a imperceptible delay. So not important for a user.
AnzAccountStatementImporterV1 and
AnzVisaStatementImporterV1
Currently only ANZ bank csv files are supported. This uses two specific implementations of IBankStatementImporter that are absolutely bound to ANZ - Visa and Chequing.
The most basic option is to write as many of these as are needed to support as many formats as necessary.
Or alternatively a new feature could be written to allow importing of any CSV file. A wizard will walk the user thru classifying or ignoring each column in the export file so it can be imported and converted.
This must also take into account overspent ledgers like Clothes for example. This will subtract from actual available surplus.
So that I can create my own and not have to rely on the hard coded widgets.
Also good from a code maintainers point of view, and will result in a reduction in code.
Create a home page "dashboard" with quick stats and info
Can't currently save the edit description when editing a transaction. No error, just not reflected in CSV and not updated in ListBox.
Change UI presentation to allow "tabbing" between the three main areas. This ties into the Home Page enhancement.
Add a tile showing which budget, transactions, and ledgerbook files are currently open.
Consider changing the validation to use the standard annotations
This happens after changing the Bucket for a transaction.
Then selecting another row, then the original one again, then a different one.
Happens as a result of the editted transaction row changing its hash after the edit. The Transaction class has overriden GetHashCode.
http://stackoverflow.com/questions/15365905/listbox-loses-the-ability-to-change-selecteditem-when-selecteditem-data-is-modif
So that I can see how much has been spent per bucket category for that period.
Add a optional non-default button to group by budget bucket. Most likely an itemscontrol of itemscontrols.
There is a large number of dependencies on the static class MessagingGateway. I'd prefer this to Dependency Injected. It could be included in UIContext.
Apply a bucket filter on transaction page. Then change date filter on dashboard, transactions now show new date range but bucket filter is ignored and reset back to show all and filter combo is not.
BucketFilter Drop Down List on Transactions view.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.