School Management and Accounting Software

[![Build Status](]( [![Linux](]( [![Code Climate](]( [![Latest release](]( [![ shield](]( [![Join the chat at](]( We like to challenge the quality of what we build to make it better. To do so, we try to make the product intuitive, beautiful, and user friendly. Innovation and hard work help to fulfill these requirements. I believe in order to innovate we need to think differently. A few months ago I discovered there was no open source free school management software that met my quality standards. I happen to know a bit of programming so I decided to make one. I also believe that working with more people can push the standard higher than working alone. So I decided to make it open source and free. ## Featured on Laravel News !! ![Screenshot_2019-04-07 Laravel News]( See the news [here]( ## Framework used - Laravel 7.X - Bootstrap 3.3.7 ## Server Requirements - PHP >= 7.3 - OpenSSL PHP Extension - PDO PHP Extension - Mbstring PHP Extension - Tokenizer PHP Extension - XML PHP Extension ## Table of Contents - [Features]( - [What's New]( - [Framework used]( - [Server Requirements]( - [How to Start (Installation)]( - [Using Docker Container]( - [Not using a Container]( - [Video Tutorial]( - [Optional]( - [Testing]( - [Stripe setup]( - [Create a school and an admin]( - [Manage a school]( - [Basic Steps by Serial]( - [Manage Exam (In exam manage page) by Admin]( - [Manage GPA and Grade]( - [Good to know]( - [Screenshots]( ## Contribute Unifiedtransform is 100% open source and free forever!! Community contribution can make this product better!! See [Contribution guideline]( before making any Pull request. When you contribute to a Github project you agree with this terms of [Github Terms of Service(Contributions Under Repository License)]( Since this project is under **GNU General Public License v3.0**, according to Github's Terms of Service all your contributions are also under the same license terms. Thus you permit the user of this software to use your contribution under the terms of **GNU General Public License v3.0**. ### Contributors Hall of Fame [![](]([![](]([![](]([![](]([![](]([![](]([![](]([![](]( ## Testing - We want testable softwares. Most parts of the software are covered by tests. You also can contribute by writing test case! - To run Feature and Unit Tests use `./vendor/bin/phpunit`. - To run Browser Tests copy `.env.dusk.example` to `.env.dusk.local` and set `APP_KEY` with same token to environment variable in your `.env` file and run `php artisan serve --env=dusk.local` for execute the server then run `php artisan dusk`. ## License GNU General Public License v3.0 ## Whats New - Certificate Upload Feature is added. - Admin can upload certificate to a student using student code. - Students can see their certificates link from Left Navigation bar. - Now students can also go to their Notifications(Teacher's Message) from Left Navigation bar. ## Features This software has following features: | Feature | Description | |---------|-------------| | Roles | Master, Admin, Teacher, Student, Librarian, Accountant.| || **(You can Impersonate User Roles in Development environment)** See how [Impersonation]( works. Cool !!| | Certificate | Now you can upload certificate to a student using student code. | | Payment |**[Stripe](** is used. See configuration below.| ||Students can pay from their accounts.| ||Student can view payment receipts (history)| ||View Screenshot below| |Attendance|Take student attendance for each course| |Mark|Can give marks to students for each course| |Registration|Register students| |Notice, Syllabus|Manage uploaded Notices, Syllabus, Routines| |Library|Manage a library of books.| ||Add new books.| ||Keep track of books.| |Exam|Manage Semester by Examination| |Grade|Give Grades based on marks of each course.| |Accounts|Manage Income, Expense Amounts| ||View Graphs based on year.| |Messaging|Uses CKEditor 5| |Export/Import| Users (Students, Teachers) from/to **Excel**| ||[Laravel Excel]( package is used.| ||**Important:** Single sheet supported in an Excel file. So delete any extra sheet in an Excel file.| ||Following excel column names supported for both Teachers and Students: `name, email, password, address, about, phone_number, blood_group, nationality, gender`.| ||Other columns:| ||For Teachers: `department`, (`class, section`) if assigned as class teacher.| ||For Students: `class, section, session, version, group, birthday, religion, father_name, father_phone_number, father_national_id, father_occupation, father_designation, father_annual_income, mother_name, mother_phone_number, mother_national_id, mother_occupation, mother_designation, mother_annual_income`| ||For any number(e.g: phone_number) starts with zero, put (') before zero.| |Supported Languages|English, Spanish| ||To set default Language and Timezone, Edit as following in `config/app.php`:| 'timezone' => 'Asia/Dhaka',//'UTC', 'locale' => 'en',//'es-MX' for Spanish ## How to Start ### Using Docker Container: **[Docker](** is now supported and improved. With the improved Docker setup, you will get: - Nginx - PHP 7.4 - MySQL 8 - PHPMyAdmin - Composer commands: access composer commands directly without entering the container - Artisan commands: access artisan commands directly without entering the container In a nutshell, you only need to install Docker as well as `docker-compose` on your (host) machine and let Docker does the rest #### Step to install: 1. Run `cp .env.example .env` 2. If you think the default setting are pretty well setup, you can run `./` right away from your terminal. 3. Otherwise, read a section below for further information about properties you may change. 4. Run `./` #### Note Here are `.env` properties you can change: - Common Laravel `.env` properties - `DOCKER_WEBSERVER_HOST` defines the Unifiedtransform port address. default value: `4049` - `DOCKER_PHPMYADMIN_HOST` defines the PHPMyAdmin port address. default value: `5051` You can also customize the database name defined on the `DB_DATABASE` property when Docker is being initialized the first time. #### Added Commands - `docker-compose run --rm composer ` - `docker-compose run --rm artisan ` ### Not using a Container: Here are some basic steps to start using this application **Note:** Instruction on cached data for Dashboard is given in **Good to know** segment below. - Clone the repository ```sh git clone ``` - Copy the contents of the `.env.example` file to create `.env` in the same directory - Run `composer install` for `developer` environment and run `composer install --optimize-autoloader --no-dev` for `production` environment to install Laravel packages (Remove **Laravel Debugbar**, **Laravel Log viewer** packages from **composer.json** and ```php //Provider Barryvdh\Debugbar\ServiceProvider, Logviewer Service provider, //Alias 'Debugbar' => Barryvdh... ``` from `config/app.php` before running **`composer install`** in **Production Environment**) - Generate `APP_KEY` using `php artisan key:generate` - Edit the database connection configuration inĀ .env file e.g. ```sh DB_CONNECTION=mysql DB_HOST= DB_PORT=3306 DB_DATABASE=unifiedtransform DB_USERNAME=unified DB_PASSWORD=secret ``` > Note that this is just an example, and the values may vary depending on your database environment. - Set the `APP_ENV` variable in your `.env` file according to your application environment (e.g. local, production) in `.env` file - Migrate your Database with `php artisan migrate` - Seed your Database with `php artisan db:seed` - On localhost, serve your application with `php artisan serve` ## Video Tutorial > See **[Video Tutorial](**. [![Video Tutorial](]( "Unifiedtransform Installation") ## (Optional) - [Laravel Page Speed Package]( is installed but not activated. If you want to use it to optimize your site automatically which results in a 35%+ optimization. You need to uncomment some lines from `Kernel.php` file and may need to run `php artisan vendor:publish --provider="RenatoMarinho\LaravelPageSpeed\ServiceProvider"`. **app/HTTP/Kernel.php** ```php //\RenatoMarinho\LaravelPageSpeed\Middleware\InlineCss::class, //\RenatoMarinho\LaravelPageSpeed\Middleware\ElideAttributes::class, //\RenatoMarinho\LaravelPageSpeed\Middleware\InsertDNSPrefetch::class, //\RenatoMarinho\LaravelPageSpeed\Middleware\RemoveComments::class, //\RenatoMarinho\LaravelPageSpeed\Middleware\TrimUrls::class, //\RenatoMarinho\LaravelPageSpeed\Middleware\RemoveQuotes::class, //\RenatoMarinho\LaravelPageSpeed\Middleware\CollapseWhitespace::class, ``` - To create a `Master`, go to the `database\seeds\UsersTableSeeder.php` and change the `name`, the `email` and the `password` settings to your likings. Leave the other settings (role, active, verified) unchanged! - [Laravel Passport]( package is included to support API. *Key* for Passport should be automatically generated by `php artisan passport:keys` from `post-install-cmd` script in `composer.json` or you have to run this manually and to remove this package just follow these steps - Remove it from `composer.json` require dependencies and remove command `@php artisan passport:keys` from `post-install-cmd` script - Run `composer update` and `composer dump-autoload`. - And all classes that relies on passport must be edited as well. The most common classes are: - `app\User.php` model, remove the `HasApiToken` trait. - `app\Proiders\AuthServiceProvider`, remove `Passport::routes();` in your boot method. - In `config/auth.php`, change your driver option for `api` from `passport` to `api` authentication. - To create the tables, run `php artisan migrate`. - If you don't want to use **Passport** package then remove the **Passport Migrations** in database `migrations` table and run command `artisan migrate:refresh` - To seed the tables with fake data, use `php artisan db:seed`. - If you want to run the migration and the seeding together, use `php artisan migrate:refresh --seed` - You must seed `database\seeds\UsersTableSeeder.php` at least once in order to create the **Master** account (**For Production:** Run the seed in **Development** environment and then switch to **production**). To do so, follow these steps: - comment all the seeders except `$this->call(UsersTableSeeder::class);` in `database\seeds\DatabaseSeeder.php`; - then comment `factory(App\User::class, 200)->create();` in `UsersTableSeeder.php`. So your files will look something like this: In `database\seeds\DatabaseSeeder.php`: ```php ... //$this->call(SectionsTableSeeder::class); $this->call(UsersTableSeeder::class); //$this->call(AttendancesTableSeeder::class); ... ``` In `database\seeds\UsersTableSeeder.php`: ```php ... //factory(User::class, 10)->states('admin')->create(); //factory(User::class, 10)->states('accountant')->create(); //factory(User::class, 10)->states('librarian')->create(); //factory(User::class, 30)->states('teacher')->create(); //factory(User::class, 200)->states('student')->create(); ``` * Make Unifiedtransform a native desktop application by using **[Nativefier](** * [Laravel 5 log viewer]( is used to view Logs using a UI at '' while in development environment. ## Stripe setup * Add `STRIPE_KEY` and `STRIPE_SECRET` in `.env` file. * For Stripe Test uncomment following test `student_can_pay_amount` in `tests\Feature\PaymentModuleTest` after editing `.env`. From ```php //public function student_can_pay_amount(){ ... //} ``` To ```php public function student_can_pay_amount(){ ... } ``` ## Create a school and an admin * Important: only a `master` can create a new school and its admins! * Login at `` using your `Master` account credentials * Create a new `school` * Create a new `admin` for the newly created school ## Manage a school * Important: A `master` CANNOT manage a school's data! * Login as `admin` at `` * Now add data to the school as required. ## Basic Steps by Serial * Create Classes * Create Sections * Create Exam * Add Students * Add Department * Add Teachers * Add Courses * Then teacher can take attendance, give marks ## Manage Exam (In exam manage page) by Admin 1. Check Notice published checkbox for an Exam after uploading Exam Notice. 2. Check Result published checkbox for an Exam after all teachers updated their courses' marks. * Checking result as published sets the Exam as completed. 3. Exam is set as Active by default while created. You can deactivate the exam by checking related checkbox. ## Manage GPA and Grade 1. Admin adds GPAs for respective mark ranges. 2. For giving marks, Teacher clicks on Submit Grade button and do the following: 1. Select a GPA by name from dropdown 2. Configure Class Test, Quiz, ...etc. count, percentage (Optional) 3. Give marks 4. To get Grade of students of a course for given marks, Teacher clicks the Get Total Marks button. (Usually this is done at the end of the semester) ## Give Certificate or Diploma to students Upon request in issue #258, Certification file upload system has been added. ## Good to know * Setup your **Mail** configuration in `.env` file if you want to send email. Currently registered users are notified by invitation mail if Mail is configured properly. * This project uses [Laravel Impersonate]( in development and staging environments, so you can view the application through another user's eyes, which is useful for testing. See the guide for using [Impersonation]( * In `.env`, turn `APP_DEBUG` to `false` for production environment. * Remove `Route::get('logs', '\Rap2hpoutre\LaravelLogViewer\LogViewerController@index');` from `routes/web.php` while in Production Environment. * `Cache::remember()` generates cache files. **Removed** ~~To delete expired cache files [LaravelCacheGarbageCollector]( package is used. Run `php artisan cache:gc`.~~ * You can switch to and from maintenance mode by running `php artisan up` and `php artisan down`. * **Optimizing Route** Loading `php artisan route:cache` * Dashboard page contents(e.g. Student count, Teacher count, Notice, etc.) are **cached** because these are not frequently changed. If you don't want these to be cached, just remove the cache lines in `index` method in `app\Http\Controller\HomeController.php`like the following example. So your edit would be something like this: From: ```php ... $classes = \Cache::remember('classes-'.$school_id, $minutes, function () use($school_id) { return \App\Myclass::where('school_id', $school_id) ->pluck('id') ->toArray(); }); ... ``` To: ```php ... $classes = \App\Myclass::where('school_id', $school_id) ->pluck('id') ->toArray(); ... ``` You can do similar for other cache lines. ## Here are some screenshots: Auto generated fake data were used. ![Screenshot_2019-04-11 - Ms Duane Welch(2)]( ![Screenshot_2019-05-11 Stripe Payment - Elvis Leffler]( ![Screenshot_2019-04-29 All Examinations - Santino Bergstrom V]( ![Screenshot_2019-03-21 Account Sectors - Britney Luettgen]( ![Screenshot_2019-03-12 Add New Book - Arvid Marquardt]( ![Screenshot_2019-03-12 Add Routine - Arvid Marquardt]( ![Screenshot_2019-03-12 Alba Huel - Arvid Marquardt]( ![Screenshot_2019-03-12 All Classes and Sections - Arvid Marquardt]( ![Screenshot_2019-03-12 All Issued Book - Arvid Marquardt]( ![Screenshot_2019-03-12 Attendance - Arvid Marquardt(1)]( ![Screenshot_2019-03-12 Attendance - Arvid Marquardt(2)]( ![Screenshot_2019-03-12 Attendance - Arvid Marquardt]( ![Screenshot_2019-03-12 Course - Arvid Marquardt]( ![Screenshot_2019-04-06 Course Students - Prof Buddy Hermann]( ![Screenshot_2019-04-06 Messages - Prof Buddy Hermann]( ![Screenshot_2019-03-29 Grade - Deron Ruecker DDS]( ![Screenshot_2019-03-12 Manage Schools - Arvid Marquardt(3)]( ![Screenshot_2019-03-12 Manage Schools - Arvid Marquardt]( ![Screenshot_2019-03-12 Promote Section Students - Arvid Marquardt(1)]( ![Screenshot_2019-03-12 Students - Arvid Marquardt]( ![Screenshot_2020-07-24 Give Certificate - Ruthie Gorczany]( ![Screenshot_2020-07-24 My Certificates - Ruthie Gorczany](