Invoice Ninja client built with Flutter

Overview

Invoice Ninja

Client app for the Invoice Ninja web app.

  • Google Play Store: v4 | v5
  • Apple App Store: v4 | v5

Dashboard View Invoice List Invoice New Invoice

Setting up the app

  • Initialize the config file

    cp lib/.env.dart.example lib/.env.dart

  • Support running the code unsigned on Android

    cp android/app/build.gradle.dev android/app/build.gradle

  • Run the app

    flutter run

Note: if you don't have an Invoice Ninja backend setup you can test the app with these credentials:

Steps to remove non-FOSS code

cp android/build.gradle.foss android/build.gradle
cp lib/utils/oauth.dart.foss lib/utils/oauth.dart
cp lib/ui/app/upgrade_dialog.dart.foss lib/ui/app/upgrade_dialog.dart
cp android/app/src/main/AndroidManifest.foss.xml android/app/src/main/AndroidManifest.xml
cp pubspec.foss.yaml pubspec.yaml 
rm pubspec.lock

Application Architecture

The application was created using the Flutter Redux Starter.

The architecture is based off these two projects:

Blog Posts

Code generation

  • Run flutter packages pub run build_runner build --delete-conflicting-outputs to regenerate the model files. It will also remove the old generated files so conflicts are avoided..

Tests

  • Run flutter drive --target=test_driver/all_it.dart to run the tests

Code Signing

  • Run cp android/app/build.gradle.prod android/app/build.gradle to support running the code signed
  • Run cp android/key.properties.example android/key.properties to create the keys file
  • Run keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias invoiceninja to generate a key to be able to sign the android application.
  • Update android/key.properties according to the parameters you entered in previous command when you generated the key
  • Open a new Firebase project from your console. Firebase is used for authentication.
    • Inside the project go to Authentication and enable at least one method.
    • After go to add a new Android application. For the package name add com.invoiceninja.flutter
    • Press "Register App" button.
    • Download "google-services.json" and put it in android/app directory.

Credits

https://github.com/invoiceninja/invoiceninja#credits

Contributions

We gladly accept contributions! If you'd like to get involved with development please join our Slack group.

