Giter Club home page Giter Club logo

red-inventory-management's Introduction

Program features

Setup database connection

The program connects to a database file with ".mdf" extension using MS SQL LocalDB. Microsoft SQL Server 2014 Express LocalDB is set as prerequisite in the Setup project, but the program works with other versions of LocalDb as well. When the application starts first time, a small window pops up and you have to create a new database file, or connect to an existing one. You can't use the program without database connection. The program automatically stores the path of the database folder and the name of the database file in the DatabaseSettings.txt file in the application folder. You can change the database connection settings under the Settings => Database menu.

Login

The program stores usernames and passwords in the "Users" table, and the passwords are encrypted with salted SHA-256 hashing. If the "Users" table is empty at the start of the program, a small window pops up, and you have to add the first user to the database. If there is at least one user in the "Users" table, you can enter the username and the password in the login window. You can Add/Modify/Remove users under the Settings => Users menu.

Notifications

The program sends messages to the user via Notifications in the top right corner of the screen. The notifications are based on this GitHub project

Program log

The program uses log4net to log it's behaviour into the RedLog.txt file. To see more detailed debug information, open the programs config file, and <-- comment --> the filter section from the log4net appender tags.

Tables

Every table builds up in a similar way in the program with the same features. You can Add/Edit/Delete:

  • Products
  • Partners
  • Incoming transactions
  • Outgoing transactions
  • Users

If you Add/Edit a record a smaller window pops up in the center of the screen. You can change the details of the record, and you can save or cancel the changes with the two button at the bottom of the window.

Lists

Inventory list

  • This list shows every product's stock quantities. If you select a product, and press the "Quantity details" button above the list, a new window pops up, that lists every transaction, that affected the product's stock quantity.

Partner transactions

  • This list shows every partner's total money transactions. If you select a partner, and press the "partner transactions" button above the list, a new window pops up, that lists every money transaction with that partner.

Program structure

Entity Layer

The Entity Layer contains the classes responsible for the structure of the database tables, and the structure of the lists passed between the layers.

Datatable Entities

  • PartnerEntity class
  • ProductCategoryEntity class
  • ProductEntity class
  • TransactionBodyEntity class
  • TransactionHeadEntity class
  • UserEntity class

List Entities

  • ProductListEntity class
  • TransactionBodyListEntity class
  • TransactionHeadListEntity class

Data Layer

The Data Layer contains the classes responsible for the Database connection, and the data provider classes responsible for the consistent database state.

Database connection

  • InventoryContext class
    • Database context for the Inventory database.
    • Derived from the Entity Framework's System.Data.Entity.DbContext class.
  • DatabaseConnection class
    • Generates and holds the connectionstring to the mdf file.
    • Uses Entity Framework to connect to the MS SQL LocalDB.
    • Can create a database file if the file does not exists.
    • Automatically migrates database to the latest version after connecting to it.
    • Contains template "linq to sql" database manipulation functions, that can be used in the data provider classes

Data providers

  • PartnerProvider class
  • ProductCategoryProvider class
  • ProductProvider class
  • TransactionProvider class
  • UsersProvider class

Business Layer

The classes in the Business Layer are providing services used by the UI Layer and connecting the Data Layer and the UI Layer.

  • DatabaseConnection class
    • Reads the default setting from the "DatabaseSettings.txt" and tries to connect to the default file when TestConnection() is called.
    • Connects the DatabaseConnection class in the Data Layer with the UI Layer.
  • UserLogin class
    • Handles user authentication, and holds the last logged in user's ID.
    • Connects the UsersProvider class in the Data Layer with the UI Layer
  • ManagePartners class
    • Connects the PartnerProvider class in the Data Layer with the UI Layer
  • ManageProducts class
    • Connects the ProductCategoryProvider and ProductProvider classes in the Data Layer with the UI Layer
  • ManageTransactions class
    • Connects the TransactionProvider class in the Data Layer with the UI Layer

UI Layer

The UI Layer was made by using MVVM pattern.

Setup database connection UI

  • ViewModel: SetupConnectionViewModel
  • View:
    • SetupConnectionWindow (Called from MainWindowViewModel constructor)
    • SetupConnectionMenuView (Called from Settings => Database)
    • SetupConnectionView

Login UI

  • New User
    • ViewModel: NewUserViewModel
    • View: NewUserWindow (Called from MainWindowViewModel constructor and Settings => Users table)
  • Edit User
    • ViewModel: EditUserViewModel
    • View: EditUserWindow (Called from Settings => Users table)
  • Login
    • ViewModel: LoginViewModel
    • View: LoginWindow (Called from MainWindowViewModel constructor)

