{"id":37085368,"url":"https://github.com/adamwojt/invoicepy","last_synced_at":"2026-01-14T10:29:43.978Z","repository":{"id":62571369,"uuid":"430929750","full_name":"adamwojt/invoicepy","owner":"adamwojt","description":"personal accounting CLI tool","archived":false,"fork":false,"pushed_at":"2021-11-29T18:24:40.000Z","size":192,"stargazers_count":9,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-27T09:27:34.429Z","etag":null,"topics":["accounting","cli","finance","invoice","python","tools"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/adamwojt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-11-23T02:12:48.000Z","updated_at":"2022-08-01T22:01:39.000Z","dependencies_parsed_at":"2022-11-03T18:26:01.407Z","dependency_job_id":null,"html_url":"https://github.com/adamwojt/invoicepy","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/adamwojt/invoicepy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adamwojt%2Finvoicepy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adamwojt%2Finvoicepy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adamwojt%2Finvoicepy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adamwojt%2Finvoicepy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/adamwojt","download_url":"https://codeload.github.com/adamwojt/invoicepy/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adamwojt%2Finvoicepy/sbom","scorecard":{"id":165644,"data":{"date":"2025-08-11","repo":{"name":"github.com/adamwojt/invoicepy","commit":"117ee633a03b8d17f26b0ab36c7397c29d3cd2f7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.3,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/adamwojt/invoicepy/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/adamwojt/invoicepy/ci.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/ci.yml:22","Warn: pipCommand not pinned by hash: .github/workflows/ci.yml:23","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 0.1.0 not signed: https://api.github.com/repos/adamwojt/invoicepy/releases/54037245","Warn: release artifact 0.1.0 does not have provenance: https://api.github.com/repos/adamwojt/invoicepy/releases/54037245"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"20 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-3rq5-2g8h-59hc","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-gmj6-6f8f-6699","Warn: Project is vulnerable to: GHSA-h5c8-rqwp-cp95","Warn: Project is vulnerable to: GHSA-h75v-3vvj-5mfj","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: GHSA-3f63-hfp8-52jq","Warn: Project is vulnerable to: GHSA-44wm-f244-xhp3","Warn: Project is vulnerable to: GHSA-4fx9-vc88-q2xc","Warn: Project is vulnerable to: PYSEC-2023-227 / GHSA-8ghj-p4vj-mr35","Warn: Project is vulnerable to: PYSEC-2022-10 / GHSA-8vj2-vxx3-667w","Warn: Project is vulnerable to: PYSEC-2022-168 / GHSA-9j59-75qj-795w","Warn: Project is vulnerable to: GHSA-j7hp-h8jx-5ppr","Warn: Project is vulnerable to: PYSEC-2022-42979 / GHSA-m2vv-5vj5-2hm7","Warn: Project is vulnerable to: PYSEC-2022-8 / GHSA-pw3c-h7wp-cvhx","Warn: Project is vulnerable to: PYSEC-2022-9 / GHSA-xrcv-f9gm-v42c","Warn: Project is vulnerable to: PYSEC-2023-175","Warn: Project is vulnerable to: PYSEC-2022-42969","Warn: Project is vulnerable to: GHSA-mr82-8j83-vxmv"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-16T14:45:33.899Z","repository_id":62571369,"created_at":"2025-08-16T14:45:33.899Z","updated_at":"2025-08-16T14:45:33.899Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28417301,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T10:25:19.714Z","status":"ssl_error","status_checked_at":"2026-01-14T10:22:49.371Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accounting","cli","finance","invoice","python","tools"],"created_at":"2026-01-14T10:29:43.133Z","updated_at":"2026-01-14T10:29:43.973Z","avatar_url":"https://github.com/adamwojt.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"invoicepy\n=========\n\u003cimg src=\"https://repository-images.githubusercontent.com/430929750/36502a64-8878-4341-a38b-11a2f1b78155\" alt=\"invoice\" width=\"666\"/\u003e\n\n**CLI** invoice tool, store and print invoices as *pdf*. save companies and\ncustomers for later use.\n\n\ninstallation\n------------\n\n``` {.sourceCode .bash}\npip install invoicepy\n```\n\u003e *see troubleshooting section below for common problems*\n\nconfig\n------\n\n[config](src/invoicepy/schema/config.json) stores `companies` and `customers` by alias and [invoices](src/invoicepy/schema/invoice.json).\n`custom_templates_dir` is available for customising templates.\n\nwrite [sample config](src/invoicepy/config/sample_config.json) with:\n``` {.sourceCode .bash}\ninvoicepy sample-config\n# then customize it in $HOME/.invoicepy.conf\n```\n\nexamples\n--------\n\n1. print pdf saving it in current directory, result is invoice nr. BAR001\n``` {.sourceCode .bash}\ninvoicepy pdf --company foo --customer bar --line '{\"price\":10, \"qty\": 20, \"name\":\"1h services\"}' --series BAR\n```\n\u003cimg src=\"examples/2021-11-23_bar-inc_bar1.png\" alt=\"invoice\" width=\"400\"/\u003e\n\nwhen above is repeated twice, the invoices numers will increase, BAR002, BAR003. this is calculated per series.\nsee below for more options.\n\n2. below example won't save invoice in config, open in it browser and use custom template specified in `custom_templates_dir`:\n```\ninvoicepy pdf --company foo --customer bar --line ... -b --no-save --series BAR --number 25 --curency USD --template my_custom_template.html\n```\n\ncli\n---\n\n``` {.sourceCode .}\ninvoicepy [OPTIONS] COMMAND [ARGS]...\n\nOptions:\n  -C, --config PATH\n  --help             Show this message and exit.\n\nCommands:\nsample-config        generate sample config in home dir\npdf                  prints pdf to given path\n```\n\n**pdf**\n\n```\nOptions:\n  -l, --line TEXT       json string of invoice line, can pass multiple. ex:\n                        --line '{\"price\":15, \"qty\": 100, \"name\":\"1h cleaning\n                        services\", \"vat\": 21}' --line ...  [required]\n\n\t\t\tThe fields are as follows:\n\t\t\t`price` - price of product\n\t\t\t`qty` - quantity of product\n\t\t\t`name` - name of product\n\t\t\t`vat` - vat rate %\n\n\n  -c, --company TEXT    company alias as in configuration.  [required]\n  -r, --customer TEXT   customer alias as in configuration.  [required]\n  -d, --date TEXT       invoice date, `create_date` field. `yyyy-mm-dd` format\n  -e, --due-date TEXT   If due date is not provided, `payment_term_days` is\n                        used to calculate it.\n\n  -s, --series TEXT     invoice series  [required]\n  -n, --number INTEGER  invoice number, if not provided, it will calculated\n                        from company config for given series.\n\n  -u, --currency TEXT   currency, default=EUR\n  -o, --output PATH     output path, can be new filepath, directory. If it's\n                        not provided the invoice pdf will be saved in current\n                        directory.\n\n  -t, --template TEXT   template name, ex. simple.html. `custom_templates_dir`\n                        will be searched first, then package templates.\n\n  --save / --no-save    decides whether to store invoice in config file.\n  -b, --browser         open generated invoice in browser.\n  --help                show this message and exit.\n```\n\ntemplates\n---------\ncurrently two templates are available:\n- `simple.html` - simple english template (*default*).\n- `simple_lt.html` - simple lithuanian/english template.\n\nyou can pass your own template name with `-t`. see `custom_templates_dir` (config section). have a look on schema below in case you want to write your own templates. templates are written in html and use [jinja2](https://jinja.palletsprojects.com/en/3.0.x/) templating language.\n\nschema\n------\n-   [schema/invoice.json](src/invoicepy/schema/invoice.json)\n-   [schema/config.json](src/invoicepy/schema/config.json)\n\n\ntroubleshooting\n---------------\n\n| Problem|Solution|\n|--------|--------|\n| `invoicepy: command not found`| Your distro didn't append python bin folder to your PATH. You can check where package lives with `pip3 show invoicepy` and add appropriate path. Example in your .bashrc: `export PATH=\"$PATH:$HOME/.local/bin\"`|\n|`OSError: encoder jpeg2k not available`| This is caused by pillow needing some extra libs, on Ubuntu: `sudo apt-get install libjpeg8-dev` then `pip install --no-cache-dir -I pillow`. On other distros find `libjpeg8-dev` equiavilent or google around for solutions regarding pillow.|\n|`sample-config` says `Aborting` and exists| Fixed in `0.1.1`|\n\ncontributing\n------------\n\nif you written cool new template or improved some features, feel free to fork and PR. See [contributing guidelines](CONTRIBUTING.md).\n\nto-dos\n------\n\n-   use babel for translations and locale\n-   extend tests\n-   consider moving config to yaml\n-   backup copy config on start\n-   invoices should have unique ids (maybe companies and customers too?)\n-   view saved invoices\n-   reprint saved invoices (?)\n-   package for arch (AUR)\n\nCredits\n-------\n\nThis package was created with\n[Cookiecutter](https://github.com/audreyr/cookiecutter) and the\n[johanvergeer/cookiecutter-poetry](https://github.com/johanvergeer/cookiecutter-poetry)\nproject template.\n\nTemplate taken from here and slightly modified:\n\u003chttps://github.com/sparksuite/simple-html-invoice-template\u003e\n\nLicence\n-------\n\nFree software: MIT license\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadamwojt%2Finvoicepy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadamwojt%2Finvoicepy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadamwojt%2Finvoicepy/lists"}