Comments
  • Slow typing in v5

    Slow typing in v5

    INFO

    What version of Invoice Ninja are you running? ie v4.5.25 / v5.0.30 5.1.31

    What environment are you running? Docker

    Have you checked log files (storage/logs/) Please provide redacted output not applicable

    Have you searched existing issues? yes

    Have you reported this to Slack/forum before posting? no

    Describe the bug see below

    Steps To Reproduce use any text editor

    Expected behavior normal typing

    DESCRIPTION

    I've tried v5 with these setups (extensions disabled):

    • windows + edge
    • windows + firefox
    • linux + firefox
    • linux + chrome

    In all cases typing is very slow - there's a short (roughly 1 second) delay before a character is shown in the ui. I can type a whole line of text, then wait a few moments while the string is printed in the UI. It's not instantaneous.

    It's as if the javascript running on the page is VERY aggressive and filtering every keypress.

    Has anyone else experienced this?

    bug 
    opened by grokky1 44
  • App does not refresh data until re-login

    App does not refresh data until re-login

    What version of Invoice Ninja are you running? ie v4.5.25 / v5.0.30

    What environment are you running? ZIP

    Have you checked log files (F12 console) Please provide redacted output

    unreachable code after return statement
    main.foss.dart.js:3:42
    Error while trying to load font family "packages/material_design_icons_flutter/Material Design Icons":
    SyntaxError: An invalid or illegal string was specified main.foss.dart.js:63781:47
    unreachable code after return statement
    main.foss.dart.js:3:47
    unreachable code after return statement
    main.foss.dart.js:3:47
    ## Refresh data - include static: false js_primitives.dart:47
    POST: https://>REDACTED>/api/v1/refresh?current_company=true&updated_at=1620233449&first_load=true js_primitives.dart:47
    unreachable code after return statement
    main.foss.dart.js:3:46
    unreachable code after return statement
    main.foss.dart.js:3:43
    unreachable code after return statement
    main.foss.dart.js:3:46
    unreachable code after return statement
    main.foss.dart.js:3:43
    unreachable code after return statement
    main.foss.dart.js:3:52
    unreachable code after return statement
    main.foss.dart.js:3:52
    unreachable code after return statement
    main.foss.dart.js:3:42
    unreachable code after return statement
    main.foss.dart.js:3:42
    unreachable code after return statement
    main.foss.dart.js:3:47
    unreachable code after return statement
    main.foss.dart.js:3:46
    unreachable code after return statement
    main.foss.dart.js:3:46
    
    ## Refresh data - include static: false js_primitives.dart:47
    POST: https://<REDACTED>/api/v1/refresh?current_company=true&updated_at=1620233449&first_load=true js_primitives.dart:47
    

    Have you searched existing issues? https://github.com/invoiceninja/invoiceninja/issues/5490#issuecomment-830164527

    Describe the bug All those fancy refresh button in the app appear to do nothing. Invoices that would actually be SENT are still shown as DRAFT and so on… Once you logout and in, everything is back in sync.

    Steps To Reproduce

    1. Login on machine A with user U
    2. Draft invoice
    3. Login in machine B with user V
    4. Send invoice from machine B
    5. Click refresh on machine A
    6. Invoice is still a DRAFT
    7. Logout user U from machine A
    8. Login on machine A with user U

    Expected behavior Data is up-to-date and synced everywhere

    (v5) Can you replicate the issue on our demo site? Impossible due to lack of credentials for user creation

    question 
    opened by itkfm 29
  • not adding products when clicking on the product

    not adding products when clicking on the product

    **What version of Invoice Ninja are you running? v5.2.6-C51

    What environment are you running? Dedicated Hosting

    Have you checked log files (storage/logs/) Please provide redacted output no output in logs

    Have you searched existing issues? yes

    Have you reported this to Slack/forum before posting? no

    Describe the bug When typing for a product, the product list appears but can't add the product info by clicking on the product, All options are enabled in product settings, when typing in prodict id field for adding a product to the invoice, you see the options but not able to add them, fullin option is enabled, tested in chrome and edge

    Steps To Reproduce Please list the steps to reproduce the issue default installation,

    Expected behavior the product info is added to the invoice

    Screenshots

    image

    Additional context i have installed 3 in the past, and upgraded them to newest version, old and new version are 5.XXX i have installed a new one from scratch as discribe on the install page and this issue popped up, reinstalled the application, no luck, i installed a 2th new install for a new client and the same issue is there, checked all the fields and settings as my own working version, all are the same

    Note: Before posting don't forget to check our "Troubleshooting" category in the docs (https://invoiceninja.github.io/docs/self-host-troubleshooting/).

    (v5) Can you replicate the issue on our demo site? https://demo.invoiceninja.com

    No, this issue is not active when you do an upgrade from a older version, this is the case for new installations

    opened by ReaperOfTheSoul 24
  • Editing Time Tracking details behaves unpredictable

    Editing Time Tracking details behaves unpredictable

    What version of Invoice Ninja are you running? ie v4.5.25 / v5.0.30 v5.1.65-C48

    What environment are you running? Docker

    Have you checked log files (storage/logs/) Please provide redacted output No

    Have you searched existing issues? Yes

    Have you reported this to Slack/forum before posting? No

    Describe the bug When editing or adding Time Tracking Entries, sometimes it is overwriting and or deleting previous Entries, which is critical if we use Invoice Ninja as primary Time Tracking System for Billing.

    When I am affected the whole Time Tracking Screen is behaving weird.

    As i am unable to write steps to reproduce or to describe the Issue, I will take a short Video and Post it in the Comments as soon as I can reproduce the Issue again.

    Steps To Reproduce Unable to provide "Steps To Reproduce", see Video in Comments.

    Expected behavior Time Tracking should only delete/edit the Entries I directly interact with.

    Screenshots Unable to provide "Screenshots", see Video in Comments.

    (v5) Can you replicate the issue on our demo site? https://demo.invoiceninja.com Did invest some minutes and tried to reproduce on my instance and on the demo, but i am unable for now on both.

    bug 
    opened by Akjo4712 24
  • F-Droid build failed

    F-Droid build failed

    /home/vagrant/.pub-cache/hosted/pub.dartlang.org/flutter_styled_toast-2.1.3/lib/src/styled_toast.dart:497:63: Error: Property 'window' cannot be accessed on 'WidgetsBinding?' because it is potentially null.
     - 'WidgetsBinding' is from 'package:flutter/src/widgets/binding.dart' ('../srclib/flutter/packages/flutter/lib/src/widgets/binding.dart').
    Try accessing using ?. instead.
          data: MediaQueryData.fromWindow(WidgetsBinding.instance.window),
                                                                  ^^^^^^
    /home/vagrant/.pub-cache/hosted/pub.dartlang.org/flutter_styled_toast-2.1.3/lib/src/styled_toast.dart:681:29: Error: Method 'addObserver' cannot be called on 'WidgetsBinding?' because it is potentially null.
     - 'WidgetsBinding' is from 'package:flutter/src/widgets/binding.dart' ('../srclib/flutter/packages/flutter/lib/src/widgets/binding.dart').
    Try calling using ?. instead.
        WidgetsBinding.instance.addObserver(this);
                                ^^^^^^^^^^^
    /home/vagrant/.pub-cache/hosted/pub.dartlang.org/flutter_styled_toast-2.1.3/lib/src/styled_toast.dart:1559:29: Error: Method 'removeObserver' cannot be called on 'WidgetsBinding?' because it is potentially null.
     - 'WidgetsBinding' is from 'package:flutter/src/widgets/binding.dart' ('../srclib/flutter/packages/flutter/lib/src/widgets/binding.dart').
    Try calling using ?. instead.
        WidgetsBinding.instance.removeObserver(this);
                                ^^^^^^^^^^^^^^
    FAILURE: Build failed with an exception.
    * Where:
    Script '/builds/linsui/fdroiddata/build/srclib/flutter/packages/flutter_tools/gradle/flutter.gradle' line: 1102
    * What went wrong:
    Execution failed for task ':app:compileFlutterBuildRelease'.
    > Process 'command '/builds/linsui/fdroiddata/build/srclib/flutter/bin/flutter'' finished with non-zero exit value 1
    

    Could you please take a look? Thanks!

    opened by linsui 20
  • Multi-currency Transaction not visible properly in reports

    Multi-currency Transaction not visible properly in reports

    What version of Invoice Ninja are you running? ie v4.5.25 / v5.0.30 Self hosted - v5.3.33-C67 Online (invoicing.co) - v5.3.33-C67

    What environment are you running? Ubuntu 20.4 for self hosted

    Have you checked log files (storage/logs/) Please provide redacted output No

    Have you searched existing issues? Yes, Could not find anything similar.

    Have you reported this to Slack/forum before posting? i have reported it using contact us (today only after trying on invoicing.co)

    Describe the bug A clear and concise description of what the bug is.

    Steps To Reproduce Create Client in Foreign currency. (INR 2500) Receive Payment in foreign currency. Apply conversion to local currency in payment. (GBP 25) Check the reports for payments / profit or loss -- amount shows as Β£2500.

    Expected behavior Expect amount it to shows in appropriate currency. considering transaction is in INR, either we should show it in iNR everywhere or local currency.

    Screenshots If applicable, add screenshots to help explain your problem. Screenshot 2021-12-03 at 13 33 26 Screenshot 2021-12-03 at 13 34 45 Screenshot 2021-12-03 at 13 35 28

    Additional context Add any other context about the problem here.

    (v5) Can you replicate the issue on our demo site? https://demo.invoiceninja.com

    opened by HarshadkCon 14
  • Recurring invoices are sorted wrong

    Recurring invoices are sorted wrong

    What version of Invoice Ninja are you running? ie v4.5.25 / v5.0.30 v5.3.23

    What environment are you running? ZIP

    Have you checked log files (storage/logs/) Please provide redacted output NA

    Have you searched existing issues? Yes

    Have you reported this to Slack/forum before posting? No

    Describe the bug When you go to the page where all invoices are listed and sort by number, the recurring invoices are always at the end of the list. Example: You have 5 invoices, invoice number 4 is a recurring invoice. When you sort by number counting down, the output will be 5, 3, 2, 1, 4

    IMPORTANT: It only happens when you also have a recurring prefix!

    Steps To Reproduce

    • Set a recurring prefix
    • Have multiple existing invoices with 1 or more recurring invoice in the middle

    Expected behavior NA

    Screenshots 1 1

    Additional context Add any other context about the problem here.

    (v5) Can you replicate the issue on our demo site? https://demo.invoiceninja.com Absolutely

    opened by stefaandevylder 14
  • Partially incorrect translation for

    Partially incorrect translation for "cancel"

    Hi there, currently IncoiceNinja makes a bit of a mess with the translation of "cancel" - now it's translated to "Stornieren" only. But instead we need to differentiate: between Invoice cancelation and between progress cancelation. Therefore the default translation should be "Abbrechen" and in only the following places a separate translation is needed (presumably also in other languages than german):

    • Screenshot_20220304-143539.png("Stornieren")

    Thanks for your great software, Lars

    bug 
    opened by LarsK1 13
  • iOS APP: Always prompts for Add new company

    iOS APP: Always prompts for Add new company

    What version of Invoice Ninja are you running? ie v4.5.25 / v5.0.30

    v5.3.27-C62 / Latest available iOS app from the appstore (iOS 15)

    What environment are you running? Docker

    Problem: Everytime I open the app on iOS it prompts for new company details. When i fully close the app from the app switcher and open it again, it prompts me again.

    To be clear: there are already 3 companies set up ...

    image

    bug 
    opened by alexanderhofstaetter 13
  • building error, master branch

    building error, master branch

    hi,

    when run in android studio show this error.

    event sent after app closed: {id: 0, progressId: null, message: Running "flutter pub get" in flutter-client-master...} event sent after app closed: {id: 0, progressId: null, finished: true} Launching lib\main.dart on SM G9650 in debug mode... Running Gradle task 'assembleDebug'... Note: C:\development\flutter.pub-cache\hosted\pub.dartlang.org\in_app_purchase-0.3.4+4\android\src\main\java\io\flutter\plugins\inapppurchase\MethodCallHandlerImpl.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. Note: C:\development\flutter.pub-cache\hosted\pub.dartlang.org\url_launcher-5.5.0\android\src\main\java\io\flutter\plugins\urllauncher\WebViewActivity.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: C:\development\flutter.pub-cache\hosted\pub.dartlang.org\webview_flutter-0.3.22+1\android\src\main\java\io\flutter\plugins\webviewflutter\FlutterWebView.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.

    opened by jesulo 13
  • building error

    building error

    Hello good day, I have this error in master branch.

    Compiler message: lib/ui/app/app_bottom_bar.dart:244:25: Error: No named parameter with the name 'toggleable'. toggleable: true, ^^^^^^^^^^ /C:/development/flutter/packages/flutter/lib/src/material/radio_list_tile.dart:307:9: Context: Found this candidate, but the arguments don't match. const RadioListTile({ ^^^^^^^^^^^^^

    Compiler message: lib/ui/app/app_bottom_bar.dart:244:25: Error: No named parameter with the name 'toggleable'. toggleable: true, ^^^^^^^^^^ /C:/development/flutter/packages/flutter/lib/src/material/radio_list_tile.dart:307:9: Context: Found this candidate, but the arguments don't match. const RadioListTile({ ^^^^^^^^^^^^^ Target kernel_snapshot failed: Exception: Errors during snapshot creation: null build failed.

    FAILURE: Build failed with an exception.

    • Where: Script 'C:\development\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 882

    • What went wrong: Execution failed for task ':app:compileFlutterBuildDebug'.

    Process 'command 'C:\development\flutter\bin\flutter.bat'' finished with non-zero exit value 1

    • Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

    • Get more help at https://help.gradle.org

    BUILD FAILED in 1m 49s Exception: Gradle task assembleDebug failed with exit code 1

    opened by jesulo 13
  • Link to Client Portal on Sign-In Page / custom error message / redirect to client portal

    Link to Client Portal on Sign-In Page / custom error message / redirect to client portal

    https://github.com/invoiceninja/invoiceninja/issues/8024

    According to this issue, i want to address this feature request within the admin-portal also:

    • A Button/Link on Admin Login Page to Client Portal
    • Custom error Message OR redirect, when user of client portal tries to sign in into admin-portal

    These changes may be possible to implement without any backend-changes.

    enhancement 
    opened by paulwer 0
  • Restoring Invoice fails despite success popup

    Restoring Invoice fails despite success popup

    I tried multiple times, every time it pops up with success but nothing changes. Reloading Data or logging back in changed nothing either: image

    Using latest 5.5

    Kind of the opposite of https://github.com/invoiceninja/admin-portal/issues/519

    triage 
    opened by xeruf 1
  • Batch-select checkboxes with shift

    Batch-select checkboxes with shift

    Currently in batch mode I have to select each checkbox one by one. When I hold shift, it should automatically select (or invert the selection of) every checkbox between the last clicked and current checkbox.

    enhancement 
    opened by xeruf 0
  • Dashboard add extra view tabs on quote

    Dashboard add extra view tabs on quote

    Hello everyone,

    I would like to see a few extra tabs on the dashboard for the quote section. Now there are 3 tabs: active, approved and unapproved. My suggestion would be to add invoiced and invoice paid to keep track on what quotes are converted to an invoice. The same layout as expense, for example.

    With kind regards, Jelle van Kraaij

    Current configuration qoutes: image Current configuration expenses (for reference) image

    enhancement 
    opened by JellevanKraaij 0
  • Better display files for a client

    Better display files for a client

    Hey everyone, I am using the feature to save files for my customers. The administration in the admin-portal, because of the display in blocks and not as a list is sometimes hard, to keep track of all files. Is there an oportunity to display it as a list or to move this section down, to have more space to view?

    enhancement 
    opened by paulwer 2
