Compare commits

..

41 Commits

Author SHA1 Message Date
948c71f365 fix indentation on dashboard chart 2023-03-28 15:24:10 +05:30
3710ba74e5 add dark mode in dashboard stats & chart 2023-03-21 15:52:29 +05:30
15f3f566e3 Dark sidebar header (#1156)
* add dark mode in sidebar and header

* add dark theme in blade file
2023-03-20 15:50:27 +05:30
98196194e2 Merge branch 'master' of https://github.com/bytefury/crater 2022-12-13 11:38:49 +05:30
7447cc24f9 feat: uffizzi integration (#1091)
Co-authored-by: Aramayis <>
2022-11-21 18:35:59 +05:30
889d22d92c Update php version (#1083)
Version 7.4 no longer works when running docker-compose/setup.sh. Updated to 8.1 in Dockerfile. Issue is now resolved and Crater sets up as expected without version conflicts.
2022-11-03 19:29:16 +05:30
bc8f2cd484 fix tax issue (#953)
* fix tax issue

* remove console log

* update cs fixer package
2022-10-26 19:51:36 +05:30
4e47f58bad fixed - No query results for model [Crater\Models\Currency] (#1070)
* fixed report pdf issue

* Removed telescope service provider file
2022-10-26 19:33:25 +05:30
d8c429912e fix composer issue with pest 2022-10-17 13:04:27 +05:30
df04fd9e53 Merge branch 'master' of https://github.com/bytefury/crater 2022-10-17 12:48:24 +05:30
0aaf0e7e75 Adding object-fit rules so thumbnail image does not appear stretched. (#1065) 2022-10-13 23:44:39 +05:30
3d0b89bb4d bug: fix missing hyphen in setup.sh (#1067)
Co-authored-by: Aramayis <>
2022-10-13 23:40:07 +05:30
38c4b9ebce Patch setup.sh script to deploy without plugins error. (#1034) 2022-09-13 14:52:51 +05:30
7be59e78e0 Formatting + Netherlands rename (#973)
* Formatting + Netherlands rename

* Revert change
2022-07-09 20:03:08 +05:30
189c51cdf4 Merge branch 'master' of https://github.com/bytefury/crater 2022-06-15 20:39:16 +05:30
204483836a 🌐Update: support Thai language (#768)
* add thai language config

* update thai translation

* update thai translation

* add THSarabunNew fonts to using in pdf

* update: pdf file to support thai language by checking isLocale('th') and include thai font-family

* update: thai translation

* remove the index.php file (not used)

* move THSarabunNew fonts to resoureces/static/fonts

* Add .gitkeep to storage/fonts to pre-build the fonts directory

Co-authored-by: Ritthikrai (Champ) Wiengchai <ritthikrai.w@aware.co.th>
2022-06-15 18:17:36 +05:30
33bc9ded65 Bump guzzlehttp/guzzle from 7.4.1 to 7.4.3 (#936)
Bumps [guzzlehttp/guzzle](https://github.com/guzzle/guzzle) from 7.4.1 to 7.4.3.
- [Release notes](https://github.com/guzzle/guzzle/releases)
- [Changelog](https://github.com/guzzle/guzzle/blob/master/CHANGELOG.md)
- [Commits](https://github.com/guzzle/guzzle/compare/7.4.1...7.4.3)

---
updated-dependencies:
- dependency-name: guzzlehttp/guzzle
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-05 14:10:27 +05:30
4271ef451e Php 8 compliant (#914) 2022-06-05 14:09:42 +05:30
6eb44fba93 Update cron.dockerfile (#949) 2022-06-05 14:09:11 +05:30
96e7300583 Make unit clearable (#918) 2022-05-28 11:55:09 +05:30
a479d966d1 Update en.json (#925)
Corrected sentence case from "Expiry date" to "Expiry Date"
2022-05-28 11:54:32 +05:30
bd5f0fe5cf Merge branch 'v-calendar' into 'master'
apply v-calendar

See merge request mohit.panjvani/crater-web!1468
2022-04-01 10:24:57 +00:00
787619b907 add v-calendar 2022-04-01 10:24:56 +00:00
fd70ab9a99 Merge branch 'fix-expense-receipt-delete-issue' into 'master'
Fix expense receipt delete issue while update

See merge request mohit.panjvani/crater-web!1477
2022-04-01 10:24:20 +00:00
33315638df Fix expense receipt delete issue while update 2022-04-01 15:51:12 +05:30
bba14bf51a Merge branch 'master' 2022-04-01 12:04:06 +05:30
ea41989034 Merge branch 'fix-expense-receipt-issue' into 'master'
fix expense receipt issue

See merge request mohit.panjvani/crater-web!1473
2022-03-30 09:02:56 +00:00
3f3f83a00a fix expense receipt issue 2022-03-30 09:02:56 +00:00
adc5962071 Merge branch 'fix-invoice-status-issue' into 'master'
Fix invoice status issue

See merge request mohit.panjvani/crater-web!1470
2022-03-30 07:38:38 +00:00
c4c00002d7 Fix invoice status issue 2022-03-30 07:38:38 +00:00
a7c1e12db6 Merge branch 'new-custom-fields' into 'master'
added "Due Amount, Total Amount and PDF Link" new custom fields

See merge request mohit.panjvani/crater-web!1464
2022-03-30 07:35:53 +00:00
32949d1eec added "Due Amount, Total Amount and PDF Link" new custom fields 2022-03-30 07:35:53 +00:00
7718f77f3d Merge branch 'master' of https://github.com/bytefury/crater 2022-03-29 13:16:03 +05:30
a9e54981bf Merge branch 'fix-minor-issues' into 'master'
Fix minor issues

See merge request mohit.panjvani/crater-web!1469
2022-03-21 06:45:14 +00:00
ef35293f8a update company slug help text 2022-03-21 12:13:05 +05:30
5c63770b6b added unique validation and help text for company slug field 2022-03-21 12:04:17 +05:30
d130e20c92 Merge branch 'fix-default-custom-value' into 'master'
fixed "Custom fields always set to default value"

See merge request mohit.panjvani/crater-web!1471
2022-03-16 06:04:21 +00:00
586fb1ae10 fixed "Custom fields always set to default value" 2022-03-16 11:28:08 +05:30
20c2502e31 added company slug 2022-03-14 17:45:58 +05:30
0e31f85c18 change company currency if it does not have any transaction. 2022-03-14 12:55:38 +05:30
e7301eb7a3 Fix minor issues 2022-03-14 11:54:13 +05:30
121 changed files with 8610 additions and 10018 deletions

162
.github/workflows/uffizzi-build.yml vendored Normal file
View File

@ -0,0 +1,162 @@
name: Build PR Image
on:
pull_request:
types: [opened,synchronize,reopened,closed]
jobs:
build-application:
name: Build and Push `application`
runs-on: ubuntu-latest
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
outputs:
tags: ${{ steps.meta.outputs.tags }}
steps:
- name: Checkout git repo
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Generate UUID image name
id: uuid
run: echo "UUID_TAG_APP=$(uuidgen)" >> $GITHUB_ENV
- name: Docker metadata
id: meta
uses: docker/metadata-action@v3
with:
images: registry.uffizzi.com/${{ env.UUID_TAG_APP }}
tags: type=raw,value=60d
- name: Build and Push Image to registry.uffizzi.com ephemeral registry
uses: docker/build-push-action@v2
with:
push: true
context: ./
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
file: ./uffizzi/Dockerfile
cache-from: type=gha
cache-to: type=gha,mode=max
build-nginx:
name: Build and Push `nginx`
runs-on: ubuntu-latest
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
outputs:
tags: ${{ steps.meta.outputs.tags }}
steps:
- name: Checkout git repo
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Generate UUID image name
id: uuid
run: echo "UUID_TAG_NGINX=$(uuidgen)" >> $GITHUB_ENV
- name: Docker metadata
id: meta
uses: docker/metadata-action@v3
with:
images: registry.uffizzi.com/${{ env.UUID_TAG_NGINX }}
tags: type=raw,value=60d
- name: Build and Push Image to Uffizzi ephemeral registry
uses: docker/build-push-action@v2
with:
push: true
context: ./
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
file: ./uffizzi/nginx/Dockerfile
cache-from: type=gha
cache-to: type=gha,mode=max
build-crond:
name: Build and Push `crond`
runs-on: ubuntu-latest
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
outputs:
tags: ${{ steps.meta.outputs.tags }}
steps:
- name: Checkout git repo
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Generate UUID image name
id: uuid
run: echo "UUID_TAG_CROND=$(uuidgen)" >> $GITHUB_ENV
- name: Docker metadata
id: meta
uses: docker/metadata-action@v3
with:
images: registry.uffizzi.com/${{ env.UUID_TAG_CROND }}
tags: type=raw,value=60d
- name: Build and Push Image to registry.uffizzi.com ephemeral registry
uses: docker/build-push-action@v2
with:
push: true
context: ./
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
file: ./uffizzi/crond/Dockerfile
cache-from: type=gha
cache-to: type=gha,mode=max
render-compose-file:
name: Render Docker Compose File
# Pass output of this workflow to another triggered by `workflow_run` event.
runs-on: ubuntu-latest
outputs:
compose-file-cache-key: ${{ steps.hash.outputs.hash }}
needs:
- build-application
- build-nginx
- build-crond
steps:
- name: Checkout git repo
uses: actions/checkout@v3
- name: Render Compose File
run: |
APP_IMAGE=$(echo ${{ needs.build-application.outputs.tags }})
export APP_IMAGE
NGINX_IMAGE=$(echo ${{ needs.build-nginx.outputs.tags }})
export NGINX_IMAGE
CROND_IMAGE=$(echo ${{ needs.build-crond.outputs.tags }})
export CROND_IMAGE
# Render simple template from environment variables.
envsubst < ./uffizzi/docker-compose.uffizzi.yml > docker-compose.rendered.yml
cat docker-compose.rendered.yml
- name: Upload Rendered Compose File as Artifact
uses: actions/upload-artifact@v3
with:
name: preview-spec
path: docker-compose.rendered.yml
retention-days: 2
- name: Serialize PR Event to File
run: |
cat << EOF > event.json
${{ toJSON(github.event) }}
EOF
- name: Upload PR Event as Artifact
uses: actions/upload-artifact@v3
with:
name: preview-spec
path: event.json
retention-days: 2
delete-preview:
name: Call for Preview Deletion
runs-on: ubuntu-latest
if: ${{ github.event.action == 'closed' }}
steps:
# If this PR is closing, we will not render a compose file nor pass it to the next workflow.
- name: Serialize PR Event to File
run: echo '${{ toJSON(github.event) }}' > event.json
- name: Upload PR Event as Artifact
uses: actions/upload-artifact@v3
with:
name: preview-spec
path: event.json
retention-days: 2

84
.github/workflows/uffizzi-preview.yml vendored Normal file
View File

@ -0,0 +1,84 @@
name: Deploy Uffizzi Preview
on:
workflow_run:
workflows:
- "Build PR Image"
types:
- completed
jobs:
cache-compose-file:
name: Cache Compose File
runs-on: ubuntu-latest
outputs:
compose-file-cache-key: ${{ env.COMPOSE_FILE_HASH }}
pr-number: ${{ env.PR_NUMBER }}
steps:
- name: 'Download artifacts'
# Fetch output (zip archive) from the workflow run that triggered this workflow.
uses: actions/github-script@v6
with:
script: |
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.payload.workflow_run.id,
});
let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
return artifact.name == "preview-spec"
})[0];
let download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: matchArtifact.id,
archive_format: 'zip',
});
let fs = require('fs');
fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/preview-spec.zip`, Buffer.from(download.data));
- name: 'Unzip artifact'
run: unzip preview-spec.zip
- name: Read Event into ENV
run: |
echo 'EVENT_JSON<<EOF' >> $GITHUB_ENV
cat event.json >> $GITHUB_ENV
echo 'EOF' >> $GITHUB_ENV
- name: Hash Rendered Compose File
id: hash
# If the previous workflow was triggered by a PR close event, we will not have a compose file artifact.
if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }}
run: echo "COMPOSE_FILE_HASH=$(md5sum docker-compose.rendered.yml | awk '{ print $1 }')" >> $GITHUB_ENV
- name: Cache Rendered Compose File
if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }}
uses: actions/cache@v3
with:
path: docker-compose.rendered.yml
key: ${{ env.COMPOSE_FILE_HASH }}
- name: Read PR Number From Event Object
id: pr
run: echo "PR_NUMBER=${{ fromJSON(env.EVENT_JSON).number }}" >> $GITHUB_ENV
- name: DEBUG - Print Job Outputs
if: ${{ runner.debug }}
run: |
echo "PR number: ${{ env.PR_NUMBER }}"
echo "Compose file hash: ${{ env.COMPOSE_FILE_HASH }}"
cat event.json
deploy-uffizzi-preview:
name: Use Remote Workflow to Preview on Uffizzi
needs:
- cache-compose-file
uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2.6.1
with:
# If this workflow was triggered by a PR close event, cache-key will be an empty string
# and this reusable workflow will delete the preview deployment.
compose-file-cache-key: ${{ needs.cache-compose-file.outputs.compose-file-cache-key }}
compose-file-cache-path: docker-compose.rendered.yml
server: https://app.uffizzi.com/
pr-number: ${{ needs.cache-compose-file.outputs.pr-number }}
permissions:
contents: read
pull-requests: write
id-token: write

1
.gitignore vendored
View File

@ -16,3 +16,4 @@ Homestead.yaml
.gitkeep .gitkeep
/public/docs /public/docs
/.scribe /.scribe
!storage/fonts/.gitkeep

View File

@ -1,4 +1,4 @@
FROM php:7.4-fpm FROM php:8.1-fpm
# Arguments defined in docker-compose.yml # Arguments defined in docker-compose.yml
ARG user ARG user

View File

@ -103,6 +103,7 @@ class CustomerStatsController extends Controller
) )
->whereCompany() ->whereCompany()
->whereCustomer($customer->id) ->whereCustomer($customer->id)
->where('status', '<>', Invoice::STATUS_DRAFT)
->sum('total'); ->sum('total');
$totalReceipts = Payment::whereBetween( $totalReceipts = Payment::whereBetween(
'payment_date', 'payment_date',

View File

@ -104,6 +104,7 @@ class DashboardController extends Controller
'invoice_date', 'invoice_date',
[$startDate->format('Y-m-d'), $start->format('Y-m-d')] [$startDate->format('Y-m-d'), $start->format('Y-m-d')]
) )
->where('status', '<>', Invoice::STATUS_DRAFT)
->whereCompany() ->whereCompany()
->sum('base_total'); ->sum('base_total');
@ -141,6 +142,7 @@ class DashboardController extends Controller
$recent_due_invoices = Invoice::with('customer') $recent_due_invoices = Invoice::with('customer')
->whereCompany() ->whereCompany()
->where('base_due_amount', '>', 0) ->where('base_due_amount', '>', 0)
->where('status', '<>', Invoice::STATUS_DRAFT)
->take(5) ->take(5)
->latest() ->latest()
->get(); ->get();

View File

@ -24,6 +24,7 @@ class InvoicesController extends Controller
$limit = $request->has('limit') ? $request->limit : 10; $limit = $request->has('limit') ? $request->limit : 10;
$invoices = Invoice::whereCompany() $invoices = Invoice::whereCompany()
->whereTabFilters($request->tab_status)
->join('customers', 'customers.id', '=', 'invoices.customer_id') ->join('customers', 'customers.id', '=', 'invoices.customer_id')
->applyFilters($request->all()) ->applyFilters($request->all())
->select('invoices.*', 'customers.name') ->select('invoices.*', 'customers.name')

View File

@ -2,24 +2,25 @@
namespace Crater\Http\Controllers\V1\Admin\Report; namespace Crater\Http\Controllers\V1\Admin\Report;
use PDF;
use Carbon\Carbon; use Carbon\Carbon;
use Crater\Http\Controllers\Controller;
use Crater\Models\Company; use Crater\Models\Company;
use Crater\Models\CompanySetting; use Crater\Models\Currency;
use Crater\Models\Customer; use Crater\Models\Customer;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Crater\Models\CompanySetting;
use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\App;
use PDF; use Crater\Http\Controllers\Controller;
class CustomerSalesReportController extends Controller class CustomerSalesReportController extends Controller
{ {
/** /**
* Handle the incoming request. * Handle the incoming request.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
* @param string $hash * @param string $hash
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
*/ */
public function __invoke(Request $request, $hash) public function __invoke(Request $request, $hash)
{ {
$company = Company::where('unique_hash', $hash)->first(); $company = Company::where('unique_hash', $hash)->first();
@ -56,6 +57,7 @@ class CustomerSalesReportController extends Controller
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat); $from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat); $to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
$colors = [ $colors = [
'primary_text_color', 'primary_text_color',
@ -80,6 +82,7 @@ class CustomerSalesReportController extends Controller
'company' => $company, 'company' => $company,
'from_date' => $from_date, 'from_date' => $from_date,
'to_date' => $to_date, 'to_date' => $to_date,
'currency' => $currency,
]); ]);
$pdf = PDF::loadView('app.pdf.reports.sales-customers'); $pdf = PDF::loadView('app.pdf.reports.sales-customers');

View File

@ -2,24 +2,25 @@
namespace Crater\Http\Controllers\V1\Admin\Report; namespace Crater\Http\Controllers\V1\Admin\Report;
use Carbon\Carbon;
use Crater\Http\Controllers\Controller;
use Crater\Models\Company;
use Crater\Models\CompanySetting;
use Crater\Models\Expense;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use PDF; use PDF;
use Carbon\Carbon;
use Crater\Models\Company;
use Crater\Models\Expense;
use Crater\Models\Currency;
use Illuminate\Http\Request;
use Crater\Models\CompanySetting;
use Illuminate\Support\Facades\App;
use Crater\Http\Controllers\Controller;
class ExpensesReportController extends Controller class ExpensesReportController extends Controller
{ {
/** /**
* Handle the incoming request. * Handle the incoming request.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
* @param string $hash * @param string $hash
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
*/ */
public function __invoke(Request $request, $hash) public function __invoke(Request $request, $hash)
{ {
$company = Company::where('unique_hash', $hash)->first(); $company = Company::where('unique_hash', $hash)->first();
@ -43,6 +44,7 @@ class ExpensesReportController extends Controller
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat); $from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat); $to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
$colors = [ $colors = [
'primary_text_color', 'primary_text_color',
@ -66,6 +68,7 @@ class ExpensesReportController extends Controller
'company' => $company, 'company' => $company,
'from_date' => $from_date, 'from_date' => $from_date,
'to_date' => $to_date, 'to_date' => $to_date,
'currency' => $currency,
]); ]);
$pdf = PDF::loadView('app.pdf.reports.expenses'); $pdf = PDF::loadView('app.pdf.reports.expenses');

View File

@ -2,24 +2,25 @@
namespace Crater\Http\Controllers\V1\Admin\Report; namespace Crater\Http\Controllers\V1\Admin\Report;
use Carbon\Carbon;
use Crater\Http\Controllers\Controller;
use Crater\Models\Company;
use Crater\Models\CompanySetting;
use Crater\Models\InvoiceItem;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use PDF; use PDF;
use Carbon\Carbon;
use Crater\Models\Company;
use Crater\Models\Currency;
use Illuminate\Http\Request;
use Crater\Models\InvoiceItem;
use Crater\Models\CompanySetting;
use Illuminate\Support\Facades\App;
use Crater\Http\Controllers\Controller;
class ItemSalesReportController extends Controller class ItemSalesReportController extends Controller
{ {
/** /**
* Handle the incoming request. * Handle the incoming request.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
* @param string $hash * @param string $hash
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
*/ */
public function __invoke(Request $request, $hash) public function __invoke(Request $request, $hash)
{ {
$company = Company::where('unique_hash', $hash)->first(); $company = Company::where('unique_hash', $hash)->first();
@ -43,6 +44,7 @@ class ItemSalesReportController extends Controller
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat); $from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat); $to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
$colors = [ $colors = [
'primary_text_color', 'primary_text_color',
@ -66,6 +68,7 @@ class ItemSalesReportController extends Controller
'company' => $company, 'company' => $company,
'from_date' => $from_date, 'from_date' => $from_date,
'to_date' => $to_date, 'to_date' => $to_date,
'currency' => $currency,
]); ]);
$pdf = PDF::loadView('app.pdf.reports.sales-items'); $pdf = PDF::loadView('app.pdf.reports.sales-items');

View File

@ -2,25 +2,26 @@
namespace Crater\Http\Controllers\V1\Admin\Report; namespace Crater\Http\Controllers\V1\Admin\Report;
use PDF;
use Carbon\Carbon; use Carbon\Carbon;
use Crater\Http\Controllers\Controller;
use Crater\Models\Company; use Crater\Models\Company;
use Crater\Models\CompanySetting;
use Crater\Models\Expense; use Crater\Models\Expense;
use Crater\Models\Payment; use Crater\Models\Payment;
use Crater\Models\Currency;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Crater\Models\CompanySetting;
use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\App;
use PDF; use Crater\Http\Controllers\Controller;
class ProfitLossReportController extends Controller class ProfitLossReportController extends Controller
{ {
/** /**
* Handle the incoming request. * Handle the incoming request.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
* @param string $hash * @param string $hash
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
*/ */
public function __invoke(Request $request, $hash) public function __invoke(Request $request, $hash)
{ {
$company = Company::where('unique_hash', $hash)->first(); $company = Company::where('unique_hash', $hash)->first();
@ -49,6 +50,8 @@ class ProfitLossReportController extends Controller
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat); $from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat); $to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
$colors = [ $colors = [
'primary_text_color', 'primary_text_color',
@ -74,6 +77,7 @@ class ProfitLossReportController extends Controller
'company' => $company, 'company' => $company,
'from_date' => $from_date, 'from_date' => $from_date,
'to_date' => $to_date, 'to_date' => $to_date,
'currency' => $currency,
]); ]);
$pdf = PDF::loadView('app.pdf.reports.profit-loss'); $pdf = PDF::loadView('app.pdf.reports.profit-loss');

View File

@ -2,24 +2,25 @@
namespace Crater\Http\Controllers\V1\Admin\Report; namespace Crater\Http\Controllers\V1\Admin\Report;
use Carbon\Carbon;
use Crater\Http\Controllers\Controller;
use Crater\Models\Company;
use Crater\Models\CompanySetting;
use Crater\Models\Tax;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use PDF; use PDF;
use Carbon\Carbon;
use Crater\Models\Tax;
use Crater\Models\Company;
use Crater\Models\Currency;
use Illuminate\Http\Request;
use Crater\Models\CompanySetting;
use Illuminate\Support\Facades\App;
use Crater\Http\Controllers\Controller;
class TaxSummaryReportController extends Controller class TaxSummaryReportController extends Controller
{ {
/** /**
* Handle the incoming request. * Handle the incoming request.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
* @param string $hash * @param string $hash
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
*/ */
public function __invoke(Request $request, $hash) public function __invoke(Request $request, $hash)
{ {
$company = Company::where('unique_hash', $hash)->first(); $company = Company::where('unique_hash', $hash)->first();
@ -44,6 +45,8 @@ class TaxSummaryReportController extends Controller
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat); $from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat); $to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
$colors = [ $colors = [
'primary_text_color', 'primary_text_color',
@ -68,6 +71,7 @@ class TaxSummaryReportController extends Controller
'company' => $company, 'company' => $company,
'from_date' => $from_date, 'from_date' => $from_date,
'to_date' => $to_date, 'to_date' => $to_date,
'currency' => $currency,
]); ]);
$pdf = PDF::loadView('app.pdf.reports.tax-summary'); $pdf = PDF::loadView('app.pdf.reports.tax-summary');

View File

@ -3,7 +3,6 @@
namespace Crater\Http\Requests; namespace Crater\Http\Requests;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Str;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
class CompaniesRequest extends FormRequest class CompaniesRequest extends FormRequest
@ -34,6 +33,10 @@ class CompaniesRequest extends FormRequest
'currency' => [ 'currency' => [
'required' 'required'
], ],
'slug' => [
'required',
Rule::unique('companies')
],
'address.name' => [ 'address.name' => [
'nullable', 'nullable',
], ],
@ -68,11 +71,11 @@ class CompaniesRequest extends FormRequest
{ {
return collect($this->validated()) return collect($this->validated())
->only([ ->only([
'name' 'name',
'slug'
]) ])
->merge([ ->merge([
'owner_id' => $this->user()->id, 'owner_id' => $this->user()->id
'slug' => Str::slug($this->name)
]) ])
->toArray(); ->toArray();
} }

View File

@ -30,7 +30,8 @@ class CompanyRequest extends FormRequest
Rule::unique('companies')->ignore($this->header('company'), 'id'), Rule::unique('companies')->ignore($this->header('company'), 'id'),
], ],
'slug' => [ 'slug' => [
'nullable' 'required',
Rule::unique('companies')->ignore($this->header('company'), 'id'),
], ],
'address.country_id' => [ 'address.country_id' => [
'required', 'required',

View File

@ -23,7 +23,7 @@ class EstimateResource extends JsonResource
'reference_number' => $this->reference_number, 'reference_number' => $this->reference_number,
'tax_per_item' => $this->tax_per_item, 'tax_per_item' => $this->tax_per_item,
'discount_per_item' => $this->discount_per_item, 'discount_per_item' => $this->discount_per_item,
'notes' => $this->getNotes(), 'notes' => $this->notes,
'discount' => $this->discount, 'discount' => $this->discount,
'discount_type' => $this->discount_type, 'discount_type' => $this->discount_type,
'discount_val' => $this->discount_val, 'discount_val' => $this->discount_val,

View File

@ -18,7 +18,7 @@ class PaymentResource extends JsonResource
'id' => $this->id, 'id' => $this->id,
'payment_number' => $this->payment_number, 'payment_number' => $this->payment_number,
'payment_date' => $this->payment_date, 'payment_date' => $this->payment_date,
'notes' => $this->getNotes(), 'notes' => $this->notes,
'amount' => $this->amount, 'amount' => $this->amount,
'unique_hash' => $this->unique_hash, 'unique_hash' => $this->unique_hash,
'invoice_id' => $this->invoice_id, 'invoice_id' => $this->invoice_id,

View File

@ -217,7 +217,7 @@ class Company extends Model implements HasMedia
'estimate_billing_address_format' => $billingAddressFormat, 'estimate_billing_address_format' => $billingAddressFormat,
'payment_company_address_format' => $companyAddressFormat, 'payment_company_address_format' => $companyAddressFormat,
'payment_from_customer_address_format' => $paymentFromCustomerAddress, 'payment_from_customer_address_format' => $paymentFromCustomerAddress,
'currency' => request()->currency ?? 13, 'currency' => request()->currency ?? 1,
'time_zone' => 'Asia/Kolkata', 'time_zone' => 'Asia/Kolkata',
'language' => 'en', 'language' => 'en',
'fiscal_year' => '1-12', 'fiscal_year' => '1-12',

View File

@ -483,7 +483,8 @@ class Estimate extends Model implements HasMedia
'{ESTIMATE_DATE}' => $this->formattedEstimateDate, '{ESTIMATE_DATE}' => $this->formattedEstimateDate,
'{ESTIMATE_EXPIRY_DATE}' => $this->formattedExpiryDate, '{ESTIMATE_EXPIRY_DATE}' => $this->formattedExpiryDate,
'{ESTIMATE_NUMBER}' => $this->estimate_number, '{ESTIMATE_NUMBER}' => $this->estimate_number,
'{ESTIMATE_REF_NUMBER}' => $this->reference_number, '{PDF_LINK}' => $this->estimatePdfUrl,
'{TOTAL_AMOUNT}' => format_money_pdf($this->total, $this->customer->currency)
]; ];
} }

View File

@ -240,7 +240,7 @@ class Expense extends Model implements HasMedia
} }
if ($request->hasFile('attachment_receipt')) { if ($request->hasFile('attachment_receipt')) {
$expense->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts'); $expense->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts', 'local');
} }
if ($request->customFields) { if ($request->customFields) {
@ -262,12 +262,12 @@ class Expense extends Model implements HasMedia
ExchangeRateLog::addExchangeRateLog($this); ExchangeRateLog::addExchangeRateLog($this);
} }
if (isset($request->is_attachment_receipt_removed) && (bool) $request->is_attachment_receipt_removed) { if (isset($request->is_attachment_receipt_removed) && $request->is_attachment_receipt_removed == "true") {
$this->clearMediaCollection('receipts'); $this->clearMediaCollection('receipts');
} }
if ($request->hasFile('attachment_receipt')) { if ($request->hasFile('attachment_receipt')) {
$this->clearMediaCollection('receipts'); $this->clearMediaCollection('receipts');
$this->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts'); $this->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts', 'local');
} }
if ($request->customFields) { if ($request->customFields) {

View File

@ -187,16 +187,6 @@ class Invoice extends Model implements HasMedia
return Carbon::parse($this->invoice_date)->format($dateFormat); return Carbon::parse($this->invoice_date)->format($dateFormat);
} }
public function scopeWhereStatus($query, $status)
{
return $query->where('invoices.status', $status);
}
public function scopeWherePaidStatus($query, $status)
{
return $query->where('invoices.paid_status', $status);
}
public function scopeWhereDueStatus($query, $status) public function scopeWhereDueStatus($query, $status)
{ {
return $query->whereIn('invoices.paid_status', [ return $query->whereIn('invoices.paid_status', [
@ -234,6 +224,40 @@ class Invoice extends Model implements HasMedia
$query->orderBy($orderByField, $orderBy); $query->orderBy($orderByField, $orderBy);
} }
public function scopeWhereStatus($query, $status)
{
return $query->where('invoices.status', $status);
}
public function scopeWherePaidStatus($query, $status)
{
return $query->where('invoices.paid_status', $status);
}
public function scopeWhereTabFilters($query, $status)
{
if ($status == "DRAFT") {
return $query->where('invoices.status', $status);
}
if ($status == "SENT") {
return $query->whereIn('invoices.status', [
self::STATUS_SENT,
self::STATUS_VIEWED,
self::STATUS_COMPLETED
]);
}
if ($status == 'DUE') {
return $query->whereIn('invoices.paid_status', [
self::STATUS_UNPAID,
self::STATUS_PARTIALLY_PAID,
]);
}
return ;
}
public function scopeApplyFilters($query, array $filters) public function scopeApplyFilters($query, array $filters)
{ {
$filters = collect($filters); $filters = collect($filters);
@ -249,17 +273,11 @@ class Invoice extends Model implements HasMedia
$filters->get('status') == self::STATUS_PAID $filters->get('status') == self::STATUS_PAID
) { ) {
$query->wherePaidStatus($filters->get('status')); $query->wherePaidStatus($filters->get('status'));
} elseif ($filters->get('status') == 'DUE') {
$query->whereDueStatus($filters->get('status'));
} else { } else {
$query->whereStatus($filters->get('status')); $query->whereStatus($filters->get('status'));
} }
} }
if ($filters->get('paid_status')) {
$query->wherePaidStatus($filters->get('status'));
}
if ($filters->get('invoice_id')) { if ($filters->get('invoice_id')) {
$query->whereInvoice($filters->get('invoice_id')); $query->whereInvoice($filters->get('invoice_id'));
} }
@ -651,7 +669,9 @@ class Invoice extends Model implements HasMedia
'{INVOICE_DATE}' => $this->formattedInvoiceDate, '{INVOICE_DATE}' => $this->formattedInvoiceDate,
'{INVOICE_DUE_DATE}' => $this->formattedDueDate, '{INVOICE_DUE_DATE}' => $this->formattedDueDate,
'{INVOICE_NUMBER}' => $this->invoice_number, '{INVOICE_NUMBER}' => $this->invoice_number,
'{INVOICE_REF_NUMBER}' => $this->reference_number, '{PDF_LINK}' => $this->invoicePdfUrl,
'{DUE_AMOUNT}' => format_money_pdf($this->due_amount, $this->customer->currency),
'{TOTAL_AMOUNT}' => format_money_pdf($this->total, $this->customer->currency)
]; ];
} }

View File

@ -435,7 +435,8 @@ class Payment extends Model implements HasMedia
'{PAYMENT_DATE}' => $this->formattedPaymentDate, '{PAYMENT_DATE}' => $this->formattedPaymentDate,
'{PAYMENT_MODE}' => $this->paymentMethod ? $this->paymentMethod->name : null, '{PAYMENT_MODE}' => $this->paymentMethod ? $this->paymentMethod->name : null,
'{PAYMENT_NUMBER}' => $this->payment_number, '{PAYMENT_NUMBER}' => $this->payment_number,
'{PAYMENT_AMOUNT}' => $this->reference_number, '{PDF_LINK}' => $this->paymentPdfUrl,
'{PAYMENT_AMOUNT}' => format_money_pdf($this->amount, $this->customer->currency)
]; ];
} }

View File

@ -38,15 +38,15 @@
"barryvdh/laravel-ide-helper": "^2.6", "barryvdh/laravel-ide-helper": "^2.6",
"beyondcode/laravel-dump-server": "^1.0", "beyondcode/laravel-dump-server": "^1.0",
"facade/ignition": "^2.3.6", "facade/ignition": "^2.3.6",
"friendsofphp/php-cs-fixer": "^3.0", "friendsofphp/php-cs-fixer": "^3.8",
"fzaninotto/faker": "^1.9.1", "fakerphp/faker": "^1.9.1",
"mockery/mockery": "^1.3.1", "mockery/mockery": "^1.3.1",
"nunomaduro/collision": "^5.0", "nunomaduro/collision": "^5.0",
"pestphp/pest": "^1.0", "pestphp/pest": "^1.0",
"pestphp/pest-plugin-faker": "^1.0", "pestphp/pest-plugin-faker": "^1.0",
"pestphp/pest-plugin-laravel": "^1.0", "pestphp/pest-plugin-laravel": "^1.0",
"pestphp/pest-plugin-parallel": "^0.2.1", "pestphp/pest-plugin-parallel": "^0.2.1",
"phpunit/phpunit": "^9.0" "phpunit/phpunit": "^9.3"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
@ -81,11 +81,14 @@
"config": { "config": {
"optimize-autoloader": true, "optimize-autoloader": true,
"preferred-install": "dist", "preferred-install": "dist",
"sort-packages": true "sort-packages": true,
"allow-plugins": {
"pestphp/pest-plugin": true
}
}, },
"extra": { "extra": {
"laravel": { "laravel": {
"dont-discover": [] "dont-discover": []
} }
} }
} }

2347
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -71,6 +71,7 @@ return [
["code" => "cs", "name" => "Czech"], ["code" => "cs", "name" => "Czech"],
["code" => "el", "name" => "Greek"], ["code" => "el", "name" => "Greek"],
["code" => "hr", "name" => "Crotian"], ["code" => "hr", "name" => "Crotian"],
["code" => "th", "name" => "ไทย"],
], ],
/* /*

View File

@ -170,7 +170,7 @@ class CountriesTableSeeder extends Seeder
['id' => 152,'code' => 'NR','name' => "Nauru",'phonecode' => 674], ['id' => 152,'code' => 'NR','name' => "Nauru",'phonecode' => 674],
['id' => 153,'code' => 'NP','name' => "Nepal",'phonecode' => 977], ['id' => 153,'code' => 'NP','name' => "Nepal",'phonecode' => 977],
['id' => 154,'code' => 'AN','name' => "Netherlands Antilles",'phonecode' => 599], ['id' => 154,'code' => 'AN','name' => "Netherlands Antilles",'phonecode' => 599],
['id' => 155,'code' => 'NL','name' => "Netherlands The",'phonecode' => 31], ['id' => 155,'code' => 'NL','name' => "Netherlands",'phonecode' => 31],
['id' => 156,'code' => 'NC','name' => "New Caledonia",'phonecode' => 687], ['id' => 156,'code' => 'NC','name' => "New Caledonia",'phonecode' => 687],
['id' => 157,'code' => 'NZ','name' => "New Zealand",'phonecode' => 64], ['id' => 157,'code' => 'NZ','name' => "New Zealand",'phonecode' => 64],
['id' => 158,'code' => 'NI','name' => "Nicaragua",'phonecode' => 505], ['id' => 158,'code' => 'NI','name' => "Nicaragua",'phonecode' => 505],

View File

@ -1,7 +1,7 @@
FROM php:7.4-fpm-alpine FROM php:8.0-fpm-alpine
RUN apk add --no-cache \ RUN apk add --no-cache \
php7-bcmath php8-bcmath
RUN docker-php-ext-install pdo pdo_mysql bcmath RUN docker-php-ext-install pdo pdo_mysql bcmath

View File

@ -27,7 +27,7 @@
"vite": "^2.6.1" "vite": "^2.6.1"
}, },
"dependencies": { "dependencies": {
"@headlessui/vue": "^1.4.0", "@headlessui/vue": "^1.5.0",
"@heroicons/vue": "^1.0.1", "@heroicons/vue": "^1.0.1",
"@popperjs/core": "^2.9.2", "@popperjs/core": "^2.9.2",
"@stripe/stripe-js": "^1.21.2", "@stripe/stripe-js": "^1.21.2",
@ -48,7 +48,8 @@
"mini-svg-data-uri": "^1.3.3", "mini-svg-data-uri": "^1.3.3",
"moment": "^2.29.1", "moment": "^2.29.1",
"pinia": "^2.0.4", "pinia": "^2.0.4",
"v-money3": "^3.13.5", "v-calendar": "3.0.0-alpha.8",
"v-money3": "3.16.1",
"v-tooltip": "^4.0.0-alpha.1", "v-tooltip": "^4.0.0-alpha.1",
"vue": "^3.2.0-beta.5", "vue": "^3.2.0-beta.5",
"vue-flatpickr-component": "^9.0.3", "vue-flatpickr-component": "^9.0.3",

View File

@ -6,8 +6,17 @@
<script setup> <script setup>
import Chart from 'chart.js' import Chart from 'chart.js'
import { ref, reactive, computed, onMounted, watchEffect, inject } from 'vue' import {
ref,
reactive,
computed,
onMounted,
watchEffect,
inject,
watch,
} from 'vue'
import { useCompanyStore } from '@/scripts/admin/stores/company' import { useCompanyStore } from '@/scripts/admin/stores/company'
import { useGlobalStore } from '@/scripts/admin/stores/global'
const utils = inject('utils') const utils = inject('utils')
@ -44,9 +53,11 @@ const props = defineProps({
}, },
}) })
const isDarkModeOn = document.documentElement.classList.contains('dark')
let myLineChart = null let myLineChart = null
const graph = ref(null) const graph = ref(null)
const companyStore = useCompanyStore() const companyStore = useCompanyStore()
const globalStore = useGlobalStore()
const defaultCurrency = computed(() => { const defaultCurrency = computed(() => {
return companyStore.selectedCompanyCurrency return companyStore.selectedCompanyCurrency
}) })
@ -60,6 +71,14 @@ watchEffect(() => {
} }
}) })
watch(
() => globalStore.isDarkModeOn,
() => {
myLineChart.reset()
updateColors()
}
)
onMounted(() => { onMounted(() => {
let context = graph.value.getContext('2d') let context = graph.value.getContext('2d')
let options = reactive({ let options = reactive({
@ -81,6 +100,8 @@ onMounted(() => {
}, },
}) })
const salesColor = globalStore.isDarkModeOn ? '#ffffff' : '#040405'
let data = reactive({ let data = reactive({
labels: props.labels, labels: props.labels,
datasets: [ datasets: [
@ -89,16 +110,16 @@ onMounted(() => {
fill: false, fill: false,
lineTension: 0.3, lineTension: 0.3,
backgroundColor: 'rgba(230, 254, 249)', backgroundColor: 'rgba(230, 254, 249)',
borderColor: '#040405', borderColor: salesColor,
borderCapStyle: 'butt', borderCapStyle: 'butt',
borderDash: [], borderDash: [],
borderDashOffset: 0.0, borderDashOffset: 0.0,
borderJoinStyle: 'miter', borderJoinStyle: 'miter',
pointBorderColor: '#040405', pointBorderColor: salesColor,
pointBackgroundColor: '#fff', pointBackgroundColor: '#fff',
pointBorderWidth: 1, pointBorderWidth: 1,
pointHoverRadius: 5, pointHoverRadius: 5,
pointHoverBackgroundColor: '#040405', pointHoverBackgroundColor: salesColor,
pointHoverBorderColor: 'rgba(220,220,220,1)', pointHoverBorderColor: 'rgba(220,220,220,1)',
pointHoverBorderWidth: 2, pointHoverBorderWidth: 2,
pointRadius: 4, pointRadius: 4,
@ -194,4 +215,12 @@ function update() {
lazy: true, lazy: true,
}) })
} }
function updateColors() {
const newColor = globalStore.isDarkModeOn ? '#ffffff' : '#040405'
myLineChart.data.datasets[0].borderColor = newColor
myLineChart.data.datasets[0].pointBorderColor = newColor
myLineChart.data.datasets[0].pointHoverBackgroundColor = newColor
}
</script> </script>

View File

@ -64,7 +64,7 @@ function mergeExistingValues() {
if (props.isEdit) { if (props.isEdit) {
props.store[props.storeProp].fields.forEach((field) => { props.store[props.storeProp].fields.forEach((field) => {
const existingIndex = props.store[props.storeProp].customFields.findIndex( const existingIndex = props.store[props.storeProp].customFields.findIndex(
(f) => f.id === field.custom_field_id (f) => f.id == field.custom_field_id
) )
if (existingIndex > -1) { if (existingIndex > -1) {

View File

@ -9,7 +9,7 @@ import { computed } from 'vue'
const props = defineProps({ const props = defineProps({
modelValue: { modelValue: {
type: String, type: String,
default: moment().format('YYYY-MM-DD hh:MM'), default: moment().format('YYYY-MM-DD HH:mm'),
}, },
}) })

View File

@ -17,18 +17,7 @@
<td class="px-5 py-4 text-left align-top"> <td class="px-5 py-4 text-left align-top">
<div class="flex justify-start"> <div class="flex justify-start">
<div <div
class=" class="flex items-center justify-center w-5 h-5 mt-2 mr-2 text-gray-300 cursor-move handle"
flex
items-center
justify-center
w-5
h-5
mt-2
text-gray-300
cursor-move
handle
mr-2
"
> >
<DragIcon /> <DragIcon />
</div> </div>
@ -108,7 +97,7 @@
<BaseIcon <BaseIcon
name="ChevronDownIcon" name="ChevronDownIcon"
class="w-4 h-4 text-gray-500 ml-1" class="w-4 h-4 ml-1 text-gray-500"
/> />
</span> </span>
</BaseButton> </BaseButton>
@ -155,7 +144,7 @@
<BaseContentPlaceholders v-if="loading"> <BaseContentPlaceholders v-if="loading">
<BaseContentPlaceholdersText <BaseContentPlaceholdersText
:lines="1" :lines="1"
class="w-24 h-8 rounded-md border" class="w-24 h-8 border rounded-md"
/> />
</BaseContentPlaceholders> </BaseContentPlaceholders>
@ -175,6 +164,7 @@
:ability="abilities.CREATE_INVOICE" :ability="abilities.CREATE_INVOICE"
:store="store" :store="store"
:store-prop="storeProp" :store-prop="storeProp"
:discount="discount"
@update="updateTax" @update="updateTax"
/> />
</td> </td>

View File

@ -30,24 +30,13 @@
<template v-if="userStore.hasAbilities(ability)" #action> <template v-if="userStore.hasAbilities(ability)" #action>
<button <button
type="button" type="button"
class=" class="flex items-center justify-center w-full px-2 py-2 bg-gray-200 border-none outline-none cursor-pointer "
flex
items-center
justify-center
w-full
px-2
cursor-pointer
py-2
bg-gray-200
border-none
outline-none
"
@click="openTaxModal" @click="openTaxModal"
> >
<BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" /> <BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" />
<label <label
class="ml-2 text-sm leading-none text-primary-400 cursor-pointer" class="ml-2 text-sm leading-none cursor-pointer text-primary-400"
>{{ $t('invoices.add_new_tax') }}</label >{{ $t('invoices.add_new_tax') }}</label
> >
</button> </button>
@ -115,6 +104,10 @@ const props = defineProps({
type: Number, type: Number,
default: 0, default: 0,
}, },
discountedTotal: {
type: Number,
default: 0,
},
currency: { currency: {
type: [Object, String], type: [Object, String],
required: true, required: true,
@ -153,19 +146,19 @@ const filteredTypes = computed(() => {
}) })
const taxAmount = computed(() => { const taxAmount = computed(() => {
if (localTax.compound_tax && props.total) { if (localTax.compound_tax && props.discountedTotal) {
return ((props.total + props.totalTax) * localTax.percent) / 100 return ((props.discountedTotal + props.totalTax) * localTax.percent) / 100
} }
if (props.total && localTax.percent) { if (props.discountedTotal && localTax.percent) {
return (props.total * localTax.percent) / 100 return (props.discountedTotal * localTax.percent) / 100
} }
return 0 return 0
}) })
watch( watch(
() => props.total, () => props.discountedTotal,
() => { () => {
updateRowTax() updateRowTax()
} }

View File

@ -29,14 +29,7 @@
<label <label
v-else v-else
class=" class="flex items-center justify-center m-0 text-lg text-black uppercase "
flex
items-center
justify-center
m-0
text-lg text-black
uppercase
"
> >
<BaseFormatMoney <BaseFormatMoney
:amount="store.getSubTotal" :amount="store.getSubTotal"
@ -66,14 +59,7 @@
<label <label
v-else-if="store[storeProp].tax_per_item === 'YES'" v-else-if="store[storeProp].tax_per_item === 'YES'"
class=" class="flex items-center justify-center m-0 text-lg text-black uppercase "
flex
items-center
justify-center
m-0
text-lg text-black
uppercase
"
> >
<BaseFormatMoney :amount="tax.amount" :currency="defaultCurrency" /> <BaseFormatMoney :amount="tax.amount" :currency="defaultCurrency" />
</label> </label>
@ -98,7 +84,7 @@
<BaseContentPlaceholders v-if="isLoading"> <BaseContentPlaceholders v-if="isLoading">
<BaseContentPlaceholdersText <BaseContentPlaceholdersText
:lines="1" :lines="1"
class="w-24 h-8 rounded-md border" class="w-24 h-8 border rounded-md"
/> />
</BaseContentPlaceholders> </BaseContentPlaceholders>
<div v-else class="flex" style="width: 140px" role="group"> <div v-else class="flex" style="width: 140px" role="group">
@ -114,7 +100,7 @@
<BaseDropdown position="bottom-end"> <BaseDropdown position="bottom-end">
<template #activator> <template #activator>
<BaseButton <BaseButton
class="rounded-tr-md rounded-br-md p-2 rounded-none" class="p-2 rounded-none rounded-tr-md rounded-br-md"
type="button" type="button"
variant="white" variant="white"
> >
@ -127,7 +113,7 @@
<BaseIcon <BaseIcon
name="ChevronDownIcon" name="ChevronDownIcon"
class="w-4 h-4 text-gray-500 ml-1" class="w-4 h-4 ml-1 text-gray-500"
/> />
</span> </span>
</BaseButton> </BaseButton>
@ -180,15 +166,7 @@
</div> </div>
<div <div
class=" class="flex items-center justify-between w-full pt-2 mt-5 border-t border-gray-200 border-solid "
flex
items-center
justify-between
w-full
pt-2
mt-5
border-t border-gray-200 border-solid
"
> >
<BaseContentPlaceholders v-if="isLoading"> <BaseContentPlaceholders v-if="isLoading">
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" /> <BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
@ -204,14 +182,7 @@
</BaseContentPlaceholders> </BaseContentPlaceholders>
<label <label
v-else v-else
class=" class="flex items-center justify-center text-lg uppercase text-primary-400"
flex
items-center
justify-center
text-lg
uppercase
text-primary-400
"
> >
<BaseFormatMoney :amount="store.getTotal" :currency="defaultCurrency" /> <BaseFormatMoney :amount="store.getTotal" :currency="defaultCurrency" />
</label> </label>
@ -334,6 +305,7 @@ function selectPercentage() {
function onSelectTax(selectedTax) { function onSelectTax(selectedTax) {
let amount = 0 let amount = 0
if (selectedTax.compound_tax && props.store.getSubtotalWithDiscount) { if (selectedTax.compound_tax && props.store.getSubtotalWithDiscount) {
amount = Math.round( amount = Math.round(
((props.store.getSubtotalWithDiscount + props.store.getTotalSimpleTax) * ((props.store.getSubtotalWithDiscount + props.store.getTotalSimpleTax) *

View File

@ -48,6 +48,24 @@
/> />
</BaseInputGroup> </BaseInputGroup>
<BaseInputGroup
:label="$tc('settings.company_info.company_slug')"
:help-text="$t('settings.company_info.company_slug_help_text')"
:error="
v$.newCompanyForm.slug.$error &&
v$.newCompanyForm.slug.$errors[0].$message
"
:content-loading="isFetchingInitialData"
required
>
<BaseInput
v-model="newCompanyForm.slug"
:invalid="v$.newCompanyForm.slug.$error"
:content-loading="isFetchingInitialData"
@input="v$.newCompanyForm.slug.$touch()"
/>
</BaseInputGroup>
<BaseInputGroup <BaseInputGroup
:content-loading="isFetchingInitialData" :content-loading="isFetchingInitialData"
:label="$tc('settings.company_info.country')" :label="$tc('settings.company_info.country')"
@ -130,7 +148,7 @@
<script setup> <script setup>
import { useModalStore } from '@/scripts/stores/modal' import { useModalStore } from '@/scripts/stores/modal'
import { computed, onMounted, ref, reactive } from 'vue' import { computed, onMounted, ref, reactive, watch } from 'vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { required, minLength, helpers } from '@vuelidate/validators' import { required, minLength, helpers } from '@vuelidate/validators'
import { useVuelidate } from '@vuelidate/core' import { useVuelidate } from '@vuelidate/core'
@ -152,6 +170,7 @@ let companyLogoName = ref(null)
const newCompanyForm = reactive({ const newCompanyForm = reactive({
name: null, name: null,
slug: null,
currency: '', currency: '',
address: { address: {
country_id: null, country_id: null,
@ -162,6 +181,9 @@ const modalActive = computed(() => {
return modalStore.active && modalStore.componentName === 'CompanyModal' return modalStore.active && modalStore.componentName === 'CompanyModal'
}) })
const slugValidator = (value) => {
return value == slugify(value)
}
const rules = { const rules = {
newCompanyForm: { newCompanyForm: {
name: { name: {
@ -171,6 +193,17 @@ const rules = {
minLength(3) minLength(3)
), ),
}, },
slug: {
required: helpers.withMessage(t('validation.required'), required),
minLength: helpers.withMessage(
t('validation.name_min_length', { count: 3 }),
minLength(3)
),
slugValidator: helpers.withMessage(
t('validation.invalid_slug'),
slugValidator
),
},
address: { address: {
country_id: { country_id: {
required: helpers.withMessage(t('validation.required'), required), required: helpers.withMessage(t('validation.required'), required),
@ -243,6 +276,7 @@ async function submitCompanyData() {
function resetNewCompanyForm() { function resetNewCompanyForm() {
newCompanyForm.name = '' newCompanyForm.name = ''
newCompanyForm.slug = ''
newCompanyForm.currency = '' newCompanyForm.currency = ''
newCompanyForm.address.country_id = '' newCompanyForm.address.country_id = ''
@ -257,4 +291,24 @@ function closeCompanyModal() {
v$.value.$reset() v$.value.$reset()
}, 300) }, 300)
} }
// watcher for if change company name then auto fill company slug value
watch(
() => newCompanyForm.name,
(currentValue) => {
newCompanyForm.slug = slugify(currentValue)
}
)
function slugify(string) {
return string
.toString()
.trim()
.toLowerCase()
.replace(/\s+/g, '-')
.replace(/[^\w\-]+/g, '')
.replace(/\-\-+/g, '-')
.replace(/^-+/, '')
.replace(/-+$/, '')
}
</script> </script>

View File

@ -15,6 +15,13 @@
bg-gradient-to-r bg-gradient-to-r
from-primary-500 from-primary-500
to-primary-400 to-primary-400
dark:from-gray-700/70 dark:to-gray-800/70
bg-primary-500
dark:bg-transparent
dark:backdrop-blur-xl
dark:shadow-glass
dark:border
dark:border-white/10
" "
> >
<router-link <router-link
@ -53,6 +60,7 @@
cursor-pointer cursor-pointer
md:hidden md:ml-0 md:hidden md:ml-0
hover:bg-gray-100 hover:bg-gray-100
dark:bg-gray-800 dark:border-gray-500 dark:border
" "
@click.prevent="onToggle" @click.prevent="onToggle"
> >
@ -143,7 +151,7 @@
<template #activator> <template #activator>
<img <img
:src="previewAvatar" :src="previewAvatar"
class="block w-8 h-8 rounded md:h-9 md:w-9" class="block w-8 h-8 rounded md:h-9 md:w-9 object-cover"
/> />
</template> </template>

View File

@ -15,7 +15,9 @@
leave-from="opacity-100" leave-from="opacity-100"
leave-to="opacity-0" leave-to="opacity-0"
> >
<DialogOverlay class="fixed inset-0 bg-gray-600 bg-opacity-75" /> <DialogOverlay
class="fixed inset-0 bg-gray-600 bg-opacity-75 dark:bg-gray-900/90"
/>
</TransitionChild> </TransitionChild>
<TransitionChild <TransitionChild
@ -27,7 +29,9 @@
leave-from="translate-x-0" leave-from="translate-x-0"
leave-to="-translate-x-full" leave-to="-translate-x-full"
> >
<div class="relative flex flex-col flex-1 w-full max-w-xs bg-white"> <div
class="relative flex flex-col flex-1 w-full max-w-xs bg-white dark:bg-gray-800"
>
<TransitionChild <TransitionChild
as="template" as="template"
enter="ease-in-out duration-300" enter="ease-in-out duration-300"
@ -40,18 +44,17 @@
<div class="absolute top-0 right-0 pt-2 -mr-12"> <div class="absolute top-0 right-0 pt-2 -mr-12">
<button <button
class=" class="
flex flex
items-center items-center
justify-center justify-center
w-10 w-10
h-10 h-10
ml-1 ml-1
rounded-full rounded-full
focus:outline-none focus:outline-none
focus:ring-2 focus:ring-2
focus:ring-inset focus:ring-inset
focus:ring-white focus:ring-white"
"
@click="globalStore.setSidebarVisibility(false)" @click="globalStore.setSidebarVisibility(false)"
> >
<span class="sr-only">Close sidebar</span> <span class="sr-only">Close sidebar</span>
@ -82,8 +85,8 @@
:to="item.link" :to="item.link"
:class="[ :class="[
hasActiveUrl(item.link) hasActiveUrl(item.link)
? 'text-primary-500 border-primary-500 bg-gray-100 ' ? 'text-primary-500 border-primary-500 bg-gray-100 dark:shadow-glass dark:backdrop-blur-xl dark:hover:bg-gray-700 dark:bg-gray-700/50 dark:text-primary-400 dark:font-medium'
: 'text-black', : 'text-black dark:text-gray-300',
'cursor-pointer px-0 pl-4 py-3 border-transparent flex items-center border-l-4 border-solid text-sm not-italic font-medium', 'cursor-pointer px-0 pl-4 py-3 border-transparent flex items-center border-l-4 border-solid text-sm not-italic font-medium',
]" ]"
@click="globalStore.setSidebarVisibility(false)" @click="globalStore.setSidebarVisibility(false)"
@ -100,6 +103,10 @@
/> />
{{ $t(item.title) }} {{ $t(item.title) }}
</router-link> </router-link>
<LightDarkSwitch
:show-label="false"
class="absolute right-6 top-6 !w-auto"
/>
</nav> </nav>
</div> </div>
</div> </div>
@ -113,17 +120,16 @@
<!-- DESKTOP MENU --> <!-- DESKTOP MENU -->
<div <div
class=" class="
hidden hidden
w-56 w-56
h-screen h-screen
pb-32 bg-white
overflow-y-auto border-r border-gray-200 border-solid
bg-white xl:w-64
border-r border-gray-200 border-solid md:fixed md:flex md:flex-col md:inset-y-0
xl:w-64 pt-16
md:fixed md:flex md:flex-col md:inset-y-0 dark:border-gray-800
pt-16 dark:bg-gray-800/80"
"
> >
<div <div
v-for="menu in globalStore.menuGroups" v-for="menu in globalStore.menuGroups"
@ -136,8 +142,8 @@
:to="item.link" :to="item.link"
:class="[ :class="[
hasActiveUrl(item.link) hasActiveUrl(item.link)
? 'text-primary-500 border-primary-500 bg-gray-100 ' ? 'text-primary-500 border-primary-500 bg-gray-100 dark:border-primary-400 dark:shadow-glass dark:backdrop-blur-xl dark:hover:bg-gray-700 dark:bg-gray-700/50 dark:text-primary-400 dark:font-medium'
: 'text-black', : 'text-black dark:hover:bg-transparent dark:hover:text-white dark:text-gray-300',
'cursor-pointer px-0 pl-6 hover:bg-gray-50 py-3 group flex items-center border-l-4 border-solid border-transparent text-sm not-italic font-medium', 'cursor-pointer px-0 pl-6 hover:bg-gray-50 py-3 group flex items-center border-l-4 border-solid border-transparent text-sm not-italic font-medium',
]" ]"
> >
@ -145,8 +151,8 @@
:name="item.icon" :name="item.icon"
:class="[ :class="[
hasActiveUrl(item.link) hasActiveUrl(item.link)
? 'text-primary-500 group-hover:text-primary-500 ' ? 'text-primary-500 group-hover:text-primary-500 dark:text-primary-400 dark:group-hover:text-primary-500 '
: 'text-gray-400 group-hover:text-black', : 'text-gray-400 group-hover:text-black dark:text-gray-400 dark:group-hover:text-white',
'mr-4 shrink-0 h-5 w-5 ', 'mr-4 shrink-0 h-5 w-5 ',
]" ]"
/> />
@ -154,6 +160,9 @@
{{ $t(item.title) }} {{ $t(item.title) }}
</router-link> </router-link>
</div> </div>
<LightDarkSwitch
class="absolute bottom-0 py-4 border-t border-gray-200 dark:border-gray-700"
/>
</div> </div>
</template> </template>
@ -169,6 +178,7 @@ import {
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { useGlobalStore } from '@/scripts/admin/stores/global' import { useGlobalStore } from '@/scripts/admin/stores/global'
import LightDarkSwitch from '@/scripts/components/LightDarkSwitcher.vue'
const route = useRoute() const route = useRoute()
const globalStore = useGlobalStore() const globalStore = useGlobalStore()

View File

@ -184,6 +184,20 @@ export const useCompanyStore = (useWindow = false) => {
setDefaultCurrency(data) { setDefaultCurrency(data) {
this.defaultCurrency = data.currency this.defaultCurrency = data.currency
}, },
checkCompanyHasCurrencyTransactions() {
return new Promise((resolve, reject) => {
axios
.get(`/api/v1/company/has-transactions`)
.then((response) => {
resolve(response)
})
.catch((err) => {
handleError(err)
reject(err)
})
})
},
}, },
})() })()
} }

View File

@ -34,6 +34,7 @@ export const useGlobalStore = (useWindow = false) => {
isAppLoaded: false, isAppLoaded: false,
isSidebarOpen: false, isSidebarOpen: false,
areCurrenciesLoading: false, areCurrenciesLoading: false,
isDarkModeOn: false,
downloadReport: null, downloadReport: null,
}), }),
@ -70,8 +71,8 @@ export const useGlobalStore = (useWindow = false) => {
moduleStore.apiToken = response.data.global_settings.api_token moduleStore.apiToken = response.data.global_settings.api_token
moduleStore.enableModules = response.data.modules moduleStore.enableModules = response.data.modules
// company store // company store
companyStore.companies = response.data.companies companyStore.companies = response.data.companies
companyStore.selectedCompany = response.data.current_company companyStore.selectedCompany = response.data.current_company
companyStore.setSelectedCompany(response.data.current_company) companyStore.setSelectedCompany(response.data.current_company)
companyStore.selectedCompanySettings = companyStore.selectedCompanySettings =

View File

@ -2,8 +2,23 @@
<div> <div>
<div <div
v-if="dashboardStore.isDashboardDataLoaded" v-if="dashboardStore.isDashboardDataLoaded"
class="grid grid-cols-10 mt-8 bg-white rounded shadow" class="
grid
grid-cols-10
mt-8
bg-white
rounded shadow
dark:text-white
dark:backdrop-blur-xl
dark:shadow-glass
dark:border
dark:bg-opacity-70
dark:border-white/10
dark:bg-gray-800
relative
"
> >
<BaseDarkHighlight />
<!-- Chart --> <!-- Chart -->
<div <div
class=" class="
@ -54,6 +69,7 @@
lg:border-t-0 lg:text-right lg:col-span-3 lg:border-t-0 lg:text-right lg:col-span-3
xl:col-span-2 xl:col-span-2
lg:grid-cols-1 lg:grid-cols-1
dark:border-white/10
" "
> >
<div class="p-6"> <div class="p-6">
@ -96,15 +112,7 @@
</span> </span>
<br /> <br />
<span <span
class=" class="block mt-1 text-xl font-semibold leading-8 lg:text-2xl text-red-400"
block
mt-1
text-xl
font-semibold
leading-8
lg:text-2xl
text-red-400
"
> >
<BaseFormatMoney <BaseFormatMoney
:amount="dashboardStore.totalExpenses" :amount="dashboardStore.totalExpenses"
@ -116,8 +124,10 @@
class=" class="
col-span-3 col-span-3
p-6 p-6
border-t border-gray-200 border-solid border-t
border-gray-200 border-solid
lg:col-span-1 lg:col-span-1
dark:border-white/10
" "
> >
<span class="text-xs leading-5 lg:text-sm"> <span class="text-xs leading-5 lg:text-sm">
@ -132,7 +142,7 @@
font-semibold font-semibold
leading-8 leading-8
lg:text-2xl lg:text-2xl
text-primary-500 text-primary-500 dark:text-primary-400
" "
> >
<BaseFormatMoney <BaseFormatMoney

View File

@ -1,6 +1,6 @@
<template> <template>
<BaseContentPlaceholders <BaseContentPlaceholders
class="grid grid-cols-10 mt-8 bg-white rounded shadow" class="grid grid-cols-10 mt-8 bg-white rounded shadow dark:bg-gray-800"
> >
<!-- Chart --> <!-- Chart -->
<div <div
@ -29,6 +29,7 @@
text-center text-center
border-t border-l border-gray-200 border-solid border-t border-l border-gray-200 border-solid
lg:border-t-0 lg:text-right lg:col-span-3 lg:border-t-0 lg:text-right lg:col-span-3
dark:border-gray-600
xl:col-span-2 xl:col-span-2
lg:grid-cols-1 lg:grid-cols-1
" "
@ -77,6 +78,7 @@
col-span-3 col-span-3
p-6 p-6
border-t border-gray-200 border-solid border-t border-gray-200 border-solid
dark:border-gray-600
lg:justify-end lg:items-end lg:col-span-1 lg:justify-end lg:items-end lg:col-span-1
" "
> >

View File

@ -12,18 +12,24 @@
hover:bg-gray-50 hover:bg-gray-50
xl:p-4 xl:p-4
lg:col-span-2 lg:col-span-2
dark:backdrop-blur-xl
dark:shadow-glass
dark:border
dark:border-white/10
dark:bg-gray-800/70
" "
:class="{ 'lg:!col-span-3': large }" :class="{ 'lg:!col-span-3': large }"
:to="route" :to="route"
> >
<div> <div>
<span class="text-xl font-semibold leading-tight text-black xl:text-3xl"> <span class="text-xl font-semibold leading-tight text-black xl:text-3xl dark:text-white">
<slot /> <slot />
</span> </span>
<span class="block mt-1 text-sm leading-tight text-gray-500 xl:text-lg"> <span class="block mt-1 text-sm leading-tight text-gray-500 xl:text-lg dark:text-gray-300">
{{ label }} {{ label }}
</span> </span>
</div> </div>
<BaseDarkHighlight class="!bg-highlight/[.17] !top-5" />
<div class="flex items-center"> <div class="flex items-center">
<component :is="iconComponent" class="w-10 h-10 xl:w-12 xl:h-12" /> <component :is="iconComponent" class="w-10 h-10 xl:w-12 xl:h-12" />
</div> </div>

View File

@ -1,7 +1,7 @@
<template> <template>
<BaseContentPlaceholders <BaseContentPlaceholders
:rounded="true" :rounded="true"
class="relative flex justify-between w-full p-3 bg-white rounded shadow lg:col-span-3 xl:p-4" class="relative flex justify-between w-full p-3 bg-white rounded shadow lg:col-span-3 xl:p-4 dark:bg-gray-800"
> >
<div> <div>
<BaseContentPlaceholdersText <BaseContentPlaceholdersText

View File

@ -12,6 +12,7 @@
shadow shadow
lg:col-span-2 lg:col-span-2
xl:p-4 xl:p-4
dark:bg-gray-800
" "
> >
<div> <div>

View File

@ -32,6 +32,8 @@
:content-loading="isLoading" :content-loading="isLoading"
:calendar-button="true" :calendar-button="true"
calendar-button-icon="calendar" calendar-button-icon="calendar"
:show-extra-options="true"
:source-date="estimateStore.newEstimate.estimate_date"
/> />
</BaseInputGroup> </BaseInputGroup>

View File

@ -34,6 +34,24 @@
/> />
</BaseInputGroup> </BaseInputGroup>
<BaseInputGroup
:label="$tc('wizard.company_slug')"
:help-text="$t('wizard.company_slug_help_text')"
:error="
v$.companyForm.slug.$error &&
v$.companyForm.slug.$errors[0].$message
"
required
>
<BaseInput
v-model="companyForm.slug"
:invalid="v$.companyForm.slug.$error"
type="text"
name="slug"
@input="v$.companyForm.slug.$touch()"
/>
</BaseInputGroup>
<BaseInputGroup <BaseInputGroup
:label="$t('wizard.country')" :label="$t('wizard.country')"
:error=" :error="
@ -57,9 +75,7 @@
track-by="name" track-by="name"
/> />
</BaseInputGroup> </BaseInputGroup>
</div>
<div class="grid grid-cols-1 gap-4 mb-4 md:grid-cols-2 md:mb-6">
<BaseInputGroup :label="$t('wizard.state')"> <BaseInputGroup :label="$t('wizard.state')">
<BaseInput <BaseInput
v-model="companyForm.address.state" v-model="companyForm.address.state"
@ -144,9 +160,9 @@
</template> </template>
<script setup> <script setup>
import { ref, computed, onMounted, reactive } from 'vue' import { ref, computed, onMounted, reactive, watch } from 'vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { required, maxLength, helpers } from '@vuelidate/validators' import { required, minLength, maxLength, helpers } from '@vuelidate/validators'
import { useVuelidate } from '@vuelidate/core' import { useVuelidate } from '@vuelidate/core'
import { useGlobalStore } from '@/scripts/admin/stores/global' import { useGlobalStore } from '@/scripts/admin/stores/global'
import { useCompanyStore } from '@/scripts/admin/stores/company' import { useCompanyStore } from '@/scripts/admin/stores/company'
@ -162,6 +178,7 @@ let logoFileName = ref(null)
const companyForm = reactive({ const companyForm = reactive({
name: null, name: null,
slug: null,
address: { address: {
address_street_1: '', address_street_1: '',
address_street_2: '', address_street_2: '',
@ -188,10 +205,28 @@ onMounted(async () => {
})?.id })?.id
}) })
const slugValidator = (value) => {
return value == slugify(value)
}
const rules = { const rules = {
companyForm: { companyForm: {
name: { name: {
required: helpers.withMessage(t('validation.required'), required), required: helpers.withMessage(t('validation.required'), required),
minLength: helpers.withMessage(
t('validation.name_min_length', { count: 3 }),
minLength(3)
),
},
slug: {
required: helpers.withMessage(t('validation.required'), required),
minLength: helpers.withMessage(
t('validation.name_min_length', { count: 3 }),
minLength(3)
),
slugValidator: helpers.withMessage(
t('validation.invalid_slug'),
slugValidator
),
}, },
address: { address: {
country_id: { country_id: {
@ -249,4 +284,24 @@ async function next() {
emit('next', 7) emit('next', 7)
} }
} }
// watcher for if change company name then auto fill company slug value
watch(
() => companyForm.name,
(currentValue) => {
companyForm.slug = slugify(currentValue)
}
)
function slugify(string) {
return string
.toString()
.trim()
.toLowerCase()
.replace(/\s+/g, '-')
.replace(/[^\w\-]+/g, '')
.replace(/\-\-+/g, '-')
.replace(/^-+/, '')
.replace(/-+$/, '')
}
</script> </script>

View File

@ -56,7 +56,7 @@
<BaseMultiselect <BaseMultiselect
v-model="filters.status" v-model="filters.status"
:groups="true" :groups="true"
:options="status" :options="invoiceStatus"
searchable searchable
:placeholder="$t('general.select_a_status')" :placeholder="$t('general.select_a_status')"
@update:modelValue="setActiveTab" @update:modelValue="setActiveTab"
@ -130,11 +130,27 @@
" "
> >
<!-- Tabs --> <!-- Tabs -->
<BaseTabGroup class="-mb-5" @change="setStatusFilter"> <BaseTabGroup
<BaseTab :title="$t('general.all')" filter="" /> class="-mb-5"
<BaseTab :title="$t('general.draft')" filter="DRAFT" /> :selected-index="selectedIndex"
<BaseTab :title="$t('general.sent')" filter="SENT" /> @change="changeTabStatus"
<BaseTab :title="$t('general.due')" filter="DUE" /> >
<BaseTab
:title="invoiceTabStatus[0].title"
:tab-status="invoiceTabStatus[0].value"
/>
<BaseTab
:title="invoiceTabStatus[1].title"
:tab-status="invoiceTabStatus[1].value"
/>
<BaseTab
:title="invoiceTabStatus[2].title"
:tab-status="invoiceTabStatus[2].value"
/>
<BaseTab
:title="invoiceTabStatus[3].title"
:tab-status="invoiceTabStatus[3].value"
/>
</BaseTabGroup> </BaseTabGroup>
<BaseDropdown <BaseDropdown
@ -289,10 +305,10 @@ const utils = inject('$utils')
const table = ref(null) const table = ref(null)
const showFilters = ref(false) const showFilters = ref(false)
const status = ref([ const invoiceStatus = ref([
{ {
label: 'Status', label: 'Status',
options: ['DRAFT', 'DUE', 'SENT', 'VIEWED', 'COMPLETED'], options: ['DRAFT', 'SENT', 'VIEWED', 'COMPLETED'],
}, },
{ {
label: 'Paid Status', label: 'Paid Status',
@ -300,10 +316,29 @@ const status = ref([
}, },
, ,
]) ])
const invoiceTabStatus = {
0: {
title: t('general.all'),
value: '',
},
1: {
title: t('general.draft'),
value: 'DRAFT',
},
2: {
title: t('general.sent'),
value: 'SENT',
},
3: {
title: t('general.due'),
value: 'DUE',
},
}
const isRequestOngoing = ref(true) const isRequestOngoing = ref(true)
const activeTab = ref('general.draft')
const router = useRouter() const router = useRouter()
const userStore = useUserStore() const userStore = useUserStore()
const selectedIndex = ref(0)
let filters = reactive({ let filters = reactive({
customer_id: '', customer_id: '',
@ -311,6 +346,7 @@ let filters = reactive({
from_date: '', from_date: '',
to_date: '', to_date: '',
invoice_number: '', invoice_number: '',
tab_status: '',
}) })
const showEmptyScreen = computed( const showEmptyScreen = computed(
@ -401,6 +437,7 @@ async function fetchData({ page, filter, sort }) {
from_date: filters.from_date, from_date: filters.from_date,
to_date: filters.to_date, to_date: filters.to_date,
invoice_number: filters.invoice_number, invoice_number: filters.invoice_number,
tab_status: filters.tab_status,
orderByField: sort.fieldName || 'created_at', orderByField: sort.fieldName || 'created_at',
orderBy: sort.order || 'desc', orderBy: sort.order || 'desc',
page, page,
@ -423,29 +460,9 @@ async function fetchData({ page, filter, sort }) {
} }
} }
function setStatusFilter(val) { function changeTabStatus(val, index) {
if (activeTab.value == val.title) { filters.tab_status = val['tab-status']
return true selectedIndex.value = index
}
activeTab.value = val.title
switch (val.title) {
case t('general.draft'):
filters.status = 'DRAFT'
break
case t('general.sent'):
filters.status = 'SENT'
break
case t('general.due'):
filters.status = 'DUE'
break
default:
filters.status = ''
break
}
} }
function setFilters() { function setFilters() {
@ -463,8 +480,6 @@ function clearFilter() {
filters.from_date = '' filters.from_date = ''
filters.to_date = '' filters.to_date = ''
filters.invoice_number = '' filters.invoice_number = ''
activeTab.value = t('general.all')
} }
async function removeMultipleInvoices() { async function removeMultipleInvoices() {
@ -505,39 +520,21 @@ function toggleFilter() {
function setActiveTab(val) { function setActiveTab(val) {
switch (val) { switch (val) {
case 'DRAFT': case 'DRAFT':
activeTab.value = t('general.draft') selectedIndex.value = 1
break break
case 'SENT': case 'SENT':
activeTab.value = t('general.sent') case 'VIEWED':
break
case 'DUE':
activeTab.value = t('general.due')
break
case 'COMPLETED': case 'COMPLETED':
activeTab.value = t('invoices.completed')
break
case 'PAID': case 'PAID':
activeTab.value = t('invoices.paid') selectedIndex.value = 2
break break
case 'UNPAID': case 'UNPAID':
activeTab.value = t('invoices.unpaid')
break
case 'PARTIALLY_PAID': case 'PARTIALLY_PAID':
activeTab.value = t('invoices.partially_paid') selectedIndex.value = 3
break
case 'VIEWED':
activeTab.value = t('invoices.viewed')
break
default:
activeTab.value = t('general.all')
break break
} }
filters.tab_status = invoiceTabStatus[selectedIndex.value].value
} }
</script> </script>

View File

@ -32,6 +32,8 @@
:content-loading="isLoading" :content-loading="isLoading"
:calendar-button="true" :calendar-button="true"
calendar-button-icon="calendar" calendar-button-icon="calendar"
:show-extra-options="true"
:source-date="invoiceStore.newInvoice.invoice_date"
/> />
</BaseInputGroup> </BaseInputGroup>

View File

@ -54,8 +54,6 @@
label="name" label="name"
:options="itemStore.itemUnits" :options="itemStore.itemUnits"
value-prop="id" value-prop="id"
:can-deselect="false"
:can-clear="false"
:placeholder="$t('items.select_a_unit')" :placeholder="$t('items.select_a_unit')"
searchable searchable
track-by="name" track-by="name"

View File

@ -82,9 +82,9 @@
required required
> >
<BaseCustomerSelectInput <BaseCustomerSelectInput
v-if="!isLoadingContent"
v-model="paymentStore.currentPayment.customer_id" v-model="paymentStore.currentPayment.customer_id"
:content-loading="isLoadingContent" :content-loading="isLoadingContent"
v-if="!isLoadingContent"
:invalid="v$.currentPayment.customer_id.$error" :invalid="v$.currentPayment.customer_id.$error"
:placeholder="$t('customers.select_a_customer')" :placeholder="$t('customers.select_a_customer')"
show-action show-action
@ -423,7 +423,7 @@ function onCustomerChange(customer_id) {
if (customer_id) { if (customer_id) {
let data = { let data = {
customer_id: customer_id, customer_id: customer_id,
status: 'DUE', tab_status: 'DUE',
limit: 'all', limit: 'all',
} }
@ -446,7 +446,11 @@ function onCustomerChange(customer_id) {
paymentStore.currentPayment.selectedCustomer = res2.data.data paymentStore.currentPayment.selectedCustomer = res2.data.data
paymentStore.currentPayment.customer = res2.data.data paymentStore.currentPayment.customer = res2.data.data
paymentStore.currentPayment.currency = res2.data.data.currency paymentStore.currentPayment.currency = res2.data.data.currency
if(isEdit.value && !customerStore.editCustomer && paymentStore.currentPayment.customer_id) { if (
isEdit.value &&
!customerStore.editCustomer &&
paymentStore.currentPayment.customer_id
) {
customerStore.editCustomer = res2.data.data customerStore.editCustomer = res2.data.data
} }
} }

View File

@ -28,6 +28,19 @@
/> />
</BaseInputGroup> </BaseInputGroup>
<BaseInputGroup
:label="$tc('settings.company_info.company_slug')"
:help-text="$t('settings.company_info.company_slug_help_text')"
:error="v$.slug.$error && v$.slug.$errors[0].$message"
required
>
<BaseInput
v-model="companyForm.slug"
:invalid="v$.slug.$error"
@blur="v$.slug.$touch()"
/>
</BaseInputGroup>
<BaseInputGroup :label="$tc('settings.company_info.phone')"> <BaseInputGroup :label="$tc('settings.company_info.phone')">
<BaseInput v-model="companyForm.address.phone" /> <BaseInput v-model="companyForm.address.phone" />
</BaseInputGroup> </BaseInputGroup>
@ -160,6 +173,7 @@ let isSaving = ref(false)
const companyForm = reactive({ const companyForm = reactive({
name: null, name: null,
slug: null,
logo: null, logo: null,
address: { address: {
address_street_1: '', address_street_1: '',
@ -193,7 +207,14 @@ const rules = computed(() => {
name: { name: {
required: helpers.withMessage(t('validation.required'), required), required: helpers.withMessage(t('validation.required'), required),
minLength: helpers.withMessage( minLength: helpers.withMessage(
t('validation.name_min_length'), t('validation.name_min_length', { count: 3 }),
minLength(3)
),
},
slug: {
required: helpers.withMessage(t('validation.required'), required),
minLength: helpers.withMessage(
t('validation.name_min_length', { count: 3 }),
minLength(3) minLength(3)
), ),
}, },

View File

@ -8,7 +8,11 @@
<BaseInputGroup <BaseInputGroup
:content-loading="isFetchingInitialData" :content-loading="isFetchingInitialData"
:label="$tc('settings.preferences.currency')" :label="$tc('settings.preferences.currency')"
:help-text="$t('settings.preferences.company_currency_unchangeable')" :help-text="
isCurrencyDisabled
? $t('settings.preferences.company_currency_unchangeable')
: ''
"
:error="v$.currency.$error && v$.currency.$errors[0].$message" :error="v$.currency.$error && v$.currency.$errors[0].$message"
required required
> >
@ -21,7 +25,7 @@
:searchable="true" :searchable="true"
track-by="name" track-by="name"
:invalid="v$.currency.$error" :invalid="v$.currency.$error"
disabled :disabled="isCurrencyDisabled"
class="w-full" class="w-full"
> >
</BaseMultiselect> </BaseMultiselect>
@ -187,6 +191,7 @@ const { t, tm } = useI18n()
let isSaving = ref(false) let isSaving = ref(false)
let isDataSaving = ref(false) let isDataSaving = ref(false)
let isFetchingInitialData = ref(false) let isFetchingInitialData = ref(false)
let isCurrencyDisabled = ref(true)
const settingsForm = reactive({ ...companyStore.selectedCompanySettings }) const settingsForm = reactive({ ...companyStore.selectedCompanySettings })
@ -282,10 +287,14 @@ setInitialData()
async function setInitialData() { async function setInitialData() {
isFetchingInitialData.value = true isFetchingInitialData.value = true
Promise.all([ Promise.all([
companyStore.checkCompanyHasCurrencyTransactions(),
globalStore.fetchCurrencies(), globalStore.fetchCurrencies(),
globalStore.fetchDateFormats(), globalStore.fetchDateFormats(),
globalStore.fetchTimeZones(), globalStore.fetchTimeZones(),
]).then(([res1]) => { ]).then(([res1]) => {
if (res1.data?.has_transactions == false) {
isCurrencyDisabled.value = false
}
isFetchingInitialData.value = false isFetchingInitialData.value = false
}) })
} }

View File

@ -0,0 +1,101 @@
<!-- This example requires Tailwind CSS v2.0+ -->
<script lang="ts" setup>
import { Switch, SwitchGroup, SwitchLabel } from '@headlessui/vue'
import { useGlobalStore } from '@/scripts/admin/stores/global'
import { computed, ref } from 'vue'
defineProps({
showLabel: {
type: Boolean,
default: true,
},
vertical: {
type: Boolean,
default: false,
},
})
const globalStore = useGlobalStore()
const enabled = ref(
localStorage.getItem('theme') === 'dark' ||
document.documentElement.classList.contains('dark')
)
globalStore.isDarkModeOn = enabled
function onChange(val) {
if (val) {
localStorage.theme = 'dark'
document.documentElement.classList.add('dark')
document.documentElement.style.setProperty('color-scheme', 'dark')
globalStore.isDarkModeOn = true
} else {
localStorage.theme = 'light'
document.documentElement.classList.remove('dark')
document.documentElement.style.setProperty('color-scheme', 'light')
globalStore.isDarkModeOn = false
}
}
</script>
<template>
<div class="w-full flex justify-center">
<SwitchGroup
as="div"
class="flex items-center"
:class="vertical ? 'flex-col justify-center' : 'flex-row'"
>
<Switch
v-model="enabled"
class="relative inline-flex flex-shrink-0 h-6 w-11 border-2 border-transparent rounded-full cursor-pointer transition-colors ease-in-out duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 dark:ring-offset-gray-700"
:class="[enabled ? 'bg-primary-600' : 'bg-gray-200']"
@update:modelValue="onChange"
>
<span class="sr-only">Use setting</span>
<span
class="pointer-events-none relative inline-block h-5 w-5 rounded-full bg-white shadow transform ring-0 transition ease-in-out duration-200"
:class="[enabled ? 'translate-x-5' : 'translate-x-0']"
>
<span
class="absolute inset-0 h-full w-full flex items-center justify-center transition-opacity"
:class="[
enabled
? 'opacity-0 ease-out duration-100'
: 'opacity-100 ease-in duration-200',
]"
aria-hidden="true"
>
<BaseIcon class="h-3 w-3 text-yellow-500" name="SunIcon" />
</span>
<span
class="absolute inset-0 h-full w-full flex items-center justify-center transition-opacity"
:class="[
enabled
? 'opacity-100 ease-in duration-200'
: 'opacity-0 ease-out duration-100',
]"
aria-hidden="true"
>
<BaseIcon class="h-3 w-3 text-primary-500" name="MoonIcon" />
</span>
</span>
</Switch>
<SwitchLabel
v-if="showLabel"
as="span"
class="cursor-pointer"
:class="vertical ? 'px-1 text-center mt-2' : 'ml-3'"
>
<span
v-if="enabled"
class="text-sm font-medium text-gray-500 dark:text-gray-400"
>
Dark Mode
</span>
<span v-else class="text-sm font-medium text-gray-500">
Light Mode
</span>
</SwitchLabel>
</SwitchGroup>
</div>
</template>

View File

@ -126,7 +126,7 @@ onMounted(() => {
}) })
const value = computed({ const value = computed({
get: () => props.modelValue, get: () => (props.modelValue ? props.modelValue : ''),
set: (value) => { set: (value) => {
emit('update:modelValue', value) emit('update:modelValue', value)
}, },
@ -195,7 +195,9 @@ async function getFields() {
{ label: 'Date', value: 'INVOICE_DATE' }, { label: 'Date', value: 'INVOICE_DATE' },
{ label: 'Due Date', value: 'INVOICE_DUE_DATE' }, { label: 'Due Date', value: 'INVOICE_DUE_DATE' },
{ label: 'Number', value: 'INVOICE_NUMBER' }, { label: 'Number', value: 'INVOICE_NUMBER' },
{ label: 'Ref Number', value: 'INVOICE_REF_NUMBER' }, { label: 'PDF Link', value: 'PDF_LINK' },
{ label: 'Due Amount', value: 'DUE_AMOUNT' },
{ label: 'Total Amount', value: 'TOTAL_AMOUNT' },
...invoiceFields.value.map((i) => ({ ...invoiceFields.value.map((i) => ({
label: i.label, label: i.label,
value: i.slug, value: i.slug,
@ -211,7 +213,8 @@ async function getFields() {
{ label: 'Date', value: 'ESTIMATE_DATE' }, { label: 'Date', value: 'ESTIMATE_DATE' },
{ label: 'Expiry Date', value: 'ESTIMATE_EXPIRY_DATE' }, { label: 'Expiry Date', value: 'ESTIMATE_EXPIRY_DATE' },
{ label: 'Number', value: 'ESTIMATE_NUMBER' }, { label: 'Number', value: 'ESTIMATE_NUMBER' },
{ label: 'Ref Number', value: 'ESTIMATE_REF_NUMBER' }, { label: 'PDF Link', value: 'PDF_LINK' },
{ label: 'Total Amount', value: 'TOTAL_AMOUNT' },
...estimateFields.value.map((i) => ({ ...estimateFields.value.map((i) => ({
label: i.label, label: i.label,
value: i.slug, value: i.slug,
@ -228,6 +231,7 @@ async function getFields() {
{ label: 'Number', value: 'PAYMENT_NUMBER' }, { label: 'Number', value: 'PAYMENT_NUMBER' },
{ label: 'Mode', value: 'PAYMENT_MODE' }, { label: 'Mode', value: 'PAYMENT_MODE' },
{ label: 'Amount', value: 'PAYMENT_AMOUNT' }, { label: 'Amount', value: 'PAYMENT_AMOUNT' },
{ label: 'PDF Link', value: 'PDF_LINK' },
...paymentFields.value.map((i) => ({ ...paymentFields.value.map((i) => ({
label: i.label, label: i.label,
value: i.slug, value: i.slug,

View File

@ -7,52 +7,108 @@
/> />
</BaseContentPlaceholders> </BaseContentPlaceholders>
<div v-else :class="computedContainerClass" class="relative flex flex-row"> <div v-else :class="computedContainerClass">
<svg <date-picker
v-if="showCalendarIcon && !hasIconSlot" ref="vCalendar"
viewBox="0 0 20 20"
fill="currentColor"
class="
absolute
w-4
h-4
mx-2
my-2.5
text-sm
not-italic
font-black
text-gray-400
cursor-pointer
"
@click="onClickDp"
>
<path
fill-rule="evenodd"
d="M6 2a1 1 0 00-1 1v1H4a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2h-1V3a1 1 0 10-2 0v1H7V3a1 1 0 00-1-1zm0 5a1 1 0 000 2h8a1 1 0 100-2H6z"
clip-rule="evenodd"
></path>
</svg>
<slot v-if="showCalendarIcon && hasIconSlot" name="icon" />
<FlatPickr
ref="dp"
v-model="date" v-model="date"
v-bind="$attrs" :mode="mode"
:disabled="disabled" :is24hr="time24hr"
:config="config" class="w-full"
:class="[defaultInputClass, inputInvalidClass, inputDisabledClass]" color="indigo"
/> :input-debounce="500"
:update-on-input="false"
:is-range="false"
trim-weeks
:is-required="isRequired"
:popover="{
visibility: disabled ? 'hidden' : 'focus',
showDelay: 0,
hideDelay: 1,
}"
:attributes="attrs"
:model-config="config"
:masks="masks"
:locale="global.locale"
>
<template
#default="{ inputValue, inputEvents, togglePopover, hidePopover }"
>
<!-- calendar icon -->
<svg
v-if="showCalendarIcon && !hasIconSlot"
viewBox="0 0 20 20"
fill="currentColor"
class="
absolute
w-4
h-4
mx-2
my-2.5
text-sm
not-italic
font-black
text-gray-400
cursor-pointer
"
@click="togglePopover()"
>
<path
fill-rule="evenodd"
d="M6 2a1 1 0 00-1 1v1H4a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2h-1V3a1 1 0 10-2 0v1H7V3a1 1 0 00-1-1zm0 5a1 1 0 000 2h8a1 1 0 100-2H6z"
clip-rule="evenodd"
></path>
</svg>
<slot v-if="showCalendarIcon && hasIconSlot" name="icon" />
<input
:value="inputValue"
:class="[defaultInputClass, inputInvalidClass, inputDisabledClass]"
readonly
v-on="inputEvents"
@blur="hidePopover()"
/>
</template>
<template v-if="showExtraOptions" #footer>
<div
class="bg-gray-100 grid grid-cols-3 gap-2 p-2 border-t rounded-b-lg"
>
<button type="button" class="extra-button" @click="moveToDate(sourceDate)">
{{ global.t('date_picker.same_day') }}
</button>
<button type="button" class="extra-button" @click="withInDays(7)">
{{ global.t('date_picker.within_7_days') }}
</button>
<button type="button" class="extra-button" @click="withInDays(15)">
{{ global.t('date_picker.within_15_days') }}
</button>
<button type="button" class="extra-button" @click="withInDays(30)">
{{ global.t('date_picker.within_30_days') }}
</button>
<button type="button" class="extra-button" @click="withInDays(45)">
{{ global.t('date_picker.within_45_days') }}
</button>
<button type="button" class="extra-button" @click="withInDays(60)">
{{ global.t('date_picker.within_60_days') }}
</button>
</div>
</template>
</date-picker>
</div> </div>
</template> </template>
<script type="text/babel" setup> <script type="text/babel" setup>
import FlatPickr from 'vue-flatpickr-component' import { Calendar, DatePicker } from 'v-calendar'
import 'flatpickr/dist/flatpickr.css' import 'v-calendar/dist/style.css'
import { computed, reactive, watch, ref, useSlots } from 'vue' import { computed, reactive, watch, ref, useSlots } from 'vue'
import { useCompanyStore } from '@/scripts/admin/stores/company' import { useCompanyStore } from '@/scripts/admin/stores/company'
import moment from 'moment'
const dp = ref(null)
const props = defineProps({ const props = defineProps({
modelValue: { modelValue: {
@ -90,36 +146,31 @@ const props = defineProps({
defaultInputClass: { defaultInputClass: {
type: String, type: String,
default: default:
'font-base pl-8 py-2 outline-none focus:ring-primary-400 focus:outline-none focus:border-primary-400 block w-full sm:text-sm border-gray-200 rounded-md text-black', 'border-2 font-base pl-8 py-2 outline-none focus:ring-primary-400 focus:outline-none focus:border-primary-400 block w-full sm:text-sm border-gray-200 rounded-md text-black',
}, },
time24hr: { time24hr: {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
isRequired: {
type: Boolean,
default: false,
},
showExtraOptions: {
type: Boolean,
default: false,
},
sourceDate: {
type: [String, Date],
default: () => new Date(),
}
}) })
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const slots = useSlots() const slots = useSlots()
const companyStore = useCompanyStore() const companyStore = useCompanyStore()
const { global } = window.i18n
let config = reactive({ const vCalendar = ref(null)
altInput: true,
enableTime: props.enableTime,
time_24hr: props.time24hr,
})
const date = computed({
get: () => props.modelValue,
set: (value) => {
emit('update:modelValue', value)
},
})
const carbonFormat = computed(() => {
return companyStore.selectedCompanySettings?.carbon_date_format
})
const hasIconSlot = computed(() => { const hasIconSlot = computed(() => {
return !!slots.icon return !!slots.icon
@ -135,7 +186,6 @@ const inputInvalidClass = computed(() => {
if (props.invalid) { if (props.invalid) {
return 'border-red-400 ring-red-400 focus:ring-red-400 focus:border-red-400' return 'border-red-400 ring-red-400 focus:ring-red-400 focus:border-red-400'
} }
return '' return ''
}) })
@ -143,35 +193,97 @@ const inputDisabledClass = computed(() => {
if (props.disabled) { if (props.disabled) {
return 'border border-solid rounded-md outline-none input-field box-border-2 base-date-picker-input placeholder-gray-400 bg-gray-200 text-gray-600 border-gray-200' return 'border border-solid rounded-md outline-none input-field box-border-2 base-date-picker-input placeholder-gray-400 bg-gray-200 text-gray-600 border-gray-200'
} }
return '' return ''
}) })
function onClickDp(params) { // to convert YYYY-MM-DD | YYYY-MM-DD HH:mm format
dp.value.fp.open() function convertYMDFormat(date) {
let format = props.enableTime ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD'
return date ? moment(date).format(format) : date
} }
watch( const date = computed({
() => props.enableTime, get: () => props.modelValue,
(val) => { set: (value) => {
if (props.enableTime) { emit('update:modelValue', value)
config.enableTime = props.enableTime
}
}, },
{ immediate: true } })
)
const mode = computed(() => {
return props.enableTime ? 'dateTime' : 'date'
})
const config = reactive({
type: 'string',
mask: 'YYYY-MM-DD', // Uses 'iso' if missing
//timeAdjust: '00:00:00',
})
const masks = reactive({
input: null,
inputDateTime: null,
inputDateTime24hr: null,
})
const attrs = reactive([
{
dates: new Date(),
highlight: {
fillMode: 'outline',
},
/* popover: {
label: 'Today Date',
visibility: 'hover',
}, */
},
])
const carbonFormat = computed(() => {
return companyStore.selectedCompanySettings?.moment_date_format
})
watch( watch(
() => carbonFormat, () => carbonFormat,
() => { () => {
if (!props.enableTime) { if (!props.enableTime) {
config.altFormat = carbonFormat.value ? carbonFormat.value : 'd M Y' masks.input = carbonFormat.value ? carbonFormat.value : 'DD MMM YYYY'
config.mask = 'YYYY-MM-DD'
} else { } else {
config.altFormat = carbonFormat.value let timeFormat = 'HH:mm'
? `${carbonFormat.value} H:i ` if (props.time24hr) {
: 'd M Y H:i' masks.inputDateTime24hr = carbonFormat.value
? `${carbonFormat.value} ${timeFormat}`
: `DD MMM YYYY ${timeFormat}`
} else {
masks.inputDateTime = carbonFormat.value
? `${carbonFormat.value} ${timeFormat}`
: `DD MMM YYYY ${timeFormat}`
}
config.mask = `YYYY-MM-DD ${timeFormat}`
} }
}, },
{ immediate: true } { immediate: true }
) )
async function moveToDate(_date) {
const calendar = vCalendar.value
_date = _date ? _date : convertYMDFormat(new Date())
date.value = _date
// await calendar.move(_date)
calendar.hidePopover()
}
async function withInDays(noOfDays) {
if (!noOfDays) return false
let newDate = moment(props.sourceDate).add(noOfDays, 'days').toDate()
newDate = convertYMDFormat(newDate)
moveToDate(newDate)
}
</script> </script>
<style scoped>
.extra-button {
@apply bg-primary-500 text-white text-sm font-semibold px-2 py-1 rounded hover:bg-primary-700;
}
</style>

View File

@ -1,6 +1,10 @@
<template> <template>
<div> <div>
<TabGroup :default-index="defaultIndex" @change="onChange"> <TabGroup
:selected-index="selectedIndex"
:default-index="defaultIndex"
@change="onChange"
>
<TabList <TabList
:class="[ :class="[
'flex border-b border-grey-light', 'flex border-b border-grey-light',
@ -54,6 +58,10 @@ const props = defineProps({
type: Number, type: Number,
default: 0, default: 0,
}, },
selectedIndex: {
type: Number,
default: 0,
},
filter: { filter: {
type: String, type: String,
default: null, default: null,
@ -67,6 +75,6 @@ const slots = useSlots()
const tabs = computed(() => slots.default().map((tab) => tab.props)) const tabs = computed(() => slots.default().map((tab) => tab.props))
function onChange(d) { function onChange(d) {
emit('change', tabs.value[d]) emit('change', tabs.value[d], d)
} }
</script> </script>

View File

@ -3,23 +3,26 @@
width="50" width="50"
height="50" height="50"
viewBox="0 0 50 50" viewBox="0 0 50 50"
:class="colorClass"
fill="none" fill="none"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
> >
<circle cx="25" cy="25" r="25" fill="#EAF1FB" /> <circle cx="25" cy="25" r="25" :class="bgColor" />
<path <path
d="M28.2656 23.0547C27.3021 24.0182 26.1302 24.5 24.75 24.5C23.3698 24.5 22.1849 24.0182 21.1953 23.0547C20.2318 22.0651 19.75 20.8802 19.75 19.5C19.75 18.1198 20.2318 16.9479 21.1953 15.9844C22.1849 14.9948 23.3698 14.5 24.75 14.5C26.1302 14.5 27.3021 14.9948 28.2656 15.9844C29.2552 16.9479 29.75 18.1198 29.75 19.5C29.75 20.8802 29.2552 22.0651 28.2656 23.0547ZM28.2656 25.75C29.6979 25.75 30.9219 26.2708 31.9375 27.3125C32.9792 28.3281 33.5 29.5521 33.5 30.9844V32.625C33.5 33.1458 33.3177 33.5885 32.9531 33.9531C32.5885 34.3177 32.1458 34.5 31.625 34.5H17.875C17.3542 34.5 16.9115 34.3177 16.5469 33.9531C16.1823 33.5885 16 33.1458 16 32.625V30.9844C16 29.5521 16.5078 28.3281 17.5234 27.3125C18.5651 26.2708 19.8021 25.75 21.2344 25.75H21.8984C22.8099 26.1667 23.7604 26.375 24.75 26.375C25.7396 26.375 26.6901 26.1667 27.6016 25.75H28.2656Z" d="M28.2656 23.0547C27.3021 24.0182 26.1302 24.5 24.75 24.5C23.3698 24.5 22.1849 24.0182 21.1953 23.0547C20.2318 22.0651 19.75 20.8802 19.75 19.5C19.75 18.1198 20.2318 16.9479 21.1953 15.9844C22.1849 14.9948 23.3698 14.5 24.75 14.5C26.1302 14.5 27.3021 14.9948 28.2656 15.9844C29.2552 16.9479 29.75 18.1198 29.75 19.5C29.75 20.8802 29.2552 22.0651 28.2656 23.0547ZM28.2656 25.75C29.6979 25.75 30.9219 26.2708 31.9375 27.3125C32.9792 28.3281 33.5 29.5521 33.5 30.9844V32.625C33.5 33.1458 33.3177 33.5885 32.9531 33.9531C32.5885 34.3177 32.1458 34.5 31.625 34.5H17.875C17.3542 34.5 16.9115 34.3177 16.5469 33.9531C16.1823 33.5885 16 33.1458 16 32.625V30.9844C16 29.5521 16.5078 28.3281 17.5234 27.3125C18.5651 26.2708 19.8021 25.75 21.2344 25.75H21.8984C22.8099 26.1667 23.7604 26.375 24.75 26.375C25.7396 26.375 26.6901 26.1667 27.6016 25.75H28.2656Z"
fill="currentColor" :class="color"
/> />
</svg> </svg>
</template> </template>
<script setup> <script setup>
const props = defineProps({ const props = defineProps({
colorClass: { color: {
type: String, type: String,
default: 'text-primary-500', default: 'fill-primary-500 dark:fill-white',
},
bgColor: {
type: String,
default: 'fill-gray-100 dark:fill-primary-400',
}, },
}) })
</script> </script>

View File

@ -6,10 +6,24 @@
fill="none" fill="none"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
> >
<circle cx="25" cy="25" r="25" fill="#FDE4E5" /> <circle :class="bgColor" cx="25" cy="25" r="25" />
<path <path
:class="color"
d="M27.2031 23.6016C28.349 23.9401 29.2083 24.6562 29.7812 25.75C30.3802 26.8438 30.4714 27.9766 30.0547 29.1484C29.7422 30.0078 29.2083 30.6979 28.4531 31.2188C27.6979 31.7135 26.8516 31.974 25.9141 32V33.875C25.9141 34.0573 25.849 34.2005 25.7188 34.3047C25.6146 34.4349 25.4714 34.5 25.2891 34.5H24.0391C23.8568 34.5 23.7005 34.4349 23.5703 34.3047C23.4661 34.2005 23.4141 34.0573 23.4141 33.875V32C22.1641 32 21.0443 31.6094 20.0547 30.8281C19.8984 30.6979 19.8073 30.5417 19.7812 30.3594C19.7552 30.1771 19.8203 30.0208 19.9766 29.8906L21.3047 28.5625C21.5651 28.3281 21.8255 28.3021 22.0859 28.4844C22.4766 28.7448 22.9193 28.875 23.4141 28.875H25.9922C26.3307 28.875 26.6042 28.7708 26.8125 28.5625C27.0469 28.3281 27.1641 28.0417 27.1641 27.7031C27.1641 27.1302 26.8906 26.7656 26.3438 26.6094L22.3203 25.4375C21.4349 25.1771 20.6927 24.7083 20.0938 24.0312C19.4948 23.3542 19.1432 22.5729 19.0391 21.6875C18.9349 20.4115 19.2995 19.3177 20.1328 18.4062C20.9922 17.4688 22.0599 17 23.3359 17H23.4141V15.125C23.4141 14.9427 23.4661 14.7995 23.5703 14.6953C23.7005 14.5651 23.8568 14.5 24.0391 14.5H25.2891C25.4714 14.5 25.6146 14.5651 25.7188 14.6953C25.849 14.7995 25.9141 14.9427 25.9141 15.125V17C27.1641 17 28.2839 17.3906 29.2734 18.1719C29.4297 18.3021 29.5208 18.4583 29.5469 18.6406C29.5729 18.8229 29.5078 18.9792 29.3516 19.1094L28.0234 20.4375C27.763 20.6719 27.5026 20.6979 27.2422 20.5156C26.8516 20.2552 26.4089 20.125 25.9141 20.125H23.3359C22.9974 20.125 22.7109 20.2422 22.4766 20.4766C22.2682 20.6849 22.1641 20.9583 22.1641 21.2969C22.1641 21.5312 22.2422 21.7526 22.3984 21.9609C22.5547 22.1693 22.75 22.3125 22.9844 22.3906L27.2031 23.6016Z" d="M27.2031 23.6016C28.349 23.9401 29.2083 24.6562 29.7812 25.75C30.3802 26.8438 30.4714 27.9766 30.0547 29.1484C29.7422 30.0078 29.2083 30.6979 28.4531 31.2188C27.6979 31.7135 26.8516 31.974 25.9141 32V33.875C25.9141 34.0573 25.849 34.2005 25.7188 34.3047C25.6146 34.4349 25.4714 34.5 25.2891 34.5H24.0391C23.8568 34.5 23.7005 34.4349 23.5703 34.3047C23.4661 34.2005 23.4141 34.0573 23.4141 33.875V32C22.1641 32 21.0443 31.6094 20.0547 30.8281C19.8984 30.6979 19.8073 30.5417 19.7812 30.3594C19.7552 30.1771 19.8203 30.0208 19.9766 29.8906L21.3047 28.5625C21.5651 28.3281 21.8255 28.3021 22.0859 28.4844C22.4766 28.7448 22.9193 28.875 23.4141 28.875H25.9922C26.3307 28.875 26.6042 28.7708 26.8125 28.5625C27.0469 28.3281 27.1641 28.0417 27.1641 27.7031C27.1641 27.1302 26.8906 26.7656 26.3438 26.6094L22.3203 25.4375C21.4349 25.1771 20.6927 24.7083 20.0938 24.0312C19.4948 23.3542 19.1432 22.5729 19.0391 21.6875C18.9349 20.4115 19.2995 19.3177 20.1328 18.4062C20.9922 17.4688 22.0599 17 23.3359 17H23.4141V15.125C23.4141 14.9427 23.4661 14.7995 23.5703 14.6953C23.7005 14.5651 23.8568 14.5 24.0391 14.5H25.2891C25.4714 14.5 25.6146 14.5651 25.7188 14.6953C25.849 14.7995 25.9141 14.9427 25.9141 15.125V17C27.1641 17 28.2839 17.3906 29.2734 18.1719C29.4297 18.3021 29.5208 18.4583 29.5469 18.6406C29.5729 18.8229 29.5078 18.9792 29.3516 19.1094L28.0234 20.4375C27.763 20.6719 27.5026 20.6979 27.2422 20.5156C26.8516 20.2552 26.4089 20.125 25.9141 20.125H23.3359C22.9974 20.125 22.7109 20.2422 22.4766 20.4766C22.2682 20.6849 22.1641 20.9583 22.1641 21.2969C22.1641 21.5312 22.2422 21.7526 22.3984 21.9609C22.5547 22.1693 22.75 22.3125 22.9844 22.3906L27.2031 23.6016Z"
fill="#FB7178" fill="#FB7178"
/> />
</svg> </svg>
</template> </template>
<script setup>
const props = defineProps({
color: {
type: String,
default: 'fill-red-400 dark:fill-white',
},
bgColor: {
type: String,
default: 'fill-red-100 dark:fill-red-400',
},
})
</script>

View File

@ -5,21 +5,24 @@
viewBox="0 0 50 50" viewBox="0 0 50 50"
fill="none" fill="none"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
:class="colorClass"
> >
<circle cx="25" cy="25" r="25" fill="#EAF1FB" /> <circle cx="25" cy="25" r="25" :class="bgColor" />
<path <path
d="M26.75 19.8125C26.75 20.0729 26.8411 20.2943 27.0234 20.4766C27.2057 20.6589 27.4271 20.75 27.6875 20.75H33V33.5625C33 33.8229 32.9089 34.0443 32.7266 34.2266C32.5443 34.4089 32.3229 34.5 32.0625 34.5H18.9375C18.6771 34.5 18.4557 34.4089 18.2734 34.2266C18.0911 34.0443 18 33.8229 18 33.5625V15.4375C18 15.1771 18.0911 14.9557 18.2734 14.7734C18.4557 14.5911 18.6771 14.5 18.9375 14.5H26.75V19.8125ZM33 19.2656V19.5H28V14.5H28.2344C28.4948 14.5 28.7161 14.5911 28.8984 14.7734L32.7266 18.6016C32.9089 18.7839 33 19.0052 33 19.2656Z" d="M26.75 19.8125C26.75 20.0729 26.8411 20.2943 27.0234 20.4766C27.2057 20.6589 27.4271 20.75 27.6875 20.75H33V33.5625C33 33.8229 32.9089 34.0443 32.7266 34.2266C32.5443 34.4089 32.3229 34.5 32.0625 34.5H18.9375C18.6771 34.5 18.4557 34.4089 18.2734 34.2266C18.0911 34.0443 18 33.8229 18 33.5625V15.4375C18 15.1771 18.0911 14.9557 18.2734 14.7734C18.4557 14.5911 18.6771 14.5 18.9375 14.5H26.75V19.8125ZM33 19.2656V19.5H28V14.5H28.2344C28.4948 14.5 28.7161 14.5911 28.8984 14.7734L32.7266 18.6016C32.9089 18.7839 33 19.0052 33 19.2656Z"
fill="currentColor" :class="color"
/> />
</svg> </svg>
</template> </template>
<script setup> <script setup>
const props = defineProps({ const props = defineProps({
colorClass: { color: {
type: String, type: String,
default: 'text-primary-500', default: 'fill-primary-500 dark:fill-white',
},
bgColor: {
type: String,
default: 'fill-gray-100 dark:fill-primary-400',
}, },
}) })
</script> </script>

View File

@ -5,21 +5,24 @@
viewBox="0 0 50 50" viewBox="0 0 50 50"
fill="none" fill="none"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
:class="colorClass"
> >
<circle cx="25" cy="25" r="25" fill="#EAF1FB" /> <circle cx="25" cy="25" r="25" :class="bgColor" />
<path <path
d="M28.25 24.5V27H20.75V24.5H28.25ZM31.7266 18.6016C31.9089 18.7839 32 19.0052 32 19.2656V19.5H27V14.5H27.2344C27.4948 14.5 27.7161 14.5911 27.8984 14.7734L31.7266 18.6016ZM25.75 19.8125C25.75 20.0729 25.8411 20.2943 26.0234 20.4766C26.2057 20.6589 26.4271 20.75 26.6875 20.75H32V33.5625C32 33.8229 31.9089 34.0443 31.7266 34.2266C31.5443 34.4089 31.3229 34.5 31.0625 34.5H17.9375C17.6771 34.5 17.4557 34.4089 17.2734 34.2266C17.0911 34.0443 17 33.8229 17 33.5625V15.4375C17 15.1771 17.0911 14.9557 17.2734 14.7734C17.4557 14.5911 17.6771 14.5 17.9375 14.5H25.75V19.8125ZM19.5 17.3125V17.9375C19.5 18.1458 19.6042 18.25 19.8125 18.25H22.9375C23.1458 18.25 23.25 18.1458 23.25 17.9375V17.3125C23.25 17.1042 23.1458 17 22.9375 17H19.8125C19.6042 17 19.5 17.1042 19.5 17.3125ZM19.5 19.8125V20.4375C19.5 20.6458 19.6042 20.75 19.8125 20.75H22.9375C23.1458 20.75 23.25 20.6458 23.25 20.4375V19.8125C23.25 19.6042 23.1458 19.5 22.9375 19.5H19.8125C19.6042 19.5 19.5 19.6042 19.5 19.8125ZM29.5 31.6875V31.0625C29.5 30.8542 29.3958 30.75 29.1875 30.75H26.0625C25.8542 30.75 25.75 30.8542 25.75 31.0625V31.6875C25.75 31.8958 25.8542 32 26.0625 32H29.1875C29.3958 32 29.5 31.8958 29.5 31.6875ZM29.5 23.875C29.5 23.6927 29.4349 23.5495 29.3047 23.4453C29.2005 23.3151 29.0573 23.25 28.875 23.25H20.125C19.9427 23.25 19.7865 23.3151 19.6562 23.4453C19.5521 23.5495 19.5 23.6927 19.5 23.875V27.625C19.5 27.8073 19.5521 27.9635 19.6562 28.0938C19.7865 28.1979 19.9427 28.25 20.125 28.25H28.875C29.0573 28.25 29.2005 28.1979 29.3047 28.0938C29.4349 27.9635 29.5 27.8073 29.5 27.625V23.875Z" d="M28.25 24.5V27H20.75V24.5H28.25ZM31.7266 18.6016C31.9089 18.7839 32 19.0052 32 19.2656V19.5H27V14.5H27.2344C27.4948 14.5 27.7161 14.5911 27.8984 14.7734L31.7266 18.6016ZM25.75 19.8125C25.75 20.0729 25.8411 20.2943 26.0234 20.4766C26.2057 20.6589 26.4271 20.75 26.6875 20.75H32V33.5625C32 33.8229 31.9089 34.0443 31.7266 34.2266C31.5443 34.4089 31.3229 34.5 31.0625 34.5H17.9375C17.6771 34.5 17.4557 34.4089 17.2734 34.2266C17.0911 34.0443 17 33.8229 17 33.5625V15.4375C17 15.1771 17.0911 14.9557 17.2734 14.7734C17.4557 14.5911 17.6771 14.5 17.9375 14.5H25.75V19.8125ZM19.5 17.3125V17.9375C19.5 18.1458 19.6042 18.25 19.8125 18.25H22.9375C23.1458 18.25 23.25 18.1458 23.25 17.9375V17.3125C23.25 17.1042 23.1458 17 22.9375 17H19.8125C19.6042 17 19.5 17.1042 19.5 17.3125ZM19.5 19.8125V20.4375C19.5 20.6458 19.6042 20.75 19.8125 20.75H22.9375C23.1458 20.75 23.25 20.6458 23.25 20.4375V19.8125C23.25 19.6042 23.1458 19.5 22.9375 19.5H19.8125C19.6042 19.5 19.5 19.6042 19.5 19.8125ZM29.5 31.6875V31.0625C29.5 30.8542 29.3958 30.75 29.1875 30.75H26.0625C25.8542 30.75 25.75 30.8542 25.75 31.0625V31.6875C25.75 31.8958 25.8542 32 26.0625 32H29.1875C29.3958 32 29.5 31.8958 29.5 31.6875ZM29.5 23.875C29.5 23.6927 29.4349 23.5495 29.3047 23.4453C29.2005 23.3151 29.0573 23.25 28.875 23.25H20.125C19.9427 23.25 19.7865 23.3151 19.6562 23.4453C19.5521 23.5495 19.5 23.6927 19.5 23.875V27.625C19.5 27.8073 19.5521 27.9635 19.6562 28.0938C19.7865 28.1979 19.9427 28.25 20.125 28.25H28.875C29.0573 28.25 29.2005 28.1979 29.3047 28.0938C29.4349 27.9635 29.5 27.8073 29.5 27.625V23.875Z"
fill="currentColor" :class="color"
/> />
</svg> </svg>
</template> </template>
<script setup> <script setup>
const props = defineProps({ const props = defineProps({
colorClass: { color: {
type: String, type: String,
default: 'text-primary-500', default: 'fill-primary-500 dark:fill-white',
},
bgColor: {
type: String,
default: 'fill-gray-100 dark:fill-primary-400',
}, },
}) })
</script> </script>

View File

@ -7,12 +7,12 @@ export function usePopper(options) {
let popper = ref(null) let popper = ref(null)
onMounted(() => { onMounted(() => {
watchEffect(onInvalidate => { watchEffect((onInvalidate) => {
if (!container.value) return if (!container.value) return
if (!activator.value) return if (!activator.value) return
let containerEl = container.value.el || container.value let containerEl = container.value.el || container.value
let activatorEl = activator.value.el || activator.value let activatorEl = activator.value.$el || activator.value
if (!(activatorEl instanceof HTMLElement)) return if (!(activatorEl instanceof HTMLElement)) return
if (!(containerEl instanceof HTMLElement)) return if (!(containerEl instanceof HTMLElement)) return

View File

@ -4,7 +4,7 @@
"customers": "العملاء", "customers": "العملاء",
"items": "بضائع/خدمات", "items": "بضائع/خدمات",
"invoices": "الفواتير", "invoices": "الفواتير",
"recurring-invoices": "الفواتير المتكررة", "recurring-invoices": "Recurring Invoices",
"expenses": "النفقات", "expenses": "النفقات",
"estimates": "التقديرات", "estimates": "التقديرات",
"payments": "الدفوعات", "payments": "الدفوعات",
@ -12,7 +12,7 @@
"settings": "الإعدادات", "settings": "الإعدادات",
"logout": "تسجيل الخروج", "logout": "تسجيل الخروج",
"users": "المستخدمون", "users": "المستخدمون",
"modules": "الإضافات" "modules": "Modules"
}, },
"general": { "general": {
"add_company": "أضف شركة", "add_company": "أضف شركة",
@ -29,9 +29,9 @@
"to_date": "إلى تاريخ", "to_date": "إلى تاريخ",
"from": "من", "from": "من",
"to": "إلى", "to": "إلى",
"ok": "حسناً", "ok": "Ok",
"yes": "نعم", "yes": "Yes",
"no": "لا", "no": "No",
"sort_by": "ترتيب حسب", "sort_by": "ترتيب حسب",
"ascending": "تصاعدي", "ascending": "تصاعدي",
"descending": "تنازلي", "descending": "تنازلي",
@ -39,7 +39,7 @@
"body": "الجسم", "body": "الجسم",
"message": "رسالة", "message": "رسالة",
"send": "إرسال", "send": "إرسال",
"preview": "معاينة", "preview": "Preview",
"go_back": "إلى الخلف", "go_back": "إلى الخلف",
"back_to_login": "العودة إلى تسجيل الدخول؟", "back_to_login": "العودة إلى تسجيل الدخول؟",
"home": "الرئيسية", "home": "الرئيسية",
@ -65,7 +65,7 @@
"sent": "ارسلت", "sent": "ارسلت",
"all": "الكل", "all": "الكل",
"select_all": "تحديد الكل", "select_all": "تحديد الكل",
"select_template": "تحديد القالب", "select_template": "Select Template",
"choose_file": "اضغط هنا لاختيار ملف", "choose_file": "اضغط هنا لاختيار ملف",
"choose_template": "اختيار القالب", "choose_template": "اختيار القالب",
"choose": "اختر", "choose": "اختر",
@ -93,14 +93,14 @@
"no_note_found": "لم يتم العثور على الملاحظة", "no_note_found": "لم يتم العثور على الملاحظة",
"insert_note": "أدخل ملاحظة", "insert_note": "أدخل ملاحظة",
"copied_pdf_url_clipboard": "تم نسخ رابط PDF إلى الحافظة!", "copied_pdf_url_clipboard": "تم نسخ رابط PDF إلى الحافظة!",
"copied_url_clipboard": "تم نسخ الرابط إلى الحافظة!", "copied_url_clipboard": "Copied url to clipboard!",
"docs": "المستندات", "docs": "Docs",
"do_you_wish_to_continue": "هل ترغب في المتابعة؟", "do_you_wish_to_continue": "Do you wish to continue?",
"note": "ملاحظة", "note": "Note",
"pay_invoice": "سدد الفاتورة", "pay_invoice": "Pay Invoice",
"login_successfully": "تم تسجيل الدخول بنجاح!", "login_successfully": "Logged in successfully!",
"logged_out_successfully": "تم تسجيل الخروج", "logged_out_successfully": "Logged out successfully",
"mark_as_default": "تحديد كافتراضي" "mark_as_default": "Mark as default"
}, },
"dashboard": { "dashboard": {
"select_year": "اختر السنة", "select_year": "اختر السنة",
@ -109,7 +109,7 @@
"customers": "العملاء", "customers": "العملاء",
"invoices": "الفواتير", "invoices": "الفواتير",
"estimates": "التقديرات", "estimates": "التقديرات",
"payments": "المدفوعات" "payments": "Payments"
}, },
"chart_info": { "chart_info": {
"total_sales": "المبيعات", "total_sales": "المبيعات",
@ -151,27 +151,27 @@
"no_results_found": "لم يتم العثور على نتائج" "no_results_found": "لم يتم العثور على نتائج"
}, },
"company_switcher": { "company_switcher": {
"label": "تبديل الشركة", "label": "SWITCH COMPANY",
"no_results_found": "لا توجد نتائج", "no_results_found": "No Results Found",
"add_new_company": "إضافة شركة جديدة", "add_new_company": "Add new company",
"new_company": "شركة جديدة", "new_company": "New company",
"created_message": "تم إنشاء الشركة بنجاح" "created_message": "Company created successfully"
}, },
"dateRange": { "dateRange": {
"today": "اليوم", "today": "Today",
"this_week": "هذا الاسبوع", "this_week": "This Week",
"this_month": "هذا الشهر", "this_month": "This Month",
"this_quarter": "هذا الربع", "this_quarter": "This Quarter",
"this_year": "هذه السنة", "this_year": "This Year",
"previous_week": "الأسبوع السابق", "previous_week": "Previous Week",
"previous_month": "الشهر الماضي", "previous_month": "Previous Month",
"previous_quarter": "الربع السابق", "previous_quarter": "Previous Quarter",
"previous_year": "السنة الماضية", "previous_year": "Previous Year",
"custom": "مخصص" "custom": "Custom"
}, },
"customers": { "customers": {
"title": "العملاء", "title": "العملاء",
"prefix": "البادئة", "prefix": "Prefix",
"add_customer": "إضافة عميل", "add_customer": "إضافة عميل",
"contacts_list": "قائمة العملاء", "contacts_list": "قائمة العملاء",
"name": "الاسم", "name": "الاسم",
@ -186,9 +186,9 @@
"phone": "الهاتف", "phone": "الهاتف",
"website": "موقع الإنترنت", "website": "موقع الإنترنت",
"overview": "استعراض", "overview": "استعراض",
"invoice_prefix": "بادئة الفاتورة", "invoice_prefix": "Invoice Prefix",
"estimate_prefix": "بادئة رقم التقدير", "estimate_prefix": "Estimate Prefix",
"payment_prefix": "بادئة رقم الدفعة", "payment_prefix": "Payment Prefix",
"enable_portal": "تفعيل البوابة", "enable_portal": "تفعيل البوابة",
"country": "الدولة", "country": "الدولة",
"state": "الولاية/المنطقة", "state": "الولاية/المنطقة",
@ -197,7 +197,7 @@
"added_on": "أضيف في", "added_on": "أضيف في",
"action": "إجراء", "action": "إجراء",
"password": "كلمة المرور", "password": "كلمة المرور",
"confirm_password": "تأكيد كلمة المرور", "confirm_password": "Confirm Password",
"street_number": "رقم الشارع", "street_number": "رقم الشارع",
"primary_currency": "العملة الرئيسية", "primary_currency": "العملة الرئيسية",
"description": "الوصف", "description": "الوصف",
@ -208,10 +208,10 @@
"new_customer": "عميل جديد", "new_customer": "عميل جديد",
"edit_customer": "تعديل عميل", "edit_customer": "تعديل عميل",
"basic_info": "معلوات أساسية", "basic_info": "معلوات أساسية",
"portal_access": "الوصول إلى بوابة العملاء", "portal_access": "Portal Access",
"portal_access_text": "هل تريد السماح لهذا العميل بتسجيل الدخول إلى بوابة العملاء؟", "portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
"portal_access_url": "رابط بوابة العملاء", "portal_access_url": "Customer Portal Login URL",
"portal_access_url_help": "يرجى نسخ وإعادة إرسال عنوان URL أعلاه إلى الزبون لتوفير الوصول.", "portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
"billing_address": "عنوان الفوترة", "billing_address": "عنوان الفوترة",
"shipping_address": "عنوان الشحن", "shipping_address": "عنوان الشحن",
"copy_billing_address": "نسخ من عنوان الفوترة", "copy_billing_address": "نسخ من عنوان الفوترة",
@ -231,9 +231,9 @@
"confirm_delete": "لن تتمكن من استرداد هذا العميل وجميع الفواتير والتقديرات والمدفوعات ذات الصلة. | لن تتمكن من استرداد هؤلاء العملاء وجميع الفواتير والتقديرات والمدفوعات ذات الصلة.", "confirm_delete": "لن تتمكن من استرداد هذا العميل وجميع الفواتير والتقديرات والمدفوعات ذات الصلة. | لن تتمكن من استرداد هؤلاء العملاء وجميع الفواتير والتقديرات والمدفوعات ذات الصلة.",
"created_message": "تم إنشاء العملاء بنجاح", "created_message": "تم إنشاء العملاء بنجاح",
"updated_message": "تم تحديث العملاء بنجاح", "updated_message": "تم تحديث العملاء بنجاح",
"address_updated_message": "تم تحديث العنوان بنجاح", "address_updated_message": "Address Information Updated succesfully",
"deleted_message": "تم حذف العملاء بنجاح | تم حذف العميل بنجاح", "deleted_message": "تم حذف العملاء بنجاح | تم حذف العميل بنجاح",
"edit_currency_not_allowed": "لا يمكن تغيير العملة بمجرد إنشاء معاملة." "edit_currency_not_allowed": "Cannot change currency once transactions created."
}, },
"items": { "items": {
"title": "الأصناف", "title": "الأصناف",
@ -265,8 +265,8 @@
}, },
"estimates": { "estimates": {
"title": "التقديرات", "title": "التقديرات",
"accept_estimate": "قبول التقدير", "accept_estimate": "Accept Estimate",
"reject_estimate": "رفض التقدير", "reject_estimate": "Reject Estimate",
"estimate": "تقدير | تقديرات", "estimate": "تقدير | تقديرات",
"estimates_list": "قائمة التقديرات", "estimates_list": "قائمة التقديرات",
"days": "{days} أيام", "days": "{days} أيام",
@ -318,10 +318,10 @@
}, },
"accepted": "مقبول", "accepted": "مقبول",
"rejected": "مرفوض", "rejected": "مرفوض",
"expired": "انتهت مدة الصلاحية", "expired": "Expired",
"sent": "مرسل", "sent": "مرسل",
"draft": "مسودة", "draft": "مسودة",
"viewed": "تمت المشاهدة", "viewed": "Viewed",
"declined": "مرفوض", "declined": "مرفوض",
"new_estimate": "تقدير جديد", "new_estimate": "تقدير جديد",
"add_new_estimate": "إضافة تقدير جديد", "add_new_estimate": "إضافة تقدير جديد",
@ -355,14 +355,14 @@
"select_an_item": "اكتب أو اختر الصنف", "select_an_item": "اكتب أو اختر الصنف",
"type_item_description": "اكتب وصف الصنف (اختياري)" "type_item_description": "اكتب وصف الصنف (اختياري)"
}, },
"mark_as_default_estimate_template_description": "في حالة التعفيل، سيتم اختيار القالب المحدد تلقائياً للتقديرات الجديدة." "mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
}, },
"invoices": { "invoices": {
"title": "الفواتير", "title": "الفواتير",
"download": "تحميل", "download": "Download",
"pay_invoice": "سدد الفاتورة", "pay_invoice": "Pay Invoice",
"invoices_list": "قائمة الفواتير", "invoices_list": "قائمة الفواتير",
"invoice_information": "معلومات الفاتورة", "invoice_information": "Invoice Information",
"days": "{days} أيام", "days": "{days} أيام",
"months": "{months} أشهر", "months": "{months} أشهر",
"years": "{years} سنوات", "years": "{years} سنوات",
@ -397,13 +397,13 @@
"send_invoice": "إرسال الفاتورة", "send_invoice": "إرسال الفاتورة",
"resend_invoice": "إعادة إرسال الفاتورة", "resend_invoice": "إعادة إرسال الفاتورة",
"invoice_template": "قالب الفاتورة", "invoice_template": "قالب الفاتورة",
"conversion_message": "تم استنساخ الفاتورة بنجاح", "conversion_message": "Invoice cloned successful",
"template": "قالب", "template": "قالب",
"mark_as_sent": "تحديد كمرسل", "mark_as_sent": "تحديد كمرسل",
"confirm_send_invoice": "سيتم إرسال هذه الفاتورة بالبريد الألكتروني إلى العميل", "confirm_send_invoice": "سيتم إرسال هذه الفاتورة بالبريد الألكتروني إلى العميل",
"invoice_mark_as_sent": "سيتم تحديد هذه الفاتورة كمرسلة", "invoice_mark_as_sent": "سيتم تحديد هذه الفاتورة كمرسلة",
"confirm_mark_as_accepted": "سيتم تحديد هذه الفاتورة كمقبولة", "confirm_mark_as_accepted": "This invoice will be marked as Accepted",
"confirm_mark_as_rejected": "سيتم تحديد هذه الفاتورة كمرفوضة", "confirm_mark_as_rejected": "This invoice will be marked as Rejected",
"confirm_send": "سيتم إرسال هذه الفاتورة بالبريد الألكتروني إلى العميل", "confirm_send": "سيتم إرسال هذه الفاتورة بالبريد الألكتروني إلى العميل",
"invoice_date": "تاريخ الفاتورة", "invoice_date": "تاريخ الفاتورة",
"record_payment": "تسجيل مدفوعات", "record_payment": "تسجيل مدفوعات",
@ -415,13 +415,13 @@
"update_invoice": "تحديث الفاتورة", "update_invoice": "تحديث الفاتورة",
"add_new_tax": "إضافة ضريبة جديدة", "add_new_tax": "إضافة ضريبة جديدة",
"no_invoices": "لا يوجد فواتير حتى الآن!", "no_invoices": "لا يوجد فواتير حتى الآن!",
"mark_as_rejected": "تحديد كمرفوض", "mark_as_rejected": "Mark as rejected",
"mark_as_accepted": "تحديد كمقبول", "mark_as_accepted": "Mark as accepted",
"list_of_invoices": "قائمة الفواتير .", "list_of_invoices": "قائمة الفواتير .",
"select_invoice": "اختر الفاتورة", "select_invoice": "اختر الفاتورة",
"no_matching_invoices": "لا يوجد فواتير مطابقة!", "no_matching_invoices": "لا يوجد فواتير مطابقة!",
"mark_as_sent_successfully": "تم تحديد الفاتورة كمرسلة بنجاح", "mark_as_sent_successfully": "تم تحديد الفاتورة كمرسلة بنجاح",
"invoice_sent_successfully": "تم إرسال الفاتورة بنجاح", "invoice_sent_successfully": "Invoice sent successfully",
"cloned_successfully": "تم استنساخ الفاتورة بنجاح", "cloned_successfully": "تم استنساخ الفاتورة بنجاح",
"clone_invoice": "استنساخ الفاتورة", "clone_invoice": "استنساخ الفاتورة",
"confirm_clone": "سيتم استنساخ هذه الفاتورة في فاتورة جديدة", "confirm_clone": "سيتم استنساخ هذه الفاتورة في فاتورة جديدة",
@ -447,14 +447,14 @@
"marked_as_sent_message": "تم إرسال الفاتورة بنجاح", "marked_as_sent_message": "تم إرسال الفاتورة بنجاح",
"something_went_wrong": "خطأ غير معروف!", "something_went_wrong": "خطأ غير معروف!",
"invalid_due_amount_message": "المبلغ النهائي للفاتورة لا يمكن أن يكون أقل من المبلغ المطلوب لها. رجاءاً حدث الفاتورة أو قم بحذف المدفوعات المرتبطة بها للاستمرار.", "invalid_due_amount_message": "المبلغ النهائي للفاتورة لا يمكن أن يكون أقل من المبلغ المطلوب لها. رجاءاً حدث الفاتورة أو قم بحذف المدفوعات المرتبطة بها للاستمرار.",
"mark_as_default_invoice_template_description": "في حالة التفعيل، سيتم اختيار القالب المحدد تلقائياً للفواتير الجديدة." "mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
}, },
"recurring_invoices": { "recurring_invoices": {
"title": "الفواتير المتكررة", "title": "Recurring Invoices",
"invoices_list": "الفواتير المتكررة", "invoices_list": "Recurring Invoices List",
"days": "{days} أيام", "days": "{days} Days",
"months": "{months} أشهر", "months": "{months} Month",
"years": "{years} سنوات", "years": "{years} Year",
"all": "All", "all": "All",
"paid": "Paid", "paid": "Paid",
"unpaid": "Unpaid", "unpaid": "Unpaid",
@ -1485,7 +1485,7 @@
"pdf_estimate_label": "تقدير", "pdf_estimate_label": "تقدير",
"pdf_estimate_number": "رقم تقدير", "pdf_estimate_number": "رقم تقدير",
"pdf_estimate_date": "تاريخ التقدير", "pdf_estimate_date": "تاريخ التقدير",
"pdf_estimate_expire_date": "Expiry Date", "pdf_estimate_expire_date": "تاريخ انتهاء الصلاحية",
"pdf_invoice_label": "الفاتورة", "pdf_invoice_label": "الفاتورة",
"pdf_invoice_number": "رقم الفاتورة", "pdf_invoice_number": "رقم الفاتورة",
"pdf_invoice_date": "تاريخ الفاتورة", "pdf_invoice_date": "تاريخ الفاتورة",

View File

@ -112,7 +112,7 @@
"payments": "Platby" "payments": "Platby"
}, },
"chart_info": { "chart_info": {
"total_sales": "Prodeje", "total_sales": "Slevy",
"total_receipts": "Doklady", "total_receipts": "Doklady",
"total_expense": "Výdaje", "total_expense": "Výdaje",
"net_income": "Čistý příjem", "net_income": "Čistý příjem",
@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Odhad", "pdf_estimate_label": "Odhad",
"pdf_estimate_number": "Číslo odhadu", "pdf_estimate_number": "Číslo odhadu",
"pdf_estimate_date": "Datum odhadu", "pdf_estimate_date": "Datum odhadu",
"pdf_estimate_expire_date": "Datum expirace", "pdf_estimate_expire_date": "Doba platnosti",
"pdf_invoice_label": "Faktura", "pdf_invoice_label": "Faktura",
"pdf_invoice_number": "Číslo faktury", "pdf_invoice_number": "Číslo faktury",
"pdf_invoice_date": "Datum fakturace", "pdf_invoice_date": "Datum fakturace",
@ -1495,7 +1495,7 @@
"pdf_quantity_label": "Množství", "pdf_quantity_label": "Množství",
"pdf_price_label": "Cena", "pdf_price_label": "Cena",
"pdf_discount_label": "Sleva", "pdf_discount_label": "Sleva",
"pdf_amount_label": "Částka", "pdf_amount_label": "Množství",
"pdf_subtotal": "Mezisoučet", "pdf_subtotal": "Mezisoučet",
"pdf_total": "Celkem", "pdf_total": "Celkem",
"pdf_payment_label": "Platba", "pdf_payment_label": "Platba",

View File

@ -688,7 +688,7 @@
"other_modules": "Weitere Module", "other_modules": "Weitere Module",
"view_all": "Alle Anzeigen", "view_all": "Alle Anzeigen",
"no_reviews_found": "Für dieses Modul gibt es noch keine Bewertungen!", "no_reviews_found": "Für dieses Modul gibt es noch keine Bewertungen!",
"module_not_purchased": "Modul noch nicht erworben", "module_not_purchased": "Module Not Purchased",
"module_not_found": "Modul nicht gefunden", "module_not_found": "Modul nicht gefunden",
"version_not_supported": "This module version doesn't support the current version of Crater", "version_not_supported": "This module version doesn't support the current version of Crater",
"last_updated": "Zuletzt aktualisiert am", "last_updated": "Zuletzt aktualisiert am",
@ -1113,7 +1113,7 @@
"default_currency_error": "Diese Währung wird bereits in einem der aktiven Anbieter verwendet", "default_currency_error": "Diese Währung wird bereits in einem der aktiven Anbieter verwendet",
"exchange_help_text": "Wechselkurs eingeben um von {currency} nach {baseCurrency} zu konvertieren", "exchange_help_text": "Wechselkurs eingeben um von {currency} nach {baseCurrency} zu konvertieren",
"currency_freak": "CurrencyFreaks", "currency_freak": "CurrencyFreaks",
"currency_layer": "Währungsebene", "currency_layer": "Currency Layer",
"open_exchange_rate": "Open Exchange Rate", "open_exchange_rate": "Open Exchange Rate",
"currency_converter": "Währungsumrechner", "currency_converter": "Währungsumrechner",
"server": "Server", "server": "Server",
@ -1150,8 +1150,8 @@
"payment_mode_added": "Zahlungsart hinzugefügt", "payment_mode_added": "Zahlungsart hinzugefügt",
"payment_mode_updated": "Zahlungsart aktualisiert", "payment_mode_updated": "Zahlungsart aktualisiert",
"payment_mode_confirm_delete": "Sie werden diese Zahlungsart nicht wiederherstellen können", "payment_mode_confirm_delete": "Sie werden diese Zahlungsart nicht wiederherstellen können",
"payments_attached": "Diese Zahlungsmethode ist bereits mit Zahlungen verknüpft. Bitte löschen Sie die angehängten Zahlungen, um mit der Löschung fortzufahren.", "payments_attached": "This payment method is already attached to payments. Please delete the attached payments to proceed with deletion.",
"expenses_attached": "Diese Zahlungsmethode ist bereits mit Ausgaben verknüpft. Bitte löschen Sie die angehängten Ausgaben, um mit der Löschung fortzufahren.", "expenses_attached": "This payment method is already attached to expenses. Please delete the attached expenses to proceed with deletion.",
"deleted_message": "Zahlungsart erfolgreich gelöscht" "deleted_message": "Zahlungsart erfolgreich gelöscht"
}, },
"expense_category": { "expense_category": {
@ -1179,7 +1179,7 @@
"discount_per_item": "Rabatt pro Artikel ", "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.", "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.",
"expire_public_links": "Öffentliche Links automatisch ablaufen lassen", "expire_public_links": "Öffentliche Links automatisch ablaufen lassen",
"expire_setting_description": "Geben Sie an, ob Sie alle von der Anwendung gesendeten Links zur Ansicht von Rechnungen, Kostenvoranschlägen und Zahlungen usw. nach einer bestimmten Zeit ablaufen lassen möchten.", "expire_setting_description": "Specify whether you would like to expire all the links sent by application to view invoices, estimates & payments, etc after a specified duration.",
"save": "Speichern", "save": "Speichern",
"preference": "Präferenz | Präferenzen", "preference": "Präferenz | Präferenzen",
"general_settings": "Standardeinstellungen für das System.", "general_settings": "Standardeinstellungen für das System.",
@ -1272,14 +1272,14 @@
"do_spaces_secret": "Do Spaces Secret", "do_spaces_secret": "Do Spaces Secret",
"do_spaces_region": "Do Spaced Region", "do_spaces_region": "Do Spaced Region",
"do_spaces_bucket": "Do Spaces Bucket", "do_spaces_bucket": "Do Spaces Bucket",
"do_spaces_endpoint": "Do Spaces Endpunkt", "do_spaces_endpoint": "Do Spaces Endpoint",
"do_spaces_root": "Do Spaced Root", "do_spaces_root": "Do Spaced Root",
"dropbox_type": "Dropbox Typ", "dropbox_type": "Dropbox Typ",
"dropbox_token": "Dropbox Token", "dropbox_token": "Dropbox Token",
"dropbox_key": "Dropbox Schlüssel", "dropbox_key": "Dropbox Schlüssel",
"dropbox_secret": "Dropbox Secret", "dropbox_secret": "Dropbox Secret",
"dropbox_app": "Dropbox App", "dropbox_app": "Dropbox App",
"dropbox_root": "Dropbox Root Verzeichnis", "dropbox_root": "Dropbox Root",
"default_driver": "Standard-Treiber", "default_driver": "Standard-Treiber",
"is_default": "Standard", "is_default": "Standard",
"set_default_disk": "Als Standard festlegen", "set_default_disk": "Als Standard festlegen",
@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Angebot", "pdf_estimate_label": "Angebot",
"pdf_estimate_number": "Angebotsnummer", "pdf_estimate_number": "Angebotsnummer",
"pdf_estimate_date": "Angebotsdatum", "pdf_estimate_date": "Angebotsdatum",
"pdf_estimate_expire_date": "Zahlungsziel", "pdf_estimate_expire_date": "Gültig bis",
"pdf_invoice_label": "Rechnung", "pdf_invoice_label": "Rechnung",
"pdf_invoice_number": "Rechnungsnummer", "pdf_invoice_number": "Rechnungsnummer",
"pdf_invoice_date": "Rechnungsdatum", "pdf_invoice_date": "Rechnungsdatum",

View File

@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Εκτίμηση", "pdf_estimate_label": "Εκτίμηση",
"pdf_estimate_number": "Εκτίμηση Αριθμού", "pdf_estimate_number": "Εκτίμηση Αριθμού",
"pdf_estimate_date": "Εκτιμώμενη ημ. επισκευής", "pdf_estimate_date": "Εκτιμώμενη ημ. επισκευής",
"pdf_estimate_expire_date": "Expiry Date", "pdf_estimate_expire_date": "Ημερομηνία λήξης",
"pdf_invoice_label": "Τιμολόγιο", "pdf_invoice_label": "Τιμολόγιο",
"pdf_invoice_number": "Αριθμός τιμολογίου", "pdf_invoice_number": "Αριθμός τιμολογίου",
"pdf_invoice_date": "Ημ/νία Τιμολόγησης", "pdf_invoice_date": "Ημ/νία Τιμολόγησης",

View File

@ -863,6 +863,8 @@
"company_info": { "company_info": {
"company_info": "Company info", "company_info": "Company info",
"company_name": "Company Name", "company_name": "Company Name",
"company_slug": "Company Slug",
"company_slug_help_text": "A unique URL friendly name for your company (It will appear on Customer Portal URL)",
"company_logo": "Company Logo", "company_logo": "Company Logo",
"section_description": "Information about your company that will be displayed on invoices, estimates and other documents created by Crater.", "section_description": "Information about your company that will be displayed on invoices, estimates and other documents created by Crater.",
"phone": "Phone", "phone": "Phone",
@ -1324,6 +1326,8 @@
"company_info": "Company Information", "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_info_desc": "This information will be displayed on invoices. Note that you can edit this later on settings page.",
"company_name": "Company Name", "company_name": "Company Name",
"company_slug": "Company Slug",
"company_slug_help_text": "A unique URL friendly name for your company (It will appear on Customer Portal URL)",
"company_logo": "Company Logo", "company_logo": "Company Logo",
"logo_preview": "Logo Preview", "logo_preview": "Logo Preview",
"preferences": "Company Preferences", "preferences": "Company Preferences",
@ -1454,7 +1458,8 @@
"at_least_one_ability": "Please select atleast one Permission.", "at_least_one_ability": "Please select atleast one Permission.",
"valid_driver_key": "Please enter a valid {driver} key.", "valid_driver_key": "Please enter a valid {driver} key.",
"valid_exchange_rate": "Please enter a valid exchange rate.", "valid_exchange_rate": "Please enter a valid exchange rate.",
"company_name_not_same": "Company name must match with given name." "company_name_not_same": "Company name must match with given name.",
"invalid_slug": "Invalid Slug"
}, },
"errors": { "errors": {
"starter_plan": "This feature is available on Starter plan and onwards!", "starter_plan": "This feature is available on Starter plan and onwards!",
@ -1522,5 +1527,13 @@
"pdf_bill_to": "Bill to,", "pdf_bill_to": "Bill to,",
"pdf_ship_to": "Ship to,", "pdf_ship_to": "Ship to,",
"pdf_received_from": "Received from:", "pdf_received_from": "Received from:",
"pdf_tax_label": "Tax" "pdf_tax_label": "Tax",
"date_picker": {
"same_day": "Same Day",
"within_7_days": "Within 7 Days",
"within_15_days": "Within 15 Days",
"within_30_days": "Within 30 Days",
"within_45_days": "Within 45 Days",
"within_60_days": "Within 60 Days"
}
} }

View File

@ -1,6 +1,6 @@
{ {
"navigation": { "navigation": {
"dashboard": "Panel de Control", "dashboard": "Tablero",
"customers": "Clientes", "customers": "Clientes",
"items": "Artículos", "items": "Artículos",
"invoices": "Facturas", "invoices": "Facturas",
@ -9,7 +9,7 @@
"estimates": "Presupuestos", "estimates": "Presupuestos",
"payments": "Pagos", "payments": "Pagos",
"reports": "Informes", "reports": "Informes",
"settings": "Configuración", "settings": "Ajustes",
"logout": "Cerrar sesión", "logout": "Cerrar sesión",
"users": "Usuarios", "users": "Usuarios",
"modules": "Módulos" "modules": "Módulos"
@ -47,7 +47,7 @@
"delete": "Eliminar", "delete": "Eliminar",
"edit": "Editar", "edit": "Editar",
"view": "Ver", "view": "Ver",
"add_new_item": "Agregar Nuevo Artículo", "add_new_item": "Agregar ítem nuevo",
"clear_all": "Limpiar todo", "clear_all": "Limpiar todo",
"showing": "Mostrar", "showing": "Mostrar",
"of": "de", "of": "de",
@ -87,7 +87,7 @@
"select_city": "Seleccionar ciudad", "select_city": "Seleccionar ciudad",
"street_1": "Calle 1", "street_1": "Calle 1",
"street_2": "Calle 2", "street_2": "Calle 2",
"action_failed": "Acción Fallida", "action_failed": "Accion Fallida",
"retry": "Procesar de nuevo", "retry": "Procesar de nuevo",
"choose_note": "Elegir nota", "choose_note": "Elegir nota",
"no_note_found": "No se encontró ninguna nota", "no_note_found": "No se encontró ninguna nota",
@ -98,7 +98,7 @@
"do_you_wish_to_continue": "¿Deseas continuar?", "do_you_wish_to_continue": "¿Deseas continuar?",
"note": "Nota", "note": "Nota",
"pay_invoice": "Pagar factura", "pay_invoice": "Pagar factura",
"login_successfully": "¡Sesión inciada con éxito!", "login_successfully": "Logeado Satisfactoriamente!",
"logged_out_successfully": "Logeado Satisfactoriamente", "logged_out_successfully": "Logeado Satisfactoriamente",
"mark_as_default": "Marcar como predeterminado" "mark_as_default": "Marcar como predeterminado"
}, },
@ -113,7 +113,7 @@
}, },
"chart_info": { "chart_info": {
"total_sales": "Ventas", "total_sales": "Ventas",
"total_receipts": "Recibos", "total_receipts": "Ingresos",
"total_expense": "Gastos", "total_expense": "Gastos",
"net_income": "Ingresos netos", "net_income": "Ingresos netos",
"year": "Seleccione año" "year": "Seleccione año"
@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Presupuestar", "pdf_estimate_label": "Presupuestar",
"pdf_estimate_number": "Número de Presupuesto", "pdf_estimate_number": "Número de Presupuesto",
"pdf_estimate_date": "Fecha presupuesto", "pdf_estimate_date": "Fecha presupuesto",
"pdf_estimate_expire_date": "Fecha de vencimiento", "pdf_estimate_expire_date": "Fecha de caducidad",
"pdf_invoice_label": "Factura", "pdf_invoice_label": "Factura",
"pdf_invoice_number": "Numero de factura", "pdf_invoice_number": "Numero de factura",
"pdf_invoice_date": "Fecha de la factura", "pdf_invoice_date": "Fecha de la factura",

View File

@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Estimate", "pdf_estimate_label": "Estimate",
"pdf_estimate_number": "Estimate Number", "pdf_estimate_number": "Estimate Number",
"pdf_estimate_date": "Estimate Date", "pdf_estimate_date": "Estimate Date",
"pdf_estimate_expire_date": "Expiry Date", "pdf_estimate_expire_date": "Expiry date",
"pdf_invoice_label": "Invoice", "pdf_invoice_label": "Invoice",
"pdf_invoice_number": "Invoice Number", "pdf_invoice_number": "Invoice Number",
"pdf_invoice_date": "Invoice Date", "pdf_invoice_date": "Invoice Date",

View File

@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Tarjous", "pdf_estimate_label": "Tarjous",
"pdf_estimate_number": "Tarjousnumero", "pdf_estimate_number": "Tarjousnumero",
"pdf_estimate_date": "Tarjouksen päiväys", "pdf_estimate_date": "Tarjouksen päiväys",
"pdf_estimate_expire_date": "Expiry Date", "pdf_estimate_expire_date": "Voimassaolo päivä",
"pdf_invoice_label": "Lasku", "pdf_invoice_label": "Lasku",
"pdf_invoice_number": "Laskunumero", "pdf_invoice_number": "Laskunumero",
"pdf_invoice_date": "Laskun päiväys", "pdf_invoice_date": "Laskun päiväys",

View File

@ -310,7 +310,7 @@
"confirm_mark_as_sent": "Ce devis sera marqué comme envoyé", "confirm_mark_as_sent": "Ce devis sera marqué comme envoyé",
"confirm_mark_as_accepted": "Ce devis sera marqué comme accepté", "confirm_mark_as_accepted": "Ce devis sera marqué comme accepté",
"confirm_mark_as_rejected": "Ce devis sera marqué comme rejeté", "confirm_mark_as_rejected": "Ce devis sera marqué comme rejeté",
"no_matching_estimates": "Aucun devis correspondant !", "no_matching_estimates": "Aucune estimation correspondante !",
"mark_as_sent_successfully": "Devis marqué comme envoyé", "mark_as_sent_successfully": "Devis marqué comme envoyé",
"send_estimate_successfully": "Devis envoyé", "send_estimate_successfully": "Devis envoyé",
"errors": { "errors": {
@ -355,7 +355,7 @@
"select_an_item": "Sélectionnez un article", "select_an_item": "Sélectionnez un article",
"type_item_description": "Taper la description de l'article (facultatif)" "type_item_description": "Taper la description de l'article (facultatif)"
}, },
"mark_as_default_estimate_template_description": "Si activé, le modèle sélectionné sera automatiquement utilisé pour les nouvelles estimations." "mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
}, },
"invoices": { "invoices": {
"title": "Factures", "title": "Factures",
@ -447,7 +447,7 @@
"marked_as_sent_message": "Facture supprimée | Factures supprimées", "marked_as_sent_message": "Facture supprimée | Factures supprimées",
"something_went_wrong": "quelque chose a mal tourné", "something_went_wrong": "quelque chose a mal tourné",
"invalid_due_amount_message": "Le paiement entré est supérieur au montant total dû pour cette facture. Veuillez vérifier et réessayer.", "invalid_due_amount_message": "Le paiement entré est supérieur au montant total dû pour cette facture. Veuillez vérifier et réessayer.",
"mark_as_default_invoice_template_description": "Si activé, le modèle sélectionné sera automatiquement utilisé pour les nouvelles factures." "mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
}, },
"recurring_invoices": { "recurring_invoices": {
"title": "Factures récurrentes", "title": "Factures récurrentes",
@ -526,7 +526,7 @@
"cloned_successfully": "Facture récurrente clonée", "cloned_successfully": "Facture récurrente clonée",
"clone_invoice": "Dupliquer", "clone_invoice": "Dupliquer",
"confirm_clone": "Cette facture récurrente sera clonée dans une nouvelle facture récurrente", "confirm_clone": "Cette facture récurrente sera clonée dans une nouvelle facture récurrente",
"add_customer_email": "Veuillez ajouter une adresse e-mail pour ce client afin d'envoyer les factures automatiquement.", "add_customer_email": "Please add an email address for this customer to send invoices automatically.",
"item": { "item": {
"title": "Nom", "title": "Nom",
"description": "Description", "description": "Description",
@ -844,9 +844,9 @@
"secret": "Secret", "secret": "Secret",
"mailgun_secret": "Secret Mailgun", "mailgun_secret": "Secret Mailgun",
"mailgun_domain": "Domaine", "mailgun_domain": "Domaine",
"mailgun_endpoint": "Endpoint de Mailgun", "mailgun_endpoint": "Mailgun Endpoint",
"ses_secret": "Clé secrète SES", "ses_secret": "SES Secret",
"ses_key": "Clé SES", "ses_key": "SES Key",
"password": "Mot de passe", "password": "Mot de passe",
"username": "Nom d'utilisateur", "username": "Nom d'utilisateur",
"mail_config": "Envoi d'emails", "mail_config": "Envoi d'emails",
@ -1112,10 +1112,10 @@
"error": "Vous ne pouvez pas supprimer le fournisseur actif", "error": "Vous ne pouvez pas supprimer le fournisseur actif",
"default_currency_error": "Cette devise est déjà affectée à un fournisseur", "default_currency_error": "Cette devise est déjà affectée à un fournisseur",
"exchange_help_text": "Veuillez entrer le taux de change pour convertir {currency} en {baseCurrency}", "exchange_help_text": "Veuillez entrer le taux de change pour convertir {currency} en {baseCurrency}",
"currency_freak": "Currency Freaks", "currency_freak": "Currency Freak",
"currency_layer": "Currency Layer", "currency_layer": "Currency Layer",
"open_exchange_rate": "Ouvrir le taux de change", "open_exchange_rate": "Open Exchange Rate",
"currency_converter": "Convertisseur de devises", "currency_converter": "Currency Converter",
"server": "Serveur", "server": "Serveur",
"url": "URL", "url": "URL",
"active": "Actif", "active": "Actif",
@ -1150,8 +1150,8 @@
"payment_mode_added": "Mode de paiement ajouté", "payment_mode_added": "Mode de paiement ajouté",
"payment_mode_updated": "Mode de paiement mis à jour", "payment_mode_updated": "Mode de paiement mis à jour",
"payment_mode_confirm_delete": "Vous ne pourrez pas récupérer ce mode de paiement", "payment_mode_confirm_delete": "Vous ne pourrez pas récupérer ce mode de paiement",
"payments_attached": "Ce moyen de paiement est déjà utilisé par des paiements. Merci de supprimer les paiements associés avant de procéder à la suppression.", "payments_attached": "This payment method is already attached to payments. Please delete the attached payments to proceed with deletion.",
"expenses_attached": "Ce moyen de paiement est déjà utilisé par des dépenses. Merci de supprimer les dépenses associés avant de procéder à la suppression.", "expenses_attached": "This payment method is already attached to expenses. Please delete the attached expenses to proceed with deletion.",
"deleted_message": "Mode de paiement supprimé" "deleted_message": "Mode de paiement supprimé"
}, },
"expense_category": { "expense_category": {
@ -1262,8 +1262,8 @@
"media_driver": "Stockage multimédia", "media_driver": "Stockage multimédia",
"media_root": "Répertoire média", "media_root": "Répertoire média",
"aws_driver": "AWS", "aws_driver": "AWS",
"aws_key": "Clé AWS", "aws_key": "AWS Key",
"aws_secret": "Clé secrète AWS", "aws_secret": "AWS Secret",
"aws_region": "Région AWS", "aws_region": "Région AWS",
"aws_bucket": "Bucket", "aws_bucket": "Bucket",
"aws_root": "Répertoire", "aws_root": "Répertoire",
@ -1491,7 +1491,7 @@
"pdf_invoice_date": "Date", "pdf_invoice_date": "Date",
"pdf_invoice_due_date": "Date déchéance", "pdf_invoice_due_date": "Date déchéance",
"pdf_notes": "Notes de bas de page", "pdf_notes": "Notes de bas de page",
"pdf_items_label": "Désignation", "pdf_items_label": "Articles",
"pdf_quantity_label": "Quantité", "pdf_quantity_label": "Quantité",
"pdf_price_label": "Prix", "pdf_price_label": "Prix",
"pdf_discount_label": "Remise", "pdf_discount_label": "Remise",

View File

@ -510,11 +510,11 @@
"update_expense": "Update Expense", "update_expense": "Update Expense",
"edit_invoice": "Edit Recurring Invoice", "edit_invoice": "Edit Recurring Invoice",
"new_invoice": "New Recurring Invoice", "new_invoice": "New Recurring Invoice",
"send_automatically": "अटोमेटिक", "send_automatically": "Send Automatically",
"send_automatically_desc": "Enable this, if you would like to send the invoice automatically to the customer when its created.", "send_automatically_desc": "Enable this, if you would like to send the invoice automatically to the customer when its created.",
"save_invoice": "Save Recurring Invoice", "save_invoice": "Save Recurring Invoice",
"update_invoice": "Update Recurring Invoice", "update_invoice": "Update Recurring Invoice",
"add_new_tax": "नवी कर", "add_new_tax": "Add New Tax",
"no_invoices": "No Recurring Invoices yet!", "no_invoices": "No Recurring Invoices yet!",
"mark_as_rejected": "Mark as rejected", "mark_as_rejected": "Mark as rejected",
"mark_as_accepted": "Mark as accepted", "mark_as_accepted": "Mark as accepted",
@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Estimate", "pdf_estimate_label": "Estimate",
"pdf_estimate_number": "Estimate Number", "pdf_estimate_number": "Estimate Number",
"pdf_estimate_date": "Estimate Date", "pdf_estimate_date": "Estimate Date",
"pdf_estimate_expire_date": "Expiry Date", "pdf_estimate_expire_date": "Expiry date",
"pdf_invoice_label": "Invoice", "pdf_invoice_label": "Invoice",
"pdf_invoice_number": "Invoice Number", "pdf_invoice_number": "Invoice Number",
"pdf_invoice_date": "Invoice Date", "pdf_invoice_date": "Invoice Date",

View File

@ -4,7 +4,7 @@
"customers": "Klijenti", "customers": "Klijenti",
"items": "Stavke", "items": "Stavke",
"invoices": "Fakture", "invoices": "Fakture",
"recurring-invoices": "Ponavljajuće fakture\n", "recurring-invoices": "Recurring Invoices",
"expenses": "Rashodi", "expenses": "Rashodi",
"estimates": "Ponude", "estimates": "Ponude",
"payments": "Uplate", "payments": "Uplate",
@ -12,7 +12,7 @@
"settings": "Postavke", "settings": "Postavke",
"logout": "Odjava", "logout": "Odjava",
"users": "Korisnici", "users": "Korisnici",
"modules": "Moduli" "modules": "Modules"
}, },
"general": { "general": {
"add_company": "Dodaj tvrtku", "add_company": "Dodaj tvrtku",
@ -30,8 +30,8 @@
"from": "Pošiljatelj", "from": "Pošiljatelj",
"to": "Primatelj", "to": "Primatelj",
"ok": "Ok", "ok": "Ok",
"yes": "Da", "yes": "Yes",
"no": "Ne", "no": "No",
"sort_by": "Posloži Po", "sort_by": "Posloži Po",
"ascending": "Rastuće", "ascending": "Rastuće",
"descending": "Padajuće", "descending": "Padajuće",
@ -39,7 +39,7 @@
"body": "Tijelo", "body": "Tijelo",
"message": "Poruka", "message": "Poruka",
"send": "Pošalji", "send": "Pošalji",
"preview": "Pregled", "preview": "Preview",
"go_back": "Natrag", "go_back": "Natrag",
"back_to_login": "Natrag na prijavu?", "back_to_login": "Natrag na prijavu?",
"home": "Početna", "home": "Početna",
@ -65,7 +65,7 @@
"sent": "Poslano", "sent": "Poslano",
"all": "Sve", "all": "Sve",
"select_all": "Izaberi sve", "select_all": "Izaberi sve",
"select_template": "Odaberite predložak", "select_template": "Select Template",
"choose_file": "Klikni ovdje da izabereš fajl", "choose_file": "Klikni ovdje da izabereš fajl",
"choose_template": "Izaberi predložak", "choose_template": "Izaberi predložak",
"choose": "Izaberi", "choose": "Izaberi",
@ -93,13 +93,13 @@
"no_note_found": "Ne postoje spremljene napomene", "no_note_found": "Ne postoje spremljene napomene",
"insert_note": "Unesi bilješku", "insert_note": "Unesi bilješku",
"copied_pdf_url_clipboard": "Link do PDF fajla kopiran!", "copied_pdf_url_clipboard": "Link do PDF fajla kopiran!",
"copied_url_clipboard": "URL je kopiran u međuspremnik!", "copied_url_clipboard": "Copied url to clipboard!",
"docs": "Dokumenti", "docs": "Docs",
"do_you_wish_to_continue": "Želite li nastaviti?", "do_you_wish_to_continue": "Do you wish to continue?",
"note": "Bilješka", "note": "Note",
"pay_invoice": "Plati račun", "pay_invoice": "Pay Invoice",
"login_successfully": "Uspješno ste prijavljeni!\n", "login_successfully": "Logged in successfully!",
"logged_out_successfully": "Uspješno odjavljen\n", "logged_out_successfully": "Logged out successfully",
"mark_as_default": "Postavi kao zadano" "mark_as_default": "Postavi kao zadano"
}, },
"dashboard": { "dashboard": {
@ -109,7 +109,7 @@
"customers": "Klijenti", "customers": "Klijenti",
"invoices": "Računi", "invoices": "Računi",
"estimates": "Ponude", "estimates": "Ponude",
"payments": "Plaćanja" "payments": "Payments"
}, },
"chart_info": { "chart_info": {
"total_sales": "Prodaja", "total_sales": "Prodaja",
@ -151,18 +151,18 @@
"no_results_found": "Nema rezultata" "no_results_found": "Nema rezultata"
}, },
"company_switcher": { "company_switcher": {
"label": "IZABERI TVRTKU", "label": "SWITCH COMPANY",
"no_results_found": "Nema rezultata\n", "no_results_found": "No Results Found",
"add_new_company": "Dodajte novu tvrtku\n", "add_new_company": "Add new company",
"new_company": "Nova tvrtka\n", "new_company": "New company",
"created_message": "Tvrtka uspješno stvorena\n" "created_message": "Company created successfully"
}, },
"dateRange": { "dateRange": {
"today": "Danas\n", "today": "Today",
"this_week": "Danas\n", "this_week": "This Week",
"this_month": "Danas\n", "this_month": "This Month",
"this_quarter": "Danas\n", "this_quarter": "This Quarter",
"this_year": "Danas\n", "this_year": "This Year",
"previous_week": "Previous Week", "previous_week": "Previous Week",
"previous_month": "Previous Month", "previous_month": "Previous Month",
"previous_quarter": "Previous Quarter", "previous_quarter": "Previous Quarter",
@ -456,32 +456,32 @@
"months": "{months} Month", "months": "{months} Month",
"years": "{years} Year", "years": "{years} Year",
"all": "All", "all": "All",
"paid": "Plaćeno", "paid": "Paid",
"unpaid": "Ne plaćeno", "unpaid": "Unpaid",
"viewed": "Pregledano", "viewed": "Viewed",
"overdue": "Kašnjenja", "overdue": "Overdue",
"active": "Aktivno", "active": "Active",
"completed": "Završeno", "completed": "Completed",
"customer": "KUPAC", "customer": "CUSTOMER",
"paid_status": "STATUS PLAĆANJA", "paid_status": "PAID STATUS",
"ref_no": "BR. REFERENCE", "ref_no": "REF NO.",
"number": "BROJ", "number": "NUMBER",
"amount_due": "AMOUNT DUE", "amount_due": "AMOUNT DUE",
"partially_paid": "Djelomično plaćeno\n", "partially_paid": "Partially Paid",
"total": "Ukupno", "total": "Total",
"discount": "Popust", "discount": "Discount",
"sub_total": "Popdzbroj", "sub_total": "Sub Total",
"invoice": "Ponavljajuća faktura | Ponavjaljuća faktura", "invoice": "Recurring Invoice | Recurring Invoices",
"invoice_number": "Broj ponavljajuće fakture\n", "invoice_number": "Recurring Invoice Number",
"next_invoice_date": "Datum sljedećeg računa", "next_invoice_date": "Next Invoice Date",
"ref_number": "Broj reference", "ref_number": "Ref Number",
"contact": "Kontakt", "contact": "Contact",
"add_item": "Dodaj stavku", "add_item": "Add an Item",
"date": "Datum", "date": "Date",
"limit_by": "Ograniči po", "limit_by": "Limit by",
"limit_date": "Vremenski rok", "limit_date": "Limit Date",
"limit_count": "Broj ograničenja\n", "limit_count": "Limit Count",
"count": "Brojač", "count": "Count",
"status": "Status", "status": "Status",
"select_a_status": "Select a status", "select_a_status": "Select a status",
"working": "Working", "working": "Working",
@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Ponuda", "pdf_estimate_label": "Ponuda",
"pdf_estimate_number": "Broj Ponude", "pdf_estimate_number": "Broj Ponude",
"pdf_estimate_date": "Datum Ponude", "pdf_estimate_date": "Datum Ponude",
"pdf_estimate_expire_date": "Expiry Date", "pdf_estimate_expire_date": "Datum isteka Ponude",
"pdf_invoice_label": "Faktura", "pdf_invoice_label": "Faktura",
"pdf_invoice_number": "Broj Fakture", "pdf_invoice_number": "Broj Fakture",
"pdf_invoice_date": "Datum Fakture", "pdf_invoice_date": "Datum Fakture",

File diff suppressed because it is too large Load Diff

View File

@ -54,9 +54,9 @@
"actions": "Azioni", "actions": "Azioni",
"subtotal": "SUBTOTALE", "subtotal": "SUBTOTALE",
"discount": "SCONTO", "discount": "SCONTO",
"fixed": "Fisso", "fixed": "Fissato",
"percentage": "Percentuale", "percentage": "Percentuale",
"tax": "IMPOSTA", "tax": "TASSA",
"total_amount": "AMMONTARE TOTALE", "total_amount": "AMMONTARE TOTALE",
"bill_to": "Fattura a", "bill_to": "Fattura a",
"ship_to": "Invia a", "ship_to": "Invia a",

View File

@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Estimate", "pdf_estimate_label": "Estimate",
"pdf_estimate_number": "Estimate Number", "pdf_estimate_number": "Estimate Number",
"pdf_estimate_date": "Estimate Date", "pdf_estimate_date": "Estimate Date",
"pdf_estimate_expire_date": "Expiry Date", "pdf_estimate_expire_date": "Expiry date",
"pdf_invoice_label": "Invoice", "pdf_invoice_label": "Invoice",
"pdf_invoice_number": "Invoice Number", "pdf_invoice_number": "Invoice Number",
"pdf_invoice_date": "Invoice Date", "pdf_invoice_date": "Invoice Date",

View File

@ -17,6 +17,7 @@ import sk from './sk.json'
import vi from './vi.json' import vi from './vi.json'
import el from './el.json' import el from './el.json'
import hr from './hr.json' import hr from './hr.json'
import th from './th.json'
export default { export default {
cs, cs,
@ -37,5 +38,6 @@ export default {
vi, vi,
pl, pl,
el, el,
hr hr,
th
} }

View File

@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Pasiūlymas", "pdf_estimate_label": "Pasiūlymas",
"pdf_estimate_number": "Pasiūlymo numeris", "pdf_estimate_number": "Pasiūlymo numeris",
"pdf_estimate_date": "Pasiūlymo data", "pdf_estimate_date": "Pasiūlymo data",
"pdf_estimate_expire_date": "Expiry Date", "pdf_estimate_expire_date": "Galiojimo laikas",
"pdf_invoice_label": "Sąskaita", "pdf_invoice_label": "Sąskaita",
"pdf_invoice_number": "Invoice Number", "pdf_invoice_number": "Invoice Number",
"pdf_invoice_date": "Invoice Date", "pdf_invoice_date": "Invoice Date",

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
"customers": "Klanten", "customers": "Klanten",
"items": "Artikelen", "items": "Artikelen",
"invoices": "Facturen", "invoices": "Facturen",
"recurring-invoices": "Periodieke facturen", "recurring-invoices": "Periodieke factuur",
"expenses": "Uitgaven", "expenses": "Uitgaven",
"estimates": "Offertes", "estimates": "Offertes",
"payments": "Betalingen", "payments": "Betalingen",
@ -28,16 +28,16 @@
"from_date": "Vanaf datum", "from_date": "Vanaf datum",
"to_date": "T/m datum", "to_date": "T/m datum",
"from": "Vanaf", "from": "Vanaf",
"to": "Naar", "to": "Naar.",
"ok": "Oké", "ok": "Oké.",
"yes": "Ja", "yes": "Ja.",
"no": "Nee", "no": "Nee.",
"sort_by": "Sorteer op", "sort_by": "Sorteer op",
"ascending": "Oplopend", "ascending": "Oplopend",
"descending": "Aflopend", "descending": "Aflopend",
"subject": "Onderwerp", "subject": "Onderwerp",
"body": "Inhoud", "body": "Inhoud",
"message": "Bericht", "message": "Bericht.",
"send": "Verstuur", "send": "Verstuur",
"preview": "Voorbeeld", "preview": "Voorbeeld",
"go_back": "Ga terug", "go_back": "Ga terug",
@ -54,7 +54,7 @@
"actions": "Acties", "actions": "Acties",
"subtotal": "SUBTOTAAL", "subtotal": "SUBTOTAAL",
"discount": "KORTING", "discount": "KORTING",
"fixed": "Vast bedrag", "fixed": "Gemaakt",
"percentage": "Percentage", "percentage": "Percentage",
"tax": "BELASTING", "tax": "BELASTING",
"total_amount": "TOTAALBEDRAG", "total_amount": "TOTAALBEDRAG",
@ -85,17 +85,17 @@
"select_state": "Selecteer staat", "select_state": "Selecteer staat",
"select_country": "Selecteer land", "select_country": "Selecteer land",
"select_city": "Selecteer stad", "select_city": "Selecteer stad",
"street_1": "Straat 1", "street_1": "straat 1",
"street_2": "Straat 2", "street_2": "Straat # 2",
"action_failed": "Actie mislukt", "action_failed": "Actie: mislukt",
"retry": "Opnieuw proberen", "retry": "Retr",
"choose_note": "Kies notitie", "choose_note": "Kies notitie",
"no_note_found": "Geen notitie gevonden", "no_note_found": "Geen notitie gevonden",
"insert_note": "Notitie invoegen", "insert_note": "Notitie invoegen",
"copied_pdf_url_clipboard": "PDF link naar klembord gekopieerd!", "copied_pdf_url_clipboard": "PDF link naar klembord gekopieerd!",
"copied_url_clipboard": "URL naar klembord gekopieerd!", "copied_url_clipboard": "URL naar klembord gekopieerd!",
"docs": "Documentatie", "docs": "Documenten",
"do_you_wish_to_continue": "Wil je doorgaan?", "do_you_wish_to_continue": "Wilt u Doorgaan?",
"note": "Notitie", "note": "Notitie",
"pay_invoice": "Betaal factuur", "pay_invoice": "Betaal factuur",
"login_successfully": "Succesvol ingelogd!", "login_successfully": "Succesvol ingelogd!",
@ -526,7 +526,7 @@
"cloned_successfully": "Terugkerende factuur succesvol gekopieerd", "cloned_successfully": "Terugkerende factuur succesvol gekopieerd",
"clone_invoice": "Kopieer periodieke factuur", "clone_invoice": "Kopieer periodieke factuur",
"confirm_clone": "Deze periodieke factuur wordt gekopieerd naar een nieuwe periodieke factuur", "confirm_clone": "Deze periodieke factuur wordt gekopieerd naar een nieuwe periodieke factuur",
"add_customer_email": "Voeg een e-mailadres aan deze klant toe zodat facturen automatisch verzonden kunnen worden.", "add_customer_email": "Voeg een e-mailadres aan deze klant toe, zodat facturen automatisch verzonden kunnen worden.",
"item": { "item": {
"title": "Item titel", "title": "Item titel",
"description": "Beschrijving", "description": "Beschrijving",
@ -1114,13 +1114,13 @@
"exchange_help_text": "Voer de wisselkoers in om te converteren van {currency} naar {baseCurrency}", "exchange_help_text": "Voer de wisselkoers in om te converteren van {currency} naar {baseCurrency}",
"currency_freak": "Valuta Freak", "currency_freak": "Valuta Freak",
"currency_layer": "Valuta-laag", "currency_layer": "Valuta-laag",
"open_exchange_rate": "Open wisselkoers", "open_exchange_rate": "Open Exchange Rate",
"currency_converter": "Valuta omzetter", "currency_converter": "Valuta omzetter",
"server": "Server", "server": "Server",
"url": "URL", "url": "URL",
"active": "Actief", "active": "Actief",
"currency_help_text": "Deze aanbieder wordt alleen gebruikt voor de hier boven geselecteerde valuta", "currency_help_text": "This provider will only be used on above selected currencies",
"currency_in_used": "De volgende valuta zijn al actief bij een andere aanbieder. Verwijder deze valuta uit de selectie om deze aanbieder opnieuw te activeren." "currency_in_used": "The following currencies are already active on another provider. Please remove these currencies from selection to activate this provider again."
}, },
"tax_types": { "tax_types": {
"title": "Belastingtypen", "title": "Belastingtypen",
@ -1143,16 +1143,16 @@
}, },
"payment_modes": { "payment_modes": {
"title": "Betaalmethodes", "title": "Betaalmethodes",
"description": "Modi van transacties voor betalingen", "description": "Modes of transaction for payments",
"add_payment_mode": "Voeg betaalwijze toe", "add_payment_mode": "Add Payment Mode",
"edit_payment_mode": "Wijzig betaalwijze", "edit_payment_mode": "Edit Payment Mode",
"mode_name": "Modusnaam", "mode_name": "Mode Name",
"payment_mode_added": "Betaalwijze toegevoegd", "payment_mode_added": "Betaalwijze toegevoegd",
"payment_mode_updated": "Betaalwijze bijgewerkt", "payment_mode_updated": "Payment Mode Updated",
"payment_mode_confirm_delete": "U kunt deze betalingsmodus niet herstellen", "payment_mode_confirm_delete": "You will not be able to recover this Payment Mode",
"payments_attached": "Deze betalingsmethode is al gekoppeld aan betalingen. Verwijder de gekoppelde betalingen om verder te gaan met het verwijderen.", "payments_attached": "This payment method is already attached to payments. Please delete the attached payments to proceed with deletion.",
"expenses_attached": "Deze betaalmethode is al gekoppeld aan uitgaven. Verwijder de gekoppelde kosten om door te gaan met het verwijderen.", "expenses_attached": "This payment method is already attached to expenses. Please delete the attached expenses to proceed with deletion.",
"deleted_message": "Betaalwijze succesvol verwijderd" "deleted_message": "Payment Mode deleted successfully"
}, },
"expense_category": { "expense_category": {
"title": "Onkostencategorieën", "title": "Onkostencategorieën",
@ -1178,8 +1178,8 @@
"discount_setting": "Kortingsinstelling", "discount_setting": "Kortingsinstelling",
"discount_per_item": "Korting per item", "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.", "discount_setting_description": "Schakel dit in als u korting wilt toevoegen aan afzonderlijke factuuritems. Standaard wordt korting rechtstreeks aan de factuur toegevoegd.",
"expire_public_links": "Publieke links automatisch laten vervallen", "expire_public_links": "Automatically Expire Public Links",
"expire_setting_description": "Geef aan of je alle links die eerder zijn verstuurd door de applicatie om facturen, offertes en betalingen te bekijken wilt laten verlopen na een bepaalde duur.", "expire_setting_description": "Specify whether you would like to expire all the links sent by application to view invoices, estimates & payments, etc after a specified duration.",
"save": "Opslaan", "save": "Opslaan",
"preference": "Voorkeur | Voorkeuren", "preference": "Voorkeur | Voorkeuren",
"general_settings": "Standaardvoorkeuren voor het systeem.", "general_settings": "Standaardvoorkeuren voor het systeem.",
@ -1188,9 +1188,9 @@
"select_time_zone": "Selecteer Tijdzone", "select_time_zone": "Selecteer Tijdzone",
"select_date_format": "Selecteer datum/tijdindeling", "select_date_format": "Selecteer datum/tijdindeling",
"select_financial_year": "Selecteer financieel ja", "select_financial_year": "Selecteer financieel ja",
"recurring_invoice_status": "Status periodieke facturen", "recurring_invoice_status": "Recurring Invoice Status",
"create_status": "Status aanmaken", "create_status": "Create Status",
"active": "Actief", "active": "Active",
"on_hold": "In wacht", "on_hold": "In wacht",
"update_status": "Updatestatus", "update_status": "Updatestatus",
"completed": "Voltooid", "completed": "Voltooid",
@ -1217,10 +1217,10 @@
"finishing_update": "Afwerking Update", "finishing_update": "Afwerking Update",
"update_failed": "Update mislukt", "update_failed": "Update mislukt",
"update_failed_text": "Sorry! Je update is mislukt op: {step} step ", "update_failed_text": "Sorry! Je update is mislukt op: {step} step ",
"update_warning": "Alle applicatiebestanden en de standaard sjabloonbestanden worden overschreven wanneer u de applicatie met behulp van dit hulpprogramma bijwerkt. Maak een reservekopie van uw sjablonen en database voordat u deze bijwerkt." "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."
}, },
"backup": { "backup": {
"title": "Back-up | Back-ups", "title": "Backup | Backups",
"description": "De back-up is een zipfile met alle bestanden in de mappen die je opgeeft samen met een dump van je database", "description": "De back-up is een zipfile met alle bestanden in de mappen die je opgeeft samen met een dump van je database",
"new_backup": "Nieuwe back-up", "new_backup": "Nieuwe back-up",
"create_backup": "Backup maken", "create_backup": "Backup maken",

View File

@ -2,7 +2,7 @@
"navigation": { "navigation": {
"dashboard": "Pulpit", "dashboard": "Pulpit",
"customers": "Kontrahenci", "customers": "Kontrahenci",
"items": "Produkty", "items": "Pozycje",
"invoices": "Faktury", "invoices": "Faktury",
"recurring-invoices": "Faktury cykliczne", "recurring-invoices": "Faktury cykliczne",
"expenses": "Wydatki", "expenses": "Wydatki",
@ -100,7 +100,7 @@
"pay_invoice": "Zapłać Fakturę", "pay_invoice": "Zapłać Fakturę",
"login_successfully": "Zalogowano pomyślnie!", "login_successfully": "Zalogowano pomyślnie!",
"logged_out_successfully": "Wylogowano pomyślnie", "logged_out_successfully": "Wylogowano pomyślnie",
"mark_as_default": "Oznacz jako domyślne" "mark_as_default": "Mark as default"
}, },
"dashboard": { "dashboard": {
"select_year": "Wybierz rok", "select_year": "Wybierz rok",
@ -355,7 +355,7 @@
"select_an_item": "Wpisz lub kliknij aby wybrać element", "select_an_item": "Wpisz lub kliknij aby wybrać element",
"type_item_description": "Opis pozycji (opcjonalnie)" "type_item_description": "Opis pozycji (opcjonalnie)"
}, },
"mark_as_default_estimate_template_description": "Jeśli włączone, wybrany szablon zostanie automatycznie wybrany dla nowych ofert." "mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
}, },
"invoices": { "invoices": {
"title": "Faktury", "title": "Faktury",
@ -447,7 +447,7 @@
"marked_as_sent_message": "Faktura oznaczona jako wysłana pomyślnie", "marked_as_sent_message": "Faktura oznaczona jako wysłana pomyślnie",
"something_went_wrong": "coś poszło nie tak", "something_went_wrong": "coś poszło nie tak",
"invalid_due_amount_message": "Całkowita kwota faktury nie może być mniejsza niż całkowita kwota zapłacona za tę fakturę. Proszę zaktualizować fakturę lub usunąć powiązane płatności, aby kontynuować.", "invalid_due_amount_message": "Całkowita kwota faktury nie może być mniejsza niż całkowita kwota zapłacona za tę fakturę. Proszę zaktualizować fakturę lub usunąć powiązane płatności, aby kontynuować.",
"mark_as_default_invoice_template_description": "Jeśli włączone, wybrany szablon zostanie automatycznie wybrany dla nowych faktur." "mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
}, },
"recurring_invoices": { "recurring_invoices": {
"title": "Faktury cykliczne", "title": "Faktury cykliczne",
@ -526,7 +526,7 @@
"cloned_successfully": "Faktura Cykliczna sklonowana pomyślnie", "cloned_successfully": "Faktura Cykliczna sklonowana pomyślnie",
"clone_invoice": "Klonuj Fakturę Cykliczną", "clone_invoice": "Klonuj Fakturę Cykliczną",
"confirm_clone": "Ta faktura cykliczna zostanie sklonowana do nowej faktury cyklicznej", "confirm_clone": "Ta faktura cykliczna zostanie sklonowana do nowej faktury cyklicznej",
"add_customer_email": "Dodaj adres e-mail dla tego klienta, aby wysyłać faktury automatycznie.", "add_customer_email": "Please add an email address for this customer to send invoices automatically.",
"item": { "item": {
"title": "Tytuł pozycji", "title": "Tytuł pozycji",
"description": "Opis", "description": "Opis",
@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Oferta", "pdf_estimate_label": "Oferta",
"pdf_estimate_number": "Numer oferty", "pdf_estimate_number": "Numer oferty",
"pdf_estimate_date": "Data oferty", "pdf_estimate_date": "Data oferty",
"pdf_estimate_expire_date": "Data ważności", "pdf_estimate_expire_date": "Termin ważności",
"pdf_invoice_label": "Faktura", "pdf_invoice_label": "Faktura",
"pdf_invoice_number": "Numer faktury", "pdf_invoice_number": "Numer faktury",
"pdf_invoice_date": "Data faktury", "pdf_invoice_date": "Data faktury",

File diff suppressed because it is too large Load Diff

View File

@ -97,8 +97,8 @@
"docs": "Documentație", "docs": "Documentație",
"do_you_wish_to_continue": "Doriţi să continuaţi?", "do_you_wish_to_continue": "Doriţi să continuaţi?",
"note": "Note", "note": "Note",
"pay_invoice": "Plătește factura", "pay_invoice": "Pay Invoice",
"login_successfully": "Autentificat cu succes!", "login_successfully": "Logged in successfully!",
"logged_out_successfully": "Logged out successfully", "logged_out_successfully": "Logged out successfully",
"mark_as_default": "Mark as default" "mark_as_default": "Mark as default"
}, },
@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Estimate", "pdf_estimate_label": "Estimate",
"pdf_estimate_number": "Estimate Number", "pdf_estimate_number": "Estimate Number",
"pdf_estimate_date": "Estimate Date", "pdf_estimate_date": "Estimate Date",
"pdf_estimate_expire_date": "Expiry Date", "pdf_estimate_expire_date": "Expiry date",
"pdf_invoice_label": "Invoice", "pdf_invoice_label": "Invoice",
"pdf_invoice_number": "Invoice Number", "pdf_invoice_number": "Invoice Number",
"pdf_invoice_date": "Invoice Date", "pdf_invoice_date": "Invoice Date",

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
"customers": "Zákazníci", "customers": "Zákazníci",
"items": "Položky", "items": "Položky",
"invoices": "Faktúry", "invoices": "Faktúry",
"recurring-invoices": "Pravidelné faktúry", "recurring-invoices": "Recurring Invoices",
"expenses": "Výdaje", "expenses": "Výdaje",
"estimates": "Cenové odhady", "estimates": "Cenové odhady",
"payments": "Platby", "payments": "Platby",
@ -12,7 +12,7 @@
"settings": "Nastavenia", "settings": "Nastavenia",
"logout": "Odhlásiť sa", "logout": "Odhlásiť sa",
"users": "Uživatelia", "users": "Uživatelia",
"modules": "Moduly" "modules": "Modules"
}, },
"general": { "general": {
"add_company": "Pridať firmu", "add_company": "Pridať firmu",
@ -30,8 +30,8 @@
"from": "Od", "from": "Od",
"to": "Pre", "to": "Pre",
"ok": "Ok", "ok": "Ok",
"yes": "Áno", "yes": "Yes",
"no": "Nie", "no": "No",
"sort_by": "Zoradiť podľa", "sort_by": "Zoradiť podľa",
"ascending": "Vzostupne", "ascending": "Vzostupne",
"descending": "Zostupne", "descending": "Zostupne",
@ -39,7 +39,7 @@
"body": "Telo textu", "body": "Telo textu",
"message": "Správa", "message": "Správa",
"send": "Odoslať", "send": "Odoslať",
"preview": "Náhľad", "preview": "Preview",
"go_back": "Späť", "go_back": "Späť",
"back_to_login": "Späť na prihlásenie?", "back_to_login": "Späť na prihlásenie?",
"home": "Domov", "home": "Domov",
@ -65,7 +65,7 @@
"sent": "Odoslané", "sent": "Odoslané",
"all": "Všetko", "all": "Všetko",
"select_all": "Vybrať všetky", "select_all": "Vybrať všetky",
"select_template": "Vyberte šablónu", "select_template": "Select Template",
"choose_file": "Kliknite sem pre vybratie súboru", "choose_file": "Kliknite sem pre vybratie súboru",
"choose_template": "Vybrať vzhľad", "choose_template": "Vybrať vzhľad",
"choose": "Vybrať", "choose": "Vybrať",
@ -92,15 +92,15 @@
"choose_note": "Vyberte poznámku", "choose_note": "Vyberte poznámku",
"no_note_found": "Neboli nájdené žiadne poznámky", "no_note_found": "Neboli nájdené žiadne poznámky",
"insert_note": "Vlož poznámku", "insert_note": "Vlož poznámku",
"copied_pdf_url_clipboard": "PDF bolo skopírované do schránky!", "copied_pdf_url_clipboard": "Copied PDF url to clipboard!",
"copied_url_clipboard": "URL adresa bola skopírovaná do schránky!", "copied_url_clipboard": "Copied url to clipboard!",
"docs": "Docs", "docs": "Docs",
"do_you_wish_to_continue": "Želáte si pokračovať?", "do_you_wish_to_continue": "Do you wish to continue?",
"note": "Poznámka", "note": "Note",
"pay_invoice": "Zaplatiť faktúru", "pay_invoice": "Pay Invoice",
"login_successfully": "Prihlásenie bolo úspešné!", "login_successfully": "Logged in successfully!",
"logged_out_successfully": "Odhlásenie bolo úspešné", "logged_out_successfully": "Logged out successfully",
"mark_as_default": "Označiť ako predvolené" "mark_as_default": "Mark as default"
}, },
"dashboard": { "dashboard": {
"select_year": "Vyberte rok", "select_year": "Vyberte rok",
@ -109,7 +109,7 @@
"customers": "Zákazníci", "customers": "Zákazníci",
"invoices": "Faktúry", "invoices": "Faktúry",
"estimates": "Cenové odhady", "estimates": "Cenové odhady",
"payments": "Platby" "payments": "Payments"
}, },
"chart_info": { "chart_info": {
"total_sales": "Predaje", "total_sales": "Predaje",
@ -151,27 +151,27 @@
"no_results_found": "Neboli nájdené žiadne výsledky" "no_results_found": "Neboli nájdené žiadne výsledky"
}, },
"company_switcher": { "company_switcher": {
"label": "PREPNÚŤ SPOLOČNOSŤ", "label": "SWITCH COMPANY",
"no_results_found": "Neboli nájdené žiadne výsledky", "no_results_found": "No Results Found",
"add_new_company": "Pridať novú spoločnosť", "add_new_company": "Add new company",
"new_company": "Vytvorte spoločnosť", "new_company": "New company",
"created_message": "Spoločnosť úspešne vytvorená" "created_message": "Company created successfully"
}, },
"dateRange": { "dateRange": {
"today": "Dnes", "today": "Today",
"this_week": "Tento týždeň", "this_week": "This Week",
"this_month": "Tento mesiac", "this_month": "This Month",
"this_quarter": "Tento štvrťrok", "this_quarter": "This Quarter",
"this_year": "Tento rok", "this_year": "This Year",
"previous_week": "Predchádzajúci týždeň", "previous_week": "Previous Week",
"previous_month": "Predchádzajúci mesiac", "previous_month": "Previous Month",
"previous_quarter": "Predchádzajúci štvrťrok", "previous_quarter": "Previous Quarter",
"previous_year": "Predchádzajúci rok", "previous_year": "Previous Year",
"custom": "Vlastný" "custom": "Custom"
}, },
"customers": { "customers": {
"title": "Zákazníci", "title": "Zákazníci",
"prefix": "Predpona", "prefix": "Prefix",
"add_customer": "Pridať Zákazníka", "add_customer": "Pridať Zákazníka",
"contacts_list": "Zoznam zákazníkov", "contacts_list": "Zoznam zákazníkov",
"name": "Meno", "name": "Meno",
@ -186,9 +186,9 @@
"phone": "Telefón", "phone": "Telefón",
"website": "Webové stránky", "website": "Webové stránky",
"overview": "Prehľad", "overview": "Prehľad",
"invoice_prefix": "Predpona Faktúry", "invoice_prefix": "Invoice Prefix",
"estimate_prefix": "Predpona cenového odhadu", "estimate_prefix": "Estimate Prefix",
"payment_prefix": "Predpona platby", "payment_prefix": "Payment Prefix",
"enable_portal": "Aktivovať portál", "enable_portal": "Aktivovať portál",
"country": "Krajina", "country": "Krajina",
"state": "Štát", "state": "Štát",
@ -197,7 +197,7 @@
"added_on": "Pridané Dňa", "added_on": "Pridané Dňa",
"action": "Akcia", "action": "Akcia",
"password": "Heslo", "password": "Heslo",
"confirm_password": "Potvrdiť heslo", "confirm_password": "Confirm Password",
"street_number": "Číslo Ulice", "street_number": "Číslo Ulice",
"primary_currency": "Hlavná Mena", "primary_currency": "Hlavná Mena",
"description": "Popis", "description": "Popis",
@ -208,17 +208,17 @@
"new_customer": "Nový Zákazník", "new_customer": "Nový Zákazník",
"edit_customer": "Upraviť Zákazníka", "edit_customer": "Upraviť Zákazníka",
"basic_info": "Základné Informácie", "basic_info": "Základné Informácie",
"portal_access": "Prístupy na portál", "portal_access": "Portal Access",
"portal_access_text": "Chcete povoliť tomuto používateľovi pripojiť sa na Zákaznícky Portál?", "portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
"portal_access_url": "Adresa zákazníckeho portálu", "portal_access_url": "Customer Portal Login URL",
"portal_access_url_help": "Prosím, skopírujte a prepošlite URL adresu uvedenú vyššie vášmu klientovi pre udelenie prístupu.", "portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
"billing_address": "Fakturačná Adresa", "billing_address": "Fakturačná Adresa",
"shipping_address": "Doručovacia Adresa", "shipping_address": "Doručovacia Adresa",
"copy_billing_address": "Kopírovať podľa Fakturačnej adresy", "copy_billing_address": "Kopírovať podľa Fakturačnej adresy",
"no_customers": "Zatiaľ nebol pridaný žiadny zákazník!", "no_customers": "Zatiaľ nebol pridaný žiadny zákazník!",
"no_customers_found": "Nenájdení žiadni zákazníci!", "no_customers_found": "Nenájdení žiadni zákazníci!",
"no_contact": "Žiadny kontakt", "no_contact": "No contact",
"no_contact_name": "Žiadny kontakt", "no_contact_name": "No contact name",
"list_of_customers": "Táto sekcia bude obsahovať zoznam zákazníkov.", "list_of_customers": "Táto sekcia bude obsahovať zoznam zákazníkov.",
"primary_display_name": "Hlavné meno pre zobrazenie", "primary_display_name": "Hlavné meno pre zobrazenie",
"select_currency": "Vyberte menu", "select_currency": "Vyberte menu",
@ -231,7 +231,7 @@
"confirm_delete": "Nebudete môcť obnoviť tohto zákazníka ani žiadne faktúry, cenové odhady alebo platby s ním spojené. | Nebudete môcť obnoviť týchto zákazníkov ani žiadne faktúry, cenové odhady alebo platby s nimi spojené.", "confirm_delete": "Nebudete môcť obnoviť tohto zákazníka ani žiadne faktúry, cenové odhady alebo platby s ním spojené. | Nebudete môcť obnoviť týchto zákazníkov ani žiadne faktúry, cenové odhady alebo platby s nimi spojené.",
"created_message": "Zákazník úspešne vytvorený", "created_message": "Zákazník úspešne vytvorený",
"updated_message": "Zákazník úspešne aktualizovaný", "updated_message": "Zákazník úspešne aktualizovaný",
"address_updated_message": "Nastavenia adresy úspešne aktualizované", "address_updated_message": "Address Information Updated succesfully",
"deleted_message": "Zákazník úspešne odstránený | Zákazníci úspešne odstránení", "deleted_message": "Zákazník úspešne odstránený | Zákazníci úspešne odstránení",
"edit_currency_not_allowed": "Cannot change currency once transactions created." "edit_currency_not_allowed": "Cannot change currency once transactions created."
}, },
@ -244,7 +244,7 @@
"added_on": "Pridané Dňa", "added_on": "Pridané Dňa",
"price": "Cena", "price": "Cena",
"date_of_creation": "Dátum Vytvorenia", "date_of_creation": "Dátum Vytvorenia",
"not_selected": "Nie je vybratá žiadna položka", "not_selected": "No item selected",
"action": "Akcia", "action": "Akcia",
"add_item": "Pridať Položku", "add_item": "Pridať Položku",
"save_item": "Uložiť Položku", "save_item": "Uložiť Položku",
@ -317,7 +317,7 @@
"required": "Pole je povinné" "required": "Pole je povinné"
}, },
"accepted": "Prijátá", "accepted": "Prijátá",
"rejected": "Odmietnuté", "rejected": "Rejected",
"expired": "Expired", "expired": "Expired",
"sent": "Odoslaná", "sent": "Odoslaná",
"draft": "Koncept", "draft": "Koncept",
@ -359,8 +359,8 @@
}, },
"invoices": { "invoices": {
"title": "Faktúry", "title": "Faktúry",
"download": "Stiahnuť", "download": "Download",
"pay_invoice": "Zaplatiť faktúru", "pay_invoice": "Pay Invoice",
"invoices_list": "Zoznam Faktúr", "invoices_list": "Zoznam Faktúr",
"invoice_information": "Invoice Information", "invoice_information": "Invoice Information",
"days": "{days} Ďeň", "days": "{days} Ďeň",
@ -370,8 +370,8 @@
"paid": "Zaplatené", "paid": "Zaplatené",
"unpaid": "Nezaplatené", "unpaid": "Nezaplatené",
"viewed": "Viewed", "viewed": "Viewed",
"overdue": "Po splatnosti", "overdue": "Overdue",
"completed": "Dokončené", "completed": "Completed",
"customer": "ZÁKAZNÍK", "customer": "ZÁKAZNÍK",
"paid_status": "Stav platby", "paid_status": "Stav platby",
"ref_no": "REF Č.", "ref_no": "REF Č.",
@ -408,7 +408,7 @@
"invoice_date": "Dátum Vystavenia", "invoice_date": "Dátum Vystavenia",
"record_payment": "Zaznamenať Platbu", "record_payment": "Zaznamenať Platbu",
"add_new_invoice": "Nová Faktúra", "add_new_invoice": "Nová Faktúra",
"update_expense": "Aktualizovať Výdaj", "update_expense": "Update Expense",
"edit_invoice": "Upraviť Faktúru", "edit_invoice": "Upraviť Faktúru",
"new_invoice": "Nová Faktúra", "new_invoice": "Nová Faktúra",
"save_invoice": "Uložiť Faktúru", "save_invoice": "Uložiť Faktúru",
@ -421,7 +421,7 @@
"select_invoice": "Vybrať Faktúru", "select_invoice": "Vybrať Faktúru",
"no_matching_invoices": "Nenašli sa žiadne faktúry!", "no_matching_invoices": "Nenašli sa žiadne faktúry!",
"mark_as_sent_successfully": "Faktúra označená ako úspešne odoslaná", "mark_as_sent_successfully": "Faktúra označená ako úspešne odoslaná",
"invoice_sent_successfully": "Faktúra bola úspešne odoslaná", "invoice_sent_successfully": "Invoice sent successfully",
"cloned_successfully": "Faktúra bola úspešne okopírovaná", "cloned_successfully": "Faktúra bola úspešne okopírovaná",
"clone_invoice": "Kopírovať faktúru", "clone_invoice": "Kopírovať faktúru",
"confirm_clone": "Faktúra bude okopírovaná do novej", "confirm_clone": "Faktúra bude okopírovaná do novej",
@ -450,34 +450,34 @@
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices." "mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
}, },
"recurring_invoices": { "recurring_invoices": {
"title": "Pravidelné faktúry", "title": "Recurring Invoices",
"invoices_list": "Zoznam pravidelných faktúr", "invoices_list": "Recurring Invoices List",
"days": "{days} Days", "days": "{days} Days",
"months": "{months} Month", "months": "{months} Month",
"years": "{years} Year", "years": "{years} Year",
"all": "Všetko", "all": "All",
"paid": "Zaplatené", "paid": "Paid",
"unpaid": "Nezaplatené", "unpaid": "Unpaid",
"viewed": "Viewed", "viewed": "Viewed",
"overdue": "Po splatnosti", "overdue": "Overdue",
"active": "Active", "active": "Active",
"completed": "Dokončené", "completed": "Completed",
"customer": "ZÁKAZNÍK", "customer": "CUSTOMER",
"paid_status": "PAID STATUS", "paid_status": "PAID STATUS",
"ref_no": "REF Č.", "ref_no": "REF NO.",
"number": "ČÍSLO", "number": "NUMBER",
"amount_due": "AMOUNT DUE", "amount_due": "AMOUNT DUE",
"partially_paid": "Čiastočne Zaplatené", "partially_paid": "Partially Paid",
"total": "Celkom", "total": "Total",
"discount": "Zľava", "discount": "Discount",
"sub_total": "Medzisúčet", "sub_total": "Sub Total",
"invoice": "Pravidelná faktúra | Pravidelné faktúry", "invoice": "Recurring Invoice | Recurring Invoices",
"invoice_number": "Číslo pravidelnej faktúry", "invoice_number": "Recurring Invoice Number",
"next_invoice_date": "Dátum nasledujúceho vystavenia", "next_invoice_date": "Next Invoice Date",
"ref_number": "Ref. Číslo", "ref_number": "Ref Number",
"contact": "Kontakt", "contact": "Contact",
"add_item": "Pridať položku", "add_item": "Add an Item",
"date": "Dátum", "date": "Date",
"limit_by": "Limit by", "limit_by": "Limit by",
"limit_date": "Limit Date", "limit_date": "Limit Date",
"limit_count": "Limit Count", "limit_count": "Limit Count",
@ -506,15 +506,15 @@
"starts_at": "Start Date", "starts_at": "Start Date",
"due_date": "Invoice Due Date", "due_date": "Invoice Due Date",
"record_payment": "Record Payment", "record_payment": "Record Payment",
"add_new_invoice": "Vytvoriť novú pravidelnú faktúru", "add_new_invoice": "Add New Recurring Invoice",
"update_expense": "Aktualizovať Výdaj", "update_expense": "Update Expense",
"edit_invoice": "Upraviť pravidelnú faktúru", "edit_invoice": "Edit Recurring Invoice",
"new_invoice": "Nová pravidelná faktúra", "new_invoice": "New Recurring Invoice",
"send_automatically": "Odoslať automaticky", "send_automatically": "Send Automatically",
"send_automatically_desc": "Enable this, if you would like to send the invoice automatically to the customer when its created.", "send_automatically_desc": "Enable this, if you would like to send the invoice automatically to the customer when its created.",
"save_invoice": "Uložiť pravidelnú faktúru", "save_invoice": "Save Recurring Invoice",
"update_invoice": "Upraviť pravidelnú faktúru", "update_invoice": "Update Recurring Invoice",
"add_new_tax": "Pridať novú daň", "add_new_tax": "Add New Tax",
"no_invoices": "No Recurring Invoices yet!", "no_invoices": "No Recurring Invoices yet!",
"mark_as_rejected": "Mark as rejected", "mark_as_rejected": "Mark as rejected",
"mark_as_accepted": "Mark as accepted", "mark_as_accepted": "Mark as accepted",
@ -528,27 +528,27 @@
"confirm_clone": "This recurring invoice will be cloned into a new Recurring Invoice", "confirm_clone": "This recurring invoice will be cloned into a new Recurring Invoice",
"add_customer_email": "Please add an email address for this customer to send invoices automatically.", "add_customer_email": "Please add an email address for this customer to send invoices automatically.",
"item": { "item": {
"title": "Názov položky", "title": "Item Title",
"description": "Popis", "description": "Description",
"quantity": "Množstvo", "quantity": "Quantity",
"price": "Cena", "price": "Price",
"discount": "Zľava", "discount": "Discount",
"total": "Súčet", "total": "Total",
"total_discount": "Celková zľava", "total_discount": "Total Discount",
"sub_total": "Medzisúčet", "sub_total": "Sub Total",
"tax": "Daň", "tax": "Tax",
"amount": "Množstvo", "amount": "Amount",
"select_an_item": "Začnite písať alebo kliknite pre vybratie položky", "select_an_item": "Type or click to select an item",
"type_item_description": "Popis položky (voliteľné)" "type_item_description": "Type Item Description (optional)"
}, },
"frequency": { "frequency": {
"title": "Frekvencia", "title": "Frequency",
"select_frequency": "Vybrať frekvenciu", "select_frequency": "Select Frequency",
"minute": "Minúta", "minute": "Minute",
"hour": "Hodina", "hour": "Hour",
"day_month": "Deň v mesiaci", "day_month": "Day of month",
"month": "Mesiac", "month": "Month",
"day_week": "Deň v týždni" "day_week": "Day of week"
}, },
"confirm_delete": "You will not be able to recover this Invoice | You will not be able to recover these Invoices", "confirm_delete": "You will not be able to recover this Invoice | You will not be able to recover these Invoices",
"created_message": "Recurring Invoice created successfully", "created_message": "Recurring Invoice created successfully",
@ -686,12 +686,12 @@
"api_token": "API token", "api_token": "API token",
"invalid_api_token": "Invalid API Token.", "invalid_api_token": "Invalid API Token.",
"other_modules": "Other Modules", "other_modules": "Other Modules",
"view_all": "Zobraziť všetky", "view_all": "View All",
"no_reviews_found": "Zatiaľ nie sú dostupné žiadne hodnotenia pre tento modul!", "no_reviews_found": "There are no reviews for this module yet!",
"module_not_purchased": "Modul nie je kúpený", "module_not_purchased": "Module Not Purchased",
"module_not_found": "Modul nebol nájdený", "module_not_found": "Module Not Found",
"version_not_supported": "This module version doesn't support the current version of Crater", "version_not_supported": "This module version doesn't support the current version of Crater",
"last_updated": "Naposledy aktualizované", "last_updated": "Last Updated On",
"connect_installation": "Connect your installation", "connect_installation": "Connect your installation",
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.", "api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
"view_module": "View Module", "view_module": "View Module",
@ -806,8 +806,8 @@
"custom_fields": "Vlastné Polia", "custom_fields": "Vlastné Polia",
"payment_modes": "Spôsoby Platby", "payment_modes": "Spôsoby Platby",
"notes": "Poznámky", "notes": "Poznámky",
"exchange_rate": "Výmenný kurz", "exchange_rate": "Exchange Rate",
"address_information": "Údaje adresy" "address_information": "Address Information"
}, },
"address_information": { "address_information": {
"section_description": " You can update Your Address information using form below." "section_description": " You can update Your Address information using form below."
@ -872,9 +872,9 @@
"address": "Adresa", "address": "Adresa",
"zip": "PSČ", "zip": "PSČ",
"save": "Uložiť", "save": "Uložiť",
"delete": "Odstrániť", "delete": "Delete",
"updated_message": "Informácie o firme úspešne aktualizované", "updated_message": "Informácie o firme úspešne aktualizované",
"delete_company": "Odstrániť spoločnosť", "delete_company": "Delete Company",
"delete_company_description": "Once you delete your company, you will lose all the data and files associated with it permanently.", "delete_company_description": "Once you delete your company, you will lose all the data and files associated with it permanently.",
"are_you_absolutely_sure": "Are you absolutely sure?", "are_you_absolutely_sure": "Are you absolutely sure?",
"delete_company_modal_desc": "This action cannot be undone. This will permanently delete {company} and all of its associated data.", "delete_company_modal_desc": "This action cannot be undone. This will permanently delete {company} and all of its associated data.",
@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Cenový odhad", "pdf_estimate_label": "Cenový odhad",
"pdf_estimate_number": "Číslo cenového odhadu", "pdf_estimate_number": "Číslo cenového odhadu",
"pdf_estimate_date": "Dátum cenového odhadu", "pdf_estimate_date": "Dátum cenového odhadu",
"pdf_estimate_expire_date": "Expiry Date", "pdf_estimate_expire_date": "Platnosť cenového odhadu",
"pdf_invoice_label": "Faktúra", "pdf_invoice_label": "Faktúra",
"pdf_invoice_number": "Číslo faktúry", "pdf_invoice_number": "Číslo faktúry",
"pdf_invoice_date": "Dátum vystavenia", "pdf_invoice_date": "Dátum vystavenia",

File diff suppressed because it is too large Load Diff

View File

@ -12,7 +12,7 @@
"settings": "Podešavanja", "settings": "Podešavanja",
"logout": "Odjavi se", "logout": "Odjavi se",
"users": "Korisnici", "users": "Korisnici",
"modules": "Moduli" "modules": "Modules"
}, },
"general": { "general": {
"add_company": "Dodaj kompaniju", "add_company": "Dodaj kompaniju",
@ -30,8 +30,8 @@
"from": "Pošiljalac", "from": "Pošiljalac",
"to": "Primalac", "to": "Primalac",
"ok": "Ok", "ok": "Ok",
"yes": "Da", "yes": "Yes",
"no": "Ne", "no": "No",
"sort_by": "Rasporedi Po", "sort_by": "Rasporedi Po",
"ascending": "Rastuće", "ascending": "Rastuće",
"descending": "Opadajuće", "descending": "Opadajuće",
@ -39,7 +39,7 @@
"body": "Telo", "body": "Telo",
"message": "Poruka", "message": "Poruka",
"send": "Pošalji", "send": "Pošalji",
"preview": "Pregled", "preview": "Preview",
"go_back": "Idi nazad", "go_back": "Idi nazad",
"back_to_login": "Nazad na prijavu?", "back_to_login": "Nazad na prijavu?",
"home": "Početna", "home": "Početna",
@ -95,9 +95,9 @@
"copied_pdf_url_clipboard": "Link do PDF fajla kopiran!", "copied_pdf_url_clipboard": "Link do PDF fajla kopiran!",
"copied_url_clipboard": "Copied url to clipboard!", "copied_url_clipboard": "Copied url to clipboard!",
"docs": "Docs", "docs": "Docs",
"do_you_wish_to_continue": "Da li želite nastaviti?", "do_you_wish_to_continue": "Do you wish to continue?",
"note": "Bilješka", "note": "Note",
"pay_invoice": "Plati račun", "pay_invoice": "Pay Invoice",
"login_successfully": "Logged in successfully!", "login_successfully": "Logged in successfully!",
"logged_out_successfully": "Logged out successfully", "logged_out_successfully": "Logged out successfully",
"mark_as_default": "Mark as default" "mark_as_default": "Mark as default"
@ -318,10 +318,10 @@
}, },
"accepted": "Prihvaćeno", "accepted": "Prihvaćeno",
"rejected": "Odbijeno", "rejected": "Odbijeno",
"expired": "Istekao", "expired": "Expired",
"sent": "Poslato", "sent": "Poslato",
"draft": "U izradi", "draft": "U izradi",
"viewed": "Pregledano", "viewed": "Viewed",
"declined": "Odbijeno", "declined": "Odbijeno",
"new_estimate": "Nova Profaktura", "new_estimate": "Nova Profaktura",
"add_new_estimate": "Dodaj novu Profakturu", "add_new_estimate": "Dodaj novu Profakturu",
@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Profaktura", "pdf_estimate_label": "Profaktura",
"pdf_estimate_number": "Broj Profakture", "pdf_estimate_number": "Broj Profakture",
"pdf_estimate_date": "Datum Profakture", "pdf_estimate_date": "Datum Profakture",
"pdf_estimate_expire_date": "Expiry Date", "pdf_estimate_expire_date": "Datum isteka Profakture",
"pdf_invoice_label": "Faktura", "pdf_invoice_label": "Faktura",
"pdf_invoice_number": "Broj Fakture", "pdf_invoice_number": "Broj Fakture",
"pdf_invoice_date": "Datum Fakture", "pdf_invoice_date": "Datum Fakture",

View File

@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Kostnadsförslag", "pdf_estimate_label": "Kostnadsförslag",
"pdf_estimate_number": "Kostnadsförslagsnummer", "pdf_estimate_number": "Kostnadsförslagsnummer",
"pdf_estimate_date": "Kostnadsförslagsdatum", "pdf_estimate_date": "Kostnadsförslagsdatum",
"pdf_estimate_expire_date": "Expiry Date", "pdf_estimate_expire_date": "Utgångsdatum",
"pdf_invoice_label": "Faktura", "pdf_invoice_label": "Faktura",
"pdf_invoice_number": "Fakturanummer", "pdf_invoice_number": "Fakturanummer",
"pdf_invoice_date": "Fakturadatum", "pdf_invoice_date": "Fakturadatum",

File diff suppressed because it is too large Load Diff

View File

@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Estimate", "pdf_estimate_label": "Estimate",
"pdf_estimate_number": "Estimate Number", "pdf_estimate_number": "Estimate Number",
"pdf_estimate_date": "Estimate Date", "pdf_estimate_date": "Estimate Date",
"pdf_estimate_expire_date": "Expiry Date", "pdf_estimate_expire_date": "Expiry date",
"pdf_invoice_label": "Invoice", "pdf_invoice_label": "Invoice",
"pdf_invoice_number": "Invoice Number", "pdf_invoice_number": "Invoice Number",
"pdf_invoice_date": "Invoice Date", "pdf_invoice_date": "Invoice Date",

File diff suppressed because it is too large Load Diff

View File

@ -12,7 +12,7 @@
"settings": "Cài đặt", "settings": "Cài đặt",
"logout": "Đăng xuất", "logout": "Đăng xuất",
"users": "Người dùng", "users": "Người dùng",
"modules": "Các Mô-Đun" "modules": "Modules"
}, },
"general": { "general": {
"add_company": "Thêm công ty", "add_company": "Thêm công ty",
@ -93,13 +93,13 @@
"no_note_found": "Không tìm thấy ghi chú", "no_note_found": "Không tìm thấy ghi chú",
"insert_note": "Chèn ghi chú", "insert_note": "Chèn ghi chú",
"copied_pdf_url_clipboard": "Đã sao chép url PDF vào khay nhớ tạm!", "copied_pdf_url_clipboard": "Đã sao chép url PDF vào khay nhớ tạm!",
"copied_url_clipboard": "Đã sao chép url vào khay nhớ tạm!", "copied_url_clipboard": "Copied url to clipboard!",
"docs": "Tài liệu", "docs": "Tài liệu",
"do_you_wish_to_continue": "Bạn có muốn tiếp tục không?", "do_you_wish_to_continue": "Bạn có muốn tiếp tục không?",
"note": "Ghi chú", "note": "Ghi chú",
"pay_invoice": "Thanh toán hóa đơn", "pay_invoice": "Pay Invoice",
"login_successfully": "Đăng nhập thành công!", "login_successfully": "Logged in successfully!",
"logged_out_successfully": "Đăng xuất thành công", "logged_out_successfully": "Logged out successfully",
"mark_as_default": "Đánh dấu mặc định" "mark_as_default": "Đánh dấu mặc định"
}, },
"dashboard": { "dashboard": {
@ -109,7 +109,7 @@
"customers": "Khách hàng", "customers": "Khách hàng",
"invoices": "Hóa đơn", "invoices": "Hóa đơn",
"estimates": "Ước tính", "estimates": "Ước tính",
"payments": "Thanh toán" "payments": "Payments"
}, },
"chart_info": { "chart_info": {
"total_sales": "Bán hàng", "total_sales": "Bán hàng",
@ -208,10 +208,10 @@
"new_customer": "Khách hàng mới", "new_customer": "Khách hàng mới",
"edit_customer": "Chỉnh sửa khách hàng", "edit_customer": "Chỉnh sửa khách hàng",
"basic_info": "Thông tin cơ bản", "basic_info": "Thông tin cơ bản",
"portal_access": "Truy cập cổng thông tin", "portal_access": "Portal Access",
"portal_access_text": "Bạn có muốn cho phép người dùng này truy cập vào cổng thông tin khách hàng không?", "portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
"portal_access_url": "Đường dẫn đăng nhập cổng thông tin khách hàng", "portal_access_url": "Customer Portal Login URL",
"portal_access_url_help": "Hãy sao chép & chuyển tiếp đường dẫn bên trên cho khách hàng của bạn để cho phép truy cập.", "portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
"billing_address": "Địa chỉ thanh toán", "billing_address": "Địa chỉ thanh toán",
"shipping_address": "Địa chỉ giao hàng", "shipping_address": "Địa chỉ giao hàng",
"copy_billing_address": "Sao chép từ thanh toán", "copy_billing_address": "Sao chép từ thanh toán",
@ -231,7 +231,7 @@
"confirm_delete": "Bạn sẽ không thể khôi phục khách hàng này và tất cả các Hóa đơn, Ước tính và Thanh toán có liên quan. | Bạn sẽ không thể khôi phục những khách hàng này và tất cả các Hóa đơn, Ước tính và Thanh toán có liên quan.", "confirm_delete": "Bạn sẽ không thể khôi phục khách hàng này và tất cả các Hóa đơn, Ước tính và Thanh toán có liên quan. | Bạn sẽ không thể khôi phục những khách hàng này và tất cả các Hóa đơn, Ước tính và Thanh toán có liên quan.",
"created_message": "Khách hàng được tạo thành công", "created_message": "Khách hàng được tạo thành công",
"updated_message": "Đã cập nhật khách hàng thành công", "updated_message": "Đã cập nhật khách hàng thành công",
"address_updated_message": "Thông tin địa chỉ được cập nhật thành công", "address_updated_message": "Address Information Updated succesfully",
"deleted_message": "Đã xóa khách hàng thành công | Đã xóa khách hàng thành công", "deleted_message": "Đã xóa khách hàng thành công | Đã xóa khách hàng thành công",
"edit_currency_not_allowed": "Không thể đổi tiền tệ khi bản dịch đã được tạo." "edit_currency_not_allowed": "Không thể đổi tiền tệ khi bản dịch đã được tạo."
}, },
@ -265,7 +265,7 @@
}, },
"estimates": { "estimates": {
"title": "Ước tính", "title": "Ước tính",
"accept_estimate": "Chấp nhận ước tính", "accept_estimate": "Accept Estimate",
"reject_estimate": "Reject Estimate", "reject_estimate": "Reject Estimate",
"estimate": "Ước tính | Ước tính", "estimate": "Ước tính | Ước tính",
"estimates_list": "Danh sách ước tính", "estimates_list": "Danh sách ước tính",
@ -318,7 +318,7 @@
}, },
"accepted": "Đã được chấp nhận", "accepted": "Đã được chấp nhận",
"rejected": "Từ chối", "rejected": "Từ chối",
"expired": "Hết hạn", "expired": "Expired",
"sent": "Gởi", "sent": "Gởi",
"draft": "Bản nháp", "draft": "Bản nháp",
"viewed": "Viewed", "viewed": "Viewed",
@ -463,36 +463,36 @@
"active": "Hoạt động", "active": "Hoạt động",
"completed": "Hoàn thành", "completed": "Hoàn thành",
"customer": "KHÁCH HÀNG", "customer": "KHÁCH HÀNG",
"paid_status": "TÌNH TRẠNG THANH TOÁN", "paid_status": "PAID STATUS",
"ref_no": "Số tham chiếu.", "ref_no": "REF NO.",
"number": "SỐ", "number": "NUMBER",
"amount_due": "AMOUNT DUE", "amount_due": "AMOUNT DUE",
"partially_paid": "Partially Paid", "partially_paid": "Partially Paid",
"total": "Tổng", "total": "Total",
"discount": "Giảm giá", "discount": "Discount",
"sub_total": "Sub Total", "sub_total": "Sub Total",
"invoice": "Recurring Invoice | Recurring Invoices", "invoice": "Recurring Invoice | Recurring Invoices",
"invoice_number": "Số hóa đơn định kì", "invoice_number": "Recurring Invoice Number",
"next_invoice_date": "Ngày lập hoá đơn tiếp theo", "next_invoice_date": "Next Invoice Date",
"ref_number": "Số tham chiếu", "ref_number": "Ref Number",
"contact": "Liên hệ", "contact": "Contact",
"add_item": "Thêm một mặt hàng", "add_item": "Add an Item",
"date": "Ngày", "date": "Date",
"limit_by": "Giới hạn bởi", "limit_by": "Limit by",
"limit_date": "Ngày giới hạn", "limit_date": "Limit Date",
"limit_count": "Limit Count", "limit_count": "Limit Count",
"count": "Count", "count": "Count",
"status": "Trạng thái", "status": "Status",
"select_a_status": "Chọn một trạng thái", "select_a_status": "Select a status",
"working": "Đang hoạt động", "working": "Working",
"on_hold": "Đang chờ", "on_hold": "On Hold",
"complete": "Hoàn thành", "complete": "Completed",
"add_tax": "Thêm thuế", "add_tax": "Add Tax",
"amount": "Số tiền", "amount": "Amount",
"action": "Hành động", "action": "Action",
"notes": "Ghi chú", "notes": "Notes",
"view": "Xem", "view": "View",
"basic_info": "Thông tin cơ bản", "basic_info": "Basic Info",
"send_invoice": "Send Recurring Invoice", "send_invoice": "Send Recurring Invoice",
"auto_send": "Auto Send", "auto_send": "Auto Send",
"resend_invoice": "Resend Recurring Invoice", "resend_invoice": "Resend Recurring Invoice",
@ -504,9 +504,9 @@
"invoice_mark_as_sent": "This recurring invoice will be marked as sent", "invoice_mark_as_sent": "This recurring invoice will be marked as sent",
"confirm_send": "This recurring invoice will be sent via email to the customer", "confirm_send": "This recurring invoice will be sent via email to the customer",
"starts_at": "Start Date", "starts_at": "Start Date",
"due_date": "Ngày lập hóa đơn", "due_date": "Invoice Due Date",
"record_payment": "Ghi lại Thanh toán", "record_payment": "Record Payment",
"add_new_invoice": "Cập nhật Hóa đơn định kỳ", "add_new_invoice": "Add New Recurring Invoice",
"update_expense": "Update Expense", "update_expense": "Update Expense",
"edit_invoice": "Edit Recurring Invoice", "edit_invoice": "Edit Recurring Invoice",
"new_invoice": "New Recurring Invoice", "new_invoice": "New Recurring Invoice",
@ -533,7 +533,7 @@
"quantity": "Quantity", "quantity": "Quantity",
"price": "Price", "price": "Price",
"discount": "Discount", "discount": "Discount",
"total": "Tổng cộng", "total": "Total",
"total_discount": "Total Discount", "total_discount": "Total Discount",
"sub_total": "Sub Total", "sub_total": "Sub Total",
"tax": "Tax", "tax": "Tax",
@ -1485,7 +1485,7 @@
"pdf_estimate_label": "Ước tính", "pdf_estimate_label": "Ước tính",
"pdf_estimate_number": "Số ước tính", "pdf_estimate_number": "Số ước tính",
"pdf_estimate_date": "Ngày ước tính", "pdf_estimate_date": "Ngày ước tính",
"pdf_estimate_expire_date": "Expiry Date", "pdf_estimate_expire_date": "Ngày hết hạn",
"pdf_invoice_label": "Hóa đơn", "pdf_invoice_label": "Hóa đơn",
"pdf_invoice_number": "Số hóa đơn", "pdf_invoice_number": "Số hóa đơn",
"pdf_invoice_date": "Ngày lập hóa đơn", "pdf_invoice_date": "Ngày lập hóa đơn",

View File

@ -12,7 +12,7 @@
"settings": "設定", "settings": "設定",
"logout": "登出", "logout": "登出",
"users": "使用者", "users": "使用者",
"modules": "功能模組" "modules": "Modules"
}, },
"general": { "general": {
"add_company": "新增公司", "add_company": "新增公司",
@ -93,14 +93,14 @@
"no_note_found": "沒有找到備註", "no_note_found": "沒有找到備註",
"insert_note": "插入備註", "insert_note": "插入備註",
"copied_pdf_url_clipboard": "複製PDF位址到剪貼簿!", "copied_pdf_url_clipboard": "複製PDF位址到剪貼簿!",
"copied_url_clipboard": "將網址複製到剪貼簿!", "copied_url_clipboard": "Copied url to clipboard!",
"docs": "文檔", "docs": "文檔",
"do_you_wish_to_continue": "你確定要繼續?", "do_you_wish_to_continue": "你確定要繼續?",
"note": "備註", "note": "備註",
"pay_invoice": "支付發票", "pay_invoice": "Pay Invoice",
"login_successfully": "已成功登入!", "login_successfully": "Logged in successfully!",
"logged_out_successfully": "已成功登出", "logged_out_successfully": "Logged out successfully",
"mark_as_default": "標記為預設值" "mark_as_default": "Mark as default"
}, },
"dashboard": { "dashboard": {
"select_year": "選擇年份", "select_year": "選擇年份",
@ -109,7 +109,7 @@
"customers": "客户", "customers": "客户",
"invoices": "發票", "invoices": "發票",
"estimates": "報價", "estimates": "報價",
"payments": "付款" "payments": "Payments"
}, },
"chart_info": { "chart_info": {
"total_sales": "銷售", "total_sales": "銷售",
@ -208,10 +208,10 @@
"new_customer": "新客戶", "new_customer": "新客戶",
"edit_customer": "編輯客戶", "edit_customer": "編輯客戶",
"basic_info": "基本資料", "basic_info": "基本資料",
"portal_access": "門戶訪問", "portal_access": "Portal Access",
"portal_access_text": "您想允許此客戶登入客戶門戶嗎?", "portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
"portal_access_url": "客戶門戶登入URL", "portal_access_url": "Customer Portal Login URL",
"portal_access_url_help": "請將上述給定的URL複製並轉發給您的客戶以提供訪問許可權。", "portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
"billing_address": "帳單地址", "billing_address": "帳單地址",
"shipping_address": "送貨地址", "shipping_address": "送貨地址",
"copy_billing_address": "由帳單複製", "copy_billing_address": "由帳單複製",
@ -231,7 +231,7 @@
"confirm_delete": "你將不能夠還原此客戶, 以及此客戶相關的發票, 報價及付款. | 你將不能夠還原此客戶, 以及此客戶相關的發票, 報價及付款.", "confirm_delete": "你將不能夠還原此客戶, 以及此客戶相關的發票, 報價及付款. | 你將不能夠還原此客戶, 以及此客戶相關的發票, 報價及付款.",
"created_message": "成功新增客戶", "created_message": "成功新增客戶",
"updated_message": "成功更新客戶", "updated_message": "成功更新客戶",
"address_updated_message": "地址資訊已成功更新", "address_updated_message": "Address Information Updated succesfully",
"deleted_message": "成功刪除客戶 | 成功刪除客戶", "deleted_message": "成功刪除客戶 | 成功刪除客戶",
"edit_currency_not_allowed": "交易一旦創建後就不能改變貨幣!" "edit_currency_not_allowed": "交易一旦創建後就不能改變貨幣!"
}, },
@ -265,8 +265,8 @@
}, },
"estimates": { "estimates": {
"title": "報價", "title": "報價",
"accept_estimate": "接受估價", "accept_estimate": "Accept Estimate",
"reject_estimate": "拒絕估算", "reject_estimate": "Reject Estimate",
"estimate": "報價 | 報價", "estimate": "報價 | 報價",
"estimates_list": "報價列表", "estimates_list": "報價列表",
"days": "{days} 天", "days": "{days} 天",
@ -318,10 +318,10 @@
}, },
"accepted": "已接受", "accepted": "已接受",
"rejected": "已拒絕", "rejected": "已拒絕",
"expired": "已過期", "expired": "Expired",
"sent": "傳送", "sent": "傳送",
"draft": "草稿", "draft": "草稿",
"viewed": "已檢視", "viewed": "Viewed",
"declined": "拒絕", "declined": "拒絕",
"new_estimate": "新報價", "new_estimate": "新報價",
"add_new_estimate": "新增報價", "add_new_estimate": "新增報價",
@ -355,14 +355,14 @@
"select_an_item": "輸入或點擊去選擇商品", "select_an_item": "輸入或點擊去選擇商品",
"type_item_description": "商品詳情(可選)" "type_item_description": "商品詳情(可選)"
}, },
"mark_as_default_estimate_template_description": "如果啟用,所選模板將自動選擇新的估算。" "mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
}, },
"invoices": { "invoices": {
"title": "發票", "title": "發票",
"download": "下載", "download": "Download",
"pay_invoice": "支付發票", "pay_invoice": "Pay Invoice",
"invoices_list": "發票列表", "invoices_list": "發票列表",
"invoice_information": "發票資訊", "invoice_information": "Invoice Information",
"days": "{days} 天", "days": "{days} 天",
"months": "{months} 月", "months": "{months} 月",
"years": "{years} 年", "years": "{years} 年",
@ -447,7 +447,7 @@
"marked_as_sent_message": "發票已標示為成功傳送", "marked_as_sent_message": "發票已標示為成功傳送",
"something_went_wrong": "出現錯誤", "something_went_wrong": "出現錯誤",
"invalid_due_amount_message": "發票總額不能少於支付總額. 請更新發票或刪除相關支付再繼續.", "invalid_due_amount_message": "發票總額不能少於支付總額. 請更新發票或刪除相關支付再繼續.",
"mark_as_default_invoice_template_description": "如果啟用,所選模板將自動選擇新發票" "mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
}, },
"recurring_invoices": { "recurring_invoices": {
"title": "定期發票", "title": "定期發票",
@ -464,12 +464,12 @@
"completed": "已完成", "completed": "已完成",
"customer": "客戶", "customer": "客戶",
"paid_status": "付款狀態", "paid_status": "付款狀態",
"ref_no": "參考號碼", "ref_no": "REF NO.",
"number": "", "number": "NUMBER",
"amount_due": "到期金額", "amount_due": "AMOUNT DUE",
"partially_paid": "部分支付", "partially_paid": "Partially Paid",
"total": "總計", "total": "Total",
"discount": "折扣", "discount": "Discount",
"sub_total": "Sub Total", "sub_total": "Sub Total",
"invoice": "Recurring Invoice | Recurring Invoices", "invoice": "Recurring Invoice | Recurring Invoices",
"invoice_number": "Recurring Invoice Number", "invoice_number": "Recurring Invoice Number",
@ -504,16 +504,16 @@
"invoice_mark_as_sent": "This recurring invoice will be marked as sent", "invoice_mark_as_sent": "This recurring invoice will be marked as sent",
"confirm_send": "This recurring invoice will be sent via email to the customer", "confirm_send": "This recurring invoice will be sent via email to the customer",
"starts_at": "Start Date", "starts_at": "Start Date",
"due_date": "發票到期日期", "due_date": "Invoice Due Date",
"record_payment": "紀錄付款", "record_payment": "Record Payment",
"add_new_invoice": "添加定期發票", "add_new_invoice": "Add New Recurring Invoice",
"update_expense": "更新支出", "update_expense": "Update Expense",
"edit_invoice": "編輯定期發票", "edit_invoice": "Edit Recurring Invoice",
"new_invoice": "添加定期發票", "new_invoice": "New Recurring Invoice",
"send_automatically": "自動發送", "send_automatically": "Send Automatically",
"send_automatically_desc": "如果您希望在建立發票時自動將發票發送給客戶,請啟用此選項。", "send_automatically_desc": "Enable this, if you would like to send the invoice automatically to the customer when its created.",
"save_invoice": "保存定期發票", "save_invoice": "Save Recurring Invoice",
"update_invoice": "更新定期發票", "update_invoice": "Update Recurring Invoice",
"add_new_tax": "Add New Tax", "add_new_tax": "Add New Tax",
"no_invoices": "No Recurring Invoices yet!", "no_invoices": "No Recurring Invoices yet!",
"mark_as_rejected": "Mark as rejected", "mark_as_rejected": "Mark as rejected",
@ -1485,7 +1485,7 @@
"pdf_estimate_label": "報價", "pdf_estimate_label": "報價",
"pdf_estimate_number": "報價單號", "pdf_estimate_number": "報價單號",
"pdf_estimate_date": "報價日期", "pdf_estimate_date": "報價日期",
"pdf_estimate_expire_date": "Expiry Date", "pdf_estimate_expire_date": "有效日期",
"pdf_invoice_label": "發票", "pdf_invoice_label": "發票",
"pdf_invoice_number": "發票號碼", "pdf_invoice_number": "發票號碼",
"pdf_invoice_date": "發票日期", "pdf_invoice_date": "發票日期",

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -17,7 +17,7 @@
<meta name="csrf-token" content="{{ csrf_token() }}"> <meta name="csrf-token" content="{{ csrf_token() }}">
<!-- Module Styles --> <!-- Module Styles -->
@foreach(\Crater\Services\Module\ModuleFacade::allStyles() as $name => $path) @foreach (\Crater\Services\Module\ModuleFacade::allStyles() as $name => $path)
<link rel="stylesheet" href="/modules/styles/{{ $name }}"> <link rel="stylesheet" href="/modules/styles/{{ $name }}">
@endforeach @endforeach
@ -25,8 +25,8 @@
</head> </head>
<body <body
class="h-full overflow-hidden bg-gray-100 font-base class="h-full overflow-hidden bg-gray-100 dark:bg-gray-900 dark:text-white font-base
@if(isset($current_theme)) theme-{{ $current_theme }} @else theme-{{get_app_setting('admin_portal_theme') ?? 'crater'}} @endif "> @if (isset($current_theme)) theme-{{ $current_theme }} @else theme-{{ get_app_setting('admin_portal_theme') ?? 'crater' }} @endif ">
<!-- Module Scripts --> <!-- Module Scripts -->
@foreach (\Crater\Services\Module\ModuleFacade::allScripts() as $name => $path) @foreach (\Crater\Services\Module\ModuleFacade::allScripts() as $name => $path)
@ -38,6 +38,14 @@
@endforeach @endforeach
<script type="module"> <script type="module">
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
document.documentElement.classList.add('dark')
document.documentElement.style.setProperty('color-scheme', 'dark');
} else {
document.documentElement.classList.remove('dark')
document.documentElement.style.setProperty('color-scheme', 'light')
}
@if(isset($customer_logo)) @if(isset($customer_logo))
window.customer_logo = "/storage/{{$customer_logo}}" window.customer_logo = "/storage/{{$customer_logo}}"
@ -57,12 +65,12 @@
window.login_page_description = "{{$login_page_description}}" window.login_page_description = "{{$login_page_description}}"
@endif @endif
@if(isset($copyright_text)) @if(isset($copyright_text))
window.copyright_text = "{{$copyright_text}}" window.copyright_text = "{{$copyright_text}}"
@endif @endif
window.Crater.start() window.Crater.start()
</script> </script>

View File

@ -386,6 +386,10 @@
} }
</style> </style>
@if (App::isLocale('th'))
@include('app.pdf.locale.th')
@endif
</head> </head>
<body> <body>

View File

@ -408,6 +408,10 @@
} }
</style> </style>
@if (App::isLocale('th'))
@include('app.pdf.locale.th')
@endif
</head> </head>
<body> <body>

View File

@ -346,6 +346,10 @@
} }
</style> </style>
@if (App::isLocale('th'))
@include('app.pdf.locale.th')
@endif
</head> </head>
<body> <body>

View File

@ -327,6 +327,10 @@
} }
</style> </style>
@if (App::isLocale('th'))
@include('app.pdf.locale.th')
@endif
</head> </head>
<body> <body>

Some files were not shown because too many files have changed in this diff Show More