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
  • Unable to build on Arch

    Unable to build on Arch

    I have freshly installed flutter on my Arch Linux system, trying to run throws this error:

    > flutter run
    The current Flutter SDK version is 0.0.0-unknown.
    
    Because flutter_staggered_grid_view 0.6.2 requires Flutter SDK version >=2.0.0 and no versions of flutter_staggered_grid_view match >0.6.2 <0.7.0, flutter_staggered_grid_view ^0.6.2 is forbidden.
    So, because invoiceninja_flutter depends on flutter_staggered_grid_view ^0.6.2, version solving failed.
    Running "flutter pub get" in invoiceninja_admin-portal...               
    pub get failed (1; So, because invoiceninja_flutter depends on flutter_staggered_grid_view ^0.6.2, version
    solving failed.)
    

    Unfortunately I have no experience with flutter and thus no idea where the issue probably lies, could you kindly assist me? ;)

    opened by xeruf 3
  • Print Multiple Invoices at Once

    Print Multiple Invoices at Once

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

    What environment are you running? Hosted

    Have you searched existing issues/requests? Yes

    Screenshots image

    Additional context Would like to print selected invoices with 1 click instead of printing each one individually.

    feature request 
    opened by tsi-dev-github 5
  • Cancel button for client settings doesn't work

    Cancel button for client settings doesn't work

    The Cancel button for client settings doesn't work.

    Steps to reproduce

    1. Go to Clients on the left hand menu
    2. Choose the dots menu for a client and click settings
    3. Press the cancel button in the top right hand corner. Observe that nothing happens and invoice ninja does not return back to the client list as expected Screenshot 2022-09-09 184720
    usability 
    opened by mrkylegp 5
  • Column cut off horizontally / Columns not displayed

    Column cut off horizontally / Columns not displayed

    In the admin panel, any section, if you have too many column options selected the text and/or additional columns are cut off horizontally and there is no way to horizontally scroll. This means that if you add several columns, you can't actually see them because you can't scroll horizontally.

    Need to introduce a horizontal scroll bar if the amount of columns chosen to be shown exceeds the space available in the browser (or if the user resizes the window)

    opened by mrkylegp 4
  • Blank rows shown if there are not enough entries to display

    Blank rows shown if there are not enough entries to display

    When choosing to show more rows than there are entries, blank rows are shown.

    Video: https://youtu.be/7OUUPWqRuGY

    Screenshot 2022-09-08 185447

    Expected behavior is not to show blank rows if there are less entries that exist to show than the selected amount.

    Eg. if 100 rows per page is selected but only 70 entries exist, show only 70 entries and no further blank rows afterwards on the last page.

    enhancement triage 
    opened by mrkylegp 0
Releases(v5.0.100)
Owner
Invoice Ninja
An open-code invoicing app built with Laravel and Flutter
Invoice Ninja
This is a mobile app created using Flutter, corona.lmao.ninja (Real Time News about Covid 19).

Covid 19 News This is a mobile app created using Flutter, corona.lmao.ninja (Real Time News about Covid 19). There are some test files that needed to

Achintha Isuru 10 Jan 28, 2022
Lime client built using flutter

** This project ist OUT OF DATE and I am currently not able to maintain it ** What we are building Lime is a social media app, which allows you to pos

Sebastian Sellmair 373 Nov 13, 2022
A Mastodon client built in Flutter

feathr A Mastodon client built in Flutter (in development). Contributing Pull requests are welcome. For major changes, please open an issue first to d

feathr.space 7 Nov 20, 2022
An Android Client for ZeroNet Built With Flutter

ZeroNet Mobile ZeroNet Mobile is an Android Client for ZeroNet, a platform for decentralized websites using Bitcoin crypto and the BitTorrent network.

null 0 Nov 10, 2021
Simplistic mobile RSS client built with Flutter

Fluent Reader Lite A simplistic mobile RSS client Download iOS Download from App Store ($1.99. This will support development and help cover the $99 an

Haoyuan Liu 622 Nov 17, 2022
A simple, modern AppImageHub Client, powered by flutter.

AppImagePool Simple AppImageHub Client Main Features FLOSS and non profit app Simple categories Download from github directly, no extra-server involve

Prateek SU 479 Nov 12, 2022
Venni client app - A flutter ride-sharing end-user app supporting map location picking

Venni client app - A flutter ride-sharing end-user app supporting map location picking, driver location tracking, in-app credit card payments, trip rating system, and trip history.

Abrantes 1 Jan 3, 2022
Cross-platform GitHub client in Flutter and BLoC clean architecture

FlutterHub Cross-platform GitHub client in Flutter and BLoC clean architecture. SwiftHub - Swift version is available Try Web version Get Started To g

Khoren Markosyan 36 Nov 12, 2022
Flutter Satellite.im Minimal Secure Chat Client

Uplink Flutter Satellite.im Minimal Secure Chat Client Getting Started ?? To run this project either use the launch configuration in VSCode or use the

Satellite 12 Nov 24, 2022
A Flutter Twitch client for iOS and Android with BTTV, FFZ, and 7TV support

Frosty for Twitch A Twitch client for iOS and Android with BTTV, FFZ, and 7TV support. Built with Flutter. Features Browse followed streams, top strea

Tommy Chow 230 Nov 18, 2022
A fully cross-platform wrap of the Matomo tracking client for Flutter, using the Matomo API.

A fully cross-platform wrap of the Matomo tracking client for Flutter, using the Matomo Tracking API.

Floating Dartists 10 Nov 20, 2022
A simple and easy to use Redis client for Dart

redis_dart A simple and minimalist Redis client for Dart See it in pub: https://pub.dev/packages/redis_dart and GitHub: https://github.com/gabrielpach

Gabriel Pacheco 6 Mar 5, 2022
ThingsBoard PE API client library for Dart developers.

ThingsBoard PE API client library for Dart developers. It's compatible with TB PE 3.3.0. Usage A simple usage example: import 'package:thingsboard_pe_

ThingsBoard - Open-source IoT Platform 45 Sep 28, 2022
An architecture for dynamic UI without client deployment

Server Driven UI Demo Server Driven UI(SDUI)는 서버에서 클라이언트의 UI 컴포넌트를 관리하는 방식. 클라이언트 배포없이 API 응답을 변경하는 것만으로 UI 변경이 가능한 동시에 하위 호환성을 확보할 수 있다. Rust, GraphQ

Simon Park 15 Oct 17, 2022
Wallet Connect client in Dart.

Wallet Connect Wallet Connect client in dart highly inspired from wallet-connect-kotlin by Trust Wallet. Usage import 'package:wallet_connect/wall

null 96 Nov 9, 2022
Dalal Street Client 2022

Flutter Client for Dalal Street Prerequisites Flutter >2.12 Download Link Protocol Buffer Compiler Download Link Check Prerequisites Run if you have i

Delta Force 14 Oct 19, 2022
Notion API client for dart

Notion API client for dart. See the ROADMAP file to see what is coming next. API implemented Usage NotionClient class Individual classes A few example

Jonathan Gómez 22 Oct 9, 2022
Figma API client written in pure Dart

figma A library for interacting with Figma APIs. Created from templates made available by Stagehand under a BSD-style license. Usage A simple usage ex

Arne Molland 14 Oct 19, 2022