Releases(v5.0.104)
Owner
Invoice Ninja
An open-code invoicing app built with Laravel and Flutter
Invoice Ninja
Just a jellyfin client made in flutter (side project quality code)

jellyflut A jellyfin client made in Flutter It's a beta, it works okay. You can : Play a video Read a book Listen Music Look photos SQLite to have log

Thomas SOHIER 106 Jan 4, 2023
An eventual FIBS client written in Flutter and hosted on the web

fibscli An eventual FIBS client written in Flutter and hosted on the web. status Currently, the app works as a stand-alone backgammon game w/o connect

Chris Sells 10 Oct 26, 2022
Native Dart client library for DBus

A native Dart client implementation of D-Bus. Accessing a remote object using dart-dbus The easiest way to get started is to use dart-dbus to generate

Canonical 81 Oct 28, 2022
❄️ An extension based Anime & Manga client.

Yukino Yukino lets you read manga or stream anime ad-free from multiple sources. The project's name "Yukino" meaning "Snow" named after the character

Yukino 204 Jan 6, 2023
Flutter Installer is an installer for Flutter built with Flutter πŸ’™πŸ˜ŽβœŒ

Flutter Installer Flutter Installer is an installer for Flutter built with Flutter ?? ?? ✌ Flutter and the related logo are trademarks of Google LLC.