Main window UI

  • ViewModel: MainWindowViewModel
  • View: MainWindow

Tables UI

  • View: TableView
    • Every table uses the same view, which contains the basic table features: Title, New-, Edit- and Delete-button
    • The middle of the view is a ContentControl, that shows different views based on the different ViewModels
  • Model: TableModel<Entity> (derived from ListModel<Entity>)
    • This is the base class of every TableViewModel class, and it implements everything that connects the viewmodel with the TableView, except 4 abstract function, that has to be implemented in the derived classes:
      • NewItem()
      • EditItem()
      • DeleteItem()
      • RefreshList()
  • Partners table
    • ViewModel: PartnersViewModel (derived from TableModel<PartnerEntity>)
    • View: PartnersTableView (in the ContentControl of TableView)
  • Product categories table
    • ViewModel: ProductCategoriesViewModel (derived from TableModel<ProductCategoryEntity>)
    • View: ProductCategoriesTableView (in the ContentControl of TableView)
  • Products table
    • ViewModel: ProductsViewModel (derived from TableModel<ProductListEntity>)
    • View: ProductsTableView (in the ContentControl of TableView)
  • Transactions table
    • ViewModel: TransactionsViewModel (derived from TableModel<TransactionHeadListEntity>)
    • View: TransactionsTableView (in the ContentControl of TableView)
  • Users table
    • ViewModel: UsersViewModel (derived from TableModel<UserEntity>)
    • View: UsersTableView (in the ContentControl of TableView)
Add/Edit table-records
  • View: EditItemWindow
    • Every table uses the same edit view. A Window pops up in the middle of the screen with a(n) ADD/Save button and a Cancel Button at the bottom of the window.
    • The middle of the view is a ContentControl, that shows different views based on the different ViewModels
  • Model: EditItemModel<Entity>
    • This is the base class of every Edit*ViewModel class, and it implements everything that connects the viewmodel with the EditItemWindow, except one logical abstract function, that has to be implemented in the derived classes:
      • Save()
  • Add/Edit partner
    • ViewModel: EditPartnerViewModel (derived from EditItemModel<PartnerEntity>)
    • View: EditPartnerView (in the ContentControl of EditItemWindow)
  • Add/Edit product category
    • ViewModel: EditProductCategoryViewModel (derived from EditItemModel<ProductCategoryEntity>)
    • View: EditProductCategoryView (in the ContentControl of EditItemWindow)
  • Add/Edit product
    • ViewModel: EditProductViewModel (derived from EditItemModel<ProductListEntity>)
    • View: EditProductView (in the ContentControl of EditItemWindow)
  • Add/Edit transaction
    • ViewModel: EditTransactionViewModel (derived from EditItemModel<TransactionHeadListEntity>)
    • View: EditTransactionView (in the ContentControl of EditItemWindow)
  • Add/Edit user
    • Adding and editing users are handled by the Login UI

Lists UI

  • View: ListView
    • Every list uses the same view.
    • The middle of the view is a ContentControl, that shows different views based on the different ViewModels
  • Model: ListModel<Entity>
    • This is the base class of every ListViewModel class and DetailsViewModel class, and it implements everything that connects the viewmodel with the ListView, except one abstract function, that has to be implemented in the derived classes:
      • RefreshList()
  • Inventory list
    • ViewModel: InventoryViewModel (derived from ListModel<TransactionBodyListEntity>)
    • View: InventoryListView (in the ContentControl of ListView)
  • Partner transactions list
    • ViewModel: PartnerTransactionsViewModel (derived from ListModel<TransactionHeadListEntity>)
    • View: PartnerTransactionsListView (in the ContentControl of ListView)
Details list
  • View: ListDetailsWindow
    • Every details list uses the same view.
    • The middle of the view is a ContentControl, that shows different views based on the different ViewModels
  • Inventory details list
    • ViewModel: InventoryDetailsViewModel (derived from ListModel<TransactionHeadListEntity>)
    • View: InventoryListDetailsView (in the ContentControl of ListDetailsWindow)
  • Partner transaction details list
    • ViewModel: PartnerTransactionsDetailsViewModel (derived from ListModel<TransactionHeadListEntity>)
    • View: PartnerTransactionsListDetailsView (in the ContentControl of ListDetailsWindow)

red-inventory-management's People

Contributors

arpadgbondor avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.