Merge branch 'master' into frontend-performance-improvements
This commit is contained in:
@@ -63,6 +63,11 @@ services:
|
||||
networks:
|
||||
- invoiceshelf-dev
|
||||
|
||||
pdf:
|
||||
image: gotenberg/gotenberg:8
|
||||
networks:
|
||||
- invoiceshelf-dev
|
||||
|
||||
networks:
|
||||
invoiceshelf-dev:
|
||||
|
||||
|
||||
@@ -62,6 +62,11 @@ services:
|
||||
networks:
|
||||
- invoiceshelf-dev
|
||||
|
||||
pdf:
|
||||
image: gotenberg/gotenberg:8
|
||||
networks:
|
||||
- invoiceshelf-dev
|
||||
|
||||
networks:
|
||||
invoiceshelf-dev:
|
||||
|
||||
|
||||
@@ -50,5 +50,10 @@ services:
|
||||
networks:
|
||||
- invoiceshelf-dev
|
||||
|
||||
pdf:
|
||||
image: gotenberg/gotenberg:8
|
||||
networks:
|
||||
- invoiceshelf-dev
|
||||
|
||||
networks:
|
||||
invoiceshelf-dev:
|
||||
|
||||
@@ -54,3 +54,7 @@ TRUSTED_PROXIES="*"
|
||||
|
||||
CRON_JOB_AUTH_TOKEN=""
|
||||
LOG_STACK=single
|
||||
|
||||
PDF_DRIVER=dompdf
|
||||
GOTENBERG_HOST=
|
||||
GOTENBERG_PAPERSIZE=
|
||||
|
||||
129
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
129
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -1,9 +1,8 @@
|
||||
name: Bug report
|
||||
description: Template for bug reports
|
||||
labels:
|
||||
- bug
|
||||
- triage
|
||||
projects: ["InvoiceShelf/2"]
|
||||
labels: ['bug', 'triage']
|
||||
type: Bug
|
||||
projects: ['InvoiceShelf/2']
|
||||
assignees:
|
||||
- rihards-simanovics
|
||||
|
||||
@@ -13,15 +12,15 @@ body:
|
||||
- type: checkboxes
|
||||
id: confirm-read-documentation
|
||||
attributes:
|
||||
label: Issue filing pre-requisites
|
||||
description: "Prior to filing an issue please confirm that:"
|
||||
label: Issue filing prerequisites
|
||||
description: 'Prior to filing an issue please confirm that:'
|
||||
options:
|
||||
- label: I've checked the documentation.
|
||||
- label: I've checked the [documentation](https://docs.invoiceshelf.com/).
|
||||
required: true
|
||||
- label: I've looked for similar issues both Open and Closed.
|
||||
required: true
|
||||
- label: >-
|
||||
Ive tried clearing both cache and cookies in my browser or tried
|
||||
I've tried clearing both cache and cookies in my browser or tried
|
||||
opening the app in the Incognito/InPrivate window.
|
||||
required: true
|
||||
|
||||
@@ -29,19 +28,19 @@ body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: >-
|
||||
If you did all of the above, we first would like to thank you for taking
|
||||
the time to fill out this bug report, it will help us tremendously to
|
||||
If you did all of the above, we would first like to thank you for taking
|
||||
the time to fill out this bug report. It will help us tremendously to
|
||||
find and fix the issue sooner!
|
||||
|
||||
# Description fo the bug
|
||||
# Description of the bug
|
||||
- type: textarea
|
||||
id: bug-description
|
||||
attributes:
|
||||
label: Describe the bug
|
||||
description: A clear and concise description of what the bug is.
|
||||
placeholder: >-
|
||||
When doing `x`, `y`, and `z` in that order, an error occurs, but when x,
|
||||
z and then y is done, the error does not occur.
|
||||
When doing `x`, `y`, and `z` in that order, an error occurs, but when `x`,
|
||||
`z` and then `y` is done, the error does not occur.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
@@ -53,34 +52,41 @@ body:
|
||||
description: A clear step-by-step explanation of how to reproduce your issue
|
||||
placeholder: >-
|
||||
## Produces an error:
|
||||
|
||||
1. Do X;
|
||||
|
||||
2. Do Y;
|
||||
|
||||
3. Do Z;
|
||||
|
||||
|
||||
## Works fine:
|
||||
|
||||
4. Do X;
|
||||
|
||||
5. Do Z;
|
||||
|
||||
6. Do Y.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
# Expected Behaviour
|
||||
- type: textarea
|
||||
id: expected-behavior
|
||||
id: expected-behaviour
|
||||
attributes:
|
||||
label: Expected behavior
|
||||
label: Expected behaviour
|
||||
description: A clear and concise description of what you expected to happen.
|
||||
placeholder: doing `x`, `y`, and `z` in that order should not generate an error.
|
||||
placeholder: Doing `x`, `y`, and `z` in that order should not generate an error.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
# Actual Behaviour
|
||||
- type: textarea
|
||||
id: actual-behavior
|
||||
id: actual-behaviour
|
||||
attributes:
|
||||
label: Actual behavior
|
||||
description: A clear and concise description of what actually happen.
|
||||
placeholder: doing `x`, `y`, and `z` in that order generate an error.
|
||||
label: Actual behaviour
|
||||
description: A clear and concise description of what actually happens.
|
||||
placeholder: Doing `x`, `y`, and `z` in that order generates an error.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
@@ -88,9 +94,19 @@ body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |-
|
||||
## Envirment
|
||||
## Environment
|
||||
|
||||
Now lets collect some information about your environment.
|
||||
Now let's collect some information about your environment.
|
||||
|
||||
# Use Docker?
|
||||
- type: checkboxes
|
||||
id: confirm-docker-install
|
||||
attributes:
|
||||
label: Docker
|
||||
description: 'Please note that unless the issue is with the app itself, you should file a bug report under the [docker](https://github.com/InvoiceShelf/docker) repository.'
|
||||
options:
|
||||
- label: App running in Docker Container.
|
||||
- label: Docker container running behind Reverse proxy.
|
||||
|
||||
# App Version
|
||||
- type: input
|
||||
@@ -115,7 +131,7 @@ body:
|
||||
id: database-type
|
||||
attributes:
|
||||
label: Database type
|
||||
placeholder: MariaDB / MySQL / PostreSQL / SQLite
|
||||
placeholder: MariaDB / MySQL / PostgreSQL / SQLite
|
||||
validations:
|
||||
required: true
|
||||
|
||||
@@ -133,14 +149,14 @@ body:
|
||||
id: web-browser
|
||||
attributes:
|
||||
label: Web Browser
|
||||
placeholder: "Firefox / Safari / or any other (chromium based browser)"
|
||||
placeholder: 'Firefox / Safari / or any other (Chromium-based browser)'
|
||||
|
||||
# OS Version
|
||||
- type: input
|
||||
id: server-os
|
||||
attributes:
|
||||
label: Server OS
|
||||
description: If Linux please make sure to provide both distro name and it's version
|
||||
description: If Linux, please make sure to provide both the distro name and its version
|
||||
placeholder: Windows / Linux (e.g. Ubuntu 24.04)
|
||||
|
||||
# Associated Logs
|
||||
@@ -150,7 +166,7 @@ body:
|
||||
## Logs
|
||||
|
||||
|
||||
last but not least, could you please take some time to get us the logs
|
||||
Last but not least, could you please take some time to get us the logs
|
||||
for:
|
||||
|
||||
# Log Reverse proxy
|
||||
@@ -162,21 +178,17 @@ body:
|
||||
Please provide logs from your Apache, Nginx, Traefik, or any other
|
||||
reverse proxy application.
|
||||
placeholder: >-
|
||||
[2015-02-04 10:00:00] production.INFO: Laravel 5.0 released. The world rejoices.
|
||||
[2015-12-03 12:00:00] production.INFO: PHP 7.0 introduced scalar type declarations. Minds blown.
|
||||
[2016-05-15 14:00:00] production.INFO: Composer installed new dependencies. Dependency hell avoided.
|
||||
[2017-08-20 16:00:00] production.INFO: Artisan command executed: migrate. Smooth sailing.
|
||||
[2018-01-10 09:00:00] production.INFO: User login successful.
|
||||
[2018-01-10 09:05:00] production.ERROR: Database connection failed. Did you try turning it off and on again?
|
||||
[2018-01-10 09:10:00] production.WARNING: Deprecated function used in UserController.php. Time to refactor, again.
|
||||
[2018-01-10 09:15:00] production.ERROR: Uncaught Exception: Division by zero. Oops, math is hard.
|
||||
[2018-01-10 09:20:00] production.INFO: User logout successful. See you later, alligator.
|
||||
[2019-03-25 11:00:00] production.INFO: Cache cleared. Fresh start!
|
||||
[2019-06-30 13:00:00] production.ERROR: Syntax error. Missing semicolon strikes again.
|
||||
[2020-09-10 15:00:00] production.INFO: User registered. Welcome aboard!
|
||||
[2021-11-05 17:00:00] production.WARNING: Low disk space. Time to clean up.
|
||||
[2022-12-20 19:00:00] production.INFO: Server rebooted. All systems go.
|
||||
[2024-11-14 18:56:20] production.INFO: Unexpected item in the bagging area. Please wait for assistance.
|
||||
2023-04-12 10:15:32 [NGINX] 172.16.0.5 - - [12/Apr/2023:10:15:32 +0000] "GET /index.html HTTP/1.1" 200 1024 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
|
||||
|
||||
2023-04-12 10:15:33 [NGINX] 172.16.0.7 - - [12/Apr/2023:10:15:33 +0000] "POST /login HTTP/1.1" 302 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8"
|
||||
|
||||
2023-04-12 10:15:34 [NGINX] 172.16.0.9 - - [12/Apr/2023:10:15:34 +0000] "GET /about HTTP/1.1" 200 2048 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
|
||||
|
||||
2023-04-12 10:15:35 [NGINX] 172.16.0.11 - - [12/Apr/2023:10:15:35 +0000] "PUT /api/v1/users/123 HTTP/1.1" 200 - "https://example.com/profile" "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1"
|
||||
|
||||
2023-04-12 10:15:36 [NGINX] 172.16.0.13 - - [12/Apr/2023:10:15:36 +0000] "DELETE /api/v1/products/456 HTTP/1.1" 204 - "-" "Dalvik/2.1.0 (Linux; U; Android 10; Pixel 4 Build/QD1A.190821.014.C2)"
|
||||
|
||||
2023-04-12 10:15:37 [NGINX] 172.16.0.15 - - [12/Apr/2023:10:15:37 +0000] "GET /easter-egg HTTP/1.1" 200 42 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.3"
|
||||
render: irc logs
|
||||
|
||||
# PHP/Laravel Logs
|
||||
@@ -186,12 +198,35 @@ body:
|
||||
label: Laravel/PHP logs
|
||||
description: Please provide logs from either PHP or Laravel or both.
|
||||
placeholder: >-
|
||||
2023-04-12 10:15:32 [NGINX] 172.16.0.5 - - [12/Apr/2023:10:15:32 +0000] "GET /index.html HTTP/1.1" 200 1024 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
|
||||
2023-04-12 10:15:33 [NGINX] 172.16.0.7 - - [12/Apr/2023:10:15:33 +0000] "POST /login HTTP/1.1" 302 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8"
|
||||
2023-04-12 10:15:34 [NGINX] 172.16.0.9 - - [12/Apr/2023:10:15:34 +0000] "GET /about HTTP/1.1" 200 2048 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
|
||||
2023-04-12 10:15:35 [NGINX] 172.16.0.11 - - [12/Apr/2023:10:15:35 +0000] "PUT /api/v1/users/123 HTTP/1.1" 200 - "https://example.com/profile" "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1"
|
||||
2023-04-12 10:15:36 [NGINX] 172.16.0.13 - - [12/Apr/2023:10:15:36 +0000] "DELETE /api/v1/products/456 HTTP/1.1" 204 - "-" "Dalvik/2.1.0 (Linux; U; Android 10; Pixel 4 Build/QD1A.190821.014.C2)"
|
||||
2023-04-12 10:15:37 [NGINX] 172.16.0.15 - - [12/Apr/2023:10:15:37 +0000] "GET /easter-egg HTTP/1.1" 200 42 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.3"
|
||||
[2015-02-04 10:00:00] production.INFO: Laravel 5.0 released. The world rejoices.
|
||||
|
||||
[2015-12-03 12:00:00] production.INFO: PHP 7.0 introduced scalar type declarations. Minds blown.
|
||||
|
||||
[2016-05-15 14:00:00] production.INFO: Composer installed new dependencies. Dependency hell avoided.
|
||||
|
||||
[2017-08-20 16:00:00] production.INFO: Artisan command executed: migrate. Smooth sailing.
|
||||
|
||||
[2018-01-10 09:00:00] production.INFO: User login successful.
|
||||
|
||||
[2018-01-10 09:05:00] production.ERROR: Database connection failed. Did you try turning it off and on again?
|
||||
|
||||
[2018-01-10 09:10:00] production.WARNING: Deprecated function used in UserController.php. Time to refactor, again.
|
||||
|
||||
[2018-01-10 09:15:00] production.ERROR: Uncaught Exception: Division by zero. Oops, maths is hard.
|
||||
|
||||
[2018-01-10 09:20:00] production.INFO: User logout successful. See you later, alligator.
|
||||
|
||||
[2019-03-25 11:00:00] production.INFO: Cache cleared. Fresh start!
|
||||
|
||||
[2019-06-30 13:00:00] production.ERROR: Syntax error. Missing semicolon strikes again.
|
||||
|
||||
[2020-09-10 15:00:00] production.INFO: User registered. Welcome aboard!
|
||||
|
||||
[2021-11-05 17:00:00] production.WARNING: Low disk space. Time to clean up.
|
||||
|
||||
[2022-12-20 19:00:00] production.INFO: Server rebooted. All systems go.
|
||||
|
||||
[2024-11-14 18:56:20] production.INFO: Unexpected item in the bagging area. Please wait for assistance.
|
||||
render: irc logs
|
||||
|
||||
# Special thanks
|
||||
|
||||
39
.github/ISSUE_TEMPLATE/code_quality_issue.yml
vendored
39
.github/ISSUE_TEMPLATE/code_quality_issue.yml
vendored
@@ -5,7 +5,7 @@ description: Create a code quality issue to help InvoiceShelf keep a clean codeb
|
||||
labels:
|
||||
- code quality
|
||||
- triage
|
||||
projects: ["InvoiceShelf/2"]
|
||||
projects: ['InvoiceShelf/2']
|
||||
assignees:
|
||||
- rihards-simanovics
|
||||
|
||||
@@ -20,6 +20,23 @@ body:
|
||||
possibility your suggestion is already being tracked. Please do a
|
||||
thorough search before creating a new issue.
|
||||
|
||||
# Ask user to confirm they've tried to fix or research the issue before
|
||||
# posting a bug report.
|
||||
- type: checkboxes
|
||||
id: confirm-read-documentation
|
||||
attributes:
|
||||
label: Issue filing prerequisites
|
||||
description: 'Prior to filing an issue please confirm that:'
|
||||
options:
|
||||
- label: I've checked the [documentation](https://docs.invoiceshelf.com/).
|
||||
required: true
|
||||
- label: I've looked for similar issues both Open and Closed.
|
||||
required: true
|
||||
- label: >-
|
||||
I've tried clearing both cache and cookies in my browser or tried
|
||||
opening the app in the Incognito/InPrivate window.
|
||||
required: true
|
||||
|
||||
# Issue body
|
||||
- type: textarea
|
||||
id: description
|
||||
@@ -45,10 +62,12 @@ body:
|
||||
attributes:
|
||||
label: Gains
|
||||
description: What would fixing this code quality issue bring to the source code?
|
||||
value: |
|
||||
- eg. A better readability.
|
||||
- eg. Uncoupling concepts X and Y.
|
||||
- eg. Clarifying the responsibility of class C.
|
||||
placeholder: >-
|
||||
- e.g. Better readability.
|
||||
|
||||
- e.g. Uncoupling concepts X and Y.
|
||||
|
||||
- e.g. Clarifying the responsibility of class C.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
@@ -58,10 +77,12 @@ body:
|
||||
attributes:
|
||||
label: Requirements
|
||||
description: Describe all the requirements to solve the code quality issue.
|
||||
value: |
|
||||
- eg. Using a specific design pattern.
|
||||
- eg. Separating Interface I into three new interfaces I1, I2 and I3.
|
||||
- eg. Regrouping the duplicated process into a new helper.
|
||||
placeholder: >-
|
||||
- e.g. Using a specific design pattern.
|
||||
|
||||
- e.g. Separating Interface I into three new interfaces I1, I2 and I3.
|
||||
|
||||
- e.g. Regrouping the duplicated process into a new helper.
|
||||
|
||||
# Remarks
|
||||
- type: textarea
|
||||
|
||||
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -6,6 +6,6 @@ contact_links:
|
||||
- name: Translation issue
|
||||
url: https://crowdin.com/project/invoiceshelf
|
||||
about: Help improve translations on Crowdin.
|
||||
- name: Question & Discussion
|
||||
- name: Support, Question & Discussion - Official Discord Server
|
||||
url: https://discord.gg/hwg2FtwWHW
|
||||
about: Post your questions and join the discussion. You can participate in chats on every channel.
|
||||
|
||||
30
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
30
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@@ -4,7 +4,8 @@ name: Feature Request
|
||||
labels:
|
||||
- feature request
|
||||
- triage
|
||||
projects: ["InvoiceShelf/2"]
|
||||
type: Feature
|
||||
projects: ['InvoiceShelf/2']
|
||||
assignees:
|
||||
- rihards-simanovics
|
||||
description: >-
|
||||
@@ -21,12 +22,31 @@ body:
|
||||
your suggestion is already being tracked. Please do a thorough search
|
||||
before creating a new issue.
|
||||
|
||||
# Ask user to confirm they've tried to fix or research the issue before
|
||||
# posting a bug report.
|
||||
- type: checkboxes
|
||||
id: confirm-read-documentation
|
||||
attributes:
|
||||
label: Issue filing prerequisites
|
||||
description: 'Prior to filing an issue please confirm that:'
|
||||
options:
|
||||
- label: I've checked the [documentation](https://docs.invoiceshelf.com/).
|
||||
required: true
|
||||
- label: I've looked for similar issues with feature requests both Open and Closed.
|
||||
required: true
|
||||
- label: >-
|
||||
I've tried clearing both cache and cookies in my browser or tried
|
||||
opening the app in the Incognito/InPrivate window.
|
||||
required: true
|
||||
|
||||
# Description
|
||||
- type: textarea
|
||||
id: what-feature
|
||||
attributes:
|
||||
label: What feature or improvement do you think would benefit InvoiceShelf?
|
||||
description: Please include your use case
|
||||
placeholder: >-
|
||||
I propose that feature J be implemented as I believe it will greatly benefit the application.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
@@ -37,7 +57,7 @@ body:
|
||||
---
|
||||
|
||||
|
||||
Please include a list changes required to make this improvement. A good
|
||||
Please include a list of changes required to make this improvement. A good
|
||||
rule of thumb is to start your proposal with no more than 7 high-level
|
||||
requirements.
|
||||
|
||||
@@ -47,9 +67,11 @@ body:
|
||||
attributes:
|
||||
label: Requirements
|
||||
description: Describe all the requirements to make your idea happen.
|
||||
value: |
|
||||
placeholder: >-
|
||||
- This proposal will accomplish X
|
||||
|
||||
- This proposal will accomplish Y
|
||||
|
||||
- This proposal will accomplish Z
|
||||
validations:
|
||||
required: true
|
||||
@@ -59,7 +81,7 @@ body:
|
||||
id: invoiceshelf_version
|
||||
attributes:
|
||||
label: App Version
|
||||
description: Which version of InvoiceShelf are you using?
|
||||
description: Which version of InvoiceShelf are you currently using?
|
||||
placeholder: v0.0.0
|
||||
validations:
|
||||
required: true
|
||||
|
||||
17
.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
vendored
Normal file
17
.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
## Pre-review request checklist
|
||||
|
||||
- [ ] (\*) I have listed all changes in the `Changes` section.
|
||||
- [ ] (opt) I have listed all issues this PR addresses in the `Issues` section [with the issue/discussion IDs](https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue).
|
||||
- [ ] (\*) I have tested my changes.
|
||||
- [ ] (\*) I have considered backwards compatibility.
|
||||
|
||||
## Changes
|
||||
|
||||
- Added feature X
|
||||
- Removed Code Y
|
||||
- Refactored code Z
|
||||
|
||||
## Issues
|
||||
|
||||
- fixes #
|
||||
- closes #
|
||||
11
.github/workflows/check.yaml
vendored
11
.github/workflows/check.yaml
vendored
@@ -40,7 +40,7 @@ jobs:
|
||||
- name: Set up PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: 8.2
|
||||
php-version: 8.3
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
@@ -61,12 +61,13 @@ jobs:
|
||||
php-version:
|
||||
- 8.2
|
||||
- 8.3
|
||||
- 8.4
|
||||
env:
|
||||
extensions: bcmath, curl, dom, gd, imagick, json, libxml, mbstring, pcntl, pdo, pdo_mysql, zip
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup PHP Action
|
||||
uses: shivammathur/setup-php@v2
|
||||
@@ -80,7 +81,7 @@ jobs:
|
||||
uses: ramsey/composer-install@v2
|
||||
|
||||
- name: Use Node.js 20
|
||||
uses: actions/setup-node@v3
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
|
||||
@@ -104,7 +105,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
@@ -119,7 +120,7 @@ jobs:
|
||||
composer-options: --no-dev
|
||||
|
||||
- name: Use Node.js 20
|
||||
uses: actions/setup-node@v3
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
|
||||
|
||||
27208
_ide_helper.php
27208
_ide_helper.php
File diff suppressed because it is too large
Load Diff
1629
_ide_helper_models.php
Normal file
1629
_ide_helper_models.php
Normal file
File diff suppressed because it is too large
Load Diff
@@ -2,8 +2,11 @@
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Space\PdfTemplateUtils;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class CreateTemplateCommand extends Command
|
||||
{
|
||||
@@ -37,25 +40,53 @@ class CreateTemplateCommand extends Command
|
||||
public function handle(): int
|
||||
{
|
||||
$templateName = $this->argument('name');
|
||||
$type = $this->option('type');
|
||||
$templateType = $this->option('type');
|
||||
|
||||
if (! $type) {
|
||||
$type = $this->choice('Create a template for?', ['invoice', 'estimate']);
|
||||
if (! $templateType) {
|
||||
$templateType = $this->choice('Create a template for?', ['invoice', 'estimate']);
|
||||
}
|
||||
|
||||
if (Storage::disk('views')->exists("/app/pdf/{$type}/{$templateName}.blade.php")) {
|
||||
if (PdfTemplateUtils::customTemplateFileExists($templateType, sprintf('%s.blade.php', $templateName))) {
|
||||
$this->info('Template with given name already exists.');
|
||||
|
||||
return 0;
|
||||
return self::INVALID;
|
||||
}
|
||||
|
||||
Storage::disk('views')->copy("/app/pdf/{$type}/{$type}1.blade.php", "/app/pdf/{$type}/{$templateName}.blade.php");
|
||||
copy(resource_path("static/img/PDF/{$type}1.png"), resource_path("static/img/PDF/{$templateName}.png"));
|
||||
if (! PdfTemplateUtils::toCustomTemplateMarkupFile(
|
||||
Str::replace(
|
||||
sprintf('app.pdf.%s', $templateType),
|
||||
sprintf('pdf_templates::%s', $templateType),
|
||||
Storage::disk('views')->get("/app/pdf/{$templateType}/{$templateType}1.blade.php"),
|
||||
),
|
||||
$templateType,
|
||||
$templateName
|
||||
)) {
|
||||
$this->error(sprintf('Unable to create %s template.', ucfirst($templateType)));
|
||||
|
||||
$path = resource_path("views/app/pdf/{$type}/{$templateName}.blade.php");
|
||||
$type = ucfirst($type);
|
||||
$this->info("{$type} Template created successfully at ".$path);
|
||||
return self::FAILURE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
PdfTemplateUtils::toCustomTemplateImageFile(
|
||||
File::get(resource_path("static/img/PDF/{$templateType}1.png")),
|
||||
$templateType,
|
||||
$templateName,
|
||||
);
|
||||
|
||||
if (! PdfTemplateUtils::customTemplateFileExists($templateType, 'partials/table.blade.php')) {
|
||||
PdfTemplateUtils::toCustomTemplateFile(
|
||||
Storage::disk('views')->get("/app/pdf/{$templateType}/partials/table.blade.php"),
|
||||
$templateType,
|
||||
'partials/table.blade.php'
|
||||
);
|
||||
}
|
||||
|
||||
$this->info(
|
||||
sprintf('%s Template created successfully at %s',
|
||||
ucfirst($templateType),
|
||||
PdfTemplateUtils::getCustomTemplateFilePath($templateType, sprintf('%s.blade.php', $templateName))
|
||||
)
|
||||
);
|
||||
|
||||
return self::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\Setting;
|
||||
use App\Space\Updater;
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
@@ -98,7 +97,7 @@ class UpdateCommand extends Command
|
||||
|
||||
public function getInstalledVersion()
|
||||
{
|
||||
return Setting::getSetting('version');
|
||||
return preg_replace('~[\r\n]+~', '', File::get(base_path('version.md')));
|
||||
}
|
||||
|
||||
public function getLatestVersionResponse()
|
||||
|
||||
16
app/Facades/PDF.php
Normal file
16
app/Facades/PDF.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace App\Facades;
|
||||
|
||||
use Illuminate\Support\Facades\Facade;
|
||||
|
||||
/**
|
||||
* @method static \Psr\Http\Message\ResponseInterface loadView(string $template)
|
||||
*/
|
||||
class PDF extends Facade
|
||||
{
|
||||
protected static function getFacadeAccessor()
|
||||
{
|
||||
return 'pdf.driver';
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Setting;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\File;
|
||||
|
||||
class AppVersionController extends Controller
|
||||
{
|
||||
@@ -14,7 +15,7 @@ class AppVersionController extends Controller
|
||||
*/
|
||||
public function __invoke(Request $request)
|
||||
{
|
||||
$version = Setting::getSetting('version');
|
||||
$version = preg_replace('~[\r\n]+~', '', File::get(base_path('version.md')));
|
||||
|
||||
$channel = Setting::getSetting('updater_channel');
|
||||
if (is_null($channel)) {
|
||||
|
||||
@@ -80,7 +80,7 @@ class BackupsController extends ApiController
|
||||
$this->authorize('manage backups');
|
||||
|
||||
$validated = $request->validate([
|
||||
'path' => ['required', new PathToZip()],
|
||||
'path' => ['required', new PathToZip],
|
||||
]);
|
||||
|
||||
$backupDestination = BackupDestination::create(config('filesystems.default'), config('backup.backup.name'));
|
||||
|
||||
@@ -18,7 +18,7 @@ class DownloadBackupController extends ApiController
|
||||
$this->authorize('manage backups');
|
||||
|
||||
$validated = $request->validate([
|
||||
'path' => ['required', new PathToZip()],
|
||||
'path' => ['required', new PathToZip],
|
||||
]);
|
||||
|
||||
$backupDestination = BackupDestination::create(config('filesystems.default'), config('backup.backup.name'));
|
||||
|
||||
@@ -24,7 +24,7 @@ class CloneEstimateController extends Controller
|
||||
|
||||
$date = Carbon::now();
|
||||
|
||||
$serial = (new SerialNumberFormatter())
|
||||
$serial = (new SerialNumberFormatter)
|
||||
->setModel($estimate)
|
||||
->setCompany($estimate->company_id)
|
||||
->setCustomer($estimate->customer_id)
|
||||
|
||||
@@ -42,7 +42,7 @@ class ConvertEstimateController extends Controller
|
||||
$due_date = Carbon::now()->addDays($dueDateDays)->format('Y-m-d');
|
||||
}
|
||||
|
||||
$serial = (new SerialNumberFormatter())
|
||||
$serial = (new SerialNumberFormatter)
|
||||
->setModel($invoice)
|
||||
->setCompany($estimate->company_id)
|
||||
->setCustomer($estimate->customer_id)
|
||||
|
||||
@@ -4,6 +4,8 @@ namespace App\Http\Controllers\V1\Admin\Estimate;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Estimate;
|
||||
use App\Space\PdfTemplateUtils;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class EstimateTemplatesController extends Controller
|
||||
@@ -11,13 +13,13 @@ class EstimateTemplatesController extends Controller
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function __invoke(Request $request)
|
||||
{
|
||||
$this->authorize('viewAny', Estimate::class);
|
||||
|
||||
$estimateTemplates = Estimate::estimateTemplates();
|
||||
$estimateTemplates = PdfTemplateUtils::getFormattedTemplates('estimate');
|
||||
|
||||
return response()->json([
|
||||
'estimateTemplates' => $estimateTemplates,
|
||||
|
||||
@@ -20,7 +20,7 @@ class NextNumberController extends Controller
|
||||
{
|
||||
$key = $request->key;
|
||||
$nextNumber = null;
|
||||
$serial = (new SerialNumberFormatter())
|
||||
$serial = (new SerialNumberFormatter)
|
||||
->setCompany($request->header('company'))
|
||||
->setCustomer($request->userId);
|
||||
|
||||
|
||||
@@ -41,6 +41,15 @@ class NotesController extends Controller
|
||||
|
||||
$note = Note::create($request->getNotesPayload());
|
||||
|
||||
if ($note->is_default) {
|
||||
Note::where('id', '!=', $note->id)
|
||||
->where('type', $note->type)
|
||||
->where('is_default', true)
|
||||
->update([
|
||||
'is_default' => false,
|
||||
]);
|
||||
}
|
||||
|
||||
return new NoteResource($note);
|
||||
}
|
||||
|
||||
@@ -68,6 +77,15 @@ class NotesController extends Controller
|
||||
|
||||
$note->update($request->getNotesPayload());
|
||||
|
||||
if ($note->is_default) {
|
||||
Note::where('id', '!=', $note->id)
|
||||
->where('type', $note->type)
|
||||
->where('is_default', true)
|
||||
->update([
|
||||
'is_default' => false,
|
||||
]);
|
||||
}
|
||||
|
||||
return new NoteResource($note);
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ class CloneInvoiceController extends Controller
|
||||
|
||||
$date = Carbon::now();
|
||||
|
||||
$serial = (new SerialNumberFormatter())
|
||||
$serial = (new SerialNumberFormatter)
|
||||
->setModel($invoice)
|
||||
->setCompany($invoice->company_id)
|
||||
->setCustomer($invoice->customer_id)
|
||||
|
||||
@@ -4,6 +4,9 @@ namespace App\Http\Controllers\V1\Admin\Invoice;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Invoice;
|
||||
use App\Space\PdfTemplateUtils;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class InvoiceTemplatesController extends Controller
|
||||
@@ -11,13 +14,16 @@ class InvoiceTemplatesController extends Controller
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*
|
||||
* @return JsonResponse
|
||||
*
|
||||
* @throws AuthorizationException
|
||||
*/
|
||||
public function __invoke(Request $request)
|
||||
{
|
||||
$this->authorize('viewAny', Invoice::class);
|
||||
|
||||
$invoiceTemplates = Invoice::invoiceTemplates();
|
||||
$invoiceTemplates = PdfTemplateUtils::getFormattedTemplates('invoice');
|
||||
|
||||
return response()->json([
|
||||
'invoiceTemplates' => $invoiceTemplates,
|
||||
|
||||
@@ -58,6 +58,7 @@ class MailConfigurationController extends Controller
|
||||
'mail_mailgun_secret' => config('services.mailgun.secret'),
|
||||
'mail_ses_key' => config('services.ses.key'),
|
||||
'mail_ses_secret' => config('services.ses.secret'),
|
||||
'mail_ses_region' => config('services.ses.region'),
|
||||
];
|
||||
|
||||
return response()->json($MailData);
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\V1\Admin\Settings;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\PDFConfigurationRequest;
|
||||
use App\Space\EnvironmentManager;
|
||||
|
||||
class PDFConfigurationController extends Controller
|
||||
{
|
||||
/**
|
||||
* @var EnvironmentManager
|
||||
*/
|
||||
protected $environmentManager;
|
||||
|
||||
public function __construct(EnvironmentManager $environmentManager)
|
||||
{
|
||||
$this->environmentManager = $environmentManager;
|
||||
}
|
||||
|
||||
public function getDrivers()
|
||||
{
|
||||
$this->authorize('manage pdf config');
|
||||
|
||||
$drivers = [
|
||||
'dompdf',
|
||||
'gotenberg',
|
||||
];
|
||||
|
||||
return response()->json($drivers);
|
||||
}
|
||||
|
||||
public function getEnvironment()
|
||||
{
|
||||
$this->authorize('manage pdf config');
|
||||
|
||||
$config = [
|
||||
'pdf_driver' => config('pdf.driver'),
|
||||
'gotenberg_host' => config('pdf.gotenberg.host'),
|
||||
'gotenberg_margins' => config('pdf.gotenberg.margins'),
|
||||
'gotenberg_papersize' => config('pdf.gotenberg.papersize'),
|
||||
];
|
||||
|
||||
return response()->json($config);
|
||||
}
|
||||
|
||||
public function saveEnvironment(PDFConfigurationRequest $request)
|
||||
{
|
||||
$this->authorize('manage pdf config');
|
||||
$results = $this->environmentManager->savePDFVariables($request);
|
||||
|
||||
return response()->json($results);
|
||||
}
|
||||
}
|
||||
@@ -3,9 +3,9 @@
|
||||
namespace App\Http\Controllers\V1\Admin\Update;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Setting;
|
||||
use App\Space\Updater;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\File;
|
||||
|
||||
class CheckVersionController extends Controller
|
||||
{
|
||||
@@ -26,7 +26,8 @@ class CheckVersionController extends Controller
|
||||
set_time_limit(600); // 10 minutes
|
||||
|
||||
$channel = $request->get('channel', 'stable');
|
||||
$response = Updater::checkForUpdate(Setting::getSetting('version'), $channel);
|
||||
$version = preg_replace('~[\r\n]+~', '', File::get(base_path('version.md')));
|
||||
$response = Updater::checkForUpdate($version, $channel);
|
||||
|
||||
return response()->json($response);
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ class AppDomainController extends Controller
|
||||
{
|
||||
Artisan::call('optimize:clear');
|
||||
|
||||
$environmentManager = new EnvironmentManager();
|
||||
$environmentManager = new EnvironmentManager;
|
||||
|
||||
$results = $environmentManager->saveDomainVariables($request);
|
||||
|
||||
|
||||
@@ -33,6 +33,9 @@ class NotesRequest extends FormRequest
|
||||
'notes' => [
|
||||
'required',
|
||||
],
|
||||
'is_default' => [
|
||||
'required',
|
||||
],
|
||||
];
|
||||
|
||||
if ($this->isMethod('PUT')) {
|
||||
|
||||
57
app/Http/Requests/PDFConfigurationRequest.php
Normal file
57
app/Http/Requests/PDFConfigurationRequest.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class PDFConfigurationRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
switch ($this->get('pdf_driver')) {
|
||||
case 'dompdf':
|
||||
return [
|
||||
'pdf_driver' => [
|
||||
'required',
|
||||
'string',
|
||||
],
|
||||
];
|
||||
break;
|
||||
|
||||
case 'gotenberg':
|
||||
return [
|
||||
'pdf_driver' => [
|
||||
'required',
|
||||
'string',
|
||||
],
|
||||
'gotenberg_host' => [
|
||||
'required',
|
||||
'url',
|
||||
],
|
||||
'gotenberg_papersize' => [
|
||||
function ($attribute, $value, $fail) {
|
||||
($attribute); // unused
|
||||
$reg = "/^\d+(pt|px|pc|mm|cm|in) \d+(pt|px|pc|mm|cm|in)$/";
|
||||
if (! preg_match($reg, $value)) {
|
||||
$fail('Invalid papersize, must be in format "210mm 297mm". Accepts: pt,px,pc,mm,cm,in');
|
||||
}
|
||||
},
|
||||
],
|
||||
];
|
||||
|
||||
break;
|
||||
}
|
||||
throw new \InvalidArgumentException('Invalid PDFDriver requested');
|
||||
}
|
||||
}
|
||||
@@ -28,8 +28,17 @@ class TaxTypeRequest extends FormRequest
|
||||
->where('type', TaxType::TYPE_GENERAL)
|
||||
->where('company_id', $this->header('company')),
|
||||
],
|
||||
'percent' => [
|
||||
'calculation_type' => [
|
||||
'required',
|
||||
Rule::in(['percentage', 'fixed']),
|
||||
],
|
||||
'percent' => [
|
||||
'nullable',
|
||||
'numeric',
|
||||
],
|
||||
'fixed_amount' => [
|
||||
'nullable',
|
||||
'numeric',
|
||||
],
|
||||
'description' => [
|
||||
'nullable',
|
||||
|
||||
@@ -18,6 +18,7 @@ class NoteResource extends JsonResource
|
||||
'type' => $this->type,
|
||||
'name' => $this->name,
|
||||
'notes' => $this->notes,
|
||||
'is_default' => $this->is_default,
|
||||
'company' => $this->when($this->company()->exists(), function () {
|
||||
return new CompanyResource($this->company);
|
||||
}),
|
||||
|
||||
@@ -25,6 +25,8 @@ class TaxResource extends JsonResource
|
||||
'name' => $this->name,
|
||||
'amount' => $this->amount,
|
||||
'percent' => $this->percent,
|
||||
'calculation_type' => $this->calculation_type,
|
||||
'fixed_amount' => $this->fixed_amount,
|
||||
'compound_tax' => $this->compound_tax,
|
||||
'base_amount' => $this->base_amount,
|
||||
'currency_id' => $this->currency_id,
|
||||
|
||||
@@ -17,6 +17,8 @@ class TaxTypeResource extends JsonResource
|
||||
'id' => $this->id,
|
||||
'name' => $this->name,
|
||||
'percent' => $this->percent,
|
||||
'fixed_amount' => $this->fixed_amount,
|
||||
'calculation_type' => $this->calculation_type,
|
||||
'type' => $this->type,
|
||||
'compound_tax' => $this->compound_tax,
|
||||
'collective_tax' => $this->collective_tax,
|
||||
|
||||
@@ -3,19 +3,18 @@
|
||||
namespace App\Models;
|
||||
|
||||
use App;
|
||||
use App\Facades\PDF;
|
||||
use App\Mail\SendEstimateMail;
|
||||
use App\Services\SerialNumberFormatter;
|
||||
use App\Space\PdfTemplateUtils;
|
||||
use App\Traits\GeneratesPdfTrait;
|
||||
use App\Traits\HasCustomFieldsTrait;
|
||||
use Barryvdh\DomPDF\Facade\Pdf as PDF;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Relations\MorphMany;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Facades\Vite;
|
||||
use Illuminate\Support\Str;
|
||||
use Spatie\MediaLibrary\HasMedia;
|
||||
use Spatie\MediaLibrary\InteractsWithMedia;
|
||||
@@ -227,7 +226,7 @@ class Estimate extends Model implements HasMedia
|
||||
|
||||
$estimate = self::create($data);
|
||||
$estimate->unique_hash = Hashids::connection(Estimate::class)->encode($estimate->id);
|
||||
$serial = (new SerialNumberFormatter())
|
||||
$serial = (new SerialNumberFormatter)
|
||||
->setModel($estimate)
|
||||
->setCompany($estimate->company_id)
|
||||
->setCustomer($estimate->customer_id)
|
||||
@@ -262,7 +261,7 @@ class Estimate extends Model implements HasMedia
|
||||
{
|
||||
$data = $request->getEstimatePayload();
|
||||
|
||||
$serial = (new SerialNumberFormatter())
|
||||
$serial = (new SerialNumberFormatter)
|
||||
->setModel($this)
|
||||
->setCompany($this->company_id)
|
||||
->setCustomer($request->customer_id)
|
||||
@@ -424,11 +423,14 @@ class Estimate extends Model implements HasMedia
|
||||
'taxes' => $taxes,
|
||||
]);
|
||||
|
||||
$template = PdfTemplateUtils::findFormattedTemplate('estimate', $estimateTemplate, '');
|
||||
$templatePath = $template['custom'] ? sprintf('pdf_templates::estimate.%s', $estimateTemplate) : sprintf('app.pdf.estimate.%s', $estimateTemplate);
|
||||
|
||||
if (request()->has('preview')) {
|
||||
return view('app.pdf.estimate.'.$estimateTemplate);
|
||||
return view($templatePath);
|
||||
}
|
||||
|
||||
return PDF::loadView('app.pdf.estimate.'.$estimateTemplate);
|
||||
return PDF::loadView($templatePath);
|
||||
}
|
||||
|
||||
public function getCompanyAddress()
|
||||
@@ -499,27 +501,13 @@ class Estimate extends Model implements HasMedia
|
||||
];
|
||||
}
|
||||
|
||||
public static function estimateTemplates()
|
||||
{
|
||||
$templates = Storage::disk('views')->files('/app/pdf/estimate');
|
||||
$estimateTemplates = [];
|
||||
|
||||
foreach ($templates as $key => $template) {
|
||||
$templateName = Str::before(basename($template), '.blade.php');
|
||||
$estimateTemplates[$key]['name'] = $templateName;
|
||||
$estimateTemplates[$key]['path'] = Vite::asset('resources/static/img/PDF/'.$templateName.'.png');
|
||||
}
|
||||
|
||||
return $estimateTemplates;
|
||||
}
|
||||
|
||||
public function getInvoiceTemplateName()
|
||||
{
|
||||
$templateName = Str::replace('estimate', 'invoice', $this->template_name);
|
||||
|
||||
$name = [];
|
||||
|
||||
foreach (Invoice::invoiceTemplates() as $template) {
|
||||
foreach (PdfTemplateUtils::getFormattedTemplates('invoice') as $template) {
|
||||
$name[] = $template['name'];
|
||||
}
|
||||
|
||||
|
||||
@@ -3,20 +3,18 @@
|
||||
namespace App\Models;
|
||||
|
||||
use App;
|
||||
use App\Facades\PDF;
|
||||
use App\Mail\SendInvoiceMail;
|
||||
use App\Services\SerialNumberFormatter;
|
||||
use App\Space\ImageUtils;
|
||||
use App\Space\PdfTemplateUtils;
|
||||
use App\Traits\GeneratesPdfTrait;
|
||||
use App\Traits\HasCustomFieldsTrait;
|
||||
use Barryvdh\DomPDF\Facade\Pdf as PDF;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Relations\MorphMany;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
use Nwidart\Modules\Facades\Module;
|
||||
use Spatie\MediaLibrary\HasMedia;
|
||||
use Spatie\MediaLibrary\InteractsWithMedia;
|
||||
@@ -323,7 +321,7 @@ class Invoice extends Model implements HasMedia
|
||||
|
||||
$invoice = Invoice::create($data);
|
||||
|
||||
$serial = (new SerialNumberFormatter())
|
||||
$serial = (new SerialNumberFormatter)
|
||||
->setModel($invoice)
|
||||
->setCompany($invoice->company_id)
|
||||
->setCustomer($invoice->customer_id)
|
||||
@@ -364,7 +362,7 @@ class Invoice extends Model implements HasMedia
|
||||
|
||||
public function updateInvoice($request)
|
||||
{
|
||||
$serial = (new SerialNumberFormatter())
|
||||
$serial = (new SerialNumberFormatter)
|
||||
->setModel($this)
|
||||
->setCompany($this->company_id)
|
||||
->setCustomer($request->customer_id)
|
||||
@@ -523,6 +521,7 @@ class Invoice extends Model implements HasMedia
|
||||
|
||||
public static function createTaxes($invoice, $taxes)
|
||||
{
|
||||
|
||||
$exchange_rate = $invoice->exchange_rate;
|
||||
|
||||
foreach ($taxes as $tax) {
|
||||
@@ -582,11 +581,14 @@ class Invoice extends Model implements HasMedia
|
||||
'taxes' => $taxes,
|
||||
]);
|
||||
|
||||
$template = PdfTemplateUtils::findFormattedTemplate('invoice', $invoiceTemplate, '');
|
||||
$templatePath = $template['custom'] ? sprintf('pdf_templates::invoice.%s', $invoiceTemplate) : sprintf('app.pdf.invoice.%s', $invoiceTemplate);
|
||||
|
||||
if (request()->has('preview')) {
|
||||
return view('app.pdf.invoice.'.$invoiceTemplate);
|
||||
return view($templatePath);
|
||||
}
|
||||
|
||||
return PDF::loadView('app.pdf.invoice.'.$invoiceTemplate);
|
||||
return PDF::loadView($templatePath);
|
||||
}
|
||||
|
||||
public function getEmailAttachmentSetting()
|
||||
@@ -657,20 +659,6 @@ class Invoice extends Model implements HasMedia
|
||||
];
|
||||
}
|
||||
|
||||
public static function invoiceTemplates()
|
||||
{
|
||||
$templates = Storage::disk('views')->files('/app/pdf/invoice');
|
||||
$invoiceTemplates = [];
|
||||
|
||||
foreach ($templates as $key => $template) {
|
||||
$templateName = Str::before(basename($template), '.blade.php');
|
||||
$invoiceTemplates[$key]['name'] = $templateName;
|
||||
$invoiceTemplates[$key]['path'] = ImageUtils::toBase64Src(resource_path('static/img/PDF/'.$templateName.'.png'));
|
||||
}
|
||||
|
||||
return $invoiceTemplates;
|
||||
}
|
||||
|
||||
public function addInvoicePayment($amount)
|
||||
{
|
||||
$this->due_amount += $amount;
|
||||
|
||||
@@ -163,7 +163,7 @@ class Payment extends Model implements HasMedia
|
||||
$payment = Payment::create($data);
|
||||
$payment->unique_hash = Hashids::connection(Payment::class)->encode($payment->id);
|
||||
|
||||
$serial = (new SerialNumberFormatter())
|
||||
$serial = (new SerialNumberFormatter)
|
||||
->setModel($payment)
|
||||
->setCompany($payment->company_id)
|
||||
->setCustomer($payment->customer_id)
|
||||
@@ -215,7 +215,7 @@ class Payment extends Model implements HasMedia
|
||||
$invoice->subtractInvoicePayment($request->amount);
|
||||
}
|
||||
|
||||
$serial = (new SerialNumberFormatter())
|
||||
$serial = (new SerialNumberFormatter)
|
||||
->setModel($this)
|
||||
->setCompany($this->company_id)
|
||||
->setCustomer($request->customer_id)
|
||||
@@ -452,8 +452,8 @@ class Payment extends Model implements HasMedia
|
||||
{
|
||||
$invoice = Invoice::find($transaction->invoice_id);
|
||||
|
||||
$serial = (new SerialNumberFormatter())
|
||||
->setModel(new Payment())
|
||||
$serial = (new SerialNumberFormatter)
|
||||
->setModel(new Payment)
|
||||
->setCompany($invoice->company_id)
|
||||
->setCustomer($invoice->customer_id)
|
||||
->setNextNumbers();
|
||||
|
||||
@@ -307,9 +307,9 @@ class RecurringInvoice extends Model
|
||||
|
||||
public function createInvoice()
|
||||
{
|
||||
//get invoice_number
|
||||
$serial = (new SerialNumberFormatter())
|
||||
->setModel(new Invoice())
|
||||
// get invoice_number
|
||||
$serial = (new SerialNumberFormatter)
|
||||
->setModel(new Invoice)
|
||||
->setCompany($this->company_id)
|
||||
->setCustomer($this->customer_id)
|
||||
->setNextNumbers();
|
||||
@@ -375,7 +375,7 @@ class RecurringInvoice extends Model
|
||||
$invoice->addCustomFields($customField);
|
||||
}
|
||||
|
||||
//send automatically
|
||||
// send automatically
|
||||
if ($this->send_automatically == true) {
|
||||
$data = [
|
||||
'body' => CompanySetting::getSetting('invoice_mail_body', $this->company_id),
|
||||
|
||||
@@ -22,7 +22,7 @@ class Setting extends Model
|
||||
return;
|
||||
}
|
||||
|
||||
$set = new Setting();
|
||||
$set = new Setting;
|
||||
$set->option = $key;
|
||||
$set->value = $setting;
|
||||
$set->save();
|
||||
|
||||
@@ -21,6 +21,7 @@ class Tax extends Model
|
||||
return [
|
||||
'amount' => 'integer',
|
||||
'percent' => 'float',
|
||||
'fixed_amount' => 'integer',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ class TaxType extends Model
|
||||
{
|
||||
return [
|
||||
'percent' => 'float',
|
||||
'fixed_amount' => 'integer',
|
||||
'compound_tax' => 'boolean',
|
||||
];
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ class CustomerMailResetPasswordNotification extends ResetPassword
|
||||
{
|
||||
$link = url("/{$notifiable->company->slug}/customer/reset/password/".$this->token);
|
||||
|
||||
return (new MailMessage())
|
||||
return (new MailMessage)
|
||||
->subject('Reset Password Notification')
|
||||
->line('Hello! You are receiving this email because we received a password reset request for your account.')
|
||||
->action('Reset Password', $link)
|
||||
|
||||
@@ -40,7 +40,7 @@ class MailResetPasswordNotification extends ResetPassword
|
||||
{
|
||||
$link = url('/reset-password/'.$this->token);
|
||||
|
||||
return (new MailMessage())
|
||||
return (new MailMessage)
|
||||
->subject('Reset Password Notification')
|
||||
->line('Hello! You are receiving this email because we received a password reset request for your account.')
|
||||
->action('Reset Password', $link)
|
||||
|
||||
@@ -46,6 +46,15 @@ class SettingsPolicy
|
||||
return false;
|
||||
}
|
||||
|
||||
public function managePDFConfig(User $user)
|
||||
{
|
||||
if ($user->isOwner()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function manageSettings(User $user)
|
||||
{
|
||||
if ($user->isOwner()) {
|
||||
|
||||
@@ -25,6 +25,7 @@ use Illuminate\Support\Facades\Broadcast;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Silber\Bouncer\Database\Models as BouncerModels;
|
||||
use Silber\Bouncer\Database\Role;
|
||||
use View;
|
||||
|
||||
class AppServiceProvider extends ServiceProvider
|
||||
{
|
||||
@@ -58,6 +59,8 @@ class AppServiceProvider extends ServiceProvider
|
||||
|
||||
Gate::policy(Role::class, RolePolicy::class);
|
||||
|
||||
View::addNamespace('pdf_templates', storage_path('app/templates/pdf'));
|
||||
|
||||
$this->bootAuth();
|
||||
$this->bootBroadcast();
|
||||
|
||||
@@ -78,14 +81,14 @@ class AppServiceProvider extends ServiceProvider
|
||||
|
||||
public function addMenus()
|
||||
{
|
||||
//main menu
|
||||
// main menu
|
||||
\Menu::make('main_menu', function ($menu) {
|
||||
foreach (config('invoiceshelf.main_menu') as $data) {
|
||||
$this->generateMenu($menu, $data);
|
||||
}
|
||||
});
|
||||
|
||||
//setting menu
|
||||
// setting menu
|
||||
\Menu::make('setting_menu', function ($menu) {
|
||||
foreach (config('invoiceshelf.setting_menu') as $data) {
|
||||
$this->generateMenu($menu, $data);
|
||||
@@ -124,6 +127,7 @@ class AppServiceProvider extends ServiceProvider
|
||||
Gate::define('manage backups', [SettingsPolicy::class, 'manageBackups']);
|
||||
Gate::define('manage file disk', [SettingsPolicy::class, 'manageFileDisk']);
|
||||
Gate::define('manage email config', [SettingsPolicy::class, 'manageEmailConfig']);
|
||||
Gate::define('manage pdf config', [SettingsPolicy::class, 'managePDFConfig']);
|
||||
Gate::define('manage notes', [NotePolicy::class, 'manageNotes']);
|
||||
Gate::define('view notes', [NotePolicy::class, 'viewNotes']);
|
||||
|
||||
|
||||
13
app/Providers/PDFServiceProvider.php
Normal file
13
app/Providers/PDFServiceProvider.php
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace App\Providers;
|
||||
|
||||
use App\Services\PDFService;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
|
||||
class PDFServiceProvider extends ServiceProvider
|
||||
{
|
||||
public $bindings = [
|
||||
'pdf.driver' => PDFService::class,
|
||||
];
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Rules\Backup;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Contracts\Validation\ValidationRule;
|
||||
|
||||
class BackupDisk implements ValidationRule
|
||||
@@ -18,8 +19,6 @@ class BackupDisk implements ValidationRule
|
||||
|
||||
/**
|
||||
* Run the validation rule.
|
||||
*
|
||||
* @param \Closure $fail
|
||||
*/
|
||||
public function validate(string $attribute, mixed $value, Closure $fail): void
|
||||
{
|
||||
|
||||
@@ -36,7 +36,7 @@ class Module
|
||||
{
|
||||
static::$scripts[$name] = $path;
|
||||
|
||||
return new static();
|
||||
return new static;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -50,7 +50,7 @@ class Module
|
||||
{
|
||||
static::$styles[$name] = $path;
|
||||
|
||||
return new static();
|
||||
return new static;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
59
app/Services/PDFDrivers/GotenbergPDFDriver.php
Normal file
59
app/Services/PDFDrivers/GotenbergPDFDriver.php
Normal file
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\PDFDrivers;
|
||||
|
||||
use Gotenberg\Gotenberg;
|
||||
use Gotenberg\Stream;
|
||||
use Illuminate\Http\Response;
|
||||
|
||||
class GotenbergPDFResponse
|
||||
{
|
||||
/** @var \Psr\Http\Message\ResponseInterface */
|
||||
protected $response;
|
||||
|
||||
public function __construct($stream)
|
||||
{
|
||||
$this->response = $stream;
|
||||
}
|
||||
|
||||
public function stream(string $filename = 'document.pdf'): Response
|
||||
{
|
||||
$output = $this->response->getBody();
|
||||
|
||||
return new Response($output, 200, [
|
||||
'Content-Type' => 'application/pdf',
|
||||
'Content-Disposition' => 'inline; filename="'.$filename.'"',
|
||||
]);
|
||||
}
|
||||
|
||||
public function output(): string
|
||||
{
|
||||
return $this->response->getBody()->getContents();
|
||||
}
|
||||
}
|
||||
|
||||
class GotenbergPDFDriver
|
||||
{
|
||||
public function loadView(string $viewname): GotenbergPDFResponse
|
||||
{
|
||||
$papersize = explode(' ', config('pdf.gotenberg.papersize'));
|
||||
if (count($papersize) != 2) {
|
||||
throw new \InvalidArgumentException('Invalid Gotenberg Papersize specified');
|
||||
}
|
||||
|
||||
$host = config('pdf.gotenberg.host');
|
||||
$request = Gotenberg::chromium($host)
|
||||
->pdf()
|
||||
->margins(0, 0, 0, 0) // Margins can be set using CSS
|
||||
->paperSize($papersize[0], $papersize[1])
|
||||
->html(
|
||||
Stream::string(
|
||||
'document.html',
|
||||
view($viewname)->render(),
|
||||
)
|
||||
);
|
||||
$result = Gotenberg::send($request);
|
||||
|
||||
return new GotenbergPDFResponse($result);
|
||||
}
|
||||
}
|
||||
47
app/Services/PDFService.php
Normal file
47
app/Services/PDFService.php
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
/*
|
||||
* Two options:
|
||||
* - Barryvdh\DomPDF\Facade\Pdf
|
||||
* - Gotenberg
|
||||
*/
|
||||
|
||||
use App;
|
||||
use App\Services\PDFDrivers\GotenbergPDFDriver;
|
||||
use Illuminate\Http\Response;
|
||||
|
||||
interface ResponseStream
|
||||
{
|
||||
public function stream(string $filename): Response;
|
||||
|
||||
public function output(): string;
|
||||
}
|
||||
|
||||
interface PDFDriver
|
||||
{
|
||||
public function loadView(string $template): ResponseStream;
|
||||
}
|
||||
|
||||
class PDFDriverFactory
|
||||
{
|
||||
public static function create(string $driver)
|
||||
{
|
||||
return match ($driver) {
|
||||
'dompdf' => App::make('dompdf.wrapper'),
|
||||
'gotenberg' => new GotenbergPDFDriver,
|
||||
default => throw new \InvalidArgumentException('Invalid PDFDriver requested')
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
class PDFService
|
||||
{
|
||||
public static function loadView(string $template)
|
||||
{
|
||||
$driver = config('pdf.driver');
|
||||
|
||||
return PDFDriverFactory::create($driver)->loadView($template);
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ use App\Http\Requests\DatabaseEnvironmentRequest;
|
||||
use App\Http\Requests\DiskEnvironmentRequest;
|
||||
use App\Http\Requests\DomainEnvironmentRequest;
|
||||
use App\Http\Requests\MailEnvironmentRequest;
|
||||
use App\Http\Requests\PDFConfigurationRequest;
|
||||
use Exception;
|
||||
use Illuminate\Support\Facades\Artisan;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
@@ -94,7 +95,6 @@ class EnvironmentManager
|
||||
}
|
||||
|
||||
return $str;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -225,7 +225,6 @@ class EnvironmentManager
|
||||
try {
|
||||
|
||||
$this->updateEnv($mailEnv);
|
||||
|
||||
} catch (Exception $e) {
|
||||
return [
|
||||
'error' => 'mail_variables_save_error',
|
||||
@@ -237,6 +236,60 @@ class EnvironmentManager
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the pdf generation content to the .env file.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function savePDFVariables(PDFConfigurationRequest $request)
|
||||
{
|
||||
$pdfEnv = $this->getPDFConfiguration($request);
|
||||
|
||||
try {
|
||||
|
||||
$this->updateEnv($pdfEnv);
|
||||
} catch (Exception $e) {
|
||||
return [
|
||||
'error' => 'pdf_variables_save_error',
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
'success' => 'pdf_variables_save_successfully',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the pdf configuration
|
||||
*
|
||||
* @param PDFConfigurationRequest $request
|
||||
* @return array
|
||||
*/
|
||||
private function getPDFConfiguration($request)
|
||||
{
|
||||
$pdfEnv = [];
|
||||
|
||||
$driver = $request->get('pdf_driver');
|
||||
|
||||
switch ($driver) {
|
||||
case 'dompdf':
|
||||
$pdfEnv = [
|
||||
'PDF_DRIVER' => $request->get('pdf_driver'),
|
||||
];
|
||||
break;
|
||||
case 'gotenberg':
|
||||
$pdfEnv = [
|
||||
'PDF_DRIVER' => $request->get('pdf_driver'),
|
||||
'GOTENBERG_HOST' => $request->get('gotenberg_host'),
|
||||
'GOTENBERG_MARGINS' => $request->get('gotenberg_margins'),
|
||||
'GOTENBERG_PAPERSIZE' => $request->get('gotenberg_papersize'),
|
||||
];
|
||||
break;
|
||||
}
|
||||
|
||||
return $pdfEnv;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the mail configuration
|
||||
*
|
||||
@@ -296,6 +349,7 @@ class EnvironmentManager
|
||||
'MAIL_FROM_NAME' => $request->get('from_name'),
|
||||
'SES_KEY' => $request->get('mail_ses_key'),
|
||||
'SES_SECRET' => $request->get('mail_ses_secret'),
|
||||
'SES_REGION' => $request->get('mail_ses_region'),
|
||||
];
|
||||
|
||||
break;
|
||||
@@ -315,7 +369,6 @@ class EnvironmentManager
|
||||
];
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return $mailEnv;
|
||||
@@ -333,7 +386,6 @@ class EnvironmentManager
|
||||
try {
|
||||
|
||||
$this->updateEnv($diskEnv);
|
||||
|
||||
} catch (Exception $e) {
|
||||
return [
|
||||
'error' => 'disk_variables_save_error',
|
||||
@@ -449,7 +501,6 @@ class EnvironmentManager
|
||||
}
|
||||
$formatted .= $current.$this->delimiter;
|
||||
$previous = $current;
|
||||
|
||||
}
|
||||
|
||||
file_put_contents($this->envPath, trim($formatted));
|
||||
|
||||
@@ -153,7 +153,7 @@ class ModuleInstaller
|
||||
File::makeDirectory($temp_extract_dir);
|
||||
}
|
||||
// Unzip the file
|
||||
$zip = new ZipArchive();
|
||||
$zip = new ZipArchive;
|
||||
|
||||
if ($zip->open($zip_file_path)) {
|
||||
$zip->extractTo($temp_extract_dir);
|
||||
|
||||
140
app/Space/PdfTemplateUtils.php
Normal file
140
app/Space/PdfTemplateUtils.php
Normal file
@@ -0,0 +1,140 @@
|
||||
<?php
|
||||
|
||||
namespace App\Space;
|
||||
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class PdfTemplateUtils
|
||||
{
|
||||
/**
|
||||
* Find the formatted template
|
||||
*
|
||||
* @param string $imageFormat
|
||||
* @return array|null
|
||||
*/
|
||||
public static function findFormattedTemplate($templateType, $templateName, $imageFormat = 'base64')
|
||||
{
|
||||
foreach (array_reverse(self::getFormattedTemplates($templateType, $imageFormat)) as $formattedTemplate) {
|
||||
if ($formattedTemplate['name'] === $templateName) {
|
||||
return $formattedTemplate;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the available formatted template paths
|
||||
*
|
||||
* @param string $imageFormat
|
||||
* @return array|array[]
|
||||
*/
|
||||
public static function getFormattedTemplates($templateType, $imageFormat = 'base64')
|
||||
{
|
||||
|
||||
$files_native = array_map(function ($file) {
|
||||
return [
|
||||
'path' => $file,
|
||||
'custom' => false,
|
||||
];
|
||||
}, Storage::disk('views')->files(sprintf('/app/pdf/%s', $templateType)));
|
||||
|
||||
$files_custom = array_map(function ($file) {
|
||||
return [
|
||||
'path' => $file,
|
||||
'custom' => true,
|
||||
];
|
||||
}, Storage::disk('pdf_templates')->files(sprintf('/%s', $templateType)));
|
||||
|
||||
$files = array_merge($files_native, $files_custom);
|
||||
$files = array_filter($files, function ($file) {
|
||||
return Str::endsWith($file['path'], '.blade.php');
|
||||
});
|
||||
|
||||
return array_map(function ($file) use ($templateType, $imageFormat) {
|
||||
$templateName = Str::before(basename($file['path']), '.blade.php');
|
||||
|
||||
if ($file['custom']) {
|
||||
$imagePath = self::getCustomTemplateFilePath($templateType, sprintf('%s.png', $templateName));
|
||||
$isCustomTemplate = true;
|
||||
} else {
|
||||
$imagePath = resource_path('static/img/PDF/'.$templateName.'.png');
|
||||
$isCustomTemplate = false;
|
||||
}
|
||||
|
||||
if (empty($imageFormat)) {
|
||||
$imageValue = '';
|
||||
} elseif ($imageFormat == 'path') {
|
||||
$imageValue = $imagePath;
|
||||
} else {
|
||||
$imageValue = File::exists($imagePath) ? ImageUtils::toBase64Src($imagePath) : '';
|
||||
}
|
||||
|
||||
return [
|
||||
'name' => $templateName,
|
||||
'path' => $imageValue,
|
||||
'custom' => $isCustomTemplate,
|
||||
];
|
||||
}, $files);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns custom template path
|
||||
*
|
||||
* @param string $fileName
|
||||
*/
|
||||
public static function getCustomTemplateFilePath($templateType, $fileName = ''): string
|
||||
{
|
||||
$path = ! empty($fileName) ? sprintf('/%s/%s', $templateType, $fileName) : sprintf('/%s/', $templateType);
|
||||
|
||||
return Storage::disk('pdf_templates')->path($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if custom template exists.
|
||||
*
|
||||
* @param $templateName
|
||||
* @return string
|
||||
*/
|
||||
public static function customTemplateFileExists($templateType, $fileName)
|
||||
{
|
||||
return Storage::disk('pdf_templates')->exists(sprintf('/%s/%s', $templateType, $fileName));
|
||||
}
|
||||
|
||||
/**
|
||||
* Save template markup file
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
public static function toCustomTemplateMarkupFile($contents, $templateType, $templateName)
|
||||
{
|
||||
return self::toCustomTemplateFile($contents, $templateType, $templateName.'.blade.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* Save template image file
|
||||
*
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
public static function toCustomTemplateImageFile($contents, $templateType, $templateName, $imageType = 'png')
|
||||
{
|
||||
return self::toCustomTemplateFile($contents, $templateType, $templateName.'.'.$imageType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save file contents into a template file of specific template type.
|
||||
*
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
public static function toCustomTemplateFile($contents, $templateType, $fileName)
|
||||
{
|
||||
return Storage::disk('pdf_templates')->put(
|
||||
sprintf('/%s/%s', $templateType, $fileName),
|
||||
$contents
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -93,7 +93,7 @@ class Updater
|
||||
File::makeDirectory($temp_extract_dir);
|
||||
}
|
||||
// Unzip the file
|
||||
$zip = new ZipArchive();
|
||||
$zip = new ZipArchive;
|
||||
|
||||
if ($zip->open($zip_file_path)) {
|
||||
$zip->extractTo($temp_extract_dir);
|
||||
|
||||
@@ -111,9 +111,9 @@ trait GeneratesPdfTrait
|
||||
public function getFieldsArray()
|
||||
{
|
||||
$customer = $this->customer;
|
||||
$shippingAddress = $customer->shippingAddress ?? new Address();
|
||||
$billingAddress = $customer->billingAddress ?? new Address();
|
||||
$companyAddress = $this->company->address ?? new Address();
|
||||
$shippingAddress = $customer->shippingAddress ?? new Address;
|
||||
$billingAddress = $customer->billingAddress ?? new Address;
|
||||
$companyAddress = $this->company->address ?? new Address;
|
||||
|
||||
$fields = [
|
||||
'{SHIPPING_ADDRESS_NAME}' => $shippingAddress->name,
|
||||
|
||||
@@ -5,4 +5,5 @@ return [
|
||||
App\Providers\RouteServiceProvider::class,
|
||||
App\Providers\DropboxServiceProvider::class,
|
||||
App\Providers\ViewServiceProvider::class,
|
||||
App\Providers\PDFServiceProvider::class,
|
||||
];
|
||||
|
||||
@@ -9,40 +9,41 @@
|
||||
"type": "project",
|
||||
"require": {
|
||||
"php": "^8.2",
|
||||
"aws/aws-sdk-php": "^3.297",
|
||||
"barryvdh/laravel-dompdf": "^2.1",
|
||||
"doctrine/dbal": "^4.0",
|
||||
"dragonmantank/cron-expression": "^3.3",
|
||||
"guzzlehttp/guzzle": "^7.2",
|
||||
"aws/aws-sdk-php": "^3.336",
|
||||
"barryvdh/laravel-dompdf": "^v3.0",
|
||||
"doctrine/dbal": "^4.2",
|
||||
"dragonmantank/cron-expression": "^v3.4",
|
||||
"guzzlehttp/guzzle": "^7.9",
|
||||
"gotenberg/gotenberg-php": "^2.8",
|
||||
"invoiceshelf/modules": "^1.0.0",
|
||||
"jasonmccreary/laravel-test-assertions": "^2.4",
|
||||
"laravel/framework": "^11.3",
|
||||
"jasonmccreary/laravel-test-assertions": "^v2.4",
|
||||
"laravel/framework": "^12.0",
|
||||
"laravel/helpers": "^1.7",
|
||||
"laravel/sanctum": "^4.0",
|
||||
"laravel/tinker": "^2.9",
|
||||
"laravel/ui": "^4.4",
|
||||
"laravel/tinker": "^2.10.1",
|
||||
"laravel/ui": "^4.6",
|
||||
"lavary/laravel-menu": "^1.8",
|
||||
"league/flysystem-aws-s3-v3": "^3.23",
|
||||
"predis/predis": "^2.2",
|
||||
"silber/bouncer": "v1.0.2",
|
||||
"league/flysystem-aws-s3-v3": "^3.29",
|
||||
"predis/predis": "^2.3",
|
||||
"silber/bouncer": "v1.0.3",
|
||||
"spatie/flysystem-dropbox": "^3.0",
|
||||
"spatie/laravel-backup": "^8.6",
|
||||
"spatie/laravel-medialibrary": "^11.3",
|
||||
"vinkla/hashids": "^12.0"
|
||||
"spatie/laravel-backup": "^9.2.9",
|
||||
"spatie/laravel-medialibrary": "^11.11",
|
||||
"vinkla/hashids": "^13.0.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"barryvdh/laravel-ide-helper": "^3.5",
|
||||
"beyondcode/laravel-dump-server": "^2.0.0",
|
||||
"fakerphp/faker": "^1.23",
|
||||
"laravel/pint": "^1.13",
|
||||
"laravel/sail": "^1.26",
|
||||
"laravel/sail": "^1.41",
|
||||
"mockery/mockery": "^1.6",
|
||||
"nunomaduro/collision": "^8.0",
|
||||
"phpunit/phpunit": "^10.5",
|
||||
"spatie/laravel-ignition": "^2.4",
|
||||
"barryvdh/laravel-ide-helper": "^3.0",
|
||||
"beyondcode/laravel-dump-server": "^2.0",
|
||||
"pestphp/pest": "^2.33",
|
||||
"pestphp/pest-plugin-faker": "^2.0",
|
||||
"pestphp/pest-plugin-laravel": "^2.2"
|
||||
"nunomaduro/collision": "^8.6",
|
||||
"pestphp/pest": "^3.8",
|
||||
"pestphp/pest-plugin-faker": "^3.0",
|
||||
"pestphp/pest-plugin-laravel": "^3.1",
|
||||
"phpunit/phpunit": "^11.5.3",
|
||||
"spatie/laravel-ignition": "^2.9"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
@@ -60,31 +61,41 @@
|
||||
"Tests\\": "tests/"
|
||||
}
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true,
|
||||
"scripts": {
|
||||
"post-autoload-dump": [
|
||||
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
|
||||
"@php artisan package:discover --ansi"
|
||||
],
|
||||
"post-update-cmd": [
|
||||
"@php artisan vendor:publish --tag=laravel-assets --ansi --force"
|
||||
],
|
||||
"post-root-package-install": [
|
||||
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
|
||||
],
|
||||
"post-create-project-cmd": [
|
||||
"@php artisan key:generate --ansi"
|
||||
"@php artisan key:generate --ansi",
|
||||
"@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"",
|
||||
"@php artisan migrate --graceful --ansi"
|
||||
],
|
||||
"dev": [
|
||||
"Composer\\Config::disableProcessTimeout",
|
||||
"npx concurrently -c \"#93c5fd,#c4b5fd,#fb7185,#fdba74\" \"php artisan serve\" \"php artisan queue:listen --tries=1\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=server,queue,logs,vite"
|
||||
]
|
||||
},
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"dont-discover": []
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"optimize-autoloader": true,
|
||||
"preferred-install": "dist",
|
||||
"sort-packages": true,
|
||||
"allow-plugins": {
|
||||
"pestphp/pest-plugin": true
|
||||
"pestphp/pest-plugin": true,
|
||||
"php-http/discovery": true
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"dont-discover": []
|
||||
}
|
||||
}
|
||||
"minimum-stability": "stable",
|
||||
"prefer-stable": true
|
||||
}
|
||||
|
||||
3753
composer.lock
generated
3753
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,6 @@
|
||||
return [
|
||||
|
||||
'backup' => [
|
||||
|
||||
/*
|
||||
* The name of this application. You can use this name to monitor
|
||||
* the backups.
|
||||
@@ -11,9 +10,7 @@ return [
|
||||
'name' => env('APP_NAME', 'laravel-backup'),
|
||||
|
||||
'source' => [
|
||||
|
||||
'files' => [
|
||||
|
||||
/*
|
||||
* The list of directories and files that will be included in the backup.
|
||||
*/
|
||||
@@ -29,7 +26,6 @@ return [
|
||||
'exclude' => [
|
||||
base_path('vendor'),
|
||||
base_path('node_modules'),
|
||||
base_path('.git'),
|
||||
],
|
||||
|
||||
/*
|
||||
@@ -41,6 +37,13 @@ return [
|
||||
* Determines if it should avoid unreadable folders.
|
||||
*/
|
||||
'ignore_unreadable_directories' => false,
|
||||
|
||||
/*
|
||||
* This path is used to make directories in resulting zip-file relative
|
||||
* Set to `null` to include complete absolute path
|
||||
* Example: base_path()
|
||||
*/
|
||||
'relative_path' => null,
|
||||
],
|
||||
|
||||
/*
|
||||
@@ -79,7 +82,7 @@ return [
|
||||
],
|
||||
|
||||
/*
|
||||
* The database dump can be compressed to decrease diskspace usage.
|
||||
* The database dump can be compressed to decrease disk space usage.
|
||||
*
|
||||
* Out of the box Laravel-backup supplies
|
||||
* Spatie\DbDumper\Compressors\GzipCompressor::class.
|
||||
@@ -91,7 +94,53 @@ return [
|
||||
*/
|
||||
'database_dump_compressor' => null,
|
||||
|
||||
/*
|
||||
* If specified, the database dumped file name will contain a timestamp (e.g.: 'Y-m-d-H-i-s').
|
||||
*/
|
||||
'database_dump_file_timestamp_format' => null,
|
||||
|
||||
/*
|
||||
* The base of the dump filename, either 'database' or 'connection'
|
||||
*
|
||||
* If 'database' (default), the dumped filename will contain the database name.
|
||||
* If 'connection', the dumped filename will contain the connection name.
|
||||
*/
|
||||
'database_dump_filename_base' => 'database',
|
||||
|
||||
/*
|
||||
* The file extension used for the database dump files.
|
||||
*
|
||||
* If not specified, the file extension will be .archive for MongoDB and .sql for all other databases
|
||||
* The file extension should be specified without a leading .
|
||||
*/
|
||||
'database_dump_file_extension' => '',
|
||||
|
||||
'destination' => [
|
||||
/*
|
||||
* The compression algorithm to be used for creating the zip archive.
|
||||
*
|
||||
* If backing up only database, you may choose gzip compression for db dump and no compression at zip.
|
||||
*
|
||||
* Some common algorithms are listed below:
|
||||
* ZipArchive::CM_STORE (no compression at all; set 0 as compression level)
|
||||
* ZipArchive::CM_DEFAULT
|
||||
* ZipArchive::CM_DEFLATE
|
||||
* ZipArchive::CM_BZIP2
|
||||
* ZipArchive::CM_XZ
|
||||
*
|
||||
* For more check https://www.php.net/manual/zip.constants.php and confirm it's supported by your system.
|
||||
*/
|
||||
'compression_method' => ZipArchive::CM_DEFAULT,
|
||||
|
||||
/*
|
||||
* The compression level corresponding to the used algorithm; an integer between 0 and 9.
|
||||
*
|
||||
* Check supported levels for the chosen algorithm, usually 1 means the fastest and weakest compression,
|
||||
* while 9 the slowest and strongest one.
|
||||
*
|
||||
* Setting of 0 for some algorithms may switch to the strongest compression.
|
||||
*/
|
||||
'compression_level' => 9,
|
||||
|
||||
/*
|
||||
* The filename prefix used for the backup zip file.
|
||||
@@ -110,24 +159,49 @@ return [
|
||||
* The directory where the temporary files will be stored.
|
||||
*/
|
||||
'temporary_directory' => storage_path('app/backup-temp'),
|
||||
|
||||
/*
|
||||
* The password to be used for archive encryption.
|
||||
* Set to `null` to disable encryption.
|
||||
*/
|
||||
'password' => env('BACKUP_ARCHIVE_PASSWORD'),
|
||||
|
||||
/*
|
||||
* The encryption algorithm to be used for archive encryption.
|
||||
* You can set it to `null` or `false` to disable encryption.
|
||||
*
|
||||
* When set to 'default', we'll use ZipArchive::EM_AES_256 if it is
|
||||
* available on your system.
|
||||
*/
|
||||
'encryption' => 'default',
|
||||
|
||||
/*
|
||||
* The number of attempts, in case the backup command encounters an exception
|
||||
*/
|
||||
'tries' => 1,
|
||||
|
||||
/*
|
||||
* The number of seconds to wait before attempting a new backup if the previous try failed
|
||||
* Set to `0` for none
|
||||
*/
|
||||
'retry_delay' => 0,
|
||||
],
|
||||
|
||||
/*
|
||||
* You can get notified when specific events occur. Out of the box you can use 'mail' and 'slack'.
|
||||
* For Slack you need to install guzzlehttp/guzzle and laravel/slack-notification-channel.
|
||||
* For Slack you need to install laravel/slack-notification-channel.
|
||||
*
|
||||
* You can also use your own notification classes, just make sure the class is named after one of
|
||||
* the `Spatie\Backup\Events` classes.
|
||||
* the `Spatie\Backup\Notifications\Notifications` classes.
|
||||
*/
|
||||
'notifications' => [
|
||||
|
||||
'notifications' => [
|
||||
\Spatie\Backup\Notifications\Notifications\BackupHasFailed::class => [],
|
||||
\Spatie\Backup\Notifications\Notifications\UnhealthyBackupWasFound::class => [],
|
||||
\Spatie\Backup\Notifications\Notifications\CleanupHasFailed::class => [],
|
||||
\Spatie\Backup\Notifications\Notifications\BackupWasSuccessful::class => [],
|
||||
\Spatie\Backup\Notifications\Notifications\HealthyBackupWasFound::class => [],
|
||||
\Spatie\Backup\Notifications\Notifications\CleanupWasSuccessful::class => [],
|
||||
\Spatie\Backup\Notifications\Notifications\BackupHasFailedNotification::class => ['mail'],
|
||||
\Spatie\Backup\Notifications\Notifications\UnhealthyBackupWasFoundNotification::class => ['mail'],
|
||||
\Spatie\Backup\Notifications\Notifications\CleanupHasFailedNotification::class => ['mail'],
|
||||
\Spatie\Backup\Notifications\Notifications\BackupWasSuccessfulNotification::class => ['mail'],
|
||||
\Spatie\Backup\Notifications\Notifications\HealthyBackupWasFoundNotification::class => ['mail'],
|
||||
\Spatie\Backup\Notifications\Notifications\CleanupWasSuccessfulNotification::class => ['mail'],
|
||||
],
|
||||
|
||||
/*
|
||||
@@ -156,7 +230,20 @@ return [
|
||||
'username' => null,
|
||||
|
||||
'icon' => null,
|
||||
],
|
||||
|
||||
'discord' => [
|
||||
'webhook_url' => '',
|
||||
|
||||
/*
|
||||
* If this is an empty string, the name field on the webhook will be used.
|
||||
*/
|
||||
'username' => '',
|
||||
|
||||
/*
|
||||
* If this is an empty string, the avatar on the webhook will be used.
|
||||
*/
|
||||
'avatar_url' => '',
|
||||
],
|
||||
],
|
||||
|
||||
@@ -200,42 +287,55 @@ return [
|
||||
'strategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,
|
||||
|
||||
'default_strategy' => [
|
||||
|
||||
/*
|
||||
* The number of days for which backups must be kept.
|
||||
*/
|
||||
'keep_all_backups_for_days' => 7,
|
||||
|
||||
/*
|
||||
* The number of days for which daily backups must be kept.
|
||||
* After the "keep_all_backups_for_days" period is over, the most recent backup
|
||||
* of that day will be kept. Older backups within the same day will be removed.
|
||||
* If you create backups only once a day, no backups will be removed yet.
|
||||
*/
|
||||
'keep_daily_backups_for_days' => 16,
|
||||
|
||||
/*
|
||||
* The number of weeks for which one weekly backup must be kept.
|
||||
* After the "keep_daily_backups_for_days" period is over, the most recent backup
|
||||
* of that week will be kept. Older backups within the same week will be removed.
|
||||
* If you create backups only once a week, no backups will be removed yet.
|
||||
*/
|
||||
'keep_weekly_backups_for_weeks' => 8,
|
||||
|
||||
/*
|
||||
* The number of months for which one monthly backup must be kept.
|
||||
* After the "keep_weekly_backups_for_weeks" period is over, the most recent backup
|
||||
* of that month will be kept. Older backups within the same month will be removed.
|
||||
*/
|
||||
'keep_monthly_backups_for_months' => 4,
|
||||
|
||||
/*
|
||||
* The number of years for which one yearly backup must be kept.
|
||||
* After the "keep_monthly_backups_for_months" period is over, the most recent backup
|
||||
* of that year will be kept. Older backups within the same year will be removed.
|
||||
*/
|
||||
'keep_yearly_backups_for_years' => 2,
|
||||
|
||||
/*
|
||||
* After cleaning up the backups remove the oldest backup until
|
||||
* this amount of megabytes has been reached.
|
||||
* Set null for unlimited size.
|
||||
*/
|
||||
'delete_oldest_backups_when_using_more_megabytes_than' => 5000,
|
||||
],
|
||||
],
|
||||
|
||||
'queue' => [
|
||||
'name' => env('BACKUP_QUEUE_NAME', 'backup'),
|
||||
/*
|
||||
* The number of attempts, in case the cleanup command encounters an exception
|
||||
*/
|
||||
'tries' => 1,
|
||||
|
||||
/*
|
||||
* The number of seconds to wait before attempting a new cleanup if the previous try failed
|
||||
* Set to `0` for none
|
||||
*/
|
||||
'retry_delay' => 0,
|
||||
],
|
||||
|
||||
];
|
||||
|
||||
@@ -119,7 +119,7 @@ return [
|
||||
* If pdflib present in web server and auto or selected explicitly above,
|
||||
* a real license code must exist!
|
||||
*/
|
||||
//"DOMPDF_PDFLIB_LICENSE" => "your license key here",
|
||||
// "DOMPDF_PDFLIB_LICENSE" => "your license key here",
|
||||
|
||||
/**
|
||||
* html target media view which should be rendered into pdf.
|
||||
|
||||
@@ -55,6 +55,18 @@ return [
|
||||
'driver' => 'local',
|
||||
'root' => resource_path('views'),
|
||||
],
|
||||
|
||||
'pdf_templates' => [
|
||||
'driver' => 'local',
|
||||
'root' => storage_path('app/templates/pdf'),
|
||||
],
|
||||
|
||||
'local' => [
|
||||
'driver' => 'local',
|
||||
'root' => storage_path('app'),
|
||||
'throw' => false,
|
||||
'report' => false,
|
||||
],
|
||||
],
|
||||
|
||||
];
|
||||
|
||||
@@ -131,7 +131,7 @@ return [
|
||||
'group' => '',
|
||||
'name' => 'Company information',
|
||||
'link' => '/admin/settings/company-info',
|
||||
'icon' => 'OfficeBuildingIcon',
|
||||
'icon' => 'BuildingOfficeIcon',
|
||||
'owner_only' => true,
|
||||
'ability' => '',
|
||||
'model' => '',
|
||||
@@ -151,7 +151,17 @@ return [
|
||||
'group' => '',
|
||||
'name' => 'Customization',
|
||||
'link' => '/admin/settings/customization',
|
||||
'icon' => 'PencilAltIcon',
|
||||
'icon' => 'PencilSquareIcon',
|
||||
'owner_only' => true,
|
||||
'ability' => '',
|
||||
'model' => '',
|
||||
],
|
||||
[
|
||||
'title' => 'settings.menu_title.pdf_generation',
|
||||
'group' => '',
|
||||
'name' => 'PDF Generation',
|
||||
'link' => '/admin/settings/pdf-generation',
|
||||
'icon' => 'DocumentIcon',
|
||||
'owner_only' => true,
|
||||
'ability' => '',
|
||||
'model' => '',
|
||||
@@ -171,7 +181,7 @@ return [
|
||||
'group' => '',
|
||||
'name' => 'Exchange Rate Provider',
|
||||
'link' => '/admin/settings/exchange-rate-provider',
|
||||
'icon' => 'CashIcon',
|
||||
'icon' => 'BanknotesIcon',
|
||||
'owner_only' => false,
|
||||
'ability' => 'view-exchange-rate-provider',
|
||||
'model' => ExchangeRateProvider::class,
|
||||
@@ -221,7 +231,7 @@ return [
|
||||
'group' => '',
|
||||
'name' => 'Notes',
|
||||
'link' => '/admin/settings/notes',
|
||||
'icon' => 'ClipboardCheckIcon',
|
||||
'icon' => 'ClipboardDocumentCheckIcon',
|
||||
'owner_only' => false,
|
||||
'ability' => 'view-all-notes',
|
||||
'model' => Note::class,
|
||||
@@ -231,7 +241,7 @@ return [
|
||||
'group' => '',
|
||||
'name' => 'Expense Category',
|
||||
'link' => '/admin/settings/expense-category',
|
||||
'icon' => 'ClipboardListIcon',
|
||||
'icon' => 'ClipboardDocumentListIcon',
|
||||
'owner_only' => false,
|
||||
'ability' => 'view-expense',
|
||||
'model' => Expense::class,
|
||||
@@ -241,7 +251,7 @@ return [
|
||||
'group' => '',
|
||||
'name' => 'Mail Configuration',
|
||||
'link' => '/admin/settings/mail-configuration',
|
||||
'icon' => 'MailIcon',
|
||||
'icon' => 'EnvelopeIcon',
|
||||
'owner_only' => true,
|
||||
'ability' => '',
|
||||
'model' => '',
|
||||
@@ -261,7 +271,7 @@ return [
|
||||
'group' => '',
|
||||
'name' => 'Backup',
|
||||
'link' => '/admin/settings/backup',
|
||||
'icon' => 'DatabaseIcon',
|
||||
'icon' => 'CircleStackIcon',
|
||||
'owner_only' => true,
|
||||
'ability' => '',
|
||||
'model' => '',
|
||||
@@ -271,7 +281,7 @@ return [
|
||||
'group' => '',
|
||||
'name' => 'Update App',
|
||||
'link' => '/admin/settings/update-app',
|
||||
'icon' => 'RefreshIcon',
|
||||
'icon' => 'ArrowPathIcon',
|
||||
'owner_only' => true,
|
||||
'ability' => '',
|
||||
'model' => '',
|
||||
@@ -366,7 +376,7 @@ return [
|
||||
'title' => 'navigation.modules',
|
||||
'group' => 3,
|
||||
'link' => '/admin/modules',
|
||||
'icon' => 'PuzzleIcon',
|
||||
'icon' => 'PuzzlePieceIcon',
|
||||
'name' => 'Modules',
|
||||
'owner_only' => true,
|
||||
'ability' => '',
|
||||
|
||||
@@ -136,7 +136,7 @@ return [
|
||||
'-m 6', // for the slowest compression method in order to get the best compression.
|
||||
'-pass 10', // for maximizing the amount of analysis pass.
|
||||
'-mt', // multithreading for some speed improvements.
|
||||
'-q 90', //quality factor that brings the least noticeable changes.
|
||||
'-q 90', // quality factor that brings the least noticeable changes.
|
||||
],
|
||||
Spatie\ImageOptimizer\Optimizers\Avifenc::class => [
|
||||
'-a cq-level=23', // constant quality level, lower values mean better quality and greater file size (0-63).
|
||||
|
||||
14
config/pdf.php
Normal file
14
config/pdf.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'driver' => env('PDF_DRIVER', 'gotenberg'),
|
||||
|
||||
'gotenberg' => [
|
||||
'host' => env('GOTENBERG_HOST', 'http://pdf:3000'),
|
||||
'papersize' => env('GOTENBERG_PAPERSIZE', '210mm 297mm'),
|
||||
],
|
||||
|
||||
'dompdf' => [],
|
||||
|
||||
];
|
||||
@@ -48,4 +48,10 @@ return [
|
||||
'auth_token' => env('CRON_JOB_AUTH_TOKEN', 0),
|
||||
],
|
||||
|
||||
'ses' => [
|
||||
'key' => env('SES_KEY'),
|
||||
'secret' => env('SES_SECRET'),
|
||||
'region' => env('SES_REGION', 'us-east-1'),
|
||||
],
|
||||
|
||||
];
|
||||
|
||||
@@ -68,8 +68,8 @@ class EstimateFactory extends Factory
|
||||
*/
|
||||
public function definition(): array
|
||||
{
|
||||
$sequenceNumber = (new SerialNumberFormatter())
|
||||
->setModel(new Estimate())
|
||||
$sequenceNumber = (new SerialNumberFormatter)
|
||||
->setModel(new Estimate)
|
||||
->setCompany(User::find(1)->companies()->first()->id)
|
||||
->setNextNumbers();
|
||||
|
||||
|
||||
@@ -78,8 +78,8 @@ class InvoiceFactory extends Factory
|
||||
*/
|
||||
public function definition(): array
|
||||
{
|
||||
$sequenceNumber = (new SerialNumberFormatter())
|
||||
->setModel(new Invoice())
|
||||
$sequenceNumber = (new SerialNumberFormatter)
|
||||
->setModel(new Invoice)
|
||||
->setCompany(User::find(1)->companies()->first()->id)
|
||||
->setNextNumbers();
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ class NoteFactory extends Factory
|
||||
'name' => $this->faker->word(),
|
||||
'notes' => $this->faker->text(),
|
||||
'company_id' => User::find(1)->companies()->first()->id,
|
||||
'is_default' => $this->faker->boolean(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,8 +24,8 @@ class PaymentFactory extends Factory
|
||||
*/
|
||||
public function definition(): array
|
||||
{
|
||||
$sequenceNumber = (new SerialNumberFormatter())
|
||||
->setModel(new Payment())
|
||||
$sequenceNumber = (new SerialNumberFormatter)
|
||||
->setModel(new Payment)
|
||||
->setCompany(User::find(1)->companies()->first()->id)
|
||||
->setNextNumbers();
|
||||
|
||||
|
||||
@@ -22,8 +22,10 @@ class TaxTypeFactory extends Factory
|
||||
{
|
||||
return [
|
||||
'name' => $this->faker->word(),
|
||||
'calculation_type' => 'percentage',
|
||||
'company_id' => User::find(1)->companies()->first()->id,
|
||||
'percent' => $this->faker->numberBetween($min = 0, $max = 100),
|
||||
'fixed_amount' => null,
|
||||
'description' => $this->faker->text(),
|
||||
'compound_tax' => 0,
|
||||
'collective_tax' => 0,
|
||||
|
||||
@@ -24,7 +24,5 @@ class AddUserIdToExpensesTable extends Migration
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
}
|
||||
public function down() {}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class() extends Migration
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up()
|
||||
{
|
||||
Schema::table('tax_types', function (Blueprint $table) {
|
||||
$table->enum('calculation_type', ['percentage', 'fixed'])->default('percentage')->after('name');
|
||||
$table->integer('fixed_amount')->nullable()->after('percent');
|
||||
$table->decimal('percent', 5, 2)->nullable()->change();
|
||||
});
|
||||
|
||||
Schema::table('taxes', function (Blueprint $table) {
|
||||
$table->enum('calculation_type', ['percentage', 'fixed'])->default('percentage')->after('name');
|
||||
$table->integer('fixed_amount')->nullable()->after('percent');
|
||||
$table->decimal('percent', 5, 2)->nullable()->change();
|
||||
});
|
||||
}
|
||||
|
||||
public function down()
|
||||
{
|
||||
Schema::table('tax_types', function (Blueprint $table) {
|
||||
$table->dropColumn(['calculation_type', 'fixed_amount']);
|
||||
$table->decimal('percent', 5, 2)->change();
|
||||
});
|
||||
|
||||
Schema::table('taxes', function (Blueprint $table) {
|
||||
$table->dropColumn(['calculation_type', 'fixed_amount']);
|
||||
$table->decimal('percent', 5, 2)->change();
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('notes', function (Blueprint $table) {
|
||||
$table->boolean('is_default')->default(false);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('notes', function (Blueprint $table) {
|
||||
$table->dropColumn('is_default');
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('invoice_items', function (Blueprint $table) {
|
||||
$table->bigInteger('price')->change();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('invoice_items', function (Blueprint $table) {
|
||||
$table->unsignedBigInteger('price')->change();
|
||||
});
|
||||
}
|
||||
};
|
||||
26
lang/ar.json
26
lang/ar.json
@@ -39,7 +39,7 @@
|
||||
"body": "الجسم",
|
||||
"message": "رسالة",
|
||||
"send": "إرسال",
|
||||
"preview": "Preview",
|
||||
"preview": "عرض",
|
||||
"go_back": "إلى الخلف",
|
||||
"back_to_login": "العودة إلى تسجيل الدخول؟",
|
||||
"home": "الرئيسية",
|
||||
@@ -65,7 +65,7 @@
|
||||
"sent": "ارسلت",
|
||||
"all": "الكل",
|
||||
"select_all": "تحديد الكل",
|
||||
"select_template": "Select Template",
|
||||
"select_template": "اختر قالب",
|
||||
"choose_file": "اضغط هنا لاختيار ملف",
|
||||
"choose_template": "اختيار القالب",
|
||||
"choose": "اختر",
|
||||
@@ -95,7 +95,7 @@
|
||||
"copied_pdf_url_clipboard": "تم نسخ رابط PDF إلى الحافظة!",
|
||||
"copied_url_clipboard": "Copied url to clipboard!",
|
||||
"docs": "Docs",
|
||||
"do_you_wish_to_continue": "Do you wish to continue?",
|
||||
"do_you_wish_to_continue": "هل ترغب في الاستمرار؟",
|
||||
"note": "ملاحظة",
|
||||
"pay_invoice": "دفع الفاتورة",
|
||||
"login_successfully": "تم تسجيل الدخول بنجاح!",
|
||||
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "طرق الدفع",
|
||||
"notes": "ملاحظات",
|
||||
"exchange_rate": "Exchange Rate",
|
||||
"address_information": "Address Information"
|
||||
"address_information": "Address Information",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " You can update Your Address information using form below."
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "النهاية الطرفية لـ Mailgun",
|
||||
"ses_secret": "SES الرمز السري",
|
||||
"ses_key": "SES مفتاح",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "كلمة مرور البريد الالكتروني",
|
||||
"username": "اسم المستخدم للبريد الإلكتروني",
|
||||
"mail_config": "إعدادات البريد الالكتروني",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "PDF إعدادات",
|
||||
"footer_text": "نص التذييل",
|
||||
"pdf_layout": "اتجاه صفحة PDF"
|
||||
"pdf_layout": "اتجاه صفحة PDF",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "معلومات الشركة",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "توفير الوقت عن طريق إنشاء الملاحظات وإعادة استخدامها على الفواتير والتقديرات والمدفوعات.",
|
||||
"notes": "ملاحظات",
|
||||
"type": "نوع",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "اضف ملاحظة",
|
||||
"add_new_note": "أضف ملاحظة جديدة",
|
||||
"name": "اسم",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "المنطة الزمنية",
|
||||
"fiscal_year": "السنة المالية",
|
||||
"date_format": "صيغة التاريخ",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "إعدادات الخصم",
|
||||
"discount_per_item": "خصم على الصنف ",
|
||||
"discount_setting_description": "قم بتمكين هذا إذا كنت تريد إضافة خصم إلى عناصر الفاتورة الفردية. بشكل افتراضي ، يتم إضافة الخصم مباشرة إلى الفاتورة.",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "الفاتورة",
|
||||
"pdf_invoice_number": "رقم الفاتورة",
|
||||
"pdf_invoice_date": "تاريخ الفاتورة",
|
||||
"pdf_invoice_due_date": "تاريخ الاستحقاق",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "ملاحظات",
|
||||
"pdf_items_label": "الأصناف",
|
||||
"pdf_quantity_label": "الكمية",
|
||||
|
||||
20
lang/bg.json
20
lang/bg.json
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Payment Modes",
|
||||
"notes": "Notes",
|
||||
"exchange_rate": "Exchange Rate",
|
||||
"address_information": "Address Information"
|
||||
"address_information": "Address Information",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " You can update Your Address information using form below."
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Secret",
|
||||
"ses_key": "SES Key",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "Mail Password",
|
||||
"username": "Mail Username",
|
||||
"mail_config": "Mail Configuration",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "PDF Setting",
|
||||
"footer_text": "Footer Text",
|
||||
"pdf_layout": "PDF Layout"
|
||||
"pdf_layout": "PDF Layout",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Company info",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Save time by creating notes and reusing them on your invoices, estimates & payments.",
|
||||
"notes": "Notes",
|
||||
"type": "Type",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Add Note",
|
||||
"add_new_note": "Add New Note",
|
||||
"name": "Name",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Time Zone",
|
||||
"fiscal_year": "Financial Year",
|
||||
"date_format": "Date Format",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Discount Setting",
|
||||
"discount_per_item": "Discount Per Item ",
|
||||
"discount_setting_description": "Enable this if you want to add Discount to individual invoice items. By default, Discount is added directly to the invoice.",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Invoice",
|
||||
"pdf_invoice_number": "Invoice Number",
|
||||
"pdf_invoice_date": "Invoice Date",
|
||||
"pdf_invoice_due_date": "Due date",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Notes",
|
||||
"pdf_items_label": "Items",
|
||||
"pdf_quantity_label": "Quantity",
|
||||
|
||||
64
lang/cs.json
64
lang/cs.json
@@ -29,7 +29,7 @@
|
||||
"to_date": "Do data",
|
||||
"from": "Od",
|
||||
"to": "Do",
|
||||
"ok": "OK",
|
||||
"ok": "Ok",
|
||||
"yes": "Ano",
|
||||
"no": "Ne",
|
||||
"sort_by": "Seřadit podle",
|
||||
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Způsoby plateb",
|
||||
"notes": "Poznámky",
|
||||
"exchange_rate": "Směnný kurz",
|
||||
"address_information": "Adresa"
|
||||
"address_information": "Adresa",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " Adresu můžete aktualizovat pomocí formuláře níže."
|
||||
@@ -864,7 +865,7 @@
|
||||
"primary_currency": "Primární měna",
|
||||
"timezone": "Časová zóna",
|
||||
"date_format": "Formát data",
|
||||
"time_format": "Time Format",
|
||||
"time_format": "Formát času",
|
||||
"currencies": {
|
||||
"title": "Měny",
|
||||
"currency": "Měna | Měny",
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES tajný klíč (secret)",
|
||||
"ses_key": "Klíč SES",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "E-mailové heslo",
|
||||
"username": "Uživatelské jméno pro e-mail",
|
||||
"mail_config": "Konfigurace e-mailu",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "Nastavení PDF",
|
||||
"footer_text": "Text zápatí",
|
||||
"pdf_layout": "Rozvržení PDF"
|
||||
"pdf_layout": "Rozvržení PDF",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Údaje o společnosti",
|
||||
@@ -991,7 +1001,7 @@
|
||||
"delimiter_description": "Jeden znak pro určení hranice mezi 2 samostatnými komponentami. Ve výchozím nastavení je nastaveno na -",
|
||||
"delimiter_param_label": "Hodnota oddělovače",
|
||||
"date_format": "Formát data",
|
||||
"time_format": "Time Format",
|
||||
"time_format": "Formát času",
|
||||
"date_format_description": "Pole pro formát místní data a času. Výchozí formát: 'Y' vykresluje aktuální rok.",
|
||||
"date_format_param_label": "Formát",
|
||||
"sequence": "Sekvence",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Ušetřete čas vytvořením poznámek a jejich opětovným použitím na fakturách, odhadech a platbách.",
|
||||
"notes": "Poznámky",
|
||||
"type": "Typ",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Přidat poznámku",
|
||||
"add_new_note": "Přidat novou poznámku",
|
||||
"name": "Jméno",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Časové pásmo",
|
||||
"fiscal_year": "Fiskální rok",
|
||||
"date_format": "Formát data",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Nastavení slev",
|
||||
"discount_per_item": "Sleva za položku ",
|
||||
"discount_setting_description": "Povolte tuto možnost, pokud chcete přidat slevu do jednotlivých položek faktury. Ve výchozím nastavení je sleva přidána přímo na fakturu.",
|
||||
@@ -1249,7 +1261,7 @@
|
||||
"select_language": "Vyberte jazyk",
|
||||
"select_time_zone": "Vyberte časové pásmo",
|
||||
"select_date_format": "Vyberte formát data",
|
||||
"select_time_format": "Select Time Format",
|
||||
"select_time_format": "Vyberte formát času",
|
||||
"select_financial_year": "Vyberte fiskální rok",
|
||||
"recurring_invoice_status": "Stav opakující se faktury",
|
||||
"create_status": "Vytvořit stav",
|
||||
@@ -1258,8 +1270,8 @@
|
||||
"update_status": "Upravit stav",
|
||||
"completed": "Dokončeno",
|
||||
"company_currency_unchangeable": "Měnu společnosti nelze měnit",
|
||||
"invoice_use_time": "Use time in invoices",
|
||||
"invoice_use_time_description": "Enable this if you want to select exact invoice time.",
|
||||
"invoice_use_time": "Použítat čas ve fakturách",
|
||||
"invoice_use_time_description": "Povolte, pokud chcete zvolit přesný čas faktury.",
|
||||
"fiscal_years": {
|
||||
"january_december": "Leden - Prosinec",
|
||||
"february_january": "Únor - Leden",
|
||||
@@ -1349,8 +1361,8 @@
|
||||
"aws_root": "AWS Root",
|
||||
"s3_endpoint": "S3 Endpoint",
|
||||
"s3_key": "S3 klíč",
|
||||
"s3_secret": "S3 Secret",
|
||||
"s3_region": "S3 Region",
|
||||
"s3_secret": "S3 tajný klíč",
|
||||
"s3_region": "S3 region",
|
||||
"s3_bucket": "S3 Bucket",
|
||||
"s3_root": "S3 Root",
|
||||
"do_spaces_type": "Do Spaces type",
|
||||
@@ -1360,12 +1372,12 @@
|
||||
"do_spaces_bucket": "Do Spaces Bucket",
|
||||
"do_spaces_endpoint": "Do Spaces Endpoint",
|
||||
"do_spaces_root": "Do Spaces Root",
|
||||
"dropbox_type": "Dropbox Type",
|
||||
"dropbox_token": "Dropbox Token",
|
||||
"dropbox_key": "Dropbox Key",
|
||||
"dropbox_secret": "Dropbox Secret",
|
||||
"dropbox_app": "Dropbox App",
|
||||
"dropbox_root": "Dropbox Root",
|
||||
"dropbox_type": "Typ Dropboxu",
|
||||
"dropbox_token": "Dropbox token",
|
||||
"dropbox_key": "Dropbox klíč",
|
||||
"dropbox_secret": "Dropbox tajný klíč",
|
||||
"dropbox_app": "Aplikace Dropboxu",
|
||||
"dropbox_root": "Kořenový adresář Dropboxu",
|
||||
"default_driver": "Výchozí ovladač",
|
||||
"is_default": "JE VÝCHOZÍ",
|
||||
"set_default_disk": "Nastavit výchozí disk",
|
||||
@@ -1428,7 +1440,7 @@
|
||||
"time_zone": "Časové pásmo",
|
||||
"fiscal_year": "Fiskální rok",
|
||||
"date_format": "Formát data",
|
||||
"time_format": "Time Format",
|
||||
"time_format": "Formát času",
|
||||
"from_address": "Z adresy",
|
||||
"username": "Uživatelské jméno",
|
||||
"next": "Další",
|
||||
@@ -1478,12 +1490,12 @@
|
||||
"host": "Hostitel e-mailu",
|
||||
"port": "Port e-mailu",
|
||||
"driver": "Ovladač e-mailů",
|
||||
"secret": "Secret",
|
||||
"mailgun_secret": "Mailgun Secret",
|
||||
"secret": "Tajný klíč",
|
||||
"mailgun_secret": "Mailgun tajný klíč",
|
||||
"mailgun_domain": "Doména",
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Secret",
|
||||
"ses_key": "SES Key",
|
||||
"ses_secret": "SES tajný klíč",
|
||||
"ses_key": "SES klíč",
|
||||
"password": "E-mailové heslo",
|
||||
"username": "Uživatelské jméno e-mailu",
|
||||
"mail_config": "Konfigurace e-mailu",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Faktura",
|
||||
"pdf_invoice_number": "Číslo faktury",
|
||||
"pdf_invoice_date": "Datum fakturace",
|
||||
"pdf_invoice_due_date": "Datum splatnosti",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Poznámky",
|
||||
"pdf_items_label": "Položky",
|
||||
"pdf_quantity_label": "Množství",
|
||||
@@ -1623,9 +1635,9 @@
|
||||
"pdf_received_from": "Přijato od:",
|
||||
"pdf_tax_label": "Daň",
|
||||
"pdf_tax_id": "DIČ",
|
||||
"pdf_vat_id": "VAT-ID",
|
||||
"pdf_amount_paid": "Amount Paid",
|
||||
"pdf_amount_due": "Amount Due",
|
||||
"pdf_vat_id": "DIČ",
|
||||
"pdf_amount_paid": "Uhrazená částka",
|
||||
"pdf_amount_due": "Splatná částka",
|
||||
"mail_thanks": "Díky",
|
||||
"mail_view_estimate": "Zobrazit odhad",
|
||||
"mail_viewed_estimate": ":name si prohlédl tento odhad.",
|
||||
|
||||
24
lang/de.json
24
lang/de.json
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Zahlungsarten",
|
||||
"notes": "Notizen",
|
||||
"exchange_rate": "Wechselkurs",
|
||||
"address_information": "Adressinformationen"
|
||||
"address_information": "Adressinformationen",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " Sie können Ihre Adressinformationen über das untenstehende Formular aktualisieren."
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun-Endpunkt",
|
||||
"ses_secret": "SES Verschlüsselung",
|
||||
"ses_key": "SES-Taste",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "E-Mail-Kennwort",
|
||||
"username": "E-Mail-Benutzername",
|
||||
"mail_config": "E-Mail-Konfiguration",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "PDF-Einstellung",
|
||||
"footer_text": "Fußzeile Text",
|
||||
"pdf_layout": "PDF-Layout"
|
||||
"pdf_layout": "PDF-Layout",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Firmeninfo",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Sparen Sie Zeit, indem Sie Notizen erstellen und diese auf Ihren Rechnungen, Angeboten und Zahlungen wiederverwenden.",
|
||||
"notes": "Hinweise",
|
||||
"type": "Art",
|
||||
"is_default": "Standardmäßig auswählen",
|
||||
"is_default_description": "Diese Notiz wird standardmäßig in neuen Rechnungen ausgewählt.",
|
||||
"add_note": "Notiz hinzufügen",
|
||||
"add_new_note": "Neue Notiz hinzufügen",
|
||||
"name": "Name",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Zeitzone",
|
||||
"fiscal_year": "Geschäftsjahr",
|
||||
"date_format": "Datum-Format",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Einstellung Rabatt",
|
||||
"discount_per_item": "Rabatt pro Artikel ",
|
||||
"discount_setting_description": "Aktivieren Sie diese Option, wenn Sie einzelnen Rechnungspositionen einen Rabatt hinzufügen möchten. Standardmäßig wird der Rabatt direkt zur Rechnung hinzugefügt.",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Rechnung",
|
||||
"pdf_invoice_number": "Rechnungsnummer",
|
||||
"pdf_invoice_date": "Rechnungsdatum",
|
||||
"pdf_invoice_due_date": "Fälligkeitsdatum",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Hinweise",
|
||||
"pdf_items_label": "Artikel",
|
||||
"pdf_quantity_label": "Menge",
|
||||
@@ -1624,8 +1636,8 @@
|
||||
"pdf_tax_label": "Steuer",
|
||||
"pdf_tax_id": "Steuer-Nr.",
|
||||
"pdf_vat_id": "USt.-ID",
|
||||
"pdf_amount_paid": "Amount Paid",
|
||||
"pdf_amount_due": "Amount Due",
|
||||
"pdf_amount_paid": "Bezahlter Betrag",
|
||||
"pdf_amount_due": "Offener Betrag",
|
||||
"mail_thanks": "Danke",
|
||||
"mail_view_estimate": "Angebot ansehen",
|
||||
"mail_viewed_estimate": ":name hat dieses Angebot angesehen.",
|
||||
|
||||
20
lang/el.json
20
lang/el.json
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Τρόπος πληρωμής",
|
||||
"notes": "Σημειώσεις",
|
||||
"exchange_rate": "Συναλλαγματική ισοτιμία",
|
||||
"address_information": "Address Information"
|
||||
"address_information": "Address Information",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " You can update Your Address information using form below."
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Μυστικό",
|
||||
"ses_key": "Κλειδί SES",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "Κωδικός Πρόσβασης Ταχυδρομείου",
|
||||
"username": "Όνομα Ταχυδρομείου",
|
||||
"mail_config": "Διαμόρφωση Mail",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "Ρυθμίσεις PDF",
|
||||
"footer_text": "Κείμενο Υποσέλιδου",
|
||||
"pdf_layout": "Διάταξη PDF"
|
||||
"pdf_layout": "Διάταξη PDF",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Πληροφορίες Εταιρίας",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Εξοικονομήστε χρόνο δημιουργώντας σημειώσεις και επαναχρησιμοποίησή τους στα τιμολόγια σας, εκτιμήσεις και πληρωμές.",
|
||||
"notes": "Σημειώσεις",
|
||||
"type": "Type",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Προσθήκη σημείωσης",
|
||||
"add_new_note": "Προσθήκη Νέας Σημείωσης",
|
||||
"name": "Όνομα",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Ζώνη Ώρας",
|
||||
"fiscal_year": "Οικονομικό έτος",
|
||||
"date_format": "Μορφή Ημερομηνίας",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Ρυθμίσεις Λογαριασμού",
|
||||
"discount_per_item": "Έκπτωση Ανά Στοιχείο ",
|
||||
"discount_setting_description": "Ενεργοποιήστε το αν θέλετε να προσθέσετε έκπτωση σε μεμονωμένα στοιχεία τιμολογίου. Από προεπιλογή, η έκπτωση προστίθεται απευθείας στο τιμολόγιο.",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Τιμολόγιο",
|
||||
"pdf_invoice_number": "Αριθμός τιμολογίου",
|
||||
"pdf_invoice_date": "Ημ/νία Τιμολόγησης",
|
||||
"pdf_invoice_due_date": "Echéance",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Σημειώσεις",
|
||||
"pdf_items_label": "Προϊόντα",
|
||||
"pdf_quantity_label": "Ποσότητα",
|
||||
|
||||
38
lang/en.json
38
lang/en.json
@@ -161,7 +161,10 @@
|
||||
"name": "Name",
|
||||
"description": "Description",
|
||||
"percent": "Percent",
|
||||
"compound_tax": "Compound Tax"
|
||||
"compound_tax": "Compound Tax",
|
||||
"percentage": "Percentage",
|
||||
"fixed_amount": "Fixed Amount",
|
||||
"tax_type": "Tax Type"
|
||||
},
|
||||
"global_search": {
|
||||
"search": "Search...",
|
||||
@@ -852,7 +855,8 @@
|
||||
"payment_modes": "Payment Modes",
|
||||
"notes": "Notes",
|
||||
"exchange_rate": "Exchange Rate",
|
||||
"address_information": "Address Information"
|
||||
"address_information": "Address Information",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " You can update Your Address information using form below."
|
||||
@@ -893,6 +897,7 @@
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Secret",
|
||||
"ses_key": "SES Key",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "Mail Password",
|
||||
"username": "Mail Username",
|
||||
"mail_config": "Mail Configuration",
|
||||
@@ -904,7 +909,15 @@
|
||||
"pdf": {
|
||||
"title": "PDF Setting",
|
||||
"footer_text": "Footer Text",
|
||||
"pdf_layout": "PDF Layout"
|
||||
"pdf_layout": "PDF Layout",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Company info",
|
||||
@@ -1087,6 +1100,8 @@
|
||||
"description": "Save time by creating notes and reusing them on your invoices, estimates & payments.",
|
||||
"notes": "Notes",
|
||||
"type": "Type",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Add Note",
|
||||
"add_new_note": "Add New Note",
|
||||
"name": "Name",
|
||||
@@ -1193,7 +1208,12 @@
|
||||
"tax_per_item": "Tax Per Item",
|
||||
"tax_name": "Tax Name",
|
||||
"compound_tax": "Compound Tax",
|
||||
"amount": "Amount",
|
||||
"percent": "Percent",
|
||||
"fixed_amount": "Fixed Amount",
|
||||
"calculation_type": "Calculation Type",
|
||||
"percentage": "Percentage",
|
||||
"fixed": "Fixed",
|
||||
"action": "Action",
|
||||
"tax_setting_description": "Enable this if you want to add taxes to individual invoice items. By default, taxes are added directly to the invoice.",
|
||||
"created_message": "Tax type created successfully",
|
||||
@@ -1236,7 +1256,7 @@
|
||||
"time_zone": "Time Zone",
|
||||
"fiscal_year": "Financial Year",
|
||||
"date_format": "Date Format",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Discount Setting",
|
||||
"discount_per_item": "Discount Per Item ",
|
||||
"discount_setting_description": "Enable this if you want to add Discount to individual invoice items. By default, Discount is added directly to the invoice.",
|
||||
@@ -1279,7 +1299,7 @@
|
||||
"title": "Update App",
|
||||
"description": "You can easily update InvoiceShelf by checking for a new update by clicking the button below",
|
||||
"check_update": "Check for updates",
|
||||
"insider_consent" : "Opt-in for Insider releases. Recommended for testing purposes only.",
|
||||
"insider_consent": "Opt-in for Insider releases. Recommended for testing purposes only.",
|
||||
"avail_update": "New Update available",
|
||||
"next_version": "Next version",
|
||||
"requirements": "Requirements",
|
||||
@@ -1467,9 +1487,9 @@
|
||||
"failed": "Domain verification failed. Please enter valid domain name.",
|
||||
"verify_and_continue": "Verify And Continue",
|
||||
"notes": {
|
||||
"notes" : "Notes:",
|
||||
"not_contain" : "App domain should not contain",
|
||||
"or" : "or",
|
||||
"notes": "Notes:",
|
||||
"not_contain": "App domain should not contain",
|
||||
"or": "or",
|
||||
"in_front": "in front of the domain.",
|
||||
"if_you": "If you're accessing the website on a different port, please mention the port. For example:"
|
||||
}
|
||||
@@ -1588,7 +1608,7 @@
|
||||
"pdf_invoice_label": "Invoice",
|
||||
"pdf_invoice_number": "Invoice Number",
|
||||
"pdf_invoice_date": "Invoice Date",
|
||||
"pdf_invoice_due_date": "Due date",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Notes",
|
||||
"pdf_items_label": "Items",
|
||||
"pdf_quantity_label": "Quantity",
|
||||
|
||||
44
lang/es.json
44
lang/es.json
@@ -49,7 +49,7 @@
|
||||
"view": "Ver",
|
||||
"add_new_item": "Agregar un Nuevo Artículo",
|
||||
"clear_all": "Limpiar todo",
|
||||
"showing": "Mostrar",
|
||||
"showing": "Mostrando",
|
||||
"of": "de",
|
||||
"actions": "Acciones",
|
||||
"subtotal": "SUBTOTAL",
|
||||
@@ -285,8 +285,8 @@
|
||||
},
|
||||
"estimates": {
|
||||
"title": "Presupuestos",
|
||||
"accept_estimate": "Aceptar cotización",
|
||||
"reject_estimate": "Rechazar cotización",
|
||||
"accept_estimate": "Aceptar presupuesto",
|
||||
"reject_estimate": "Rechazar presupuesto",
|
||||
"estimate": "Presupuesto | Presupuestos",
|
||||
"estimates_list": "Lista de presupuestos",
|
||||
"days": "{días} Días",
|
||||
@@ -320,7 +320,7 @@
|
||||
"convert_to_invoice": "Convertir a factura",
|
||||
"mark_as_sent": "Marcar como enviado",
|
||||
"send_estimate": "Enviar presupuesto",
|
||||
"resend_estimate": "Reenviar estimado",
|
||||
"resend_estimate": "Reenviar presupuesto",
|
||||
"record_payment": "Registro de pago",
|
||||
"add_estimate": "Agregar presupuesto",
|
||||
"save_estimate": "Guardar presupuesto",
|
||||
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Formas de pago",
|
||||
"notes": "Notas",
|
||||
"exchange_rate": "Tasa de cambio",
|
||||
"address_information": "Información de dirección"
|
||||
"address_information": "Información de dirección",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": "Puede actualizar la información de su dirección utilizando el siguiente formulario."
|
||||
@@ -864,7 +865,7 @@
|
||||
"primary_currency": "Moneda primaria",
|
||||
"timezone": "Zona horaria",
|
||||
"date_format": "Formato de fecha",
|
||||
"time_format": "Time Format",
|
||||
"time_format": "Formato de hora",
|
||||
"currencies": {
|
||||
"title": "Monedas",
|
||||
"currency": "Moneda | Monedas",
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun endpoint",
|
||||
"ses_secret": "Secreto SES",
|
||||
"ses_key": "Clave SES",
|
||||
"ses_region": "Región de AWS",
|
||||
"password": "Contraseña de correo",
|
||||
"username": "Nombre de usuario de correo",
|
||||
"mail_config": "Configuración de correo",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "Configuración de PDF",
|
||||
"footer_text": "Texto de pie de página",
|
||||
"pdf_layout": "Diseño PDF"
|
||||
"pdf_layout": "Diseño PDF",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Información de la compañía",
|
||||
@@ -991,7 +1001,7 @@
|
||||
"delimiter_description": "Carácter único para especificar el límite entre 2 componentes separados. Por defecto está configurado en -",
|
||||
"delimiter_param_label": "Valor delimitador",
|
||||
"date_format": "Formato de fecha",
|
||||
"time_format": "Time Format",
|
||||
"time_format": "Formato de hora",
|
||||
"date_format_description": "Un campo de fecha y hora local que acepta un parámetro de formato. El formato predeterminado: 'Y' representa el año actual.",
|
||||
"date_format_param_label": "Formato",
|
||||
"sequence": "Secuencia",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Ahorre tiempo creando notas y reutilizándolas en sus facturas, cálculos y pagos.",
|
||||
"notes": "Notas",
|
||||
"type": "Tipo",
|
||||
"is_default": "Seleccionar por defecto",
|
||||
"is_default_description": "Esta nota será seleccionada por defecto en las nuevas facturas.",
|
||||
"add_note": "Agregar nota",
|
||||
"add_new_note": "Agregar nueva nota",
|
||||
"name": "Nombre",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Zona horaria",
|
||||
"fiscal_year": "Año financiero",
|
||||
"date_format": "Formato de fecha",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Formato de hora",
|
||||
"discount_setting": "Ajuste de descuento",
|
||||
"discount_per_item": "Descuento por artículo",
|
||||
"discount_setting_description": "Habilítelo si desea agregar Descuento a artículos de factura individuales. Por defecto, los descuentos se agregan directamente a la factura.",
|
||||
@@ -1249,7 +1261,7 @@
|
||||
"select_language": "seleccione el idioma",
|
||||
"select_time_zone": "selecciona la zona horaria",
|
||||
"select_date_format": "Seleccionar formato de fecha",
|
||||
"select_time_format": "Select Time Format",
|
||||
"select_time_format": "Seleccionar formato de hora",
|
||||
"select_financial_year": "seleccione año financiero",
|
||||
"recurring_invoice_status": "Estado de la factura recurrente",
|
||||
"create_status": "Crear estado",
|
||||
@@ -1258,8 +1270,8 @@
|
||||
"update_status": "Actualizar estado",
|
||||
"completed": "Completado",
|
||||
"company_currency_unchangeable": "No se puede cambiar la divisa de la empresa",
|
||||
"invoice_use_time": "Use time in invoices",
|
||||
"invoice_use_time_description": "Enable this if you want to select exact invoice time.",
|
||||
"invoice_use_time": "Usar hora en las facturas",
|
||||
"invoice_use_time_description": "Active esta opción si desea seleccionar la hora exacta de la factura.",
|
||||
"fiscal_years": {
|
||||
"january_december": "Enero - Diciembre",
|
||||
"february_january": "Febrero - Enero",
|
||||
@@ -1428,7 +1440,7 @@
|
||||
"time_zone": "Zona horaria",
|
||||
"fiscal_year": "Año financiero",
|
||||
"date_format": "Formato de fecha",
|
||||
"time_format": "Time Format",
|
||||
"time_format": "Formato de hora",
|
||||
"from_address": "Desde la Dirección",
|
||||
"username": "Nombre de usuario",
|
||||
"next": "Siguiente",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Factura",
|
||||
"pdf_invoice_number": "Numero de factura",
|
||||
"pdf_invoice_date": "Fecha de la factura",
|
||||
"pdf_invoice_due_date": "Fecha final",
|
||||
"pdf_invoice_due_date": "Fecha de vencimiento",
|
||||
"pdf_notes": "Notas",
|
||||
"pdf_items_label": "Artículos",
|
||||
"pdf_quantity_label": "Cantidad",
|
||||
@@ -1624,8 +1636,8 @@
|
||||
"pdf_tax_label": "Impuesto",
|
||||
"pdf_tax_id": "ID de impuesto",
|
||||
"pdf_vat_id": "ID de IVA",
|
||||
"pdf_amount_paid": "Amount Paid",
|
||||
"pdf_amount_due": "Amount Due",
|
||||
"pdf_amount_paid": "Importe pagado",
|
||||
"pdf_amount_due": "Importe pendiente",
|
||||
"mail_thanks": "Gracias",
|
||||
"mail_view_estimate": "Ver presupuesto",
|
||||
"mail_viewed_estimate": ":name ha visto este Presupuesto.",
|
||||
|
||||
20
lang/fa.json
20
lang/fa.json
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Payment Modes",
|
||||
"notes": "Notes",
|
||||
"exchange_rate": "Exchange Rate",
|
||||
"address_information": "Address Information"
|
||||
"address_information": "Address Information",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " You can update Your Address information using form below."
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Secret",
|
||||
"ses_key": "SES Key",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "Mail Password",
|
||||
"username": "Mail Username",
|
||||
"mail_config": "Mail Configuration",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "PDF Setting",
|
||||
"footer_text": "Footer Text",
|
||||
"pdf_layout": "PDF Layout"
|
||||
"pdf_layout": "PDF Layout",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Company info",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Save time by creating notes and reusing them on your invoices, estimates & payments.",
|
||||
"notes": "Notes",
|
||||
"type": "Type",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Add Note",
|
||||
"add_new_note": "Add New Note",
|
||||
"name": "Name",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Time Zone",
|
||||
"fiscal_year": "Financial Year",
|
||||
"date_format": "Date Format",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Discount Setting",
|
||||
"discount_per_item": "Discount Per Item ",
|
||||
"discount_setting_description": "Enable this if you want to add Discount to individual invoice items. By default, Discount is added directly to the invoice.",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Invoice",
|
||||
"pdf_invoice_number": "Invoice Number",
|
||||
"pdf_invoice_date": "Invoice Date",
|
||||
"pdf_invoice_due_date": "Due date",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Notes",
|
||||
"pdf_items_label": "Items",
|
||||
"pdf_quantity_label": "Quantity",
|
||||
|
||||
20
lang/fi.json
20
lang/fi.json
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Maksutavat",
|
||||
"notes": "Viestit",
|
||||
"exchange_rate": "Exchange Rate",
|
||||
"address_information": "Address Information"
|
||||
"address_information": "Address Information",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " You can update Your Address information using form below."
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun päätepiste",
|
||||
"ses_secret": "SES salaus",
|
||||
"ses_key": "SES avain",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "Sähköpostin salasana",
|
||||
"username": "Sähköpostin käyttäjänimi",
|
||||
"mail_config": "Sähköposti asetukset",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "PDF Asetukset",
|
||||
"footer_text": "Alaotsikko teksti",
|
||||
"pdf_layout": "PDF asettelu"
|
||||
"pdf_layout": "PDF asettelu",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Yritystiedot",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Säästä aikaa luomalla viestejä, joita voit käyttää laskuilla, tarjouksilla ja maksuissa.",
|
||||
"notes": "Viestit",
|
||||
"type": "Tyyppi",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Lisää viesti",
|
||||
"add_new_note": "Lisää uusi viesti",
|
||||
"name": "Nimi",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Aikavyöhyke",
|
||||
"fiscal_year": "Tilikausi",
|
||||
"date_format": "Päivämäärä formaatti",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Alennusten määritys",
|
||||
"discount_per_item": "Alennus per tuote ",
|
||||
"discount_setting_description": "Aktivoi tämä jos haluat lisätä alennuksen rivikohtaisesti. Oletuksena, Alennus lisätään suoraan laskun kokonaissummaan.",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Lasku",
|
||||
"pdf_invoice_number": "Laskunumero",
|
||||
"pdf_invoice_date": "Laskun päiväys",
|
||||
"pdf_invoice_due_date": "Eräpäivä",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Viesti",
|
||||
"pdf_items_label": "Tuotenimi",
|
||||
"pdf_quantity_label": "Määrä",
|
||||
|
||||
38
lang/fr.json
38
lang/fr.json
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Modes de paiement",
|
||||
"notes": "Notes de bas de page",
|
||||
"exchange_rate": "Taux de change",
|
||||
"address_information": "Information d'adresse"
|
||||
"address_information": "Information d'adresse",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " Vous pouvez mettre à jour vos informations d'adresse via le formulaire ci dessous."
|
||||
@@ -864,7 +865,7 @@
|
||||
"primary_currency": "Devise principale",
|
||||
"timezone": "Fuseau horaire",
|
||||
"date_format": "Format de date",
|
||||
"time_format": "Time Format",
|
||||
"time_format": "Format d'heure",
|
||||
"currencies": {
|
||||
"title": "Devises",
|
||||
"currency": "Devise | Devises",
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Secret",
|
||||
"ses_key": "SES Key",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "Mot de passe",
|
||||
"username": "Nom d'utilisateur",
|
||||
"mail_config": "Envoi d'emails",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "Paramètre PDF",
|
||||
"footer_text": "Pied de page",
|
||||
"pdf_layout": "Mise en page PDF"
|
||||
"pdf_layout": "Mise en page PDF",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Coordonnées de la société",
|
||||
@@ -991,7 +1001,7 @@
|
||||
"delimiter_description": "Un caractère servant à séparer deux composants. Par exemple, un trait d'union",
|
||||
"delimiter_param_label": "Caractère",
|
||||
"date_format": "Date",
|
||||
"time_format": "Time Format",
|
||||
"time_format": "Format d'heure",
|
||||
"date_format_description": "Une date qui peut formatée. Par exemple, \"Y\" affichera l'année en cours.",
|
||||
"date_format_param_label": "Format",
|
||||
"sequence": "Suite",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Créez des notes de bas de page réutilisable sur vos factures, devis et paiements.",
|
||||
"notes": "Note de bas de page",
|
||||
"type": "Type ",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Nouvelle note de bas de page",
|
||||
"add_new_note": "Ajouter une note de bas de page",
|
||||
"name": "Nom",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Fuseau horaire",
|
||||
"fiscal_year": "Exercice fiscal",
|
||||
"date_format": "Format de date",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Réglage de remise",
|
||||
"discount_per_item": "Remise par article",
|
||||
"discount_setting_description": "Activez cette option si vous souhaitez détailler les remises par article. Par défaut, les remises sont ajoutées au sous-total.",
|
||||
@@ -1248,8 +1260,8 @@
|
||||
"updated_message": "Préférences mises à jour",
|
||||
"select_language": "Choisir la langue",
|
||||
"select_time_zone": "Sélectionnez le fuseau horaire",
|
||||
"select_date_format": "Sélectionnez le format de date",
|
||||
"select_time_format": "Select Time Format",
|
||||
"select_date_format": "Choix du format de date",
|
||||
"select_time_format": "Choix du format d'heure",
|
||||
"select_financial_year": "Exercice fiscal",
|
||||
"recurring_invoice_status": "Statut de la facture récurrente",
|
||||
"create_status": "Créer un statut",
|
||||
@@ -1258,8 +1270,8 @@
|
||||
"update_status": "Mettre à jour le statut",
|
||||
"completed": "Terminé",
|
||||
"company_currency_unchangeable": "La devise de la société ne peut pas être modifiée",
|
||||
"invoice_use_time": "Use time in invoices",
|
||||
"invoice_use_time_description": "Enable this if you want to select exact invoice time.",
|
||||
"invoice_use_time": "Inclure l'heure dans les factures",
|
||||
"invoice_use_time_description": "Activez cette option si vous souhaitez indiquer l'heure exacte de la facturation.",
|
||||
"fiscal_years": {
|
||||
"january_december": "Janvier - Décembre",
|
||||
"february_january": "Février - Janvier",
|
||||
@@ -1428,7 +1440,7 @@
|
||||
"time_zone": "Fuseau horaire",
|
||||
"fiscal_year": "Exercice fiscal",
|
||||
"date_format": "Format de date",
|
||||
"time_format": "Time Format",
|
||||
"time_format": "Format d'heure",
|
||||
"from_address": "De l'adresse",
|
||||
"username": "Nom d'utilisateur",
|
||||
"next": "Suivant",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Facture",
|
||||
"pdf_invoice_number": "Numéro",
|
||||
"pdf_invoice_date": "Date",
|
||||
"pdf_invoice_due_date": "Date d’échéance",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Notes de bas de page",
|
||||
"pdf_items_label": "Articles",
|
||||
"pdf_quantity_label": "Quantité",
|
||||
@@ -1624,8 +1636,8 @@
|
||||
"pdf_tax_label": "Taxe",
|
||||
"pdf_tax_id": "N° fiscal",
|
||||
"pdf_vat_id": "N° de TVA",
|
||||
"pdf_amount_paid": "Amount Paid",
|
||||
"pdf_amount_due": "Amount Due",
|
||||
"pdf_amount_paid": "Montant acquitté",
|
||||
"pdf_amount_due": "Montant dû",
|
||||
"mail_thanks": "Merci",
|
||||
"mail_view_estimate": "Voir le devis",
|
||||
"mail_viewed_estimate": ":name a consulté ce devis.",
|
||||
|
||||
20
lang/hi.json
20
lang/hi.json
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "भुगतान के प्रकार",
|
||||
"notes": "नोट्स",
|
||||
"exchange_rate": "विनिमय दर",
|
||||
"address_information": "पते के बारे में जानकारी"
|
||||
"address_information": "पते के बारे में जानकारी",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " आप नीचे दिए गए फॉर्म का उपयोग करके अपनी पता जानकारी अपडेट कर सकते हैं"
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Secret",
|
||||
"ses_key": "SES Key",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "Mail Password",
|
||||
"username": "Mail Username",
|
||||
"mail_config": "Mail Configuration",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "PDF Setting",
|
||||
"footer_text": "Footer Text",
|
||||
"pdf_layout": "PDF Layout"
|
||||
"pdf_layout": "PDF Layout",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Company info",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Save time by creating notes and reusing them on your invoices, estimates & payments.",
|
||||
"notes": "Notes",
|
||||
"type": "Type",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Add Note",
|
||||
"add_new_note": "Add New Note",
|
||||
"name": "Name",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Time Zone",
|
||||
"fiscal_year": "Financial Year",
|
||||
"date_format": "Date Format",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Discount Setting",
|
||||
"discount_per_item": "Discount Per Item ",
|
||||
"discount_setting_description": "Enable this if you want to add Discount to individual invoice items. By default, Discount is added directly to the invoice.",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Invoice",
|
||||
"pdf_invoice_number": "Invoice Number",
|
||||
"pdf_invoice_date": "Invoice Date",
|
||||
"pdf_invoice_due_date": "Due date",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Notes",
|
||||
"pdf_items_label": "Items",
|
||||
"pdf_quantity_label": "Quantity",
|
||||
|
||||
20
lang/hr.json
20
lang/hr.json
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Način plaćanja",
|
||||
"notes": "Napomene",
|
||||
"exchange_rate": "Tečaj",
|
||||
"address_information": "Podaci o adresi"
|
||||
"address_information": "Podaci o adresi",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " Možete ažurirati svoju adresu u slijedećem obrascu."
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Lozinka",
|
||||
"ses_key": "SES Ključ",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "Mail Lozinka",
|
||||
"username": "Mail Korisničko Ime",
|
||||
"mail_config": "Mail Postavke",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "PDF Postavke",
|
||||
"footer_text": "Tekstualno zaglavlje na dnu strane",
|
||||
"pdf_layout": "PDF Raspored"
|
||||
"pdf_layout": "PDF Raspored",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Podaci o firmi",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Uštedite vrijeme kreirajući napomene i koristeći ih na računima, ponudama i uplatama.",
|
||||
"notes": "Napomene",
|
||||
"type": "Vrsta",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Dodaj Napomenu",
|
||||
"add_new_note": "Dodaj novu Napomenu",
|
||||
"name": "Naziv",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Vremenska Zona",
|
||||
"fiscal_year": "Financijska Godina",
|
||||
"date_format": "Format datuma",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Postavke popusta",
|
||||
"discount_per_item": "Popust po stavkama",
|
||||
"discount_setting_description": "Izaberite ovo ako želite dodati Popust na individualne stavke. Zadana vrijednost je da je Popust dodan direktno na fakturu.",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Račun",
|
||||
"pdf_invoice_number": "Broj Fakture",
|
||||
"pdf_invoice_date": "Datum Fakture",
|
||||
"pdf_invoice_due_date": "Datum dospijeća Fakture",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Napomena",
|
||||
"pdf_items_label": "Stavke",
|
||||
"pdf_quantity_label": "Količina",
|
||||
|
||||
912
lang/id.json
912
lang/id.json
File diff suppressed because it is too large
Load Diff
20
lang/it.json
20
lang/it.json
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Modalità di Pagamento",
|
||||
"notes": "Note",
|
||||
"exchange_rate": "Tasso di cambio",
|
||||
"address_information": "Indirizzo"
|
||||
"address_information": "Indirizzo",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " Puoi aggiornare le informazioni sul tuo indirizzo utilizzando il modulo sottostante."
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Endpoint Mailgun",
|
||||
"ses_secret": "Segreto SES",
|
||||
"ses_key": "Chiave SES",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "Password Email",
|
||||
"username": "Nome Utente Email",
|
||||
"mail_config": "Configurazione Mail",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "Configurazione PDF",
|
||||
"footer_text": "Testo Footer",
|
||||
"pdf_layout": "Layout PDF"
|
||||
"pdf_layout": "Layout PDF",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Info azienda",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Risparmia tempo creando note e riutilizzandole sulle tue fatture, preventivi e pagamenti.",
|
||||
"notes": "Note",
|
||||
"type": "genere",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Aggiungi Nota",
|
||||
"add_new_note": "Aggiungi nuova nota",
|
||||
"name": "Nome",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Fuso Orario",
|
||||
"fiscal_year": "Anno finanziario",
|
||||
"date_format": "Formato Data",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Impostazione Sconto",
|
||||
"discount_per_item": "Sconto Per Item ",
|
||||
"discount_setting_description": "Abilita se vuoi aggiungere uno sconto ad uno specifica fattura. Di default, lo sconto è aggiunto direttamente in fattura.",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Fattura",
|
||||
"pdf_invoice_number": "Numero Fattura",
|
||||
"pdf_invoice_date": "Data fattura",
|
||||
"pdf_invoice_due_date": "Data di pagamento",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Note",
|
||||
"pdf_items_label": "Commesse",
|
||||
"pdf_quantity_label": "Quantità",
|
||||
|
||||
668
lang/ja.json
668
lang/ja.json
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "支払い方法",
|
||||
"notes": "ノート",
|
||||
"exchange_rate": "為替レート",
|
||||
"address_information": "住所情報"
|
||||
"address_information": "住所情報",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " 以下のフォームを使用して、住所情報を更新できます。"
|
||||
@@ -864,7 +865,7 @@
|
||||
"primary_currency": "主要通貨",
|
||||
"timezone": "タイムゾーン",
|
||||
"date_format": "日付の形式",
|
||||
"time_format": "Time Format",
|
||||
"time_format": "時刻形式",
|
||||
"currencies": {
|
||||
"title": "通貨",
|
||||
"currency": "通貨",
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun エンドポイント",
|
||||
"ses_secret": "SESシークレット",
|
||||
"ses_key": "SESキー",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "メールのパスワード",
|
||||
"username": "メールのユーザー名",
|
||||
"mail_config": "メール設定",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "PDFの設定",
|
||||
"footer_text": "フッターの文章",
|
||||
"pdf_layout": "PDFのレイアウト"
|
||||
"pdf_layout": "PDFのレイアウト",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "会社情報",
|
||||
@@ -991,7 +1001,7 @@
|
||||
"delimiter_description": "2 つの異なるコンポーネント間の境界を指定するための 1 つの文字。デフォルトでは次のように設定されています -",
|
||||
"delimiter_param_label": "区切り文字の値",
|
||||
"date_format": "日付形式",
|
||||
"time_format": "Time Format",
|
||||
"time_format": "時刻形式",
|
||||
"date_format_description": "フォーマットパラメータを受け入れるローカルの日付と時刻のフィールド。デフォルトのフォーマット: 'Y' は現在の年をレンダリングします。",
|
||||
"date_format_param_label": "フォーマット",
|
||||
"sequence": "シーケンス",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "ノートを作成し、請求書、見積り、支払いで再利用することで時間を節約します。",
|
||||
"notes": "ノート",
|
||||
"type": "タイプ",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "ノートの追加",
|
||||
"add_new_note": "新規ノートを追加",
|
||||
"name": "名前",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "タイムゾーン",
|
||||
"fiscal_year": "会計年度",
|
||||
"date_format": "日付形式",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "時刻形式",
|
||||
"discount_setting": "割引設定",
|
||||
"discount_per_item": "アイテムごとの割引 ",
|
||||
"discount_setting_description": "個々の請求書項目に割引を追加する場合はこれを有効にします。デフォルトでは割引は請求書に直接追加されます。",
|
||||
@@ -1249,7 +1261,7 @@
|
||||
"select_language": "言語の選択",
|
||||
"select_time_zone": "タイムゾーンの選択",
|
||||
"select_date_format": "日付形式を選択",
|
||||
"select_time_format": "Select Time Format",
|
||||
"select_time_format": "時刻形式を選択",
|
||||
"select_financial_year": "会計年度の選択",
|
||||
"recurring_invoice_status": "定期請求書のステータス",
|
||||
"create_status": "ステータスを作成",
|
||||
@@ -1258,8 +1270,8 @@
|
||||
"update_status": "ステータスの更新",
|
||||
"completed": "完了",
|
||||
"company_currency_unchangeable": "会社の通貨は変更できません",
|
||||
"invoice_use_time": "Use time in invoices",
|
||||
"invoice_use_time_description": "Enable this if you want to select exact invoice time.",
|
||||
"invoice_use_time": "請求書の時間を使用",
|
||||
"invoice_use_time_description": "正確な請求書の時刻を選択する場合は、これを有効にします。",
|
||||
"fiscal_years": {
|
||||
"january_december": "1月-12月",
|
||||
"february_january": "2月-1月",
|
||||
@@ -1278,361 +1290,361 @@
|
||||
"update_app": {
|
||||
"title": "アプリの更新",
|
||||
"description": "下のボタンをクリックするとInvoiceShelfを簡単にアップデートできます。",
|
||||
"check_update": "Check for updates",
|
||||
"insider_consent": "Opt-in for Insider releases. Recommended for testing purposes only.",
|
||||
"avail_update": "New Update available",
|
||||
"next_version": "Next version",
|
||||
"requirements": "Requirements",
|
||||
"update": "Update Now",
|
||||
"update_progress": "Update in progress...",
|
||||
"progress_text": "It will just take a few minutes. Please do not refresh the screen or close the window before the update finishes",
|
||||
"update_success": "App has been updated! Please wait while your browser window gets reloaded automatically.",
|
||||
"latest_message": "No update available! You are on the latest version.",
|
||||
"current_version": "Current Version",
|
||||
"download_zip_file": "Download ZIP file",
|
||||
"unzipping_package": "Unzipping Package",
|
||||
"copying_files": "Copying Files",
|
||||
"deleting_files": "Deleting Unused files",
|
||||
"running_migrations": "Running Migrations",
|
||||
"finishing_update": "Finishing Update",
|
||||
"update_failed": "Update Failed",
|
||||
"update_failed_text": "Sorry! Your update failed on : {step} step",
|
||||
"update_warning": "All of the application files and default template files will be overwritten when you update the application using this utility. Please take a backup of your templates & database before updating."
|
||||
"check_update": "アップデートを確認する",
|
||||
"insider_consent": "Insiderリリースにオプトインします。テストのみに推奨されます。",
|
||||
"avail_update": "新しいアップデートが利用可能です",
|
||||
"next_version": "次のバージョン",
|
||||
"requirements": "要件",
|
||||
"update": "今すぐアップデート",
|
||||
"update_progress": "アップデート中...",
|
||||
"progress_text": "数分程度かかります。更新が完了するまで画面を更新したりウィンドウを閉じたりしないでください。",
|
||||
"update_success": "アプリが更新されました!ブラウザが自動的に再読み込みされるまでお待ちください。",
|
||||
"latest_message": "利用可能なアップデートはありません!最新バージョンです。",
|
||||
"current_version": "現在のバージョン",
|
||||
"download_zip_file": "ZIPファイルをダウンロード",
|
||||
"unzipping_package": "パッケージの展開中",
|
||||
"copying_files": "ファイルのコピー中",
|
||||
"deleting_files": "未使用のファイルの削除",
|
||||
"running_migrations": "移行を実行中",
|
||||
"finishing_update": "アップデート完了",
|
||||
"update_failed": "アップデートに失敗しました",
|
||||
"update_failed_text": "申し訳ありません。更新に失敗しました: {step} ステップ",
|
||||
"update_warning": "このユーティリティを使用してアプリケーションを更新するとすべてのアプリケーションファイルと既定のテンプレートファイルが上書きされます。更新する前にテンプレートとデータベースのバックアップを作成してください。"
|
||||
},
|
||||
"backup": {
|
||||
"title": "Backup | Backups",
|
||||
"description": "The backup is a zipfile that contains all files in the directories you specify along with a dump of your database",
|
||||
"new_backup": "Add New Backup",
|
||||
"create_backup": "Create Backup",
|
||||
"select_backup_type": "Select Backup Type",
|
||||
"backup_confirm_delete": "You will not be able to recover this Backup",
|
||||
"path": "path",
|
||||
"new_disk": "New Disk",
|
||||
"created_at": "created at",
|
||||
"size": "size",
|
||||
"title": "バックアップ | バックアップ",
|
||||
"description": "バックアップは指定したディレクトリ内のすべてのファイルとデータベースのダンプを含むzipファイルです。",
|
||||
"new_backup": "新しいバックアップを追加",
|
||||
"create_backup": "バックアップを作成",
|
||||
"select_backup_type": "バックアップの種類を選択",
|
||||
"backup_confirm_delete": "このバックアップを復元することはできません",
|
||||
"path": "パス",
|
||||
"new_disk": "新しいディスク",
|
||||
"created_at": "作成日",
|
||||
"size": "サイズ",
|
||||
"dropbox": "dropbox",
|
||||
"local": "local",
|
||||
"local": "ローカル",
|
||||
"healthy": "healthy",
|
||||
"amount_of_backups": "amount of backups",
|
||||
"newest_backups": "newest backups",
|
||||
"used_storage": "used storage",
|
||||
"select_disk": "Select Disk",
|
||||
"action": "Action",
|
||||
"deleted_message": "Backup deleted successfully",
|
||||
"created_message": "Backup created successfully",
|
||||
"invalid_disk_credentials": "Invalid credential of selected disk"
|
||||
"amount_of_backups": "バックアップ数",
|
||||
"newest_backups": "最新のバックアップ",
|
||||
"used_storage": "ストレージ使用量",
|
||||
"select_disk": "ディスクを選択",
|
||||
"action": "アクション",
|
||||
"deleted_message": "バックアップは正常に削除されました",
|
||||
"created_message": "バックアップは正常に作成されました。",
|
||||
"invalid_disk_credentials": "選択したディスクの認証情報が無効です"
|
||||
},
|
||||
"disk": {
|
||||
"title": "File Disk | File Disks",
|
||||
"description": "By default, InvoiceShelf will use your local disk for saving backups, avatar and other image files. You can configure more than one disk drivers like DigitalOcean, S3 and Dropbox according to your preference.",
|
||||
"created_at": "created at",
|
||||
"title": "ファイルディスク | ファイルディスク",
|
||||
"description": "デフォルトではInvoiceShelfはバックアップ、アバター、その他の画像ファイルの保存にローカル ディスクを使用します。好みに応じて、DigitalOcean、S3、Dropbox などの複数のディスク ドライバーを構成できます。",
|
||||
"created_at": "作成日",
|
||||
"dropbox": "dropbox",
|
||||
"name": "Name",
|
||||
"driver": "Driver",
|
||||
"disk_type": "Type",
|
||||
"disk_name": "Disk Name",
|
||||
"new_disk": "Add New Disk",
|
||||
"filesystem_driver": "Filesystem Driver",
|
||||
"local_driver": "local Driver",
|
||||
"local_root": "local Root",
|
||||
"public_driver": "Public Driver",
|
||||
"public_root": "Public Root",
|
||||
"public_url": "Public URL",
|
||||
"public_visibility": "Public Visibility",
|
||||
"media_driver": "Media Driver",
|
||||
"media_root": "Media Root",
|
||||
"aws_driver": "AWS Driver",
|
||||
"aws_key": "AWS Key",
|
||||
"aws_secret": "AWS Secret",
|
||||
"aws_region": "AWS Region",
|
||||
"aws_bucket": "AWS Bucket",
|
||||
"aws_root": "AWS Root",
|
||||
"s3_endpoint": "S3 Endpoint",
|
||||
"s3_key": "S3 Key",
|
||||
"s3_secret": "S3 Secret",
|
||||
"s3_region": "S3 Region",
|
||||
"s3_bucket": "S3 Bucket",
|
||||
"s3_root": "S3 Root",
|
||||
"do_spaces_type": "Do Spaces type",
|
||||
"do_spaces_key": "Do Spaces key",
|
||||
"do_spaces_secret": "Do Spaces Secret",
|
||||
"do_spaces_region": "Do Spaces Region",
|
||||
"do_spaces_bucket": "Do Spaces Bucket",
|
||||
"do_spaces_endpoint": "Do Spaces Endpoint",
|
||||
"do_spaces_root": "Do Spaces Root",
|
||||
"dropbox_type": "Dropbox Type",
|
||||
"dropbox_token": "Dropbox Token",
|
||||
"dropbox_key": "Dropbox Key",
|
||||
"dropbox_secret": "Dropbox Secret",
|
||||
"dropbox_app": "Dropbox App",
|
||||
"dropbox_root": "Dropbox Root",
|
||||
"default_driver": "Default Driver",
|
||||
"is_default": "IS DEFAULT",
|
||||
"set_default_disk": "Set Default Disk",
|
||||
"set_default_disk_confirm": "This disk will be set as default and all the new PDFs will be saved on this disk",
|
||||
"success_set_default_disk": "Disk set as default successfully",
|
||||
"save_pdf_to_disk": "Save PDFs to Disk",
|
||||
"disk_setting_description": " Enable this, if you wish to save a copy of each Invoice, Estimate & Payment Receipt PDF on your default disk automatically. Turning this option will decrease the load-time when viewing the PDFs.",
|
||||
"select_disk": "Select Disk",
|
||||
"disk_settings": "Disk Settings",
|
||||
"confirm_delete": "Your existing files & folders in the specified disk will not be affected but your disk configuration will be deleted from InvoiceShelf",
|
||||
"action": "Action",
|
||||
"edit_file_disk": "Edit File Disk",
|
||||
"success_create": "Disk added successfully",
|
||||
"success_update": "Disk updated successfully",
|
||||
"error": "Disk addition failed",
|
||||
"deleted_message": "File Disk deleted successfully",
|
||||
"disk_variables_save_successfully": "Disk Configured Successfully",
|
||||
"disk_variables_save_error": "Disk configuration failed.",
|
||||
"invalid_disk_credentials": "Invalid credential of selected disk"
|
||||
"name": "名前",
|
||||
"driver": "ドライバ",
|
||||
"disk_type": "タイプ",
|
||||
"disk_name": "ディスク名",
|
||||
"new_disk": "新しいディスクを追加",
|
||||
"filesystem_driver": "ファイルシステムドライバ",
|
||||
"local_driver": "ローカルドライバ",
|
||||
"local_root": "ローカルルート",
|
||||
"public_driver": "公開ドライバ",
|
||||
"public_root": "公開ルート",
|
||||
"public_url": "公開URL",
|
||||
"public_visibility": "公開表示",
|
||||
"media_driver": "メディアドライバ",
|
||||
"media_root": "メディアルート",
|
||||
"aws_driver": "AWSドライバ",
|
||||
"aws_key": "AWSキー",
|
||||
"aws_secret": "AWSシークレット",
|
||||
"aws_region": "AWSリージョン",
|
||||
"aws_bucket": "AWSバケット",
|
||||
"aws_root": "AWSルート",
|
||||
"s3_endpoint": "S3エンドポイント",
|
||||
"s3_key": "S3キー",
|
||||
"s3_secret": "S3シークレット",
|
||||
"s3_region": "S3リージョン",
|
||||
"s3_bucket": "S3バケット",
|
||||
"s3_root": "S3ルート",
|
||||
"do_spaces_type": "Do Spacesタイプ",
|
||||
"do_spaces_key": "Do Spacesキー",
|
||||
"do_spaces_secret": "Do Spacesシークレット",
|
||||
"do_spaces_region": "Do Spacesリージョン",
|
||||
"do_spaces_bucket": "Do Spacesバケット",
|
||||
"do_spaces_endpoint": "Do Spacesエンドポイント",
|
||||
"do_spaces_root": "Do Spacesルート",
|
||||
"dropbox_type": "Dropboxタイプ",
|
||||
"dropbox_token": "Dropboxトークン",
|
||||
"dropbox_key": "Dropboxキー",
|
||||
"dropbox_secret": "Dropboxシークレット",
|
||||
"dropbox_app": "Dropboxアプリ",
|
||||
"dropbox_root": "Dropboxルート",
|
||||
"default_driver": "既定のドライバ",
|
||||
"is_default": "既定値",
|
||||
"set_default_disk": "既定のディスクを設定",
|
||||
"set_default_disk_confirm": "このディスクは既定値として設定され、すべての新しいPDFがこのディスクに保存されます",
|
||||
"success_set_default_disk": "ディスクを既定に設定しました",
|
||||
"save_pdf_to_disk": "PDFをディスクに保存",
|
||||
"disk_setting_description": " 請求書、見積書、支払い領収書の各PDFのコピーをデフォルトのディスクに自動的に保存する場合は、これを有効にします。このオプションをオンにするとPDFを表示するときの読み込み時間が短縮されます。",
|
||||
"select_disk": "ディスクを選択",
|
||||
"disk_settings": "ディスクの設定",
|
||||
"confirm_delete": "指定されたディスク内の既存のファイルとフォルダは影響を受けませんが、ディスク構成はInvoiceShelfから削除されます。",
|
||||
"action": "アクション",
|
||||
"edit_file_disk": "ファイルディスクの編集",
|
||||
"success_create": "ディスクの追加に成功しました",
|
||||
"success_update": "ディスクは正常に更新されました",
|
||||
"error": "ディスク追加に失敗しました",
|
||||
"deleted_message": "ファイルディスクは正常に削除されました",
|
||||
"disk_variables_save_successfully": "ディスクの設定が完了しました",
|
||||
"disk_variables_save_error": "ディスクの設定に失敗しました。",
|
||||
"invalid_disk_credentials": "選択したディスクの認証情報が無効です"
|
||||
},
|
||||
"taxations": {
|
||||
"add_billing_address": "Enter Billing Address",
|
||||
"add_shipping_address": "Enter Shipping Address",
|
||||
"add_company_address": "Enter Company Address",
|
||||
"modal_description": "The information below is required in order to fetch sales tax.",
|
||||
"add_address": "Add Address for fetching sales tax.",
|
||||
"address_placeholder": "Example: 123, My Street",
|
||||
"city_placeholder": "Example: Los Angeles",
|
||||
"state_placeholder": "Example: CA",
|
||||
"zip_placeholder": "Example: 90024",
|
||||
"invalid_address": "Please provide valid address details."
|
||||
"add_billing_address": "請求先住所を入力",
|
||||
"add_shipping_address": "配送先住所を入力",
|
||||
"add_company_address": "会社住所を入力",
|
||||
"modal_description": "消費税を取得するには以下の情報が必要です。",
|
||||
"add_address": "消費税を取得するための住所を追加します。",
|
||||
"address_placeholder": "例: 123、番地",
|
||||
"city_placeholder": "例: ロサンゼルス",
|
||||
"state_placeholder": "例: CA",
|
||||
"zip_placeholder": "例: 90024",
|
||||
"invalid_address": "有効な住所の詳細を入力してください。"
|
||||
}
|
||||
},
|
||||
"wizard": {
|
||||
"account_info": "Account Information",
|
||||
"account_info_desc": "Below details will be used to create the main Administrator account. Also you can change the details anytime after logging in.",
|
||||
"name": "Name",
|
||||
"email": "Email",
|
||||
"password": "Password",
|
||||
"confirm_password": "Confirm Password",
|
||||
"save_cont": "Save & Continue",
|
||||
"company_info": "Company Information",
|
||||
"company_info_desc": "This information will be displayed on invoices. Note that you can edit this later on settings page.",
|
||||
"company_name": "Company Name",
|
||||
"company_logo": "Company Logo",
|
||||
"logo_preview": "Logo Preview",
|
||||
"preferences": "Company Preferences",
|
||||
"preferences_desc": "Specify the default preferences for this company.",
|
||||
"currency_set_alert": "The company's currency cannot be changed later.",
|
||||
"country": "Country",
|
||||
"state": "State",
|
||||
"city": "City",
|
||||
"address": "Address",
|
||||
"street": "Street1 | Street2",
|
||||
"phone": "Phone",
|
||||
"zip_code": "Zip Code",
|
||||
"go_back": "Go Back",
|
||||
"currency": "Currency",
|
||||
"language": "Language",
|
||||
"time_zone": "Time Zone",
|
||||
"fiscal_year": "Financial Year",
|
||||
"date_format": "Date Format",
|
||||
"time_format": "Time Format",
|
||||
"from_address": "From Address",
|
||||
"username": "Username",
|
||||
"next": "Next",
|
||||
"continue": "Continue",
|
||||
"skip": "Skip",
|
||||
"account_info": "アカウント情報",
|
||||
"account_info_desc": "以下の詳細はメインの管理者アカウントを作成するために使用されます。また、ログイン後いつでも詳細を変更できます。",
|
||||
"name": "名前",
|
||||
"email": "メール",
|
||||
"password": "パスワード",
|
||||
"confirm_password": "パスワードの再入力",
|
||||
"save_cont": "保存して続ける",
|
||||
"company_info": "会社情報",
|
||||
"company_info_desc": "この情報は請求書に表示されます。設定ページで後で編集できます。",
|
||||
"company_name": "会社名",
|
||||
"company_logo": "企業ロゴ",
|
||||
"logo_preview": "ロゴのプレビュー",
|
||||
"preferences": "会社設定",
|
||||
"preferences_desc": "この会社のデフォルトの設定を指定します。",
|
||||
"currency_set_alert": "会社の通貨は後から変更できません。",
|
||||
"country": "国",
|
||||
"state": "都道府県",
|
||||
"city": "市区町村",
|
||||
"address": "住所",
|
||||
"street": "住所1 | 住所2",
|
||||
"phone": "電話",
|
||||
"zip_code": "郵便番号",
|
||||
"go_back": "戻る",
|
||||
"currency": "通貨",
|
||||
"language": "言語",
|
||||
"time_zone": "タイムゾーン",
|
||||
"fiscal_year": "会計年度",
|
||||
"date_format": "日付形式",
|
||||
"time_format": "時刻形式",
|
||||
"from_address": "差出人アドレス",
|
||||
"username": "ユーザー名",
|
||||
"next": "次",
|
||||
"continue": "続行",
|
||||
"skip": "スキップ",
|
||||
"install_language": {
|
||||
"title": "Choose your language",
|
||||
"description": "Select language wizard to install InvoiceShelf"
|
||||
"title": "言語選択",
|
||||
"description": "InvoiceShelfをインストールする言語ウィザードを選択してください"
|
||||
},
|
||||
"database": {
|
||||
"database": "Site URL & Database",
|
||||
"connection": "Database Connection",
|
||||
"host": "Database Host",
|
||||
"port": "Database Port",
|
||||
"password": "Database Password",
|
||||
"app_url": "App URL",
|
||||
"app_domain": "App Domain",
|
||||
"username": "Database Username",
|
||||
"db_name": "Database Name",
|
||||
"db_path": "Database Path",
|
||||
"overwrite": "Overwrite existing database and proceed",
|
||||
"desc": "Create a database on your server and set the credentials using the form below."
|
||||
"database": "サイトURLとデータベース",
|
||||
"connection": "データベース接続",
|
||||
"host": "データベースホスト",
|
||||
"port": "データベースポート",
|
||||
"password": "データベースパスワード",
|
||||
"app_url": "アプリURL",
|
||||
"app_domain": "アプリのドメイン",
|
||||
"username": "データベースのユーザ名",
|
||||
"db_name": "データベース名",
|
||||
"db_path": "データベースのパス",
|
||||
"overwrite": "既存のデータベースを上書きして続行します",
|
||||
"desc": "サーバーにデータベースを作成し、以下のフォームを使用して資格情報を設定します。"
|
||||
},
|
||||
"permissions": {
|
||||
"permissions": "Permissions",
|
||||
"permission_confirm_title": "Are you sure you want to continue?",
|
||||
"permission_confirm_desc": "Folder permission check failed",
|
||||
"permission_desc": "Below is the list of folder permissions which are required in order for the app to work. If the permission check fails, make sure to update your folder permissions."
|
||||
"permissions": "権限",
|
||||
"permission_confirm_title": "本当に続行しますか?",
|
||||
"permission_confirm_desc": "フォルダ権限のチェックに失敗しました",
|
||||
"permission_desc": "以下はアプリが動作するために必要なフォルダー権限のリストです。権限チェックが失敗した場合はフォルダー権限を更新してください。"
|
||||
},
|
||||
"verify_domain": {
|
||||
"title": "Domain Verification",
|
||||
"desc": "InvoiceShelf uses Session based authentication which requires domain verification for security purposes. Please enter the domain on which you will be accessing your web application.",
|
||||
"app_domain": "App Domain",
|
||||
"verify_now": "Verify Now",
|
||||
"success": "Domain Verify Successfully.",
|
||||
"failed": "Domain verification failed. Please enter valid domain name.",
|
||||
"verify_and_continue": "Verify And Continue",
|
||||
"title": "ドメイン検証",
|
||||
"desc": "InvoiceShelfはセキュリティ上の理由からドメイン検証を必要とするセッションベースの認証を使用します。Web アプリケーションにアクセスするドメインを入力してください。",
|
||||
"app_domain": "アプリのドメイン",
|
||||
"verify_now": "今すぐ確認",
|
||||
"success": "ドメインの確認に成功しました。",
|
||||
"failed": "ドメイン検証に失敗しました。有効なドメイン名を入力してください。",
|
||||
"verify_and_continue": "確認して続ける",
|
||||
"notes": {
|
||||
"notes": "Notes:",
|
||||
"not_contain": "App domain should not contain",
|
||||
"or": "or",
|
||||
"in_front": "in front of the domain.",
|
||||
"if_you": "If you're accessing the website on a different port, please mention the port. For example:"
|
||||
"notes": "ノート:",
|
||||
"not_contain": "アプリのドメインを含めることはできません",
|
||||
"or": "または",
|
||||
"in_front": "ドメインの前。",
|
||||
"if_you": "別のポートでWebサイトにアクセスする場合はポートを指定してください。例:"
|
||||
}
|
||||
},
|
||||
"mail": {
|
||||
"host": "Mail Host",
|
||||
"port": "Mail Port",
|
||||
"driver": "Mail Driver",
|
||||
"secret": "Secret",
|
||||
"mailgun_secret": "Mailgun Secret",
|
||||
"mailgun_domain": "Domain",
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Secret",
|
||||
"ses_key": "SES Key",
|
||||
"password": "Mail Password",
|
||||
"username": "Mail Username",
|
||||
"mail_config": "Mail Configuration",
|
||||
"from_name": "From Mail Name",
|
||||
"from_mail": "From Mail Address",
|
||||
"encryption": "Mail Encryption",
|
||||
"mail_config_desc": "Below is the form for Configuring Email driver for sending emails from the app. You can also configure third party providers like Sendgrid, SES etc."
|
||||
"host": "メールサーバーアドレス",
|
||||
"port": "メールポート",
|
||||
"driver": "メールドライバ",
|
||||
"secret": "シークレット",
|
||||
"mailgun_secret": "Mailgunシークレット",
|
||||
"mailgun_domain": "ドメイン",
|
||||
"mailgun_endpoint": "Mailgunエンドポイント",
|
||||
"ses_secret": "SESシークレット",
|
||||
"ses_key": "SESキー",
|
||||
"password": "メールのパスワード",
|
||||
"username": "メールのユーザー名",
|
||||
"mail_config": "メール設定",
|
||||
"from_name": "送信者名",
|
||||
"from_mail": "差出人アドレス",
|
||||
"encryption": "メールの暗号化",
|
||||
"mail_config_desc": "以下は、アプリからメールを送信するためのメールドライバーを構成するためのフォームです。Sendgrid、SES などのサードパーティ プロバイダーを構成することもできます。"
|
||||
},
|
||||
"req": {
|
||||
"system_req": "System Requirements",
|
||||
"php_req_version": "Php (version {version} required)",
|
||||
"check_req": "Check Requirements",
|
||||
"system_req_desc": "InvoiceShelf has a few server requirements. Make sure that your server has the required php version and all the extensions mentioned below."
|
||||
"system_req": "システム要件",
|
||||
"php_req_version": "PHP(バージョン{version}が必要)",
|
||||
"check_req": "要件を確認する",
|
||||
"system_req_desc": "InvoiceShelfにはいくつかのサーバー要件があります。サーバーに必要なPHPバージョンと以下に記載されているすべての拡張機能がインストールされていることを確認してください。"
|
||||
},
|
||||
"errors": {
|
||||
"migrate_failed": "Migrate Failed",
|
||||
"database_variables_save_error": "Cannot write configuration to .env file. Please check its file permissions",
|
||||
"mail_variables_save_error": "Email configuration failed.",
|
||||
"connection_failed": "Database connection failed",
|
||||
"database_should_be_empty": "Database should be empty"
|
||||
"migrate_failed": "移行に失敗しました",
|
||||
"database_variables_save_error": ".envファイルに構成を書き込めません。ファイルの権限を確認してください。",
|
||||
"mail_variables_save_error": "メールの設定に失敗しました。",
|
||||
"connection_failed": "データベース接続に失敗しました",
|
||||
"database_should_be_empty": "データベースは空である必要があります"
|
||||
},
|
||||
"success": {
|
||||
"mail_variables_save_successfully": "Email configured successfully",
|
||||
"database_variables_save_successfully": "Database configured successfully."
|
||||
"mail_variables_save_successfully": "メールが正常に設定されました",
|
||||
"database_variables_save_successfully": "データベースが正常に構成されました。"
|
||||
}
|
||||
},
|
||||
"validation": {
|
||||
"invalid_phone": "Invalid Phone Number",
|
||||
"invalid_url": "Invalid url (ex: http://www.invoiceshelf.com)",
|
||||
"invalid_domain_url": "Invalid url (ex: invoiceshelf.com)",
|
||||
"required": "Field is required",
|
||||
"email_incorrect": "Incorrect Email.",
|
||||
"email_already_taken": "The email has already been taken.",
|
||||
"email_does_not_exist": "User with given email doesn't exist",
|
||||
"item_unit_already_taken": "This item unit name has already been taken",
|
||||
"payment_mode_already_taken": "This payment mode name has already been taken",
|
||||
"send_reset_link": "Send Reset Link",
|
||||
"not_yet": "Not yet? Send it again",
|
||||
"password_min_length": "Password must contain {count} characters",
|
||||
"name_min_length": "Name must have at least {count} letters.",
|
||||
"prefix_min_length": "Prefix must have at least {count} letters.",
|
||||
"enter_valid_tax_rate": "Enter valid tax rate",
|
||||
"numbers_only": "Numbers Only.",
|
||||
"characters_only": "Characters Only.",
|
||||
"password_incorrect": "Passwords must be identical",
|
||||
"password_length": "Password must be {count} character long.",
|
||||
"qty_must_greater_than_zero": "Quantity must be greater than zero.",
|
||||
"price_greater_than_zero": "Price must be greater than zero.",
|
||||
"payment_greater_than_zero": "Payment must be greater than zero.",
|
||||
"payment_greater_than_due_amount": "Entered Payment is more than due amount of this invoice.",
|
||||
"quantity_maxlength": "Quantity should not be greater than 20 digits.",
|
||||
"price_maxlength": "Price should not be greater than 20 digits.",
|
||||
"price_minvalue": "Price should be greater than 0.",
|
||||
"amount_maxlength": "Amount should not be greater than 20 digits.",
|
||||
"amount_minvalue": "Amount should be greater than 0.",
|
||||
"discount_maxlength": "Discount should not be greater than max discount",
|
||||
"description_maxlength": "Description should not be greater than 255 characters.",
|
||||
"subject_maxlength": "Subject should not be greater than 100 characters.",
|
||||
"message_maxlength": "Message should not be greater than 255 characters.",
|
||||
"maximum_options_error": "Maximum of {max} options selected. First remove a selected option to select another.",
|
||||
"notes_maxlength": "Notes should not be greater than 65,000 characters.",
|
||||
"address_maxlength": "Address should not be greater than 255 characters.",
|
||||
"ref_number_maxlength": "Ref Number should not be greater than 255 characters.",
|
||||
"prefix_maxlength": "Prefix should not be greater than 5 characters.",
|
||||
"something_went_wrong": "something went wrong",
|
||||
"number_length_minvalue": "Number length should be greater than 0",
|
||||
"at_least_one_ability": "Please select atleast one Permission.",
|
||||
"valid_driver_key": "Please enter a valid {driver} key.",
|
||||
"valid_exchange_rate": "Please enter a valid exchange rate.",
|
||||
"company_name_not_same": "Company name must match with given name."
|
||||
"invalid_phone": "無効な電話番号",
|
||||
"invalid_url": "無効なURL(例: http://www.invoiceshelf.com)",
|
||||
"invalid_domain_url": "無効なURL(例: invoiceshelf.com)",
|
||||
"required": "フィールドは必須です",
|
||||
"email_incorrect": "メールが間違っています。",
|
||||
"email_already_taken": "このメールはすでに使用されています。",
|
||||
"email_does_not_exist": "指定されたメールのユーザーは存在しません",
|
||||
"item_unit_already_taken": "このアイテムユニット名はすでに使用されています",
|
||||
"payment_mode_already_taken": "この支払い方法の名前はすでに使用されています",
|
||||
"send_reset_link": "再設定用リンクを送信",
|
||||
"not_yet": "まだですか?もう一度送信してください",
|
||||
"password_min_length": "パスワードには{count}文字を含める必要があります",
|
||||
"name_min_length": "名前には少なくとも{count}文字が必要です。",
|
||||
"prefix_min_length": "接頭辞には少なくとも{count}文字が必要です。",
|
||||
"enter_valid_tax_rate": "有効な税率を入力してください",
|
||||
"numbers_only": "数値のみ。",
|
||||
"characters_only": "文字のみ。",
|
||||
"password_incorrect": "パスワードは同一である必要があります",
|
||||
"password_length": "パスワードは{count}文字以上でなければなりません。",
|
||||
"qty_must_greater_than_zero": "数量はゼロより大きくなければなりません。",
|
||||
"price_greater_than_zero": "価格はゼロより大きくなければなりません。",
|
||||
"payment_greater_than_zero": "支払いはゼロより大きくなければなりません。",
|
||||
"payment_greater_than_due_amount": "入力された支払い額はこの請求書の支払金額を超えています。",
|
||||
"quantity_maxlength": "数量は20桁以上にしないでください。",
|
||||
"price_maxlength": "価格は20桁以上にしないでください。",
|
||||
"price_minvalue": "価格は0より大きくなければなりません。",
|
||||
"amount_maxlength": "金額は20桁以上にしないでください。",
|
||||
"amount_minvalue": "金額は0より大きくなければなりません。",
|
||||
"discount_maxlength": "割引は最大割引より大きくすることはできません",
|
||||
"description_maxlength": "説明は255文字以下にしてください。",
|
||||
"subject_maxlength": "件名は100文字以下にしてください。",
|
||||
"message_maxlength": "メッセージは255文字以下にしてください。",
|
||||
"maximum_options_error": "最大の{max}個のオプションが選択されています。別のオプションを選択するにはまず選択したオプションを削除してください。",
|
||||
"notes_maxlength": "ノートは65,000文字を超えないようにしてください。",
|
||||
"address_maxlength": "アドレスは255文字以下にしてください。",
|
||||
"ref_number_maxlength": "参照番号は255文字以下にしてください。",
|
||||
"prefix_maxlength": "接頭辞は5文字以下にしてください。",
|
||||
"something_went_wrong": "問題が発生しました",
|
||||
"number_length_minvalue": "数値の長さは0より大きくなければなりません",
|
||||
"at_least_one_ability": "少なくとも1つの権限を選択してください。",
|
||||
"valid_driver_key": "有効な{driver}キーを入力してください。",
|
||||
"valid_exchange_rate": "有効な為替レートを入力してください。",
|
||||
"company_name_not_same": "会社名は指定された名前と一致する必要があります。"
|
||||
},
|
||||
"errors": {
|
||||
"starter_plan": "This feature is available on Starter plan and onwards!",
|
||||
"invalid_provider_key": "Please Enter Valid Provider API Key.",
|
||||
"estimate_number_used": "The estimate number has already been taken.",
|
||||
"invoice_number_used": "The invoice number has already been taken.",
|
||||
"payment_attached": "This invoice already has a payment attached to it. Make sure to delete the attached payments first in order to go ahead with the removal.",
|
||||
"payment_number_used": "The payment number has already been taken.",
|
||||
"name_already_taken": "The name has already been taken.",
|
||||
"receipt_does_not_exist": "Receipt does not exist.",
|
||||
"customer_cannot_be_changed_after_payment_is_added": "Customer cannot be change after payment is added",
|
||||
"invalid_credentials": "Invalid Credentials.",
|
||||
"not_allowed": "Not Allowed",
|
||||
"login_invalid_credentials": "These credentials do not match our records.",
|
||||
"enter_valid_cron_format": "Please enter a valid cron format",
|
||||
"email_could_not_be_sent": "Email could not be sent to this email address.",
|
||||
"invalid_address": "Please enter a valid address.",
|
||||
"invalid_key": "Please enter valid key.",
|
||||
"invalid_state": "Please enter a valid state.",
|
||||
"invalid_city": "Please enter a valid city.",
|
||||
"invalid_postal_code": "Please enter a valid zip.",
|
||||
"invalid_format": "Please enter valid query string format.",
|
||||
"api_error": "Server not responding.",
|
||||
"feature_not_enabled": "Feature not enabled.",
|
||||
"request_limit_met": "Api request limit exceeded.",
|
||||
"address_incomplete": "Incomplete Address"
|
||||
"starter_plan": "この機能はスタータープラン以降で利用できます!",
|
||||
"invalid_provider_key": "有効なプロバイダーAPIキーを入力してください。",
|
||||
"estimate_number_used": "見積番号はすでに使用されています。",
|
||||
"invoice_number_used": "この請求番号はすでに使用されています。",
|
||||
"payment_attached": "この請求書にはすでに支払いが添付されています。削除を進めるには添付されている支払いを先に削除してください。",
|
||||
"payment_number_used": "支払い番号はすでに使用されています。",
|
||||
"name_already_taken": "その名前はすでに使用されています。",
|
||||
"receipt_does_not_exist": "領収書が存在しません。",
|
||||
"customer_cannot_be_changed_after_payment_is_added": "支払いが追加された後は顧客を変更することはできません",
|
||||
"invalid_credentials": "資格情報が無効です。",
|
||||
"not_allowed": "許可されていません",
|
||||
"login_invalid_credentials": "これらの資格情報はレコードと一致しません。",
|
||||
"enter_valid_cron_format": "有効なcron形式を入力してください",
|
||||
"email_could_not_be_sent": "このメールアドレスにメールを送信できませんでした。",
|
||||
"invalid_address": "有効な住所を入力してください。",
|
||||
"invalid_key": "有効なキーを入力してください。",
|
||||
"invalid_state": "有効な都道府県を入力してください。",
|
||||
"invalid_city": "有効な市区町村を入力してください。",
|
||||
"invalid_postal_code": "有効な郵便番号を入力してください。",
|
||||
"invalid_format": "有効なクエリ文字列形式を入力してください。",
|
||||
"api_error": "サーバーが応答していません。",
|
||||
"feature_not_enabled": "機能が有効になっていません。",
|
||||
"request_limit_met": "APIリクエストの制限を超えました。",
|
||||
"address_incomplete": "不完全なアドレス"
|
||||
},
|
||||
"pdf_estimate_label": "Estimate",
|
||||
"pdf_estimate_number": "Estimate Number",
|
||||
"pdf_estimate_date": "Estimate Date",
|
||||
"pdf_estimate_label": "見積り",
|
||||
"pdf_estimate_number": "見積番号",
|
||||
"pdf_estimate_date": "見積日",
|
||||
"pdf_estimate_expire_date": "Expiry date",
|
||||
"pdf_invoice_label": "Invoice",
|
||||
"pdf_invoice_number": "Invoice Number",
|
||||
"pdf_invoice_date": "Invoice Date",
|
||||
"pdf_invoice_due_date": "Due date",
|
||||
"pdf_notes": "Notes",
|
||||
"pdf_items_label": "Items",
|
||||
"pdf_quantity_label": "Quantity",
|
||||
"pdf_price_label": "Price",
|
||||
"pdf_discount_label": "Discount",
|
||||
"pdf_amount_label": "Amount",
|
||||
"pdf_subtotal": "Subtotal",
|
||||
"pdf_total": "Total",
|
||||
"pdf_payment_label": "Payment",
|
||||
"pdf_payment_receipt_label": "PAYMENT RECEIPT",
|
||||
"pdf_payment_date": "Payment Date",
|
||||
"pdf_payment_number": "Payment Number",
|
||||
"pdf_payment_mode": "Payment Mode",
|
||||
"pdf_payment_amount_received_label": "Amount Received",
|
||||
"pdf_expense_report_label": "EXPENSES REPORT",
|
||||
"pdf_total_expenses_label": "TOTAL EXPENSE",
|
||||
"pdf_profit_loss_label": "PROFIT & LOSS REPORT",
|
||||
"pdf_sales_customers_label": "Sales Customer Report",
|
||||
"pdf_sales_items_label": "Sales Item Report",
|
||||
"pdf_tax_summery_label": "Tax Summary Report",
|
||||
"pdf_income_label": "INCOME",
|
||||
"pdf_net_profit_label": "NET PROFIT",
|
||||
"pdf_customer_sales_report": "Sales Report: By Customer",
|
||||
"pdf_total_sales_label": "TOTAL SALES",
|
||||
"pdf_item_sales_label": "Sales Report: By Item",
|
||||
"pdf_tax_report_label": "TAX REPORT",
|
||||
"pdf_total_tax_label": "TOTAL TAX",
|
||||
"pdf_tax_types_label": "Tax Types",
|
||||
"pdf_invoice_label": "請求書",
|
||||
"pdf_invoice_number": "請求番号",
|
||||
"pdf_invoice_date": "請求日",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "ノート",
|
||||
"pdf_items_label": "アイテム",
|
||||
"pdf_quantity_label": "数量",
|
||||
"pdf_price_label": "価格",
|
||||
"pdf_discount_label": "割引",
|
||||
"pdf_amount_label": "量",
|
||||
"pdf_subtotal": "小計",
|
||||
"pdf_total": "合計",
|
||||
"pdf_payment_label": "支払い",
|
||||
"pdf_payment_receipt_label": "支払い領収書",
|
||||
"pdf_payment_date": "支払い日",
|
||||
"pdf_payment_number": "支払番号",
|
||||
"pdf_payment_mode": "支払い方法",
|
||||
"pdf_payment_amount_received_label": "受取金額",
|
||||
"pdf_expense_report_label": "経費報告書",
|
||||
"pdf_total_expenses_label": "総費用",
|
||||
"pdf_profit_loss_label": "損益報告書",
|
||||
"pdf_sales_customers_label": "販売顧客レポート",
|
||||
"pdf_sales_items_label": "販売品目レポート",
|
||||
"pdf_tax_summery_label": "税金概要レポート",
|
||||
"pdf_income_label": "収入",
|
||||
"pdf_net_profit_label": "純利益",
|
||||
"pdf_customer_sales_report": "売上レポート: 顧客別",
|
||||
"pdf_total_sales_label": "総売上",
|
||||
"pdf_item_sales_label": "売上レポート: 商品別",
|
||||
"pdf_tax_report_label": "税レポート",
|
||||
"pdf_total_tax_label": "合計税額",
|
||||
"pdf_tax_types_label": "税の種類",
|
||||
"pdf_expenses_label": "支出",
|
||||
"pdf_bill_to": "Bill to,",
|
||||
"pdf_ship_to": "Ship to,",
|
||||
"pdf_received_from": "Received from:",
|
||||
"pdf_tax_label": "Tax",
|
||||
"pdf_tax_id": "Tax-ID",
|
||||
"pdf_vat_id": "VAT-ID",
|
||||
"pdf_amount_paid": "Amount Paid",
|
||||
"pdf_amount_due": "Amount Due",
|
||||
"mail_thanks": "Thanks",
|
||||
"mail_view_estimate": "View Estimate",
|
||||
"mail_viewed_estimate": ":name viewed this Estimate.",
|
||||
"mail_view_invoice": "View Invoice",
|
||||
"mail_viewed_invoice": ":name viewed this Invoice.",
|
||||
"mail_view_payment": "View Payment",
|
||||
"notification_view_estimate": "[Notification] Estimate viewed",
|
||||
"notification_view_invoice": "[Notification] Invoice viewed",
|
||||
"You have received a new invoice from <b>{COMPANY_NAME}</b>.</br> Please download using the button below:": "You have received a new invoice from <b>{COMPANY_NAME}</b>.</br> Please download using the button below:"
|
||||
"pdf_bill_to": "請求先",
|
||||
"pdf_ship_to": "配送先",
|
||||
"pdf_received_from": "受信元:",
|
||||
"pdf_tax_label": "税",
|
||||
"pdf_tax_id": "税ID",
|
||||
"pdf_vat_id": "法人ID",
|
||||
"pdf_amount_paid": "支払金額",
|
||||
"pdf_amount_due": "請求金額",
|
||||
"mail_thanks": "ありがとう",
|
||||
"mail_view_estimate": "見積りを見る",
|
||||
"mail_viewed_estimate": ":name がこの見積りを閲覧しました。",
|
||||
"mail_view_invoice": "請求書を見る",
|
||||
"mail_viewed_invoice": ":name がこの請求書を閲覧しました。",
|
||||
"mail_view_payment": "支払いを表示",
|
||||
"notification_view_estimate": "[通知] 見積りを閲覧しました",
|
||||
"notification_view_invoice": "[通知] 請求書を閲覧しました",
|
||||
"You have received a new invoice from <b>{COMPANY_NAME}</b>.</br> Please download using the button below:": "<b>{COMPANY_NAME}</b>から新しい請求書を受け取りました。</br>以下のボタンを使用してダウンロードしてください。"
|
||||
}
|
||||
|
||||
28
lang/lt.json
28
lang/lt.json
@@ -101,11 +101,11 @@
|
||||
"login_successfully": "Prisijungta sėkmingai!",
|
||||
"logged_out_successfully": "Atsijungta sėkmingai",
|
||||
"mark_as_default": "Pažymėti kaip numatytąjį",
|
||||
"no_data_found": "No data found",
|
||||
"no_data_found": "Duomenų nerasta",
|
||||
"pagination": {
|
||||
"previous": "Previous",
|
||||
"next": "Next",
|
||||
"showing": "Showing",
|
||||
"previous": "Ankstesnis",
|
||||
"next": "Kitas",
|
||||
"showing": "Rodoma",
|
||||
"to": "to",
|
||||
"of": "of",
|
||||
"results": "results"
|
||||
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Mokėjimo būdai",
|
||||
"notes": "Pastabos",
|
||||
"exchange_rate": "Valiutų kursas",
|
||||
"address_information": "Address Information"
|
||||
"address_information": "Address Information",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " You can update Your Address information using form below."
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Secret",
|
||||
"ses_key": "SES Key",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "Mail Password",
|
||||
"username": "Mail Username",
|
||||
"mail_config": "Mail Configuration",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "PDF nustatymai",
|
||||
"footer_text": "Poraštės tekstas",
|
||||
"pdf_layout": "PDF Išdėstymas"
|
||||
"pdf_layout": "PDF Išdėstymas",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Company info",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Save time by creating notes and reusing them on your invoices, estimates & payments.",
|
||||
"notes": "Pastabos",
|
||||
"type": "Tipas",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Pridėti pastabą",
|
||||
"add_new_note": "Pridėti Naują Pastabą",
|
||||
"name": "Pavadinimas",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Laiko zona",
|
||||
"fiscal_year": "Finansiniai metai",
|
||||
"date_format": "Datos formatas",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Discount Setting",
|
||||
"discount_per_item": "Discount Per Item ",
|
||||
"discount_setting_description": "Enable this if you want to add Discount to individual invoice items. By default, Discount is added directly to the invoice.",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Sąskaita",
|
||||
"pdf_invoice_number": "Invoice Number",
|
||||
"pdf_invoice_date": "Invoice Date",
|
||||
"pdf_invoice_due_date": "Due date",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Pastabos",
|
||||
"pdf_items_label": "Items",
|
||||
"pdf_quantity_label": "Kiekis",
|
||||
|
||||
20
lang/lv.json
20
lang/lv.json
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Apmaksas veidi",
|
||||
"notes": "Piezīmes",
|
||||
"exchange_rate": "Exchange Rate",
|
||||
"address_information": "Address Information"
|
||||
"address_information": "Address Information",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " You can update Your Address information using form below."
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Secret",
|
||||
"ses_key": "SES Key",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "E-pasta parole",
|
||||
"username": "E-pasta lietotājvārds",
|
||||
"mail_config": "E-pasta konfigurācija",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "PDF uzstādījumi",
|
||||
"footer_text": "Kājenes teksts",
|
||||
"pdf_layout": "PDF izkārtojums"
|
||||
"pdf_layout": "PDF izkārtojums",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Uzņēmuma informācija",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Save time by creating notes and reusing them on your invoices, estimates & payments.",
|
||||
"notes": "Notes",
|
||||
"type": "Type",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Add Note",
|
||||
"add_new_note": "Add New Note",
|
||||
"name": "Name",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Laika josla",
|
||||
"fiscal_year": "Finanšu gads",
|
||||
"date_format": "Datuma formāts",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Atlaižu iestatījumi",
|
||||
"discount_per_item": "Atlaide par preci/pakalpojumu ",
|
||||
"discount_setting_description": "Iespējot šo, lai piešķirtu atlaides individuālām rēķina precēm. Pēc noklusējuma, atlaide tiek piemērota rēķinam.",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Rēķins",
|
||||
"pdf_invoice_number": "Rēķina numurs",
|
||||
"pdf_invoice_date": "Rēķina datums",
|
||||
"pdf_invoice_due_date": "Apmaksas termiņš",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Notes",
|
||||
"pdf_items_label": "Nosaukums",
|
||||
"pdf_quantity_label": "Daudzums",
|
||||
|
||||
24
lang/mk.json
24
lang/mk.json
@@ -57,7 +57,7 @@
|
||||
"fixed": "Fixed",
|
||||
"percentage": "Percentage",
|
||||
"tax": "TAX",
|
||||
"total_amount": "TOTAL AMOUNT",
|
||||
"total_amount": "Вкупен износ",
|
||||
"bill_to": "Bill to",
|
||||
"ship_to": "Ship to",
|
||||
"due": "Due",
|
||||
@@ -111,7 +111,7 @@
|
||||
"results": "results"
|
||||
},
|
||||
"file_upload": {
|
||||
"drag_a_file": "Drag a file here or",
|
||||
"drag_a_file": "Повлечете го фаилот овде или",
|
||||
"browse": "browse",
|
||||
"to_choose": "to choose a file"
|
||||
},
|
||||
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Payment Modes",
|
||||
"notes": "Notes",
|
||||
"exchange_rate": "Exchange Rate",
|
||||
"address_information": "Address Information"
|
||||
"address_information": "Address Information",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " You can update Your Address information using form below."
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Secret",
|
||||
"ses_key": "SES Key",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "Mail Password",
|
||||
"username": "Mail Username",
|
||||
"mail_config": "Mail Configuration",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "PDF Setting",
|
||||
"footer_text": "Footer Text",
|
||||
"pdf_layout": "PDF Layout"
|
||||
"pdf_layout": "PDF Layout",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Company info",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Save time by creating notes and reusing them on your invoices, estimates & payments.",
|
||||
"notes": "Notes",
|
||||
"type": "Type",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Add Note",
|
||||
"add_new_note": "Add New Note",
|
||||
"name": "Name",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Time Zone",
|
||||
"fiscal_year": "Financial Year",
|
||||
"date_format": "Date Format",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Discount Setting",
|
||||
"discount_per_item": "Discount Per Item ",
|
||||
"discount_setting_description": "Enable this if you want to add Discount to individual invoice items. By default, Discount is added directly to the invoice.",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Invoice",
|
||||
"pdf_invoice_number": "Invoice Number",
|
||||
"pdf_invoice_date": "Invoice Date",
|
||||
"pdf_invoice_due_date": "Due date",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Notes",
|
||||
"pdf_items_label": "Items",
|
||||
"pdf_quantity_label": "Quantity",
|
||||
|
||||
20
lang/nl.json
20
lang/nl.json
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Betaalmethodes",
|
||||
"notes": "Opmerkingen",
|
||||
"exchange_rate": "Wisselkoers",
|
||||
"address_information": "Adresgegevens"
|
||||
"address_information": "Adresgegevens",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " U kunt uw adresgegevens bijwerken via het onderstaande formulier."
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun-eindpunt",
|
||||
"ses_secret": "SES geheim",
|
||||
"ses_key": "SES-sleutel",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "E-mail wachtwoord",
|
||||
"username": "E-mail gebruikersnaam",
|
||||
"mail_config": "E-mailconfiguratie",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "PDF-instelling",
|
||||
"footer_text": "Voettekst",
|
||||
"pdf_layout": "PDF indeling"
|
||||
"pdf_layout": "PDF indeling",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Bedrijfsinfo",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Bespaar tijd door notities te maken en ze opnieuw te gebruiken op uw facturen, ramingen en betalingen.",
|
||||
"notes": "Opmerkingen",
|
||||
"type": "Type",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Notitie toevoegen",
|
||||
"add_new_note": "Voeg een nieuwe notitie toe",
|
||||
"name": "Naam",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Tijdzone",
|
||||
"fiscal_year": "Financieel jaar",
|
||||
"date_format": "Datumnotatie",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Kortingsinstelling",
|
||||
"discount_per_item": "Korting per item",
|
||||
"discount_setting_description": "Schakel dit in als u korting wilt toevoegen aan afzonderlijke factuuritems. Standaard wordt korting rechtstreeks aan de factuur toegevoegd.",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Factuur",
|
||||
"pdf_invoice_number": "Factuurnummer",
|
||||
"pdf_invoice_date": "Factuur datum",
|
||||
"pdf_invoice_due_date": "Vervaldatum",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Opmerkingen",
|
||||
"pdf_items_label": "Artikelen",
|
||||
"pdf_quantity_label": "Aantal stuks",
|
||||
|
||||
30
lang/pl.json
30
lang/pl.json
@@ -191,7 +191,7 @@
|
||||
"customers": {
|
||||
"title": "Klienci",
|
||||
"prefix": "Przedrostek",
|
||||
"tax_id": "Tax ID",
|
||||
"tax_id": "NIP",
|
||||
"add_customer": "Dodaj klienta",
|
||||
"contacts_list": "Lista klientów",
|
||||
"name": "Nazwa",
|
||||
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Rodzaje płatności",
|
||||
"notes": "Notatki",
|
||||
"exchange_rate": "Kurs wymiany",
|
||||
"address_information": "Informacje Adresowe"
|
||||
"address_information": "Informacje Adresowe",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " Możesz zaktualizować informacje o adresie za pomocą poniższego formularza."
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Punkt dostępowy Mailgun",
|
||||
"ses_secret": "Tajny klucz SES",
|
||||
"ses_key": "Klucz SES",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "Hasło poczty",
|
||||
"username": "Nazwa użytkownika poczty",
|
||||
"mail_config": "Konfiguracja poczty",
|
||||
@@ -904,13 +906,21 @@
|
||||
"pdf": {
|
||||
"title": "Ustawienia PDF",
|
||||
"footer_text": "Teks stopki",
|
||||
"pdf_layout": "Szablon PDF"
|
||||
"pdf_layout": "Szablon PDF",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Dane firmy",
|
||||
"company_name": "Nazwa firmy",
|
||||
"tax_id": "Tax Identification Number",
|
||||
"vat_id": "VAT Identification Number",
|
||||
"tax_id": "Numer identyfikacyjny VAT",
|
||||
"vat_id": "Numer identyfikacyjny VAT",
|
||||
"company_logo": "Logo firmy",
|
||||
"section_description": "Informacje o Twojej firmie, które będą wyświetlane na fakturach, ofertach i innych dokumentach stworzonych przez InvoiceShelf.",
|
||||
"phone": "Telefon",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Oszczędzaj czas, tworząc notatki i ponownie używając ich na fakturach, ofertach i płatnościach.",
|
||||
"notes": "Notatki",
|
||||
"type": "Typ",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Dodaj notatkę",
|
||||
"add_new_note": "Dodaj nową notatkę",
|
||||
"name": "Nazwa",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Strefa czasowa",
|
||||
"fiscal_year": "Rok finansowy",
|
||||
"date_format": "Format daty",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Ustawienia rabatu",
|
||||
"discount_per_item": "Rabat na produkt ",
|
||||
"discount_setting_description": "Włącz to, jeśli chcesz dodać rabat do poszczególnych elementów faktury. Domyślnie rabat jest dodawany bezpośrednio do całej faktury.",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Faktura",
|
||||
"pdf_invoice_number": "Numer faktury",
|
||||
"pdf_invoice_date": "Data faktury",
|
||||
"pdf_invoice_due_date": "Termin",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Notatki",
|
||||
"pdf_items_label": "Pozycje",
|
||||
"pdf_quantity_label": "Ilość",
|
||||
@@ -1622,8 +1634,8 @@
|
||||
"pdf_ship_to": "Wysyłka do",
|
||||
"pdf_received_from": "Otrzymane od:",
|
||||
"pdf_tax_label": "Podatek",
|
||||
"pdf_tax_id": "Tax-ID",
|
||||
"pdf_vat_id": "VAT-ID",
|
||||
"pdf_tax_id": "NIP",
|
||||
"pdf_vat_id": "NIP",
|
||||
"pdf_amount_paid": "Amount Paid",
|
||||
"pdf_amount_due": "Amount Due",
|
||||
"mail_thanks": "Thanks",
|
||||
|
||||
@@ -571,6 +571,7 @@
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Segredo",
|
||||
"ses_key": "SES Chave",
|
||||
"ses_region": "Região AWS",
|
||||
"password": "Senha do Email",
|
||||
"username": "Nome de Usuário do Email",
|
||||
"mail_config": "Configuração de Email",
|
||||
|
||||
723
lang/pt.json
723
lang/pt.json
File diff suppressed because it is too large
Load Diff
24
lang/ro.json
24
lang/ro.json
@@ -12,7 +12,7 @@
|
||||
"settings": "Setări",
|
||||
"logout": "Deconectare",
|
||||
"users": "Utilizatori",
|
||||
"modules": "Modules"
|
||||
"modules": "Module"
|
||||
},
|
||||
"general": {
|
||||
"add_company": "Adaugă firmă",
|
||||
@@ -317,7 +317,7 @@
|
||||
"notes": "Notes",
|
||||
"tax": "Tax",
|
||||
"estimate_template": "Template",
|
||||
"convert_to_invoice": "Convert to Invoice",
|
||||
"convert_to_invoice": "Convertește în Invoice",
|
||||
"mark_as_sent": "Mark as Sent",
|
||||
"send_estimate": "Send Estimate",
|
||||
"resend_estimate": "Resend Estimate",
|
||||
@@ -852,7 +852,8 @@
|
||||
"payment_modes": "Payment Modes",
|
||||
"notes": "Notes",
|
||||
"exchange_rate": "Exchange Rate",
|
||||
"address_information": "Address Information"
|
||||
"address_information": "Address Information",
|
||||
"pdf_generation": "PDF Generation"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " You can update Your Address information using form below."
|
||||
@@ -893,6 +894,7 @@
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Secret",
|
||||
"ses_key": "SES Key",
|
||||
"ses_region": "AWS Region",
|
||||
"password": "Mail Password",
|
||||
"username": "Mail Username",
|
||||
"mail_config": "Mail Configuration",
|
||||
@@ -904,7 +906,15 @@
|
||||
"pdf": {
|
||||
"title": "PDF Setting",
|
||||
"footer_text": "Footer Text",
|
||||
"pdf_layout": "PDF Layout"
|
||||
"pdf_layout": "PDF Layout",
|
||||
"pdf_configuration": "PDF Generation Settings",
|
||||
"section_description": "Change the way PDFs are generated",
|
||||
"driver": "PDF Driver to use",
|
||||
"papersize": "Papersize",
|
||||
"papersize_hint": "Papersize in width and height (ex. \"210mm 297mm\")",
|
||||
"gotenberg_host": "Gotenberg service host",
|
||||
"pdf_variables_save_successfully": "PDF configuration saved successfully",
|
||||
"pdf_variables_save_error": "PDF configuration could not be saved"
|
||||
},
|
||||
"company_info": {
|
||||
"company_info": "Company info",
|
||||
@@ -1087,6 +1097,8 @@
|
||||
"description": "Save time by creating notes and reusing them on your invoices, estimates & payments.",
|
||||
"notes": "Notes",
|
||||
"type": "Type",
|
||||
"is_default": "Select by default",
|
||||
"is_default_description": "This note will be selected by default in new invoices.",
|
||||
"add_note": "Add Note",
|
||||
"add_new_note": "Add New Note",
|
||||
"name": "Name",
|
||||
@@ -1236,7 +1248,7 @@
|
||||
"time_zone": "Time Zone",
|
||||
"fiscal_year": "Financial Year",
|
||||
"date_format": "Date Format",
|
||||
"time_format": "Time Fromat",
|
||||
"time_format": "Time Format",
|
||||
"discount_setting": "Discount Setting",
|
||||
"discount_per_item": "Discount Per Item ",
|
||||
"discount_setting_description": "Enable this if you want to add Discount to individual invoice items. By default, Discount is added directly to the invoice.",
|
||||
@@ -1588,7 +1600,7 @@
|
||||
"pdf_invoice_label": "Invoice",
|
||||
"pdf_invoice_number": "Invoice Number",
|
||||
"pdf_invoice_date": "Invoice Date",
|
||||
"pdf_invoice_due_date": "Due date",
|
||||
"pdf_invoice_due_date": "Due Date",
|
||||
"pdf_notes": "Notes",
|
||||
"pdf_items_label": "Items",
|
||||
"pdf_quantity_label": "Quantity",
|
||||
|
||||
1084
lang/ru.json
1084
lang/ru.json
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user