Yazeed AlKhalaf 406 Dec 27, 2022
A nice clean Portfolio Website for Designer or developers Built Using Flutter

A Portfolio Website - Flutter Web Watch it on YouTube This UI is not Responsive A nice clean Portfolio Website for Designer or developers. Which inclu

Elias Baya 1 Aug 17, 2022
Serverpod is a next-generation app and web server, explicitly built for the Flutter and Dart ecosystem.

Serverpod Serverpod is a next-generation app and web server, explicitly built for the Flutter and Dart ecosystem. It allows you to write your server-s

Serverpod 1k Jan 8, 2023
A lightweight personal portfolio website template built using Flutter

Dev Portfolio Software Developer Portfolio Template that helps you showcase your

AbdulMomen 18 Dec 23, 2022
Photon is a cross-platform file-sharing application built using flutter.

Welcome to Photon ?? Photon is a cross-platform file-transfer application built using flutter. It uses http to transfer files between devices.You can

Abhilash Hegde 161 Jan 1, 2023
A Flutter package that makes it easy to customize and work with your Flutter desktop app window.

bitsdojo_window A Flutter package that makes it easy to customize and work with your Flutter desktop app window on Windows, macOS and Linux. Watch the

Bits Dojo 607 Jan 4, 2023
Flutter plugin for Flutter desktop(macOS/Linux/Windows) to change window size.

desktop_window Flutter plugin for Flutter desktop(macOS/Linux/Windows) to change window size. Usage import 'package:desktop_window/desktop_window.dart

ChunKoo Park 72 Dec 2, 2022
A Flutter package that makes it easy to customize and work with your Flutter desktop app's system tray.

system_tray A Flutter package that that enables support for system tray menu for desktop flutter apps. on Windows, macOS and Linux. Features: - Modify

AnTler 140 Dec 30, 2022
Fluttern is a web app made with Flutter to list Flutter internships/jobs for the community.

Fluttern Fluttern is a web app made with Flutter to list Flutter internships/jobs for the community. It uses Google Sheet as a backend, simplifying th

Aditya Thakur 3 Jan 5, 2022
Flutter on Windows, MacOS and Linux - based on Flutter Embedding, Go and GLFW.

go-flutter - A package that brings Flutter to the desktop Purpose Flutter allows you to build beautiful native apps on iOS and Android from a single c

null 5.5k Jan 6, 2023
A clean front-end plugin to Volumio, the Linux distribution for music playback. Volumio Touch Display Lite is written in Flutter and runs on flutter-pi.

EN | δΈ­ζ–‡ Touch Display Lite plugin for Volumio 3 Feng Zhou, 2021-12 Touch Display Lite is a clean and fast user interface for Volumio 3, the Linux dist

Feng Zhou 5 Jul 26, 2022
Ubuntu-flutter-plugins - A collection of Flutter plugins and packages for Ubuntu applications.

Flutter plugins for Ubuntu A collection of Flutter plugins and packages for Ubuntu applications. ubuntu_localizations - provides localizations for Flu

Canonical 25 Oct 12, 2022
File picker plugin for Flutter, compatible with mobile (iOS & Android), Web, Desktop (Mac, Linux, Windows) platforms with Flutter Go support.

A package that allows you to use the native file explorer to pick single or multiple files, with extensions filtering support.

Miguel Ruivo 987 Jan 6, 2023
Flutter Community Plus Plugins

Flutter Community Plus Plugins Plus plugins PlusPlugins is a set of Flutter plugins that is developed based on existing Flutter plugins with extra fun

Flutter Community 1.1k Jan 5, 2023
Flutter plugin to store data behind biometric authentication (ie. fingerprint)

biometric_storage Encrypted file store, optionally secured by biometric lock for Android, iOS, MacOS and partial support for Linux, Windows and Web. M

AuthPass 125 Dec 28, 2022