mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-27 11:41:09 -04:00
Compare commits
141 Commits
dark-baseI
...
e5afc93efa
| Author | SHA1 | Date | |
|---|---|---|---|
| e5afc93efa | |||
| 9f9e45a76a | |||
| 0e7c218819 | |||
| b18ccc1b34 | |||
| 80a209284d | |||
| 7152a7b74a | |||
| 77bb074f84 | |||
| 3e145211a5 | |||
| 7c556b8427 | |||
| ff9356eb49 | |||
| 11caa7bf51 | |||
| 85a87e5f2f | |||
| 4a4353d779 | |||
| 07bf7d3d5c | |||
| ef11dc4440 | |||
| fcd992179e | |||
| d057b27560 | |||
| 6c66f0634b | |||
| b6eb1eef78 | |||
| da184cb13e | |||
| ff8519764e | |||
| 55163888b3 | |||
| 0ea6bce713 | |||
| c8ea2a7f3d | |||
| 078d928206 | |||
| 01f01b8607 | |||
| 1314821bb1 | |||
| 40d2d7435b | |||
| 36f334dc87 | |||
| dfd13bf9de | |||
| afb8cab71a | |||
| 6f0c9c6923 | |||
| a7b1fe87ea | |||
| a2970402b9 | |||
| 2934b9fc3f | |||
| ebf19636e1 | |||
| cbc13d4884 | |||
| b02803e7c5 | |||
| 194a8cb235 | |||
| 8fd045e378 | |||
| 7a11fbd02a | |||
| 5bc213299f | |||
| 2b5b4ab603 | |||
| 8a47cab96c | |||
| 606fed3e68 | |||
| d227ad4e6b | |||
| 835d61d73c | |||
| 6bb89db25e | |||
| 3f0fd04ad3 | |||
| 6c3e1b1135 | |||
| e331bc18ab | |||
| 67549fd299 | |||
| e6cea15a5b | |||
| 9471cfbca3 | |||
| e0da5e8eb8 | |||
| 1328e36306 | |||
| 5a5ed65202 | |||
| 598e5801bc | |||
| 427fb7675f | |||
| 4ce313b10a | |||
| 12d4107c13 | |||
| 41ba8fc849 | |||
| 2ba2d83478 | |||
| f421cd1677 | |||
| 16b4533892 | |||
| 3afdfe3fda | |||
| ebdfd83b04 | |||
| 26ba2d8d28 | |||
| 22377bc407 | |||
| 65b7a2c78e | |||
| d8ca49572b | |||
| f28d67629f | |||
| fa9c0824d2 | |||
| d8ad7d1c09 | |||
| f3eba0ca98 | |||
| 0046ce1675 | |||
| 1ea4048e98 | |||
| 3922da67db | |||
| d939c7340f | |||
| a1540dcbc1 | |||
| df89e1d248 | |||
| c4d79a8b63 | |||
| 5d875af7be | |||
| 9734ccf9fa | |||
| 8080fe86ca | |||
| 43b3f00dff | |||
| 9f3b39a685 | |||
| 309b2e0888 | |||
| ca60a4830d | |||
| ee96724b81 | |||
| c3250d6141 | |||
| d2a8477087 | |||
| 718657b0a4 | |||
| 1acac8f129 | |||
| 176b207335 | |||
| 77d7ae0fe4 | |||
| fc222fc6de | |||
| fa9d28e66b | |||
| a87ef11edc | |||
| 221f272da9 | |||
| b022cbad59 | |||
| d342bc9771 | |||
| c236012f4e | |||
| c50a2a5988 | |||
| f07f488148 | |||
| 46ba42478f | |||
| ddfea9d827 | |||
| 25aa4ac198 | |||
| 2081580640 | |||
| b20277d1b7 | |||
| 9fded639b9 | |||
| a19266a29c | |||
| d07d2243a9 | |||
| 19a23983ab | |||
| 3545ebb7a4 | |||
| e0ab4136a9 | |||
| 7ee0ceba0c | |||
| 2ca332f33c | |||
| fd3a1524ad | |||
| 889df7b9a6 | |||
| 73f36981e4 | |||
| e3460384d0 | |||
| a793d53b31 | |||
| 59854f016b | |||
| 411e2bf7b7 | |||
| fc46391dec | |||
| 15bfbfdaf3 | |||
| 9d7cc7548a | |||
| 7e460249bc | |||
| fd68cea4de | |||
| 0268b808d5 | |||
| 532422feca | |||
| f3cb1f6af6 | |||
| 5b0e1fc5a8 | |||
| 6f68f57791 | |||
| 6db63b3aae | |||
| c8e7378725 | |||
| cf1e90aa40 | |||
| 3d476f66f9 | |||
| 5f0925416e | |||
| a3a1f51d34 |
162
.github/workflows/uffizzi-build.yml
vendored
162
.github/workflows/uffizzi-build.yml
vendored
@ -1,162 +0,0 @@
|
||||
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
84
.github/workflows/uffizzi-preview.yml
vendored
@ -1,84 +0,0 @@
|
||||
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
1
.gitignore
vendored
@ -16,4 +16,3 @@ Homestead.yaml
|
||||
.gitkeep
|
||||
/public/docs
|
||||
/.scribe
|
||||
!storage/fonts/.gitkeep
|
||||
@ -1,4 +1,4 @@
|
||||
FROM php:8.1-fpm
|
||||
FROM php:7.4-fpm
|
||||
|
||||
# Arguments defined in docker-compose.yml
|
||||
ARG user
|
||||
|
||||
@ -103,7 +103,6 @@ class CustomerStatsController extends Controller
|
||||
)
|
||||
->whereCompany()
|
||||
->whereCustomer($customer->id)
|
||||
->where('status', '<>', Invoice::STATUS_DRAFT)
|
||||
->sum('total');
|
||||
$totalReceipts = Payment::whereBetween(
|
||||
'payment_date',
|
||||
|
||||
@ -104,7 +104,6 @@ class DashboardController extends Controller
|
||||
'invoice_date',
|
||||
[$startDate->format('Y-m-d'), $start->format('Y-m-d')]
|
||||
)
|
||||
->where('status', '<>', Invoice::STATUS_DRAFT)
|
||||
->whereCompany()
|
||||
->sum('base_total');
|
||||
|
||||
@ -142,7 +141,6 @@ class DashboardController extends Controller
|
||||
$recent_due_invoices = Invoice::with('customer')
|
||||
->whereCompany()
|
||||
->where('base_due_amount', '>', 0)
|
||||
->where('status', '<>', Invoice::STATUS_DRAFT)
|
||||
->take(5)
|
||||
->latest()
|
||||
->get();
|
||||
|
||||
@ -24,7 +24,6 @@ class InvoicesController extends Controller
|
||||
$limit = $request->has('limit') ? $request->limit : 10;
|
||||
|
||||
$invoices = Invoice::whereCompany()
|
||||
->whereTabFilters($request->tab_status)
|
||||
->join('customers', 'customers.id', '=', 'invoices.customer_id')
|
||||
->applyFilters($request->all())
|
||||
->select('invoices.*', 'customers.name')
|
||||
|
||||
@ -2,25 +2,24 @@
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||
|
||||
use PDF;
|
||||
use Carbon\Carbon;
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Models\Company;
|
||||
use Crater\Models\Currency;
|
||||
use Crater\Models\CompanySetting;
|
||||
use Crater\Models\Customer;
|
||||
use Illuminate\Http\Request;
|
||||
use Crater\Models\CompanySetting;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use PDF;
|
||||
|
||||
class CustomerSalesReportController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function __invoke(Request $request, $hash)
|
||||
{
|
||||
$company = Company::where('unique_hash', $hash)->first();
|
||||
@ -57,7 +56,6 @@ class CustomerSalesReportController extends Controller
|
||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
||||
|
||||
$colors = [
|
||||
'primary_text_color',
|
||||
@ -82,7 +80,6 @@ class CustomerSalesReportController extends Controller
|
||||
'company' => $company,
|
||||
'from_date' => $from_date,
|
||||
'to_date' => $to_date,
|
||||
'currency' => $currency,
|
||||
]);
|
||||
|
||||
$pdf = PDF::loadView('app.pdf.reports.sales-customers');
|
||||
|
||||
@ -2,25 +2,24 @@
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||
|
||||
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;
|
||||
use Crater\Models\Company;
|
||||
use Crater\Models\CompanySetting;
|
||||
use Crater\Models\Expense;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use PDF;
|
||||
|
||||
class ExpensesReportController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function __invoke(Request $request, $hash)
|
||||
{
|
||||
$company = Company::where('unique_hash', $hash)->first();
|
||||
@ -44,7 +43,6 @@ class ExpensesReportController extends Controller
|
||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
||||
|
||||
$colors = [
|
||||
'primary_text_color',
|
||||
@ -68,7 +66,6 @@ class ExpensesReportController extends Controller
|
||||
'company' => $company,
|
||||
'from_date' => $from_date,
|
||||
'to_date' => $to_date,
|
||||
'currency' => $currency,
|
||||
]);
|
||||
$pdf = PDF::loadView('app.pdf.reports.expenses');
|
||||
|
||||
|
||||
@ -2,25 +2,24 @@
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||
|
||||
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;
|
||||
use Crater\Models\Company;
|
||||
use Crater\Models\CompanySetting;
|
||||
use Crater\Models\InvoiceItem;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use PDF;
|
||||
|
||||
class ItemSalesReportController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function __invoke(Request $request, $hash)
|
||||
{
|
||||
$company = Company::where('unique_hash', $hash)->first();
|
||||
@ -44,7 +43,6 @@ class ItemSalesReportController extends Controller
|
||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
||||
|
||||
$colors = [
|
||||
'primary_text_color',
|
||||
@ -68,7 +66,6 @@ class ItemSalesReportController extends Controller
|
||||
'company' => $company,
|
||||
'from_date' => $from_date,
|
||||
'to_date' => $to_date,
|
||||
'currency' => $currency,
|
||||
]);
|
||||
$pdf = PDF::loadView('app.pdf.reports.sales-items');
|
||||
|
||||
|
||||
@ -2,26 +2,25 @@
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||
|
||||
use PDF;
|
||||
use Carbon\Carbon;
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Models\Company;
|
||||
use Crater\Models\CompanySetting;
|
||||
use Crater\Models\Expense;
|
||||
use Crater\Models\Payment;
|
||||
use Crater\Models\Currency;
|
||||
use Illuminate\Http\Request;
|
||||
use Crater\Models\CompanySetting;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use PDF;
|
||||
|
||||
class ProfitLossReportController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function __invoke(Request $request, $hash)
|
||||
{
|
||||
$company = Company::where('unique_hash', $hash)->first();
|
||||
@ -50,8 +49,6 @@ class ProfitLossReportController extends Controller
|
||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
||||
|
||||
|
||||
$colors = [
|
||||
'primary_text_color',
|
||||
@ -77,7 +74,6 @@ class ProfitLossReportController extends Controller
|
||||
'company' => $company,
|
||||
'from_date' => $from_date,
|
||||
'to_date' => $to_date,
|
||||
'currency' => $currency,
|
||||
]);
|
||||
$pdf = PDF::loadView('app.pdf.reports.profit-loss');
|
||||
|
||||
|
||||
@ -2,25 +2,24 @@
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||
|
||||
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;
|
||||
use Crater\Models\Company;
|
||||
use Crater\Models\CompanySetting;
|
||||
use Crater\Models\Tax;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use PDF;
|
||||
|
||||
class TaxSummaryReportController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function __invoke(Request $request, $hash)
|
||||
{
|
||||
$company = Company::where('unique_hash', $hash)->first();
|
||||
@ -45,8 +44,6 @@ class TaxSummaryReportController extends Controller
|
||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
||||
|
||||
|
||||
$colors = [
|
||||
'primary_text_color',
|
||||
@ -71,7 +68,6 @@ class TaxSummaryReportController extends Controller
|
||||
'company' => $company,
|
||||
'from_date' => $from_date,
|
||||
'to_date' => $to_date,
|
||||
'currency' => $currency,
|
||||
]);
|
||||
|
||||
$pdf = PDF::loadView('app.pdf.reports.tax-summary');
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
namespace Crater\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class CompaniesRequest extends FormRequest
|
||||
@ -33,10 +34,6 @@ class CompaniesRequest extends FormRequest
|
||||
'currency' => [
|
||||
'required'
|
||||
],
|
||||
'slug' => [
|
||||
'required',
|
||||
Rule::unique('companies')
|
||||
],
|
||||
'address.name' => [
|
||||
'nullable',
|
||||
],
|
||||
@ -71,11 +68,11 @@ class CompaniesRequest extends FormRequest
|
||||
{
|
||||
return collect($this->validated())
|
||||
->only([
|
||||
'name',
|
||||
'slug'
|
||||
'name'
|
||||
])
|
||||
->merge([
|
||||
'owner_id' => $this->user()->id
|
||||
'owner_id' => $this->user()->id,
|
||||
'slug' => Str::slug($this->name)
|
||||
])
|
||||
->toArray();
|
||||
}
|
||||
|
||||
@ -30,8 +30,7 @@ class CompanyRequest extends FormRequest
|
||||
Rule::unique('companies')->ignore($this->header('company'), 'id'),
|
||||
],
|
||||
'slug' => [
|
||||
'required',
|
||||
Rule::unique('companies')->ignore($this->header('company'), 'id'),
|
||||
'nullable'
|
||||
],
|
||||
'address.country_id' => [
|
||||
'required',
|
||||
|
||||
@ -23,7 +23,7 @@ class EstimateResource extends JsonResource
|
||||
'reference_number' => $this->reference_number,
|
||||
'tax_per_item' => $this->tax_per_item,
|
||||
'discount_per_item' => $this->discount_per_item,
|
||||
'notes' => $this->notes,
|
||||
'notes' => $this->getNotes(),
|
||||
'discount' => $this->discount,
|
||||
'discount_type' => $this->discount_type,
|
||||
'discount_val' => $this->discount_val,
|
||||
|
||||
@ -18,7 +18,7 @@ class PaymentResource extends JsonResource
|
||||
'id' => $this->id,
|
||||
'payment_number' => $this->payment_number,
|
||||
'payment_date' => $this->payment_date,
|
||||
'notes' => $this->notes,
|
||||
'notes' => $this->getNotes(),
|
||||
'amount' => $this->amount,
|
||||
'unique_hash' => $this->unique_hash,
|
||||
'invoice_id' => $this->invoice_id,
|
||||
|
||||
@ -217,7 +217,7 @@ class Company extends Model implements HasMedia
|
||||
'estimate_billing_address_format' => $billingAddressFormat,
|
||||
'payment_company_address_format' => $companyAddressFormat,
|
||||
'payment_from_customer_address_format' => $paymentFromCustomerAddress,
|
||||
'currency' => request()->currency ?? 1,
|
||||
'currency' => request()->currency ?? 13,
|
||||
'time_zone' => 'Asia/Kolkata',
|
||||
'language' => 'en',
|
||||
'fiscal_year' => '1-12',
|
||||
|
||||
@ -483,8 +483,7 @@ class Estimate extends Model implements HasMedia
|
||||
'{ESTIMATE_DATE}' => $this->formattedEstimateDate,
|
||||
'{ESTIMATE_EXPIRY_DATE}' => $this->formattedExpiryDate,
|
||||
'{ESTIMATE_NUMBER}' => $this->estimate_number,
|
||||
'{PDF_LINK}' => $this->estimatePdfUrl,
|
||||
'{TOTAL_AMOUNT}' => format_money_pdf($this->total, $this->customer->currency)
|
||||
'{ESTIMATE_REF_NUMBER}' => $this->reference_number,
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@ -240,7 +240,7 @@ class Expense extends Model implements HasMedia
|
||||
}
|
||||
|
||||
if ($request->hasFile('attachment_receipt')) {
|
||||
$expense->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts', 'local');
|
||||
$expense->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts');
|
||||
}
|
||||
|
||||
if ($request->customFields) {
|
||||
@ -262,12 +262,12 @@ class Expense extends Model implements HasMedia
|
||||
ExchangeRateLog::addExchangeRateLog($this);
|
||||
}
|
||||
|
||||
if (isset($request->is_attachment_receipt_removed) && $request->is_attachment_receipt_removed == "true") {
|
||||
if (isset($request->is_attachment_receipt_removed) && (bool) $request->is_attachment_receipt_removed) {
|
||||
$this->clearMediaCollection('receipts');
|
||||
}
|
||||
if ($request->hasFile('attachment_receipt')) {
|
||||
$this->clearMediaCollection('receipts');
|
||||
$this->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts', 'local');
|
||||
$this->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts');
|
||||
}
|
||||
|
||||
if ($request->customFields) {
|
||||
|
||||
@ -187,6 +187,16 @@ class Invoice extends Model implements HasMedia
|
||||
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)
|
||||
{
|
||||
return $query->whereIn('invoices.paid_status', [
|
||||
@ -224,40 +234,6 @@ class Invoice extends Model implements HasMedia
|
||||
$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)
|
||||
{
|
||||
$filters = collect($filters);
|
||||
@ -273,11 +249,17 @@ class Invoice extends Model implements HasMedia
|
||||
$filters->get('status') == self::STATUS_PAID
|
||||
) {
|
||||
$query->wherePaidStatus($filters->get('status'));
|
||||
} elseif ($filters->get('status') == 'DUE') {
|
||||
$query->whereDueStatus($filters->get('status'));
|
||||
} else {
|
||||
$query->whereStatus($filters->get('status'));
|
||||
}
|
||||
}
|
||||
|
||||
if ($filters->get('paid_status')) {
|
||||
$query->wherePaidStatus($filters->get('status'));
|
||||
}
|
||||
|
||||
if ($filters->get('invoice_id')) {
|
||||
$query->whereInvoice($filters->get('invoice_id'));
|
||||
}
|
||||
@ -669,9 +651,7 @@ class Invoice extends Model implements HasMedia
|
||||
'{INVOICE_DATE}' => $this->formattedInvoiceDate,
|
||||
'{INVOICE_DUE_DATE}' => $this->formattedDueDate,
|
||||
'{INVOICE_NUMBER}' => $this->invoice_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)
|
||||
'{INVOICE_REF_NUMBER}' => $this->reference_number,
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@ -435,8 +435,7 @@ class Payment extends Model implements HasMedia
|
||||
'{PAYMENT_DATE}' => $this->formattedPaymentDate,
|
||||
'{PAYMENT_MODE}' => $this->paymentMethod ? $this->paymentMethod->name : null,
|
||||
'{PAYMENT_NUMBER}' => $this->payment_number,
|
||||
'{PDF_LINK}' => $this->paymentPdfUrl,
|
||||
'{PAYMENT_AMOUNT}' => format_money_pdf($this->amount, $this->customer->currency)
|
||||
'{PAYMENT_AMOUNT}' => $this->reference_number,
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@ -38,15 +38,15 @@
|
||||
"barryvdh/laravel-ide-helper": "^2.6",
|
||||
"beyondcode/laravel-dump-server": "^1.0",
|
||||
"facade/ignition": "^2.3.6",
|
||||
"friendsofphp/php-cs-fixer": "^3.8",
|
||||
"fakerphp/faker": "^1.9.1",
|
||||
"friendsofphp/php-cs-fixer": "^3.0",
|
||||
"fzaninotto/faker": "^1.9.1",
|
||||
"mockery/mockery": "^1.3.1",
|
||||
"nunomaduro/collision": "^5.0",
|
||||
"pestphp/pest": "^1.0",
|
||||
"pestphp/pest-plugin-faker": "^1.0",
|
||||
"pestphp/pest-plugin-laravel": "^1.0",
|
||||
"pestphp/pest-plugin-parallel": "^0.2.1",
|
||||
"phpunit/phpunit": "^9.3"
|
||||
"phpunit/phpunit": "^9.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
@ -81,14 +81,11 @@
|
||||
"config": {
|
||||
"optimize-autoloader": true,
|
||||
"preferred-install": "dist",
|
||||
"sort-packages": true,
|
||||
"allow-plugins": {
|
||||
"pestphp/pest-plugin": true
|
||||
}
|
||||
"sort-packages": true
|
||||
},
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"dont-discover": []
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
2361
composer.lock
generated
2361
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -71,7 +71,6 @@ return [
|
||||
["code" => "cs", "name" => "Czech"],
|
||||
["code" => "el", "name" => "Greek"],
|
||||
["code" => "hr", "name" => "Crotian"],
|
||||
["code" => "th", "name" => "ไทย"],
|
||||
],
|
||||
|
||||
/*
|
||||
|
||||
@ -170,7 +170,7 @@ class CountriesTableSeeder extends Seeder
|
||||
['id' => 152,'code' => 'NR','name' => "Nauru",'phonecode' => 674],
|
||||
['id' => 153,'code' => 'NP','name' => "Nepal",'phonecode' => 977],
|
||||
['id' => 154,'code' => 'AN','name' => "Netherlands Antilles",'phonecode' => 599],
|
||||
['id' => 155,'code' => 'NL','name' => "Netherlands",'phonecode' => 31],
|
||||
['id' => 155,'code' => 'NL','name' => "Netherlands The",'phonecode' => 31],
|
||||
['id' => 156,'code' => 'NC','name' => "New Caledonia",'phonecode' => 687],
|
||||
['id' => 157,'code' => 'NZ','name' => "New Zealand",'phonecode' => 64],
|
||||
['id' => 158,'code' => 'NI','name' => "Nicaragua",'phonecode' => 505],
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
FROM php:8.0-fpm-alpine
|
||||
FROM php:7.4-fpm-alpine
|
||||
|
||||
RUN apk add --no-cache \
|
||||
php8-bcmath
|
||||
php7-bcmath
|
||||
|
||||
RUN docker-php-ext-install pdo pdo_mysql bcmath
|
||||
|
||||
|
||||
@ -27,7 +27,7 @@
|
||||
"vite": "^2.6.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@headlessui/vue": "^1.5.0",
|
||||
"@headlessui/vue": "^1.4.0",
|
||||
"@heroicons/vue": "^1.0.1",
|
||||
"@popperjs/core": "^2.9.2",
|
||||
"@stripe/stripe-js": "^1.21.2",
|
||||
@ -48,8 +48,7 @@
|
||||
"mini-svg-data-uri": "^1.3.3",
|
||||
"moment": "^2.29.1",
|
||||
"pinia": "^2.0.4",
|
||||
"v-calendar": "3.0.0-alpha.8",
|
||||
"v-money3": "3.16.1",
|
||||
"v-money3": "^3.13.5",
|
||||
"v-tooltip": "^4.0.0-alpha.1",
|
||||
"vue": "^3.2.0-beta.5",
|
||||
"vue-flatpickr-component": "^9.0.3",
|
||||
|
||||
@ -83,25 +83,25 @@
|
||||
@click="selectNote(index, close)"
|
||||
>
|
||||
<div class="flex justify-between px-2">
|
||||
<BaseLabel
|
||||
<label
|
||||
class="
|
||||
!m-0
|
||||
!text-base
|
||||
!font-semibold
|
||||
!leading-tight
|
||||
!text-gray-700
|
||||
!cursor-pointer
|
||||
m-0
|
||||
text-base
|
||||
font-semibold
|
||||
leading-tight
|
||||
text-gray-700
|
||||
cursor-pointer
|
||||
"
|
||||
>
|
||||
{{ note.name }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="flex justify-center p-5 text-gray-400">
|
||||
<BaseLabel class="!text-base !text-gray-500">
|
||||
<label class="text-base text-gray-500">
|
||||
{{ $t('general.no_note_found') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
@ -122,18 +122,19 @@
|
||||
@click="openNoteModal"
|
||||
>
|
||||
<BaseIcon name="CheckCircleIcon" class="text-primary-400" />
|
||||
<BaseLabel
|
||||
<label
|
||||
class="
|
||||
!m-0
|
||||
!ml-3
|
||||
!leading-none
|
||||
!cursor-pointer
|
||||
!font-base
|
||||
!text-primary-400
|
||||
m-0
|
||||
ml-3
|
||||
text-sm
|
||||
leading-none
|
||||
cursor-pointer
|
||||
font-base
|
||||
text-primary-400
|
||||
"
|
||||
>
|
||||
{{ $t('settings.customization.notes.add_new_note') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
</button>
|
||||
</div>
|
||||
</PopoverPanel>
|
||||
|
||||
@ -64,7 +64,7 @@ function mergeExistingValues() {
|
||||
if (props.isEdit) {
|
||||
props.store[props.storeProp].fields.forEach((field) => {
|
||||
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) {
|
||||
|
||||
@ -9,7 +9,7 @@ import { computed } from 'vue'
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
type: String,
|
||||
default: moment().format('YYYY-MM-DD HH:mm'),
|
||||
default: moment().format('YYYY-MM-DD hh:MM'),
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
@ -17,7 +17,18 @@
|
||||
<td class="px-5 py-4 text-left align-top">
|
||||
<div class="flex justify-start">
|
||||
<div
|
||||
class="flex items-center justify-center w-5 h-5 mt-2 mr-2 text-gray-300 cursor-move handle"
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
w-5
|
||||
h-5
|
||||
mt-2
|
||||
text-gray-300
|
||||
cursor-move
|
||||
handle
|
||||
mr-2
|
||||
"
|
||||
>
|
||||
<DragIcon />
|
||||
</div>
|
||||
@ -97,7 +108,7 @@
|
||||
|
||||
<BaseIcon
|
||||
name="ChevronDownIcon"
|
||||
class="w-4 h-4 ml-1 text-gray-500"
|
||||
class="w-4 h-4 text-gray-500 ml-1"
|
||||
/>
|
||||
</span>
|
||||
</BaseButton>
|
||||
@ -144,7 +155,7 @@
|
||||
<BaseContentPlaceholders v-if="loading">
|
||||
<BaseContentPlaceholdersText
|
||||
:lines="1"
|
||||
class="w-24 h-8 border rounded-md"
|
||||
class="w-24 h-8 rounded-md border"
|
||||
/>
|
||||
</BaseContentPlaceholders>
|
||||
|
||||
@ -164,7 +175,6 @@
|
||||
:ability="abilities.CREATE_INVOICE"
|
||||
:store="store"
|
||||
:store-prop="storeProp"
|
||||
:discount="discount"
|
||||
@update="updateTax"
|
||||
/>
|
||||
</td>
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
<template>
|
||||
<div class="flex items-center justify-between mb-3">
|
||||
<div class="flex items-center text-base" style="flex: 4">
|
||||
<BaseLabel class="!pr-2 !mb-0" align="right">
|
||||
<label class="pr-2 mb-0" align="right">
|
||||
{{ $t('invoices.item.tax') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
|
||||
<BaseMultiselect
|
||||
v-model="selectedTax"
|
||||
@ -30,14 +30,25 @@
|
||||
<template v-if="userStore.hasAbilities(ability)" #action>
|
||||
<button
|
||||
type="button"
|
||||
class="flex items-center justify-center w-full px-2 py-2 bg-gray-200 border-none outline-none cursor-pointer "
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
w-full
|
||||
px-2
|
||||
cursor-pointer
|
||||
py-2
|
||||
bg-gray-200
|
||||
border-none
|
||||
outline-none
|
||||
"
|
||||
@click="openTaxModal"
|
||||
>
|
||||
<BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" />
|
||||
|
||||
<BaseLabel
|
||||
class="!ml-2 !leading-none !cursor-pointer !text-primary-400"
|
||||
>{{ $t('invoices.add_new_tax') }}</BaseLabel
|
||||
<label
|
||||
class="ml-2 text-sm leading-none text-primary-400 cursor-pointer"
|
||||
>{{ $t('invoices.add_new_tax') }}</label
|
||||
>
|
||||
</button>
|
||||
</template>
|
||||
@ -104,10 +115,6 @@ const props = defineProps({
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
discountedTotal: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
currency: {
|
||||
type: [Object, String],
|
||||
required: true,
|
||||
@ -146,19 +153,19 @@ const filteredTypes = computed(() => {
|
||||
})
|
||||
|
||||
const taxAmount = computed(() => {
|
||||
if (localTax.compound_tax && props.discountedTotal) {
|
||||
return ((props.discountedTotal + props.totalTax) * localTax.percent) / 100
|
||||
if (localTax.compound_tax && props.total) {
|
||||
return ((props.total + props.totalTax) * localTax.percent) / 100
|
||||
}
|
||||
|
||||
if (props.discountedTotal && localTax.percent) {
|
||||
return (props.discountedTotal * localTax.percent) / 100
|
||||
if (props.total && localTax.percent) {
|
||||
return (props.total * localTax.percent) / 100
|
||||
}
|
||||
|
||||
return 0
|
||||
})
|
||||
|
||||
watch(
|
||||
() => props.discountedTotal,
|
||||
() => props.total,
|
||||
() => {
|
||||
updateRowTax()
|
||||
}
|
||||
|
||||
@ -5,9 +5,9 @@
|
||||
>
|
||||
<SelectNotePopup :type="type" @select="onSelectNote" />
|
||||
</div>
|
||||
<BaseLabel class="!text-gray-800 !mb-4 ">
|
||||
<label class="text-gray-800 font-medium mb-4 text-sm">
|
||||
{{ $t('invoices.notes') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
<BaseCustomInput
|
||||
v-model="store[storeProp].notes"
|
||||
:content-loading="store.isFetchingInitialSettings"
|
||||
|
||||
@ -16,12 +16,12 @@
|
||||
<BaseContentPlaceholders v-if="isLoading">
|
||||
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
||||
</BaseContentPlaceholders>
|
||||
<BaseLabel
|
||||
<label
|
||||
v-else
|
||||
class="!font-semibold !text-gray-400 !uppercase"
|
||||
class="text-sm font-semibold leading-5 text-gray-400 uppercase"
|
||||
>
|
||||
{{ $t('estimates.sub_total') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
|
||||
<BaseContentPlaceholders v-if="isLoading">
|
||||
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
||||
@ -29,7 +29,14 @@
|
||||
|
||||
<label
|
||||
v-else
|
||||
class="flex items-center justify-center m-0 text-lg text-black dark:text-white uppercase "
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
m-0
|
||||
text-lg text-black
|
||||
uppercase
|
||||
"
|
||||
>
|
||||
<BaseFormatMoney
|
||||
:amount="store.getSubTotal"
|
||||
@ -48,7 +55,7 @@
|
||||
</BaseContentPlaceholders>
|
||||
<label
|
||||
v-else-if="store[storeProp].tax_per_item === 'YES'"
|
||||
class="m-0 text-sm font-semibold leading-5 text-gray-500 uppercase dark:text-gray-400"
|
||||
class="m-0 text-sm font-semibold leading-5 text-gray-500 uppercase"
|
||||
>
|
||||
{{ tax.name }} - {{ tax.percent }}%
|
||||
</label>
|
||||
@ -59,7 +66,14 @@
|
||||
|
||||
<label
|
||||
v-else-if="store[storeProp].tax_per_item === 'YES'"
|
||||
class="flex items-center justify-center m-0 text-lg text-black dark:text-white uppercase "
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
m-0
|
||||
text-lg text-black
|
||||
uppercase
|
||||
"
|
||||
>
|
||||
<BaseFormatMoney :amount="tax.amount" :currency="defaultCurrency" />
|
||||
</label>
|
||||
@ -75,16 +89,16 @@
|
||||
<BaseContentPlaceholders v-if="isLoading">
|
||||
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
||||
</BaseContentPlaceholders>
|
||||
<BaseLabel
|
||||
<label
|
||||
v-else
|
||||
class=" !font-semibold !text-gray-400 !uppercase"
|
||||
class="text-sm font-semibold leading-5 text-gray-400 uppercase"
|
||||
>
|
||||
{{ $t('estimates.discount') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
<BaseContentPlaceholders v-if="isLoading">
|
||||
<BaseContentPlaceholdersText
|
||||
:lines="1"
|
||||
class="w-24 h-8 border rounded-md"
|
||||
class="w-24 h-8 rounded-md border"
|
||||
/>
|
||||
</BaseContentPlaceholders>
|
||||
<div v-else class="flex" style="width: 140px" role="group">
|
||||
@ -100,7 +114,7 @@
|
||||
<BaseDropdown position="bottom-end">
|
||||
<template #activator>
|
||||
<BaseButton
|
||||
class="p-2 rounded-none rounded-tr-md rounded-br-md"
|
||||
class="rounded-tr-md rounded-br-md p-2 rounded-none"
|
||||
type="button"
|
||||
variant="white"
|
||||
>
|
||||
@ -113,7 +127,7 @@
|
||||
|
||||
<BaseIcon
|
||||
name="ChevronDownIcon"
|
||||
class="w-4 h-4 ml-1 text-gray-500"
|
||||
class="w-4 h-4 text-gray-500 ml-1"
|
||||
/>
|
||||
</span>
|
||||
</BaseButton>
|
||||
@ -166,26 +180,41 @@
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="flex items-center justify-between w-full pt-2 mt-5 border-t border-gray-200 border-solid "
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-between
|
||||
w-full
|
||||
pt-2
|
||||
mt-5
|
||||
border-t border-gray-200 border-solid
|
||||
"
|
||||
>
|
||||
<BaseContentPlaceholders v-if="isLoading">
|
||||
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
||||
</BaseContentPlaceholders>
|
||||
<BaseLabel
|
||||
<label
|
||||
v-else
|
||||
class="!m-0 !font-semibold !text-gray-400 !uppercase"
|
||||
>{{ $t('estimates.total') }} {{ $t('estimates.amount') }}:</BaseLabel
|
||||
class="m-0 text-sm font-semibold leading-5 text-gray-400 uppercase"
|
||||
>{{ $t('estimates.total') }} {{ $t('estimates.amount') }}:</label
|
||||
>
|
||||
|
||||
<BaseContentPlaceholders v-if="isLoading">
|
||||
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
||||
</BaseContentPlaceholders>
|
||||
<BaseLabel
|
||||
<label
|
||||
v-else
|
||||
class="!flex !items-center !justify-center !text-lg !uppercase !text-primary-400"
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
text-lg
|
||||
uppercase
|
||||
text-primary-400
|
||||
"
|
||||
>
|
||||
<BaseFormatMoney :amount="store.getTotal" :currency="defaultCurrency" />
|
||||
</BaseLabel>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@ -305,7 +334,6 @@ function selectPercentage() {
|
||||
|
||||
function onSelectTax(selectedTax) {
|
||||
let amount = 0
|
||||
|
||||
if (selectedTax.compound_tax && props.store.getSubtotalWithDiscount) {
|
||||
amount = Math.round(
|
||||
((props.store.getSubtotalWithDiscount + props.store.getTotalSimpleTax) *
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
<template>
|
||||
<div class="flex items-center justify-between w-full mt-2 text-sm">
|
||||
<BaseLabel class="!font-semibold !text-gray-500 !uppercase">
|
||||
<label class="font-semibold leading-5 text-gray-500 uppercase">
|
||||
{{ tax.name }} ({{ tax.percent }} %)
|
||||
</BaseLabel>
|
||||
<label class="flex items-center justify-center text-lg text-black dark:text-white">
|
||||
</label>
|
||||
<label class="flex items-center justify-center text-lg text-black">
|
||||
<BaseFormatMoney :amount="tax.amount" :currency="currency" />
|
||||
|
||||
<BaseIcon
|
||||
|
||||
@ -88,37 +88,38 @@
|
||||
@click="selectTaxType(taxType, close)"
|
||||
>
|
||||
<div class="flex justify-between px-2">
|
||||
<BaseLabel
|
||||
<label
|
||||
class="
|
||||
!m-0
|
||||
!text-base
|
||||
!font-semibold
|
||||
!leading-tight
|
||||
!cursor-pointer
|
||||
m-0
|
||||
text-base
|
||||
font-semibold
|
||||
leading-tight
|
||||
text-gray-700
|
||||
cursor-pointer
|
||||
"
|
||||
>
|
||||
{{ taxType.name }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
|
||||
<BaseLabel
|
||||
<label
|
||||
class="
|
||||
!m-0
|
||||
!text-base
|
||||
!font-semibold
|
||||
!text-gray-700
|
||||
!cursor-pointer
|
||||
m-0
|
||||
text-base
|
||||
font-semibold
|
||||
text-gray-700
|
||||
cursor-pointer
|
||||
"
|
||||
>
|
||||
{{ taxType.percent }} %
|
||||
</BaseLabel>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-else class="flex justify-center p-5 text-gray-400">
|
||||
<BaseLabel class="!text-base !text-gray-500 !cursor-pointer">
|
||||
<label class="text-base text-gray-500 cursor-pointer">
|
||||
{{ $t('general.no_tax_found') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -141,18 +142,19 @@
|
||||
@click="openTaxTypeModal"
|
||||
>
|
||||
<BaseIcon name="CheckCircleIcon" class="text-primary-400" />
|
||||
<BaseLabel
|
||||
<label
|
||||
class="
|
||||
!m-0
|
||||
!ml-3
|
||||
!leading-none
|
||||
!cursor-pointer
|
||||
!font-base
|
||||
!text-primary-400
|
||||
m-0
|
||||
ml-3
|
||||
text-sm
|
||||
leading-none
|
||||
cursor-pointer
|
||||
font-base
|
||||
text-primary-400
|
||||
"
|
||||
>
|
||||
{{ $t('estimates.add_new_tax') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
</button>
|
||||
</div>
|
||||
</PopoverPanel>
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
<template>
|
||||
<div>
|
||||
<BaseLabel class="!flex !text-gray-800 !mb-2">
|
||||
<label class="flex text-gray-800 font-medium text-sm mb-2">
|
||||
{{ $t('general.select_template') }}
|
||||
<span class="text-sm text-red-500"> *</span>
|
||||
</BaseLabel>
|
||||
</label>
|
||||
<BaseButton
|
||||
type="button"
|
||||
class="flex justify-center w-full text-sm lg:w-auto hover:bg-gray-200"
|
||||
|
||||
@ -48,24 +48,6 @@
|
||||
/>
|
||||
</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
|
||||
:content-loading="isFetchingInitialData"
|
||||
:label="$tc('settings.company_info.country')"
|
||||
@ -148,7 +130,7 @@
|
||||
|
||||
<script setup>
|
||||
import { useModalStore } from '@/scripts/stores/modal'
|
||||
import { computed, onMounted, ref, reactive, watch } from 'vue'
|
||||
import { computed, onMounted, ref, reactive } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { required, minLength, helpers } from '@vuelidate/validators'
|
||||
import { useVuelidate } from '@vuelidate/core'
|
||||
@ -170,7 +152,6 @@ let companyLogoName = ref(null)
|
||||
|
||||
const newCompanyForm = reactive({
|
||||
name: null,
|
||||
slug: null,
|
||||
currency: '',
|
||||
address: {
|
||||
country_id: null,
|
||||
@ -181,9 +162,6 @@ const modalActive = computed(() => {
|
||||
return modalStore.active && modalStore.componentName === 'CompanyModal'
|
||||
})
|
||||
|
||||
const slugValidator = (value) => {
|
||||
return value == slugify(value)
|
||||
}
|
||||
const rules = {
|
||||
newCompanyForm: {
|
||||
name: {
|
||||
@ -193,17 +171,6 @@ const rules = {
|
||||
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: {
|
||||
country_id: {
|
||||
required: helpers.withMessage(t('validation.required'), required),
|
||||
@ -276,7 +243,6 @@ async function submitCompanyData() {
|
||||
|
||||
function resetNewCompanyForm() {
|
||||
newCompanyForm.name = ''
|
||||
newCompanyForm.slug = ''
|
||||
newCompanyForm.currency = ''
|
||||
newCompanyForm.address.country_id = ''
|
||||
|
||||
@ -291,24 +257,4 @@ function closeCompanyModal() {
|
||||
v$.value.$reset()
|
||||
}, 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>
|
||||
|
||||
@ -15,13 +15,6 @@
|
||||
bg-gradient-to-r
|
||||
from-primary-500
|
||||
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
|
||||
@ -60,7 +53,6 @@
|
||||
cursor-pointer
|
||||
md:hidden md:ml-0
|
||||
hover:bg-gray-100
|
||||
dark:bg-gray-800 dark:border-gray-500 dark:border
|
||||
"
|
||||
@click.prevent="onToggle"
|
||||
>
|
||||
@ -151,7 +143,7 @@
|
||||
<template #activator>
|
||||
<img
|
||||
:src="previewAvatar"
|
||||
class="block w-8 h-8 rounded md:h-9 md:w-9 object-cover"
|
||||
class="block w-8 h-8 rounded md:h-9 md:w-9"
|
||||
/>
|
||||
</template>
|
||||
|
||||
|
||||
@ -15,9 +15,7 @@
|
||||
leave-from="opacity-100"
|
||||
leave-to="opacity-0"
|
||||
>
|
||||
<DialogOverlay
|
||||
class="fixed inset-0 bg-gray-600 bg-opacity-75 dark:bg-gray-900/90"
|
||||
/>
|
||||
<DialogOverlay class="fixed inset-0 bg-gray-600 bg-opacity-75" />
|
||||
</TransitionChild>
|
||||
|
||||
<TransitionChild
|
||||
@ -29,9 +27,7 @@
|
||||
leave-from="translate-x-0"
|
||||
leave-to="-translate-x-full"
|
||||
>
|
||||
<div
|
||||
class="relative flex flex-col flex-1 w-full max-w-xs bg-white dark:bg-gray-800"
|
||||
>
|
||||
<div class="relative flex flex-col flex-1 w-full max-w-xs bg-white">
|
||||
<TransitionChild
|
||||
as="template"
|
||||
enter="ease-in-out duration-300"
|
||||
@ -44,17 +40,18 @@
|
||||
<div class="absolute top-0 right-0 pt-2 -mr-12">
|
||||
<button
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
w-10
|
||||
h-10
|
||||
ml-1
|
||||
rounded-full
|
||||
focus:outline-none
|
||||
focus:ring-2
|
||||
focus:ring-inset
|
||||
focus:ring-white"
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
w-10
|
||||
h-10
|
||||
ml-1
|
||||
rounded-full
|
||||
focus:outline-none
|
||||
focus:ring-2
|
||||
focus:ring-inset
|
||||
focus:ring-white
|
||||
"
|
||||
@click="globalStore.setSidebarVisibility(false)"
|
||||
>
|
||||
<span class="sr-only">Close sidebar</span>
|
||||
@ -85,8 +82,8 @@
|
||||
:to="item.link"
|
||||
:class="[
|
||||
hasActiveUrl(item.link)
|
||||
? '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 dark:text-gray-300',
|
||||
? 'text-primary-500 border-primary-500 bg-gray-100 '
|
||||
: 'text-black',
|
||||
'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)"
|
||||
@ -103,10 +100,6 @@
|
||||
/>
|
||||
{{ $t(item.title) }}
|
||||
</router-link>
|
||||
<LightDarkSwitch
|
||||
:show-label="false"
|
||||
class="absolute right-6 top-6 !w-auto"
|
||||
/>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
@ -120,16 +113,17 @@
|
||||
<!-- DESKTOP MENU -->
|
||||
<div
|
||||
class="
|
||||
hidden
|
||||
w-56
|
||||
h-screen
|
||||
bg-white
|
||||
border-r border-gray-200 border-solid
|
||||
xl:w-64
|
||||
md:fixed md:flex md:flex-col md:inset-y-0
|
||||
pt-16
|
||||
dark:border-gray-800
|
||||
dark:bg-gray-800/80"
|
||||
hidden
|
||||
w-56
|
||||
h-screen
|
||||
pb-32
|
||||
overflow-y-auto
|
||||
bg-white
|
||||
border-r border-gray-200 border-solid
|
||||
xl:w-64
|
||||
md:fixed md:flex md:flex-col md:inset-y-0
|
||||
pt-16
|
||||
"
|
||||
>
|
||||
<div
|
||||
v-for="menu in globalStore.menuGroups"
|
||||
@ -142,8 +136,8 @@
|
||||
:to="item.link"
|
||||
:class="[
|
||||
hasActiveUrl(item.link)
|
||||
? '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 dark:hover:bg-transparent dark:hover:text-white dark:text-gray-300',
|
||||
? 'text-primary-500 border-primary-500 bg-gray-100 '
|
||||
: 'text-black',
|
||||
'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',
|
||||
]"
|
||||
>
|
||||
@ -151,8 +145,8 @@
|
||||
:name="item.icon"
|
||||
:class="[
|
||||
hasActiveUrl(item.link)
|
||||
? '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 dark:text-gray-400 dark:group-hover:text-white',
|
||||
? 'text-primary-500 group-hover:text-primary-500 '
|
||||
: 'text-gray-400 group-hover:text-black',
|
||||
'mr-4 shrink-0 h-5 w-5 ',
|
||||
]"
|
||||
/>
|
||||
@ -160,9 +154,6 @@
|
||||
{{ $t(item.title) }}
|
||||
</router-link>
|
||||
</div>
|
||||
<LightDarkSwitch
|
||||
class="absolute bottom-0 py-4 border-t border-gray-200 dark:border-gray-700"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -178,7 +169,6 @@ import {
|
||||
|
||||
import { useRoute } from 'vue-router'
|
||||
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
||||
import LightDarkSwitch from '@/scripts/components/LightDarkSwitcher.vue'
|
||||
|
||||
const route = useRoute()
|
||||
const globalStore = useGlobalStore()
|
||||
|
||||
@ -184,20 +184,6 @@ export const useCompanyStore = (useWindow = false) => {
|
||||
setDefaultCurrency(data) {
|
||||
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)
|
||||
})
|
||||
})
|
||||
},
|
||||
},
|
||||
})()
|
||||
}
|
||||
|
||||
@ -34,7 +34,6 @@ export const useGlobalStore = (useWindow = false) => {
|
||||
isAppLoaded: false,
|
||||
isSidebarOpen: false,
|
||||
areCurrenciesLoading: false,
|
||||
isDarkModeOn: false,
|
||||
|
||||
downloadReport: null,
|
||||
}),
|
||||
@ -71,8 +70,8 @@ export const useGlobalStore = (useWindow = false) => {
|
||||
moduleStore.apiToken = response.data.global_settings.api_token
|
||||
moduleStore.enableModules = response.data.modules
|
||||
|
||||
// company store
|
||||
companyStore.companies = response.data.companies
|
||||
// company store
|
||||
companyStore.companies = response.data.companies
|
||||
companyStore.selectedCompany = response.data.current_company
|
||||
companyStore.setSelectedCompany(response.data.current_company)
|
||||
companyStore.selectedCompanySettings =
|
||||
|
||||
@ -32,8 +32,6 @@
|
||||
:content-loading="isLoading"
|
||||
:calendar-button="true"
|
||||
calendar-button-icon="calendar"
|
||||
:show-extra-options="true"
|
||||
:source-date="estimateStore.newEstimate.estimate_date"
|
||||
/>
|
||||
</BaseInputGroup>
|
||||
|
||||
|
||||
@ -34,24 +34,6 @@
|
||||
/>
|
||||
</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
|
||||
:label="$t('wizard.country')"
|
||||
:error="
|
||||
@ -75,7 +57,9 @@
|
||||
track-by="name"
|
||||
/>
|
||||
</BaseInputGroup>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 gap-4 mb-4 md:grid-cols-2 md:mb-6">
|
||||
<BaseInputGroup :label="$t('wizard.state')">
|
||||
<BaseInput
|
||||
v-model="companyForm.address.state"
|
||||
@ -160,9 +144,9 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, computed, onMounted, reactive, watch } from 'vue'
|
||||
import { ref, computed, onMounted, reactive } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { required, minLength, maxLength, helpers } from '@vuelidate/validators'
|
||||
import { required, maxLength, helpers } from '@vuelidate/validators'
|
||||
import { useVuelidate } from '@vuelidate/core'
|
||||
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
||||
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
||||
@ -178,7 +162,6 @@ let logoFileName = ref(null)
|
||||
|
||||
const companyForm = reactive({
|
||||
name: null,
|
||||
slug: null,
|
||||
address: {
|
||||
address_street_1: '',
|
||||
address_street_2: '',
|
||||
@ -205,28 +188,10 @@ onMounted(async () => {
|
||||
})?.id
|
||||
})
|
||||
|
||||
const slugValidator = (value) => {
|
||||
return value == slugify(value)
|
||||
}
|
||||
const rules = {
|
||||
companyForm: {
|
||||
name: {
|
||||
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: {
|
||||
country_id: {
|
||||
@ -284,24 +249,4 @@ async function next() {
|
||||
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>
|
||||
|
||||
@ -56,7 +56,7 @@
|
||||
<BaseMultiselect
|
||||
v-model="filters.status"
|
||||
:groups="true"
|
||||
:options="invoiceStatus"
|
||||
:options="status"
|
||||
searchable
|
||||
:placeholder="$t('general.select_a_status')"
|
||||
@update:modelValue="setActiveTab"
|
||||
@ -130,27 +130,11 @@
|
||||
"
|
||||
>
|
||||
<!-- Tabs -->
|
||||
<BaseTabGroup
|
||||
class="-mb-5"
|
||||
:selected-index="selectedIndex"
|
||||
@change="changeTabStatus"
|
||||
>
|
||||
<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 class="-mb-5" @change="setStatusFilter">
|
||||
<BaseTab :title="$t('general.all')" filter="" />
|
||||
<BaseTab :title="$t('general.draft')" filter="DRAFT" />
|
||||
<BaseTab :title="$t('general.sent')" filter="SENT" />
|
||||
<BaseTab :title="$t('general.due')" filter="DUE" />
|
||||
</BaseTabGroup>
|
||||
|
||||
<BaseDropdown
|
||||
@ -305,10 +289,10 @@ const utils = inject('$utils')
|
||||
const table = ref(null)
|
||||
const showFilters = ref(false)
|
||||
|
||||
const invoiceStatus = ref([
|
||||
const status = ref([
|
||||
{
|
||||
label: 'Status',
|
||||
options: ['DRAFT', 'SENT', 'VIEWED', 'COMPLETED'],
|
||||
options: ['DRAFT', 'DUE', 'SENT', 'VIEWED', 'COMPLETED'],
|
||||
},
|
||||
{
|
||||
label: 'Paid Status',
|
||||
@ -316,29 +300,10 @@ const invoiceStatus = 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 activeTab = ref('general.draft')
|
||||
const router = useRouter()
|
||||
const userStore = useUserStore()
|
||||
const selectedIndex = ref(0)
|
||||
|
||||
let filters = reactive({
|
||||
customer_id: '',
|
||||
@ -346,7 +311,6 @@ let filters = reactive({
|
||||
from_date: '',
|
||||
to_date: '',
|
||||
invoice_number: '',
|
||||
tab_status: '',
|
||||
})
|
||||
|
||||
const showEmptyScreen = computed(
|
||||
@ -437,7 +401,6 @@ async function fetchData({ page, filter, sort }) {
|
||||
from_date: filters.from_date,
|
||||
to_date: filters.to_date,
|
||||
invoice_number: filters.invoice_number,
|
||||
tab_status: filters.tab_status,
|
||||
orderByField: sort.fieldName || 'created_at',
|
||||
orderBy: sort.order || 'desc',
|
||||
page,
|
||||
@ -460,9 +423,29 @@ async function fetchData({ page, filter, sort }) {
|
||||
}
|
||||
}
|
||||
|
||||
function changeTabStatus(val, index) {
|
||||
filters.tab_status = val['tab-status']
|
||||
selectedIndex.value = index
|
||||
function setStatusFilter(val) {
|
||||
if (activeTab.value == val.title) {
|
||||
return true
|
||||
}
|
||||
|
||||
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() {
|
||||
@ -480,6 +463,8 @@ function clearFilter() {
|
||||
filters.from_date = ''
|
||||
filters.to_date = ''
|
||||
filters.invoice_number = ''
|
||||
|
||||
activeTab.value = t('general.all')
|
||||
}
|
||||
|
||||
async function removeMultipleInvoices() {
|
||||
@ -520,21 +505,39 @@ function toggleFilter() {
|
||||
function setActiveTab(val) {
|
||||
switch (val) {
|
||||
case 'DRAFT':
|
||||
selectedIndex.value = 1
|
||||
activeTab.value = t('general.draft')
|
||||
break
|
||||
case 'SENT':
|
||||
activeTab.value = t('general.sent')
|
||||
break
|
||||
|
||||
case 'DUE':
|
||||
activeTab.value = t('general.due')
|
||||
break
|
||||
|
||||
case 'SENT':
|
||||
case 'VIEWED':
|
||||
case 'COMPLETED':
|
||||
activeTab.value = t('invoices.completed')
|
||||
break
|
||||
|
||||
case 'PAID':
|
||||
selectedIndex.value = 2
|
||||
activeTab.value = t('invoices.paid')
|
||||
break
|
||||
|
||||
case 'UNPAID':
|
||||
activeTab.value = t('invoices.unpaid')
|
||||
break
|
||||
|
||||
case 'PARTIALLY_PAID':
|
||||
selectedIndex.value = 3
|
||||
activeTab.value = t('invoices.partially_paid')
|
||||
break
|
||||
|
||||
case 'VIEWED':
|
||||
activeTab.value = t('invoices.viewed')
|
||||
break
|
||||
|
||||
default:
|
||||
activeTab.value = t('general.all')
|
||||
break
|
||||
}
|
||||
filters.tab_status = invoiceTabStatus[selectedIndex.value].value
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -32,8 +32,6 @@
|
||||
:content-loading="isLoading"
|
||||
:calendar-button="true"
|
||||
calendar-button-icon="calendar"
|
||||
:show-extra-options="true"
|
||||
:source-date="invoiceStore.newInvoice.invoice_date"
|
||||
/>
|
||||
</BaseInputGroup>
|
||||
|
||||
|
||||
@ -54,6 +54,8 @@
|
||||
label="name"
|
||||
:options="itemStore.itemUnits"
|
||||
value-prop="id"
|
||||
:can-deselect="false"
|
||||
:can-clear="false"
|
||||
:placeholder="$t('items.select_a_unit')"
|
||||
searchable
|
||||
track-by="name"
|
||||
|
||||
@ -53,7 +53,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="mt-24">
|
||||
<label class="flex items-center justify-center text-gray-500 dark:text-gray-300">
|
||||
<label class="flex items-center justify-center text-gray-500">
|
||||
{{ $t('modules.no_modules_installed') }}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
@ -82,9 +82,9 @@
|
||||
required
|
||||
>
|
||||
<BaseCustomerSelectInput
|
||||
v-if="!isLoadingContent"
|
||||
v-model="paymentStore.currentPayment.customer_id"
|
||||
:content-loading="isLoadingContent"
|
||||
v-if="!isLoadingContent"
|
||||
:invalid="v$.currentPayment.customer_id.$error"
|
||||
:placeholder="$t('customers.select_a_customer')"
|
||||
show-action
|
||||
@ -215,9 +215,9 @@
|
||||
<SelectNotePopup type="Payment" @select="onSelectNote" />
|
||||
</div>
|
||||
|
||||
<BaseLabel class="!mb-4 !text-gray-800">
|
||||
<label class="mb-4 text-sm font-medium text-gray-800">
|
||||
{{ $t('estimates.notes') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
|
||||
<BaseCustomInput
|
||||
v-model="paymentStore.currentPayment.notes"
|
||||
@ -423,7 +423,7 @@ function onCustomerChange(customer_id) {
|
||||
if (customer_id) {
|
||||
let data = {
|
||||
customer_id: customer_id,
|
||||
tab_status: 'DUE',
|
||||
status: 'DUE',
|
||||
limit: 'all',
|
||||
}
|
||||
|
||||
@ -446,11 +446,7 @@ function onCustomerChange(customer_id) {
|
||||
paymentStore.currentPayment.selectedCustomer = res2.data.data
|
||||
paymentStore.currentPayment.customer = res2.data.data
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
@ -28,19 +28,6 @@
|
||||
/>
|
||||
</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')">
|
||||
<BaseInput v-model="companyForm.address.phone" />
|
||||
</BaseInputGroup>
|
||||
@ -173,7 +160,6 @@ let isSaving = ref(false)
|
||||
|
||||
const companyForm = reactive({
|
||||
name: null,
|
||||
slug: null,
|
||||
logo: null,
|
||||
address: {
|
||||
address_street_1: '',
|
||||
@ -207,14 +193,7 @@ const rules = computed(() => {
|
||||
name: {
|
||||
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 }),
|
||||
t('validation.name_min_length'),
|
||||
minLength(3)
|
||||
),
|
||||
},
|
||||
|
||||
@ -8,11 +8,7 @@
|
||||
<BaseInputGroup
|
||||
:content-loading="isFetchingInitialData"
|
||||
:label="$tc('settings.preferences.currency')"
|
||||
:help-text="
|
||||
isCurrencyDisabled
|
||||
? $t('settings.preferences.company_currency_unchangeable')
|
||||
: ''
|
||||
"
|
||||
:help-text="$t('settings.preferences.company_currency_unchangeable')"
|
||||
:error="v$.currency.$error && v$.currency.$errors[0].$message"
|
||||
required
|
||||
>
|
||||
@ -25,7 +21,7 @@
|
||||
:searchable="true"
|
||||
track-by="name"
|
||||
:invalid="v$.currency.$error"
|
||||
:disabled="isCurrencyDisabled"
|
||||
disabled
|
||||
class="w-full"
|
||||
>
|
||||
</BaseMultiselect>
|
||||
@ -191,7 +187,6 @@ const { t, tm } = useI18n()
|
||||
let isSaving = ref(false)
|
||||
let isDataSaving = ref(false)
|
||||
let isFetchingInitialData = ref(false)
|
||||
let isCurrencyDisabled = ref(true)
|
||||
|
||||
const settingsForm = reactive({ ...companyStore.selectedCompanySettings })
|
||||
|
||||
@ -287,14 +282,10 @@ setInitialData()
|
||||
async function setInitialData() {
|
||||
isFetchingInitialData.value = true
|
||||
Promise.all([
|
||||
companyStore.checkCompanyHasCurrencyTransactions(),
|
||||
globalStore.fetchCurrencies(),
|
||||
globalStore.fetchDateFormats(),
|
||||
globalStore.fetchTimeZones(),
|
||||
]).then(([res1]) => {
|
||||
if (res1.data?.has_transactions == false) {
|
||||
isCurrencyDisabled.value = false
|
||||
}
|
||||
isFetchingInitialData.value = false
|
||||
})
|
||||
}
|
||||
|
||||
@ -4,9 +4,9 @@
|
||||
:description="$t('settings.update_app.description')"
|
||||
>
|
||||
<div class="pb-8 ml-0">
|
||||
<BaseLabel class="!input-label">
|
||||
<label class="text-sm not-italic font-medium input-label">
|
||||
{{ $t('settings.update_app.current_version') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
|
||||
<div
|
||||
class="
|
||||
@ -64,9 +64,9 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<BaseLabel class="!input-label">
|
||||
<label class="text-sm not-italic font-medium input-label">
|
||||
{{ $t('settings.update_app.next_version') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
<br />
|
||||
<div
|
||||
class="
|
||||
@ -99,9 +99,9 @@
|
||||
v-html="description"
|
||||
></div>
|
||||
|
||||
<BaseLabel class=" !input-label">
|
||||
<label class="text-sm not-italic font-medium input-label">
|
||||
{{ $t('settings.update_app.requirements') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
|
||||
<table class="w-1/2 mt-2 border-2 border-gray-200 BaseTable-fixed">
|
||||
<tr
|
||||
|
||||
@ -97,7 +97,6 @@
|
||||
whitespace-nowrap
|
||||
mr-2
|
||||
min-w-[200px]
|
||||
dark:text-primary-400
|
||||
"
|
||||
>
|
||||
{{ element.label }}
|
||||
|
||||
@ -50,20 +50,20 @@
|
||||
pb-4
|
||||
"
|
||||
>
|
||||
<BaseLabel
|
||||
<label
|
||||
class="
|
||||
!px-3
|
||||
!py-2
|
||||
!text-xs
|
||||
!font-semibold
|
||||
!text-gray-400
|
||||
!mb-0.5
|
||||
!block
|
||||
!uppercase
|
||||
px-3
|
||||
py-2
|
||||
text-xs
|
||||
font-semibold
|
||||
text-gray-400
|
||||
mb-0.5
|
||||
block
|
||||
uppercase
|
||||
"
|
||||
>
|
||||
{{ $t('company_switcher.label') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
|
||||
<div
|
||||
v-if="companyStore.companies.length < 1"
|
||||
|
||||
@ -62,9 +62,9 @@
|
||||
</div>
|
||||
<div v-else>
|
||||
<div v-if="usersStore.customerList.length > 0">
|
||||
<BaseLabel class="!text-gray-400 !mb-0.5 !block !px-2 !uppercase">
|
||||
<label class="text-sm text-gray-400 mb-0.5 block px-2 uppercase">
|
||||
{{ $t('global_search.customers') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
<div
|
||||
v-for="(customer, index) in usersStore.customerList"
|
||||
:key="index"
|
||||
@ -108,11 +108,11 @@
|
||||
</div>
|
||||
|
||||
<div v-if="usersStore.userList.length > 0" class="mt-2">
|
||||
<BaseLabel
|
||||
class="!text-gray-400 !mb-2 !block !px-2 !uppercase"
|
||||
<label
|
||||
class="text-sm text-gray-400 mb-2 block px-2 mb-0.5 uppercase"
|
||||
>
|
||||
{{ $t('global_search.users') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
<div
|
||||
v-for="(user, index) in usersStore.userList"
|
||||
:key="index"
|
||||
|
||||
@ -1,101 +0,0 @@
|
||||
<!-- 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>
|
||||
@ -15,7 +15,7 @@
|
||||
v-if="label"
|
||||
:for="id"
|
||||
:class="`font-medium ${
|
||||
disabled ? 'text-gray-400 cursor-not-allowed' : 'text-gray-600 dark:text-white'
|
||||
disabled ? 'text-gray-400 cursor-not-allowed' : 'text-gray-600'
|
||||
} cursor-pointer `"
|
||||
>
|
||||
{{ label }}
|
||||
|
||||
@ -126,7 +126,7 @@ onMounted(() => {
|
||||
})
|
||||
|
||||
const value = computed({
|
||||
get: () => (props.modelValue ? props.modelValue : ''),
|
||||
get: () => props.modelValue,
|
||||
set: (value) => {
|
||||
emit('update:modelValue', value)
|
||||
},
|
||||
@ -195,9 +195,7 @@ async function getFields() {
|
||||
{ label: 'Date', value: 'INVOICE_DATE' },
|
||||
{ label: 'Due Date', value: 'INVOICE_DUE_DATE' },
|
||||
{ label: 'Number', value: 'INVOICE_NUMBER' },
|
||||
{ label: 'PDF Link', value: 'PDF_LINK' },
|
||||
{ label: 'Due Amount', value: 'DUE_AMOUNT' },
|
||||
{ label: 'Total Amount', value: 'TOTAL_AMOUNT' },
|
||||
{ label: 'Ref Number', value: 'INVOICE_REF_NUMBER' },
|
||||
...invoiceFields.value.map((i) => ({
|
||||
label: i.label,
|
||||
value: i.slug,
|
||||
@ -213,8 +211,7 @@ async function getFields() {
|
||||
{ label: 'Date', value: 'ESTIMATE_DATE' },
|
||||
{ label: 'Expiry Date', value: 'ESTIMATE_EXPIRY_DATE' },
|
||||
{ label: 'Number', value: 'ESTIMATE_NUMBER' },
|
||||
{ label: 'PDF Link', value: 'PDF_LINK' },
|
||||
{ label: 'Total Amount', value: 'TOTAL_AMOUNT' },
|
||||
{ label: 'Ref Number', value: 'ESTIMATE_REF_NUMBER' },
|
||||
...estimateFields.value.map((i) => ({
|
||||
label: i.label,
|
||||
value: i.slug,
|
||||
@ -231,7 +228,6 @@ async function getFields() {
|
||||
{ label: 'Number', value: 'PAYMENT_NUMBER' },
|
||||
{ label: 'Mode', value: 'PAYMENT_MODE' },
|
||||
{ label: 'Amount', value: 'PAYMENT_AMOUNT' },
|
||||
{ label: 'PDF Link', value: 'PDF_LINK' },
|
||||
...paymentFields.value.map((i) => ({
|
||||
label: i.label,
|
||||
value: i.slug,
|
||||
|
||||
@ -69,29 +69,31 @@
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-8 mt-2">
|
||||
<div v-if="selectedCustomer.billing" class="flex flex-col">
|
||||
<BaseLabel
|
||||
<label
|
||||
class="
|
||||
!mb-1
|
||||
!text-left !text-gray-400
|
||||
!uppercase
|
||||
!whitespace-nowrap
|
||||
mb-1
|
||||
text-sm
|
||||
font-medium
|
||||
text-left text-gray-400
|
||||
uppercase
|
||||
whitespace-nowrap
|
||||
"
|
||||
>
|
||||
{{ $t('general.bill_to') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
|
||||
<div
|
||||
v-if="selectedCustomer.billing"
|
||||
class="flex flex-col flex-1 p-0 text-left"
|
||||
>
|
||||
<BaseLabel
|
||||
<label
|
||||
v-if="selectedCustomer.billing.name"
|
||||
class="!relative !w-11/12 !truncate"
|
||||
class="relative w-11/12 text-sm truncate"
|
||||
>
|
||||
{{ selectedCustomer.billing.name }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
|
||||
<BaseLabel class="!relative !w-11/12 !truncate">
|
||||
<label class="relative w-11/12 text-sm truncate">
|
||||
<span v-if="selectedCustomer.billing.city">
|
||||
{{ selectedCustomer.billing.city }}
|
||||
</span>
|
||||
@ -106,40 +108,42 @@
|
||||
<span v-if="selectedCustomer.billing.state">
|
||||
{{ selectedCustomer.billing.state }}
|
||||
</span>
|
||||
</BaseLabel>
|
||||
<BaseLabel
|
||||
</label>
|
||||
<label
|
||||
v-if="selectedCustomer.billing.zip"
|
||||
class="!relative !w-11/12 !truncate"
|
||||
class="relative w-11/12 text-sm truncate"
|
||||
>
|
||||
{{ selectedCustomer.billing.zip }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="selectedCustomer.shipping" class="flex flex-col">
|
||||
<BaseLabel
|
||||
<label
|
||||
class="
|
||||
!mb-1
|
||||
!text-left !text-gray-400
|
||||
!uppercase
|
||||
!whitespace-nowrap
|
||||
mb-1
|
||||
text-sm
|
||||
font-medium
|
||||
text-left text-gray-400
|
||||
uppercase
|
||||
whitespace-nowrap
|
||||
"
|
||||
>
|
||||
{{ $t('general.ship_to') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
|
||||
<div
|
||||
v-if="selectedCustomer.shipping"
|
||||
class="flex flex-col flex-1 p-0 text-left"
|
||||
>
|
||||
<BaseLabel
|
||||
<label
|
||||
v-if="selectedCustomer.shipping.name"
|
||||
class="!relative !w-11/12 !truncate"
|
||||
class="relative w-11/12 text-sm truncate"
|
||||
>
|
||||
{{ selectedCustomer.shipping.name }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
|
||||
<BaseLabel class="!relative !w-11/12 !truncate">
|
||||
<label class="relative w-11/12 text-sm truncate">
|
||||
<span v-if="selectedCustomer.shipping.city">
|
||||
{{ selectedCustomer.shipping.city }}
|
||||
</span>
|
||||
@ -154,13 +158,13 @@
|
||||
<span v-if="selectedCustomer.shipping.state">
|
||||
{{ selectedCustomer.shipping.state }}
|
||||
</span>
|
||||
</BaseLabel>
|
||||
<BaseLabel
|
||||
</label>
|
||||
<label
|
||||
v-if="selectedCustomer.shipping.zip"
|
||||
class="!relative !w-11/12 !text-sm !truncate"
|
||||
class="relative w-11/12 text-sm truncate"
|
||||
>
|
||||
{{ selectedCustomer.shipping.zip }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -207,7 +211,7 @@
|
||||
/>
|
||||
|
||||
<div class="mt-1">
|
||||
<label class="text-lg font-medium text-gray-900 dark:text-white">
|
||||
<label class="text-lg font-medium text-gray-900">
|
||||
{{ $t('customers.new_customer') }}
|
||||
<span class="text-red-500"> * </span>
|
||||
</label>
|
||||
@ -331,9 +335,9 @@
|
||||
v-if="customerStore.customers.length === 0"
|
||||
class="flex justify-center p-5 text-gray-400"
|
||||
>
|
||||
<BaseLabel class="!text-base !text-gray-500 !cursor-pointer">
|
||||
<label class="text-base text-gray-500 cursor-pointer">
|
||||
{{ $t('customers.no_customers_found') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
@ -358,18 +362,19 @@
|
||||
>
|
||||
<BaseIcon name="UserAddIcon" class="text-primary-400" />
|
||||
|
||||
<BaseLabel
|
||||
<label
|
||||
class="
|
||||
!m-0
|
||||
!ml-3
|
||||
!leading-none
|
||||
!cursor-pointer
|
||||
!font-base
|
||||
!text-primary-400
|
||||
m-0
|
||||
ml-3
|
||||
text-sm
|
||||
leading-none
|
||||
cursor-pointer
|
||||
font-base
|
||||
text-primary-400
|
||||
"
|
||||
>
|
||||
{{ $t('customers.add_new_customer') }}
|
||||
</BaseLabel>
|
||||
</label>
|
||||
</button>
|
||||
</PopoverPanel>
|
||||
</div>
|
||||
|
||||
@ -7,108 +7,52 @@
|
||||
/>
|
||||
</BaseContentPlaceholders>
|
||||
|
||||
<div v-else :class="computedContainerClass">
|
||||
<date-picker
|
||||
ref="vCalendar"
|
||||
v-model="date"
|
||||
:mode="mode"
|
||||
:is24hr="time24hr"
|
||||
class="w-full"
|
||||
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"
|
||||
<div v-else :class="computedContainerClass" class="relative flex flex-row">
|
||||
<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="onClickDp"
|
||||
>
|
||||
<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>
|
||||
<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" />
|
||||
<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>
|
||||
<FlatPickr
|
||||
ref="dp"
|
||||
v-model="date"
|
||||
v-bind="$attrs"
|
||||
:disabled="disabled"
|
||||
:config="config"
|
||||
:class="[defaultInputClass, inputInvalidClass, inputDisabledClass]"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script type="text/babel" setup>
|
||||
import { Calendar, DatePicker } from 'v-calendar'
|
||||
import 'v-calendar/dist/style.css'
|
||||
import FlatPickr from 'vue-flatpickr-component'
|
||||
import 'flatpickr/dist/flatpickr.css'
|
||||
import { computed, reactive, watch, ref, useSlots } from 'vue'
|
||||
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
||||
import moment from 'moment'
|
||||
|
||||
const dp = ref(null)
|
||||
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
@ -146,31 +90,36 @@ const props = defineProps({
|
||||
defaultInputClass: {
|
||||
type: String,
|
||||
default:
|
||||
'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',
|
||||
'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: {
|
||||
type: Boolean,
|
||||
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 slots = useSlots()
|
||||
|
||||
const companyStore = useCompanyStore()
|
||||
const { global } = window.i18n
|
||||
const vCalendar = ref(null)
|
||||
|
||||
let config = reactive({
|
||||
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(() => {
|
||||
return !!slots.icon
|
||||
@ -186,6 +135,7 @@ const inputInvalidClass = computed(() => {
|
||||
if (props.invalid) {
|
||||
return 'border-red-400 ring-red-400 focus:ring-red-400 focus:border-red-400'
|
||||
}
|
||||
|
||||
return ''
|
||||
})
|
||||
|
||||
@ -193,97 +143,35 @@ const inputDisabledClass = computed(() => {
|
||||
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 ''
|
||||
})
|
||||
|
||||
// to convert YYYY-MM-DD | YYYY-MM-DD HH:mm format
|
||||
function convertYMDFormat(date) {
|
||||
let format = props.enableTime ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD'
|
||||
return date ? moment(date).format(format) : date
|
||||
function onClickDp(params) {
|
||||
dp.value.fp.open()
|
||||
}
|
||||
|
||||
const date = computed({
|
||||
get: () => props.modelValue,
|
||||
set: (value) => {
|
||||
emit('update:modelValue', value)
|
||||
},
|
||||
})
|
||||
|
||||
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(
|
||||
() => carbonFormat,
|
||||
() => {
|
||||
if (!props.enableTime) {
|
||||
masks.input = carbonFormat.value ? carbonFormat.value : 'DD MMM YYYY'
|
||||
config.mask = 'YYYY-MM-DD'
|
||||
} else {
|
||||
let timeFormat = 'HH:mm'
|
||||
if (props.time24hr) {
|
||||
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}`
|
||||
() => props.enableTime,
|
||||
(val) => {
|
||||
if (props.enableTime) {
|
||||
config.enableTime = props.enableTime
|
||||
}
|
||||
},
|
||||
{ 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)
|
||||
}
|
||||
watch(
|
||||
() => carbonFormat,
|
||||
() => {
|
||||
if (!props.enableTime) {
|
||||
config.altFormat = carbonFormat.value ? carbonFormat.value : 'd M Y'
|
||||
} else {
|
||||
config.altFormat = carbonFormat.value
|
||||
? `${carbonFormat.value} H:i `
|
||||
: 'd M Y H:i'
|
||||
}
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
</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>
|
||||
|
||||
@ -4,10 +4,10 @@
|
||||
<slot></slot>
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
<BaseLabel >{{ title }}</BaseLabel>
|
||||
<label class="font-medium">{{ title }}</label>
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
<label class="text-gray-500 dark:text-gray-400">
|
||||
<label class="text-gray-500">
|
||||
{{ description }}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
@ -20,7 +20,6 @@
|
||||
hover:text-gray-700
|
||||
top-2.5
|
||||
right-3.5
|
||||
dark:text-gray-300
|
||||
"
|
||||
@click="$emit('clear')"
|
||||
>
|
||||
|
||||
@ -3,15 +3,18 @@
|
||||
<BaseContentPlaceholders v-if="contentLoading">
|
||||
<BaseContentPlaceholdersText :lines="1" :class="contentLoadClass" />
|
||||
</BaseContentPlaceholders>
|
||||
<BaseLabel
|
||||
<label
|
||||
v-else-if="label"
|
||||
:class="labelClasses"
|
||||
class="
|
||||
!flex
|
||||
!items-center
|
||||
!text-gray-800
|
||||
!whitespace-nowrap
|
||||
!justify-between
|
||||
flex
|
||||
text-sm
|
||||
not-italic
|
||||
items-center
|
||||
font-medium
|
||||
text-gray-800
|
||||
whitespace-nowrap
|
||||
justify-between
|
||||
"
|
||||
>
|
||||
<div>
|
||||
@ -25,10 +28,10 @@
|
||||
name="InformationCircleIcon"
|
||||
class="h-4 text-gray-400 cursor-pointer hover:text-gray-600"
|
||||
/>
|
||||
</BaseLabel>
|
||||
</label>
|
||||
<div :class="inputContainerClasses">
|
||||
<slot></slot>
|
||||
<span v-if="helpText" class="text-gray-500 text-xs mt-1 font-light dark:text-gray-400">
|
||||
<span v-if="helpText" class="text-gray-500 text-xs mt-1 font-light">
|
||||
{{ helpText }}
|
||||
</span>
|
||||
<span v-if="error" class="block mt-0.5 text-sm text-red-500">
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<label class="text-sm not-italic font-medium leading-5 text-primary-800 dark:!text-gray-300">
|
||||
<label class="text-sm not-italic font-medium leading-5 text-primary-800">
|
||||
<slot />
|
||||
</label>
|
||||
</template>
|
||||
|
||||
@ -1,10 +1,6 @@
|
||||
<template>
|
||||
<div>
|
||||
<TabGroup
|
||||
:selected-index="selectedIndex"
|
||||
:default-index="defaultIndex"
|
||||
@change="onChange"
|
||||
>
|
||||
<TabGroup :default-index="defaultIndex" @change="onChange">
|
||||
<TabList
|
||||
:class="[
|
||||
'flex border-b border-grey-light',
|
||||
@ -58,10 +54,6 @@ const props = defineProps({
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
selectedIndex: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
filter: {
|
||||
type: String,
|
||||
default: null,
|
||||
@ -75,6 +67,6 @@ const slots = useSlots()
|
||||
const tabs = computed(() => slots.default().map((tab) => tab.props))
|
||||
|
||||
function onChange(d) {
|
||||
emit('change', tabs.value[d], d)
|
||||
emit('change', tabs.value[d])
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -7,12 +7,12 @@ export function usePopper(options) {
|
||||
let popper = ref(null)
|
||||
|
||||
onMounted(() => {
|
||||
watchEffect((onInvalidate) => {
|
||||
watchEffect(onInvalidate => {
|
||||
if (!container.value) return
|
||||
if (!activator.value) return
|
||||
|
||||
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 (!(containerEl instanceof HTMLElement)) return
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
"customers": "العملاء",
|
||||
"items": "بضائع/خدمات",
|
||||
"invoices": "الفواتير",
|
||||
"recurring-invoices": "Recurring Invoices",
|
||||
"recurring-invoices": "الفواتير المتكررة",
|
||||
"expenses": "النفقات",
|
||||
"estimates": "التقديرات",
|
||||
"payments": "الدفوعات",
|
||||
@ -12,7 +12,7 @@
|
||||
"settings": "الإعدادات",
|
||||
"logout": "تسجيل الخروج",
|
||||
"users": "المستخدمون",
|
||||
"modules": "Modules"
|
||||
"modules": "الإضافات"
|
||||
},
|
||||
"general": {
|
||||
"add_company": "أضف شركة",
|
||||
@ -29,9 +29,9 @@
|
||||
"to_date": "إلى تاريخ",
|
||||
"from": "من",
|
||||
"to": "إلى",
|
||||
"ok": "Ok",
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
"ok": "حسناً",
|
||||
"yes": "نعم",
|
||||
"no": "لا",
|
||||
"sort_by": "ترتيب حسب",
|
||||
"ascending": "تصاعدي",
|
||||
"descending": "تنازلي",
|
||||
@ -39,7 +39,7 @@
|
||||
"body": "الجسم",
|
||||
"message": "رسالة",
|
||||
"send": "إرسال",
|
||||
"preview": "Preview",
|
||||
"preview": "معاينة",
|
||||
"go_back": "إلى الخلف",
|
||||
"back_to_login": "العودة إلى تسجيل الدخول؟",
|
||||
"home": "الرئيسية",
|
||||
@ -65,7 +65,7 @@
|
||||
"sent": "ارسلت",
|
||||
"all": "الكل",
|
||||
"select_all": "تحديد الكل",
|
||||
"select_template": "Select Template",
|
||||
"select_template": "تحديد القالب",
|
||||
"choose_file": "اضغط هنا لاختيار ملف",
|
||||
"choose_template": "اختيار القالب",
|
||||
"choose": "اختر",
|
||||
@ -93,14 +93,14 @@
|
||||
"no_note_found": "لم يتم العثور على الملاحظة",
|
||||
"insert_note": "أدخل ملاحظة",
|
||||
"copied_pdf_url_clipboard": "تم نسخ رابط PDF إلى الحافظة!",
|
||||
"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",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"mark_as_default": "Mark as default"
|
||||
"copied_url_clipboard": "تم نسخ الرابط إلى الحافظة!",
|
||||
"docs": "المستندات",
|
||||
"do_you_wish_to_continue": "هل ترغب في المتابعة؟",
|
||||
"note": "ملاحظة",
|
||||
"pay_invoice": "سدد الفاتورة",
|
||||
"login_successfully": "تم تسجيل الدخول بنجاح!",
|
||||
"logged_out_successfully": "تم تسجيل الخروج",
|
||||
"mark_as_default": "تحديد كافتراضي"
|
||||
},
|
||||
"dashboard": {
|
||||
"select_year": "اختر السنة",
|
||||
@ -109,7 +109,7 @@
|
||||
"customers": "العملاء",
|
||||
"invoices": "الفواتير",
|
||||
"estimates": "التقديرات",
|
||||
"payments": "Payments"
|
||||
"payments": "المدفوعات"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "المبيعات",
|
||||
@ -151,27 +151,27 @@
|
||||
"no_results_found": "لم يتم العثور على نتائج"
|
||||
},
|
||||
"company_switcher": {
|
||||
"label": "SWITCH COMPANY",
|
||||
"no_results_found": "No Results Found",
|
||||
"add_new_company": "Add new company",
|
||||
"new_company": "New company",
|
||||
"created_message": "Company created successfully"
|
||||
"label": "تبديل الشركة",
|
||||
"no_results_found": "لا توجد نتائج",
|
||||
"add_new_company": "إضافة شركة جديدة",
|
||||
"new_company": "شركة جديدة",
|
||||
"created_message": "تم إنشاء الشركة بنجاح"
|
||||
},
|
||||
"dateRange": {
|
||||
"today": "Today",
|
||||
"this_week": "This Week",
|
||||
"this_month": "This Month",
|
||||
"this_quarter": "This Quarter",
|
||||
"this_year": "This Year",
|
||||
"previous_week": "Previous Week",
|
||||
"previous_month": "Previous Month",
|
||||
"previous_quarter": "Previous Quarter",
|
||||
"previous_year": "Previous Year",
|
||||
"custom": "Custom"
|
||||
"today": "اليوم",
|
||||
"this_week": "هذا الاسبوع",
|
||||
"this_month": "هذا الشهر",
|
||||
"this_quarter": "هذا الربع",
|
||||
"this_year": "هذه السنة",
|
||||
"previous_week": "الأسبوع السابق",
|
||||
"previous_month": "الشهر الماضي",
|
||||
"previous_quarter": "الربع السابق",
|
||||
"previous_year": "السنة الماضية",
|
||||
"custom": "مخصص"
|
||||
},
|
||||
"customers": {
|
||||
"title": "العملاء",
|
||||
"prefix": "Prefix",
|
||||
"prefix": "البادئة",
|
||||
"add_customer": "إضافة عميل",
|
||||
"contacts_list": "قائمة العملاء",
|
||||
"name": "الاسم",
|
||||
@ -186,9 +186,9 @@
|
||||
"phone": "الهاتف",
|
||||
"website": "موقع الإنترنت",
|
||||
"overview": "استعراض",
|
||||
"invoice_prefix": "Invoice Prefix",
|
||||
"estimate_prefix": "Estimate Prefix",
|
||||
"payment_prefix": "Payment Prefix",
|
||||
"invoice_prefix": "بادئة الفاتورة",
|
||||
"estimate_prefix": "بادئة رقم التقدير",
|
||||
"payment_prefix": "بادئة رقم الدفعة",
|
||||
"enable_portal": "تفعيل البوابة",
|
||||
"country": "الدولة",
|
||||
"state": "الولاية/المنطقة",
|
||||
@ -197,7 +197,7 @@
|
||||
"added_on": "أضيف في",
|
||||
"action": "إجراء",
|
||||
"password": "كلمة المرور",
|
||||
"confirm_password": "Confirm Password",
|
||||
"confirm_password": "تأكيد كلمة المرور",
|
||||
"street_number": "رقم الشارع",
|
||||
"primary_currency": "العملة الرئيسية",
|
||||
"description": "الوصف",
|
||||
@ -208,10 +208,10 @@
|
||||
"new_customer": "عميل جديد",
|
||||
"edit_customer": "تعديل عميل",
|
||||
"basic_info": "معلوات أساسية",
|
||||
"portal_access": "Portal Access",
|
||||
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||
"portal_access_url": "Customer Portal Login URL",
|
||||
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||
"portal_access": "الوصول إلى بوابة العملاء",
|
||||
"portal_access_text": "هل تريد السماح لهذا العميل بتسجيل الدخول إلى بوابة العملاء؟",
|
||||
"portal_access_url": "رابط بوابة العملاء",
|
||||
"portal_access_url_help": "يرجى نسخ وإعادة إرسال عنوان URL أعلاه إلى الزبون لتوفير الوصول.",
|
||||
"billing_address": "عنوان الفوترة",
|
||||
"shipping_address": "عنوان الشحن",
|
||||
"copy_billing_address": "نسخ من عنوان الفوترة",
|
||||
@ -231,9 +231,9 @@
|
||||
"confirm_delete": "لن تتمكن من استرداد هذا العميل وجميع الفواتير والتقديرات والمدفوعات ذات الصلة. | لن تتمكن من استرداد هؤلاء العملاء وجميع الفواتير والتقديرات والمدفوعات ذات الصلة.",
|
||||
"created_message": "تم إنشاء العملاء بنجاح",
|
||||
"updated_message": "تم تحديث العملاء بنجاح",
|
||||
"address_updated_message": "Address Information Updated succesfully",
|
||||
"address_updated_message": "تم تحديث العنوان بنجاح",
|
||||
"deleted_message": "تم حذف العملاء بنجاح | تم حذف العميل بنجاح",
|
||||
"edit_currency_not_allowed": "Cannot change currency once transactions created."
|
||||
"edit_currency_not_allowed": "لا يمكن تغيير العملة بمجرد إنشاء معاملة."
|
||||
},
|
||||
"items": {
|
||||
"title": "الأصناف",
|
||||
@ -265,8 +265,8 @@
|
||||
},
|
||||
"estimates": {
|
||||
"title": "التقديرات",
|
||||
"accept_estimate": "Accept Estimate",
|
||||
"reject_estimate": "Reject Estimate",
|
||||
"accept_estimate": "قبول التقدير",
|
||||
"reject_estimate": "رفض التقدير",
|
||||
"estimate": "تقدير | تقديرات",
|
||||
"estimates_list": "قائمة التقديرات",
|
||||
"days": "{days} أيام",
|
||||
@ -318,10 +318,10 @@
|
||||
},
|
||||
"accepted": "مقبول",
|
||||
"rejected": "مرفوض",
|
||||
"expired": "Expired",
|
||||
"expired": "انتهت مدة الصلاحية",
|
||||
"sent": "مرسل",
|
||||
"draft": "مسودة",
|
||||
"viewed": "Viewed",
|
||||
"viewed": "تمت المشاهدة",
|
||||
"declined": "مرفوض",
|
||||
"new_estimate": "تقدير جديد",
|
||||
"add_new_estimate": "إضافة تقدير جديد",
|
||||
@ -355,14 +355,14 @@
|
||||
"select_an_item": "اكتب أو اختر الصنف",
|
||||
"type_item_description": "اكتب وصف الصنف (اختياري)"
|
||||
},
|
||||
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||
"mark_as_default_estimate_template_description": "في حالة التعفيل، سيتم اختيار القالب المحدد تلقائياً للتقديرات الجديدة."
|
||||
},
|
||||
"invoices": {
|
||||
"title": "الفواتير",
|
||||
"download": "Download",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"download": "تحميل",
|
||||
"pay_invoice": "سدد الفاتورة",
|
||||
"invoices_list": "قائمة الفواتير",
|
||||
"invoice_information": "Invoice Information",
|
||||
"invoice_information": "معلومات الفاتورة",
|
||||
"days": "{days} أيام",
|
||||
"months": "{months} أشهر",
|
||||
"years": "{years} سنوات",
|
||||
@ -397,13 +397,13 @@
|
||||
"send_invoice": "إرسال الفاتورة",
|
||||
"resend_invoice": "إعادة إرسال الفاتورة",
|
||||
"invoice_template": "قالب الفاتورة",
|
||||
"conversion_message": "Invoice cloned successful",
|
||||
"conversion_message": "تم استنساخ الفاتورة بنجاح",
|
||||
"template": "قالب",
|
||||
"mark_as_sent": "تحديد كمرسل",
|
||||
"confirm_send_invoice": "سيتم إرسال هذه الفاتورة بالبريد الألكتروني إلى العميل",
|
||||
"invoice_mark_as_sent": "سيتم تحديد هذه الفاتورة كمرسلة",
|
||||
"confirm_mark_as_accepted": "This invoice will be marked as Accepted",
|
||||
"confirm_mark_as_rejected": "This invoice will be marked as Rejected",
|
||||
"confirm_mark_as_accepted": "سيتم تحديد هذه الفاتورة كمقبولة",
|
||||
"confirm_mark_as_rejected": "سيتم تحديد هذه الفاتورة كمرفوضة",
|
||||
"confirm_send": "سيتم إرسال هذه الفاتورة بالبريد الألكتروني إلى العميل",
|
||||
"invoice_date": "تاريخ الفاتورة",
|
||||
"record_payment": "تسجيل مدفوعات",
|
||||
@ -415,13 +415,13 @@
|
||||
"update_invoice": "تحديث الفاتورة",
|
||||
"add_new_tax": "إضافة ضريبة جديدة",
|
||||
"no_invoices": "لا يوجد فواتير حتى الآن!",
|
||||
"mark_as_rejected": "Mark as rejected",
|
||||
"mark_as_accepted": "Mark as accepted",
|
||||
"mark_as_rejected": "تحديد كمرفوض",
|
||||
"mark_as_accepted": "تحديد كمقبول",
|
||||
"list_of_invoices": "قائمة الفواتير .",
|
||||
"select_invoice": "اختر الفاتورة",
|
||||
"no_matching_invoices": "لا يوجد فواتير مطابقة!",
|
||||
"mark_as_sent_successfully": "تم تحديد الفاتورة كمرسلة بنجاح",
|
||||
"invoice_sent_successfully": "Invoice sent successfully",
|
||||
"invoice_sent_successfully": "تم إرسال الفاتورة بنجاح",
|
||||
"cloned_successfully": "تم استنساخ الفاتورة بنجاح",
|
||||
"clone_invoice": "استنساخ الفاتورة",
|
||||
"confirm_clone": "سيتم استنساخ هذه الفاتورة في فاتورة جديدة",
|
||||
@ -447,14 +447,14 @@
|
||||
"marked_as_sent_message": "تم إرسال الفاتورة بنجاح",
|
||||
"something_went_wrong": "خطأ غير معروف!",
|
||||
"invalid_due_amount_message": "المبلغ النهائي للفاتورة لا يمكن أن يكون أقل من المبلغ المطلوب لها. رجاءاً حدث الفاتورة أو قم بحذف المدفوعات المرتبطة بها للاستمرار.",
|
||||
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||
"mark_as_default_invoice_template_description": "في حالة التفعيل، سيتم اختيار القالب المحدد تلقائياً للفواتير الجديدة."
|
||||
},
|
||||
"recurring_invoices": {
|
||||
"title": "Recurring Invoices",
|
||||
"invoices_list": "Recurring Invoices List",
|
||||
"days": "{days} Days",
|
||||
"months": "{months} Month",
|
||||
"years": "{years} Year",
|
||||
"title": "الفواتير المتكررة",
|
||||
"invoices_list": "الفواتير المتكررة",
|
||||
"days": "{days} أيام",
|
||||
"months": "{months} أشهر",
|
||||
"years": "{years} سنوات",
|
||||
"all": "All",
|
||||
"paid": "Paid",
|
||||
"unpaid": "Unpaid",
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "تقدير",
|
||||
"pdf_estimate_number": "رقم تقدير",
|
||||
"pdf_estimate_date": "تاريخ التقدير",
|
||||
"pdf_estimate_expire_date": "تاريخ انتهاء الصلاحية",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "الفاتورة",
|
||||
"pdf_invoice_number": "رقم الفاتورة",
|
||||
"pdf_invoice_date": "تاريخ الفاتورة",
|
||||
|
||||
@ -112,7 +112,7 @@
|
||||
"payments": "Platby"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "Slevy",
|
||||
"total_sales": "Prodeje",
|
||||
"total_receipts": "Doklady",
|
||||
"total_expense": "Výdaje",
|
||||
"net_income": "Čistý příjem",
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Odhad",
|
||||
"pdf_estimate_number": "Číslo odhadu",
|
||||
"pdf_estimate_date": "Datum odhadu",
|
||||
"pdf_estimate_expire_date": "Doba platnosti",
|
||||
"pdf_estimate_expire_date": "Datum expirace",
|
||||
"pdf_invoice_label": "Faktura",
|
||||
"pdf_invoice_number": "Číslo faktury",
|
||||
"pdf_invoice_date": "Datum fakturace",
|
||||
@ -1495,7 +1495,7 @@
|
||||
"pdf_quantity_label": "Množství",
|
||||
"pdf_price_label": "Cena",
|
||||
"pdf_discount_label": "Sleva",
|
||||
"pdf_amount_label": "Množství",
|
||||
"pdf_amount_label": "Částka",
|
||||
"pdf_subtotal": "Mezisoučet",
|
||||
"pdf_total": "Celkem",
|
||||
"pdf_payment_label": "Platba",
|
||||
|
||||
@ -688,7 +688,7 @@
|
||||
"other_modules": "Weitere Module",
|
||||
"view_all": "Alle Anzeigen",
|
||||
"no_reviews_found": "Für dieses Modul gibt es noch keine Bewertungen!",
|
||||
"module_not_purchased": "Module Not Purchased",
|
||||
"module_not_purchased": "Modul noch nicht erworben",
|
||||
"module_not_found": "Modul nicht gefunden",
|
||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||
"last_updated": "Zuletzt aktualisiert am",
|
||||
@ -1113,7 +1113,7 @@
|
||||
"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",
|
||||
"currency_freak": "CurrencyFreaks",
|
||||
"currency_layer": "Currency Layer",
|
||||
"currency_layer": "Währungsebene",
|
||||
"open_exchange_rate": "Open Exchange Rate",
|
||||
"currency_converter": "Währungsumrechner",
|
||||
"server": "Server",
|
||||
@ -1150,8 +1150,8 @@
|
||||
"payment_mode_added": "Zahlungsart hinzugefügt",
|
||||
"payment_mode_updated": "Zahlungsart aktualisiert",
|
||||
"payment_mode_confirm_delete": "Sie werden diese Zahlungsart nicht wiederherstellen können",
|
||||
"payments_attached": "This payment method is already attached to payments. Please delete the attached payments to proceed with deletion.",
|
||||
"expenses_attached": "This payment method is already attached to expenses. Please delete the attached expenses to proceed with deletion.",
|
||||
"payments_attached": "Diese Zahlungsmethode ist bereits mit Zahlungen verknüpft. Bitte löschen Sie die angehängten Zahlungen, um mit der Löschung fortzufahren.",
|
||||
"expenses_attached": "Diese Zahlungsmethode ist bereits mit Ausgaben verknüpft. Bitte löschen Sie die angehängten Ausgaben, um mit der Löschung fortzufahren.",
|
||||
"deleted_message": "Zahlungsart erfolgreich gelöscht"
|
||||
},
|
||||
"expense_category": {
|
||||
@ -1179,7 +1179,7 @@
|
||||
"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.",
|
||||
"expire_public_links": "Öffentliche Links automatisch ablaufen lassen",
|
||||
"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.",
|
||||
"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.",
|
||||
"save": "Speichern",
|
||||
"preference": "Präferenz | Präferenzen",
|
||||
"general_settings": "Standardeinstellungen für das System.",
|
||||
@ -1272,14 +1272,14 @@
|
||||
"do_spaces_secret": "Do Spaces Secret",
|
||||
"do_spaces_region": "Do Spaced Region",
|
||||
"do_spaces_bucket": "Do Spaces Bucket",
|
||||
"do_spaces_endpoint": "Do Spaces Endpoint",
|
||||
"do_spaces_endpoint": "Do Spaces Endpunkt",
|
||||
"do_spaces_root": "Do Spaced Root",
|
||||
"dropbox_type": "Dropbox Typ",
|
||||
"dropbox_token": "Dropbox Token",
|
||||
"dropbox_key": "Dropbox Schlüssel",
|
||||
"dropbox_secret": "Dropbox Secret",
|
||||
"dropbox_app": "Dropbox App",
|
||||
"dropbox_root": "Dropbox Root",
|
||||
"dropbox_root": "Dropbox Root Verzeichnis",
|
||||
"default_driver": "Standard-Treiber",
|
||||
"is_default": "Standard",
|
||||
"set_default_disk": "Als Standard festlegen",
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Angebot",
|
||||
"pdf_estimate_number": "Angebotsnummer",
|
||||
"pdf_estimate_date": "Angebotsdatum",
|
||||
"pdf_estimate_expire_date": "Gültig bis",
|
||||
"pdf_estimate_expire_date": "Zahlungsziel",
|
||||
"pdf_invoice_label": "Rechnung",
|
||||
"pdf_invoice_number": "Rechnungsnummer",
|
||||
"pdf_invoice_date": "Rechnungsdatum",
|
||||
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Εκτίμηση",
|
||||
"pdf_estimate_number": "Εκτίμηση Αριθμού",
|
||||
"pdf_estimate_date": "Εκτιμώμενη ημ. επισκευής",
|
||||
"pdf_estimate_expire_date": "Ημερομηνία λήξης",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "Τιμολόγιο",
|
||||
"pdf_invoice_number": "Αριθμός τιμολογίου",
|
||||
"pdf_invoice_date": "Ημ/νία Τιμολόγησης",
|
||||
|
||||
@ -863,8 +863,6 @@
|
||||
"company_info": {
|
||||
"company_info": "Company info",
|
||||
"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",
|
||||
"section_description": "Information about your company that will be displayed on invoices, estimates and other documents created by Crater.",
|
||||
"phone": "Phone",
|
||||
@ -1326,8 +1324,6 @@
|
||||
"company_info": "Company Information",
|
||||
"company_info_desc": "This information will be displayed on invoices. Note that you can edit this later on settings page.",
|
||||
"company_name": "Company Name",
|
||||
"company_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",
|
||||
"logo_preview": "Logo Preview",
|
||||
"preferences": "Company Preferences",
|
||||
@ -1458,8 +1454,7 @@
|
||||
"at_least_one_ability": "Please select atleast one Permission.",
|
||||
"valid_driver_key": "Please enter a valid {driver} key.",
|
||||
"valid_exchange_rate": "Please enter a valid exchange rate.",
|
||||
"company_name_not_same": "Company name must match with given name.",
|
||||
"invalid_slug": "Invalid Slug"
|
||||
"company_name_not_same": "Company name must match with given name."
|
||||
},
|
||||
"errors": {
|
||||
"starter_plan": "This feature is available on Starter plan and onwards!",
|
||||
@ -1527,13 +1522,5 @@
|
||||
"pdf_bill_to": "Bill to,",
|
||||
"pdf_ship_to": "Ship to,",
|
||||
"pdf_received_from": "Received from:",
|
||||
"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"
|
||||
}
|
||||
"pdf_tax_label": "Tax"
|
||||
}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"navigation": {
|
||||
"dashboard": "Tablero",
|
||||
"dashboard": "Panel de Control",
|
||||
"customers": "Clientes",
|
||||
"items": "Artículos",
|
||||
"invoices": "Facturas",
|
||||
@ -9,7 +9,7 @@
|
||||
"estimates": "Presupuestos",
|
||||
"payments": "Pagos",
|
||||
"reports": "Informes",
|
||||
"settings": "Ajustes",
|
||||
"settings": "Configuración",
|
||||
"logout": "Cerrar sesión",
|
||||
"users": "Usuarios",
|
||||
"modules": "Módulos"
|
||||
@ -47,7 +47,7 @@
|
||||
"delete": "Eliminar",
|
||||
"edit": "Editar",
|
||||
"view": "Ver",
|
||||
"add_new_item": "Agregar ítem nuevo",
|
||||
"add_new_item": "Agregar Nuevo Artículo",
|
||||
"clear_all": "Limpiar todo",
|
||||
"showing": "Mostrar",
|
||||
"of": "de",
|
||||
@ -87,7 +87,7 @@
|
||||
"select_city": "Seleccionar ciudad",
|
||||
"street_1": "Calle 1",
|
||||
"street_2": "Calle 2",
|
||||
"action_failed": "Accion Fallida",
|
||||
"action_failed": "Acción Fallida",
|
||||
"retry": "Procesar de nuevo",
|
||||
"choose_note": "Elegir nota",
|
||||
"no_note_found": "No se encontró ninguna nota",
|
||||
@ -98,7 +98,7 @@
|
||||
"do_you_wish_to_continue": "¿Deseas continuar?",
|
||||
"note": "Nota",
|
||||
"pay_invoice": "Pagar factura",
|
||||
"login_successfully": "Logeado Satisfactoriamente!",
|
||||
"login_successfully": "¡Sesión inciada con éxito!",
|
||||
"logged_out_successfully": "Logeado Satisfactoriamente",
|
||||
"mark_as_default": "Marcar como predeterminado"
|
||||
},
|
||||
@ -113,7 +113,7 @@
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "Ventas",
|
||||
"total_receipts": "Ingresos",
|
||||
"total_receipts": "Recibos",
|
||||
"total_expense": "Gastos",
|
||||
"net_income": "Ingresos netos",
|
||||
"year": "Seleccione año"
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Presupuestar",
|
||||
"pdf_estimate_number": "Número de Presupuesto",
|
||||
"pdf_estimate_date": "Fecha presupuesto",
|
||||
"pdf_estimate_expire_date": "Fecha de caducidad",
|
||||
"pdf_estimate_expire_date": "Fecha de vencimiento",
|
||||
"pdf_invoice_label": "Factura",
|
||||
"pdf_invoice_number": "Numero de factura",
|
||||
"pdf_invoice_date": "Fecha de la factura",
|
||||
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Estimate",
|
||||
"pdf_estimate_number": "Estimate Number",
|
||||
"pdf_estimate_date": "Estimate Date",
|
||||
"pdf_estimate_expire_date": "Expiry date",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "Invoice",
|
||||
"pdf_invoice_number": "Invoice Number",
|
||||
"pdf_invoice_date": "Invoice Date",
|
||||
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Tarjous",
|
||||
"pdf_estimate_number": "Tarjousnumero",
|
||||
"pdf_estimate_date": "Tarjouksen päiväys",
|
||||
"pdf_estimate_expire_date": "Voimassaolo päivä",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "Lasku",
|
||||
"pdf_invoice_number": "Laskunumero",
|
||||
"pdf_invoice_date": "Laskun päiväys",
|
||||
|
||||
@ -310,7 +310,7 @@
|
||||
"confirm_mark_as_sent": "Ce devis sera marqué comme envoyé",
|
||||
"confirm_mark_as_accepted": "Ce devis sera marqué comme accepté",
|
||||
"confirm_mark_as_rejected": "Ce devis sera marqué comme rejeté",
|
||||
"no_matching_estimates": "Aucune estimation correspondante !",
|
||||
"no_matching_estimates": "Aucun devis correspondant !",
|
||||
"mark_as_sent_successfully": "Devis marqué comme envoyé",
|
||||
"send_estimate_successfully": "Devis envoyé",
|
||||
"errors": {
|
||||
@ -355,7 +355,7 @@
|
||||
"select_an_item": "Sélectionnez un article",
|
||||
"type_item_description": "Taper la description de l'article (facultatif)"
|
||||
},
|
||||
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||
"mark_as_default_estimate_template_description": "Si activé, le modèle sélectionné sera automatiquement utilisé pour les nouvelles estimations."
|
||||
},
|
||||
"invoices": {
|
||||
"title": "Factures",
|
||||
@ -447,7 +447,7 @@
|
||||
"marked_as_sent_message": "Facture supprimée | Factures supprimées",
|
||||
"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.",
|
||||
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||
"mark_as_default_invoice_template_description": "Si activé, le modèle sélectionné sera automatiquement utilisé pour les nouvelles factures."
|
||||
},
|
||||
"recurring_invoices": {
|
||||
"title": "Factures récurrentes",
|
||||
@ -526,7 +526,7 @@
|
||||
"cloned_successfully": "Facture récurrente clonée",
|
||||
"clone_invoice": "Dupliquer",
|
||||
"confirm_clone": "Cette facture récurrente sera clonée dans une nouvelle facture récurrente",
|
||||
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
||||
"add_customer_email": "Veuillez ajouter une adresse e-mail pour ce client afin d'envoyer les factures automatiquement.",
|
||||
"item": {
|
||||
"title": "Nom",
|
||||
"description": "Description",
|
||||
@ -844,9 +844,9 @@
|
||||
"secret": "Secret",
|
||||
"mailgun_secret": "Secret Mailgun",
|
||||
"mailgun_domain": "Domaine",
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Secret",
|
||||
"ses_key": "SES Key",
|
||||
"mailgun_endpoint": "Endpoint de Mailgun",
|
||||
"ses_secret": "Clé secrète SES",
|
||||
"ses_key": "Clé SES",
|
||||
"password": "Mot de passe",
|
||||
"username": "Nom d'utilisateur",
|
||||
"mail_config": "Envoi d'emails",
|
||||
@ -1112,10 +1112,10 @@
|
||||
"error": "Vous ne pouvez pas supprimer le fournisseur actif",
|
||||
"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}",
|
||||
"currency_freak": "Currency Freak",
|
||||
"currency_freak": "Currency Freaks",
|
||||
"currency_layer": "Currency Layer",
|
||||
"open_exchange_rate": "Open Exchange Rate",
|
||||
"currency_converter": "Currency Converter",
|
||||
"open_exchange_rate": "Ouvrir le taux de change",
|
||||
"currency_converter": "Convertisseur de devises",
|
||||
"server": "Serveur",
|
||||
"url": "URL",
|
||||
"active": "Actif",
|
||||
@ -1150,8 +1150,8 @@
|
||||
"payment_mode_added": "Mode de paiement ajouté",
|
||||
"payment_mode_updated": "Mode de paiement mis à jour",
|
||||
"payment_mode_confirm_delete": "Vous ne pourrez pas récupérer ce mode de paiement",
|
||||
"payments_attached": "This payment method is already attached to payments. Please delete the attached payments to proceed with deletion.",
|
||||
"expenses_attached": "This payment method is already attached to expenses. Please delete the attached expenses to proceed with deletion.",
|
||||
"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.",
|
||||
"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.",
|
||||
"deleted_message": "Mode de paiement supprimé"
|
||||
},
|
||||
"expense_category": {
|
||||
@ -1262,8 +1262,8 @@
|
||||
"media_driver": "Stockage multimédia",
|
||||
"media_root": "Répertoire média",
|
||||
"aws_driver": "AWS",
|
||||
"aws_key": "AWS Key",
|
||||
"aws_secret": "AWS Secret",
|
||||
"aws_key": "Clé AWS",
|
||||
"aws_secret": "Clé secrète AWS",
|
||||
"aws_region": "Région AWS",
|
||||
"aws_bucket": "Bucket",
|
||||
"aws_root": "Répertoire",
|
||||
@ -1491,7 +1491,7 @@
|
||||
"pdf_invoice_date": "Date",
|
||||
"pdf_invoice_due_date": "Date d’échéance",
|
||||
"pdf_notes": "Notes de bas de page",
|
||||
"pdf_items_label": "Articles",
|
||||
"pdf_items_label": "Désignation",
|
||||
"pdf_quantity_label": "Quantité",
|
||||
"pdf_price_label": "Prix",
|
||||
"pdf_discount_label": "Remise",
|
||||
|
||||
@ -510,11 +510,11 @@
|
||||
"update_expense": "Update Expense",
|
||||
"edit_invoice": "Edit 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.",
|
||||
"save_invoice": "Save Recurring Invoice",
|
||||
"update_invoice": "Update Recurring Invoice",
|
||||
"add_new_tax": "Add New Tax",
|
||||
"add_new_tax": "नवी कर",
|
||||
"no_invoices": "No Recurring Invoices yet!",
|
||||
"mark_as_rejected": "Mark as rejected",
|
||||
"mark_as_accepted": "Mark as accepted",
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Estimate",
|
||||
"pdf_estimate_number": "Estimate Number",
|
||||
"pdf_estimate_date": "Estimate Date",
|
||||
"pdf_estimate_expire_date": "Expiry date",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "Invoice",
|
||||
"pdf_invoice_number": "Invoice Number",
|
||||
"pdf_invoice_date": "Invoice Date",
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
"customers": "Klijenti",
|
||||
"items": "Stavke",
|
||||
"invoices": "Fakture",
|
||||
"recurring-invoices": "Recurring Invoices",
|
||||
"recurring-invoices": "Ponavljajuće fakture\n",
|
||||
"expenses": "Rashodi",
|
||||
"estimates": "Ponude",
|
||||
"payments": "Uplate",
|
||||
@ -12,7 +12,7 @@
|
||||
"settings": "Postavke",
|
||||
"logout": "Odjava",
|
||||
"users": "Korisnici",
|
||||
"modules": "Modules"
|
||||
"modules": "Moduli"
|
||||
},
|
||||
"general": {
|
||||
"add_company": "Dodaj tvrtku",
|
||||
@ -30,8 +30,8 @@
|
||||
"from": "Pošiljatelj",
|
||||
"to": "Primatelj",
|
||||
"ok": "Ok",
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
"yes": "Da",
|
||||
"no": "Ne",
|
||||
"sort_by": "Posloži Po",
|
||||
"ascending": "Rastuće",
|
||||
"descending": "Padajuće",
|
||||
@ -39,7 +39,7 @@
|
||||
"body": "Tijelo",
|
||||
"message": "Poruka",
|
||||
"send": "Pošalji",
|
||||
"preview": "Preview",
|
||||
"preview": "Pregled",
|
||||
"go_back": "Natrag",
|
||||
"back_to_login": "Natrag na prijavu?",
|
||||
"home": "Početna",
|
||||
@ -65,7 +65,7 @@
|
||||
"sent": "Poslano",
|
||||
"all": "Sve",
|
||||
"select_all": "Izaberi sve",
|
||||
"select_template": "Select Template",
|
||||
"select_template": "Odaberite predložak",
|
||||
"choose_file": "Klikni ovdje da izabereš fajl",
|
||||
"choose_template": "Izaberi predložak",
|
||||
"choose": "Izaberi",
|
||||
@ -93,13 +93,13 @@
|
||||
"no_note_found": "Ne postoje spremljene napomene",
|
||||
"insert_note": "Unesi bilješku",
|
||||
"copied_pdf_url_clipboard": "Link do PDF fajla kopiran!",
|
||||
"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",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"copied_url_clipboard": "URL je kopiran u međuspremnik!",
|
||||
"docs": "Dokumenti",
|
||||
"do_you_wish_to_continue": "Želite li nastaviti?",
|
||||
"note": "Bilješka",
|
||||
"pay_invoice": "Plati račun",
|
||||
"login_successfully": "Uspješno ste prijavljeni!\n",
|
||||
"logged_out_successfully": "Uspješno odjavljen\n",
|
||||
"mark_as_default": "Postavi kao zadano"
|
||||
},
|
||||
"dashboard": {
|
||||
@ -109,7 +109,7 @@
|
||||
"customers": "Klijenti",
|
||||
"invoices": "Računi",
|
||||
"estimates": "Ponude",
|
||||
"payments": "Payments"
|
||||
"payments": "Plaćanja"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "Prodaja",
|
||||
@ -151,18 +151,18 @@
|
||||
"no_results_found": "Nema rezultata"
|
||||
},
|
||||
"company_switcher": {
|
||||
"label": "SWITCH COMPANY",
|
||||
"no_results_found": "No Results Found",
|
||||
"add_new_company": "Add new company",
|
||||
"new_company": "New company",
|
||||
"created_message": "Company created successfully"
|
||||
"label": "IZABERI TVRTKU",
|
||||
"no_results_found": "Nema rezultata\n",
|
||||
"add_new_company": "Dodajte novu tvrtku\n",
|
||||
"new_company": "Nova tvrtka\n",
|
||||
"created_message": "Tvrtka uspješno stvorena\n"
|
||||
},
|
||||
"dateRange": {
|
||||
"today": "Today",
|
||||
"this_week": "This Week",
|
||||
"this_month": "This Month",
|
||||
"this_quarter": "This Quarter",
|
||||
"this_year": "This Year",
|
||||
"today": "Danas\n",
|
||||
"this_week": "Danas\n",
|
||||
"this_month": "Danas\n",
|
||||
"this_quarter": "Danas\n",
|
||||
"this_year": "Danas\n",
|
||||
"previous_week": "Previous Week",
|
||||
"previous_month": "Previous Month",
|
||||
"previous_quarter": "Previous Quarter",
|
||||
@ -456,32 +456,32 @@
|
||||
"months": "{months} Month",
|
||||
"years": "{years} Year",
|
||||
"all": "All",
|
||||
"paid": "Paid",
|
||||
"unpaid": "Unpaid",
|
||||
"viewed": "Viewed",
|
||||
"overdue": "Overdue",
|
||||
"active": "Active",
|
||||
"completed": "Completed",
|
||||
"customer": "CUSTOMER",
|
||||
"paid_status": "PAID STATUS",
|
||||
"ref_no": "REF NO.",
|
||||
"number": "NUMBER",
|
||||
"paid": "Plaćeno",
|
||||
"unpaid": "Ne plaćeno",
|
||||
"viewed": "Pregledano",
|
||||
"overdue": "Kašnjenja",
|
||||
"active": "Aktivno",
|
||||
"completed": "Završeno",
|
||||
"customer": "KUPAC",
|
||||
"paid_status": "STATUS PLAĆANJA",
|
||||
"ref_no": "BR. REFERENCE",
|
||||
"number": "BROJ",
|
||||
"amount_due": "AMOUNT DUE",
|
||||
"partially_paid": "Partially Paid",
|
||||
"total": "Total",
|
||||
"discount": "Discount",
|
||||
"sub_total": "Sub Total",
|
||||
"invoice": "Recurring Invoice | Recurring Invoices",
|
||||
"invoice_number": "Recurring Invoice Number",
|
||||
"next_invoice_date": "Next Invoice Date",
|
||||
"ref_number": "Ref Number",
|
||||
"contact": "Contact",
|
||||
"add_item": "Add an Item",
|
||||
"date": "Date",
|
||||
"limit_by": "Limit by",
|
||||
"limit_date": "Limit Date",
|
||||
"limit_count": "Limit Count",
|
||||
"count": "Count",
|
||||
"partially_paid": "Djelomično plaćeno\n",
|
||||
"total": "Ukupno",
|
||||
"discount": "Popust",
|
||||
"sub_total": "Popdzbroj",
|
||||
"invoice": "Ponavljajuća faktura | Ponavjaljuća faktura",
|
||||
"invoice_number": "Broj ponavljajuće fakture\n",
|
||||
"next_invoice_date": "Datum sljedećeg računa",
|
||||
"ref_number": "Broj reference",
|
||||
"contact": "Kontakt",
|
||||
"add_item": "Dodaj stavku",
|
||||
"date": "Datum",
|
||||
"limit_by": "Ograniči po",
|
||||
"limit_date": "Vremenski rok",
|
||||
"limit_count": "Broj ograničenja\n",
|
||||
"count": "Brojač",
|
||||
"status": "Status",
|
||||
"select_a_status": "Select a status",
|
||||
"working": "Working",
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Ponuda",
|
||||
"pdf_estimate_number": "Broj Ponude",
|
||||
"pdf_estimate_date": "Datum Ponude",
|
||||
"pdf_estimate_expire_date": "Datum isteka Ponude",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "Faktura",
|
||||
"pdf_invoice_number": "Broj Fakture",
|
||||
"pdf_invoice_date": "Datum Fakture",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -54,9 +54,9 @@
|
||||
"actions": "Azioni",
|
||||
"subtotal": "SUBTOTALE",
|
||||
"discount": "SCONTO",
|
||||
"fixed": "Fissato",
|
||||
"fixed": "Fisso",
|
||||
"percentage": "Percentuale",
|
||||
"tax": "TASSA",
|
||||
"tax": "IMPOSTA",
|
||||
"total_amount": "AMMONTARE TOTALE",
|
||||
"bill_to": "Fattura a",
|
||||
"ship_to": "Invia a",
|
||||
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Estimate",
|
||||
"pdf_estimate_number": "Estimate Number",
|
||||
"pdf_estimate_date": "Estimate Date",
|
||||
"pdf_estimate_expire_date": "Expiry date",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "Invoice",
|
||||
"pdf_invoice_number": "Invoice Number",
|
||||
"pdf_invoice_date": "Invoice Date",
|
||||
|
||||
@ -17,7 +17,6 @@ import sk from './sk.json'
|
||||
import vi from './vi.json'
|
||||
import el from './el.json'
|
||||
import hr from './hr.json'
|
||||
import th from './th.json'
|
||||
|
||||
export default {
|
||||
cs,
|
||||
@ -38,6 +37,5 @@ export default {
|
||||
vi,
|
||||
pl,
|
||||
el,
|
||||
hr,
|
||||
th
|
||||
hr
|
||||
}
|
||||
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Pasiūlymas",
|
||||
"pdf_estimate_number": "Pasiūlymo numeris",
|
||||
"pdf_estimate_date": "Pasiūlymo data",
|
||||
"pdf_estimate_expire_date": "Galiojimo laikas",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "Sąskaita",
|
||||
"pdf_invoice_number": "Invoice Number",
|
||||
"pdf_invoice_date": "Invoice Date",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -4,7 +4,7 @@
|
||||
"customers": "Klanten",
|
||||
"items": "Artikelen",
|
||||
"invoices": "Facturen",
|
||||
"recurring-invoices": "Periodieke factuur",
|
||||
"recurring-invoices": "Periodieke facturen",
|
||||
"expenses": "Uitgaven",
|
||||
"estimates": "Offertes",
|
||||
"payments": "Betalingen",
|
||||
@ -28,16 +28,16 @@
|
||||
"from_date": "Vanaf datum",
|
||||
"to_date": "T/m datum",
|
||||
"from": "Vanaf",
|
||||
"to": "Naar.",
|
||||
"ok": "Oké.",
|
||||
"yes": "Ja.",
|
||||
"no": "Nee.",
|
||||
"to": "Naar",
|
||||
"ok": "Oké",
|
||||
"yes": "Ja",
|
||||
"no": "Nee",
|
||||
"sort_by": "Sorteer op",
|
||||
"ascending": "Oplopend",
|
||||
"descending": "Aflopend",
|
||||
"subject": "Onderwerp",
|
||||
"body": "Inhoud",
|
||||
"message": "Bericht.",
|
||||
"message": "Bericht",
|
||||
"send": "Verstuur",
|
||||
"preview": "Voorbeeld",
|
||||
"go_back": "Ga terug",
|
||||
@ -54,7 +54,7 @@
|
||||
"actions": "Acties",
|
||||
"subtotal": "SUBTOTAAL",
|
||||
"discount": "KORTING",
|
||||
"fixed": "Gemaakt",
|
||||
"fixed": "Vast bedrag",
|
||||
"percentage": "Percentage",
|
||||
"tax": "BELASTING",
|
||||
"total_amount": "TOTAALBEDRAG",
|
||||
@ -85,17 +85,17 @@
|
||||
"select_state": "Selecteer staat",
|
||||
"select_country": "Selecteer land",
|
||||
"select_city": "Selecteer stad",
|
||||
"street_1": "straat 1",
|
||||
"street_2": "Straat # 2",
|
||||
"action_failed": "Actie: mislukt",
|
||||
"retry": "Retr",
|
||||
"street_1": "Straat 1",
|
||||
"street_2": "Straat 2",
|
||||
"action_failed": "Actie mislukt",
|
||||
"retry": "Opnieuw proberen",
|
||||
"choose_note": "Kies notitie",
|
||||
"no_note_found": "Geen notitie gevonden",
|
||||
"insert_note": "Notitie invoegen",
|
||||
"copied_pdf_url_clipboard": "PDF link naar klembord gekopieerd!",
|
||||
"copied_url_clipboard": "URL naar klembord gekopieerd!",
|
||||
"docs": "Documenten",
|
||||
"do_you_wish_to_continue": "Wilt u Doorgaan?",
|
||||
"docs": "Documentatie",
|
||||
"do_you_wish_to_continue": "Wil je doorgaan?",
|
||||
"note": "Notitie",
|
||||
"pay_invoice": "Betaal factuur",
|
||||
"login_successfully": "Succesvol ingelogd!",
|
||||
@ -526,7 +526,7 @@
|
||||
"cloned_successfully": "Terugkerende factuur succesvol gekopieerd",
|
||||
"clone_invoice": "Kopieer 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": {
|
||||
"title": "Item titel",
|
||||
"description": "Beschrijving",
|
||||
@ -1114,13 +1114,13 @@
|
||||
"exchange_help_text": "Voer de wisselkoers in om te converteren van {currency} naar {baseCurrency}",
|
||||
"currency_freak": "Valuta Freak",
|
||||
"currency_layer": "Valuta-laag",
|
||||
"open_exchange_rate": "Open Exchange Rate",
|
||||
"open_exchange_rate": "Open wisselkoers",
|
||||
"currency_converter": "Valuta omzetter",
|
||||
"server": "Server",
|
||||
"url": "URL",
|
||||
"active": "Actief",
|
||||
"currency_help_text": "This provider will only be used on above selected currencies",
|
||||
"currency_in_used": "The following currencies are already active on another provider. Please remove these currencies from selection to activate this provider again."
|
||||
"currency_help_text": "Deze aanbieder wordt alleen gebruikt voor de hier boven geselecteerde valuta",
|
||||
"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."
|
||||
},
|
||||
"tax_types": {
|
||||
"title": "Belastingtypen",
|
||||
@ -1143,16 +1143,16 @@
|
||||
},
|
||||
"payment_modes": {
|
||||
"title": "Betaalmethodes",
|
||||
"description": "Modes of transaction for payments",
|
||||
"add_payment_mode": "Add Payment Mode",
|
||||
"edit_payment_mode": "Edit Payment Mode",
|
||||
"mode_name": "Mode Name",
|
||||
"description": "Modi van transacties voor betalingen",
|
||||
"add_payment_mode": "Voeg betaalwijze toe",
|
||||
"edit_payment_mode": "Wijzig betaalwijze",
|
||||
"mode_name": "Modusnaam",
|
||||
"payment_mode_added": "Betaalwijze toegevoegd",
|
||||
"payment_mode_updated": "Payment Mode Updated",
|
||||
"payment_mode_confirm_delete": "You will not be able to recover this Payment Mode",
|
||||
"payments_attached": "This payment method is already attached to payments. Please delete the attached payments to proceed with deletion.",
|
||||
"expenses_attached": "This payment method is already attached to expenses. Please delete the attached expenses to proceed with deletion.",
|
||||
"deleted_message": "Payment Mode deleted successfully"
|
||||
"payment_mode_updated": "Betaalwijze bijgewerkt",
|
||||
"payment_mode_confirm_delete": "U kunt deze betalingsmodus niet herstellen",
|
||||
"payments_attached": "Deze betalingsmethode is al gekoppeld aan betalingen. Verwijder de gekoppelde betalingen om verder te gaan met het verwijderen.",
|
||||
"expenses_attached": "Deze betaalmethode is al gekoppeld aan uitgaven. Verwijder de gekoppelde kosten om door te gaan met het verwijderen.",
|
||||
"deleted_message": "Betaalwijze succesvol verwijderd"
|
||||
},
|
||||
"expense_category": {
|
||||
"title": "Onkostencategorieën",
|
||||
@ -1178,8 +1178,8 @@
|
||||
"discount_setting": "Kortingsinstelling",
|
||||
"discount_per_item": "Korting per item",
|
||||
"discount_setting_description": "Schakel dit in als u korting wilt toevoegen aan afzonderlijke factuuritems. Standaard wordt korting rechtstreeks aan de factuur toegevoegd.",
|
||||
"expire_public_links": "Automatically Expire Public Links",
|
||||
"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.",
|
||||
"expire_public_links": "Publieke links automatisch laten vervallen",
|
||||
"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.",
|
||||
"save": "Opslaan",
|
||||
"preference": "Voorkeur | Voorkeuren",
|
||||
"general_settings": "Standaardvoorkeuren voor het systeem.",
|
||||
@ -1188,9 +1188,9 @@
|
||||
"select_time_zone": "Selecteer Tijdzone",
|
||||
"select_date_format": "Selecteer datum/tijdindeling",
|
||||
"select_financial_year": "Selecteer financieel ja",
|
||||
"recurring_invoice_status": "Recurring Invoice Status",
|
||||
"create_status": "Create Status",
|
||||
"active": "Active",
|
||||
"recurring_invoice_status": "Status periodieke facturen",
|
||||
"create_status": "Status aanmaken",
|
||||
"active": "Actief",
|
||||
"on_hold": "In wacht",
|
||||
"update_status": "Updatestatus",
|
||||
"completed": "Voltooid",
|
||||
@ -1217,10 +1217,10 @@
|
||||
"finishing_update": "Afwerking Update",
|
||||
"update_failed": "Update mislukt",
|
||||
"update_failed_text": "Sorry! Je update is mislukt op: {step} step ",
|
||||
"update_warning": "All of the application files and default template files will be overwritten when you update the application using this utility. Please take a backup of your templates & database before updating."
|
||||
"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."
|
||||
},
|
||||
"backup": {
|
||||
"title": "Backup | Backups",
|
||||
"title": "Back-up | Back-ups",
|
||||
"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",
|
||||
"create_backup": "Backup maken",
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
"navigation": {
|
||||
"dashboard": "Pulpit",
|
||||
"customers": "Kontrahenci",
|
||||
"items": "Pozycje",
|
||||
"items": "Produkty",
|
||||
"invoices": "Faktury",
|
||||
"recurring-invoices": "Faktury cykliczne",
|
||||
"expenses": "Wydatki",
|
||||
@ -100,7 +100,7 @@
|
||||
"pay_invoice": "Zapłać Fakturę",
|
||||
"login_successfully": "Zalogowano pomyślnie!",
|
||||
"logged_out_successfully": "Wylogowano pomyślnie",
|
||||
"mark_as_default": "Mark as default"
|
||||
"mark_as_default": "Oznacz jako domyślne"
|
||||
},
|
||||
"dashboard": {
|
||||
"select_year": "Wybierz rok",
|
||||
@ -355,7 +355,7 @@
|
||||
"select_an_item": "Wpisz lub kliknij aby wybrać element",
|
||||
"type_item_description": "Opis pozycji (opcjonalnie)"
|
||||
},
|
||||
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||
"mark_as_default_estimate_template_description": "Jeśli włączone, wybrany szablon zostanie automatycznie wybrany dla nowych ofert."
|
||||
},
|
||||
"invoices": {
|
||||
"title": "Faktury",
|
||||
@ -447,7 +447,7 @@
|
||||
"marked_as_sent_message": "Faktura oznaczona jako wysłana pomyślnie",
|
||||
"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ć.",
|
||||
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||
"mark_as_default_invoice_template_description": "Jeśli włączone, wybrany szablon zostanie automatycznie wybrany dla nowych faktur."
|
||||
},
|
||||
"recurring_invoices": {
|
||||
"title": "Faktury cykliczne",
|
||||
@ -526,7 +526,7 @@
|
||||
"cloned_successfully": "Faktura Cykliczna sklonowana pomyślnie",
|
||||
"clone_invoice": "Klonuj Fakturę Cykliczną",
|
||||
"confirm_clone": "Ta faktura cykliczna zostanie sklonowana do nowej faktury cyklicznej",
|
||||
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
||||
"add_customer_email": "Dodaj adres e-mail dla tego klienta, aby wysyłać faktury automatycznie.",
|
||||
"item": {
|
||||
"title": "Tytuł pozycji",
|
||||
"description": "Opis",
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Oferta",
|
||||
"pdf_estimate_number": "Numer oferty",
|
||||
"pdf_estimate_date": "Data oferty",
|
||||
"pdf_estimate_expire_date": "Termin ważności",
|
||||
"pdf_estimate_expire_date": "Data ważności",
|
||||
"pdf_invoice_label": "Faktura",
|
||||
"pdf_invoice_number": "Numer faktury",
|
||||
"pdf_invoice_date": "Data faktury",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -97,8 +97,8 @@
|
||||
"docs": "Documentație",
|
||||
"do_you_wish_to_continue": "Doriţi să continuaţi?",
|
||||
"note": "Note",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"pay_invoice": "Plătește factura",
|
||||
"login_successfully": "Autentificat cu succes!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"mark_as_default": "Mark as default"
|
||||
},
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Estimate",
|
||||
"pdf_estimate_number": "Estimate Number",
|
||||
"pdf_estimate_date": "Estimate Date",
|
||||
"pdf_estimate_expire_date": "Expiry date",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "Invoice",
|
||||
"pdf_invoice_number": "Invoice Number",
|
||||
"pdf_invoice_date": "Invoice Date",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -4,7 +4,7 @@
|
||||
"customers": "Zákazníci",
|
||||
"items": "Položky",
|
||||
"invoices": "Faktúry",
|
||||
"recurring-invoices": "Recurring Invoices",
|
||||
"recurring-invoices": "Pravidelné faktúry",
|
||||
"expenses": "Výdaje",
|
||||
"estimates": "Cenové odhady",
|
||||
"payments": "Platby",
|
||||
@ -12,7 +12,7 @@
|
||||
"settings": "Nastavenia",
|
||||
"logout": "Odhlásiť sa",
|
||||
"users": "Uživatelia",
|
||||
"modules": "Modules"
|
||||
"modules": "Moduly"
|
||||
},
|
||||
"general": {
|
||||
"add_company": "Pridať firmu",
|
||||
@ -30,8 +30,8 @@
|
||||
"from": "Od",
|
||||
"to": "Pre",
|
||||
"ok": "Ok",
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
"yes": "Áno",
|
||||
"no": "Nie",
|
||||
"sort_by": "Zoradiť podľa",
|
||||
"ascending": "Vzostupne",
|
||||
"descending": "Zostupne",
|
||||
@ -39,7 +39,7 @@
|
||||
"body": "Telo textu",
|
||||
"message": "Správa",
|
||||
"send": "Odoslať",
|
||||
"preview": "Preview",
|
||||
"preview": "Náhľad",
|
||||
"go_back": "Späť",
|
||||
"back_to_login": "Späť na prihlásenie?",
|
||||
"home": "Domov",
|
||||
@ -65,7 +65,7 @@
|
||||
"sent": "Odoslané",
|
||||
"all": "Všetko",
|
||||
"select_all": "Vybrať všetky",
|
||||
"select_template": "Select Template",
|
||||
"select_template": "Vyberte šablónu",
|
||||
"choose_file": "Kliknite sem pre vybratie súboru",
|
||||
"choose_template": "Vybrať vzhľad",
|
||||
"choose": "Vybrať",
|
||||
@ -92,15 +92,15 @@
|
||||
"choose_note": "Vyberte poznámku",
|
||||
"no_note_found": "Neboli nájdené žiadne poznámky",
|
||||
"insert_note": "Vlož poznámku",
|
||||
"copied_pdf_url_clipboard": "Copied PDF url to clipboard!",
|
||||
"copied_url_clipboard": "Copied url to clipboard!",
|
||||
"copied_pdf_url_clipboard": "PDF bolo skopírované do schránky!",
|
||||
"copied_url_clipboard": "URL adresa bola skopírovaná do schránky!",
|
||||
"docs": "Docs",
|
||||
"do_you_wish_to_continue": "Do you wish to continue?",
|
||||
"note": "Note",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"mark_as_default": "Mark as default"
|
||||
"do_you_wish_to_continue": "Želáte si pokračovať?",
|
||||
"note": "Poznámka",
|
||||
"pay_invoice": "Zaplatiť faktúru",
|
||||
"login_successfully": "Prihlásenie bolo úspešné!",
|
||||
"logged_out_successfully": "Odhlásenie bolo úspešné",
|
||||
"mark_as_default": "Označiť ako predvolené"
|
||||
},
|
||||
"dashboard": {
|
||||
"select_year": "Vyberte rok",
|
||||
@ -109,7 +109,7 @@
|
||||
"customers": "Zákazníci",
|
||||
"invoices": "Faktúry",
|
||||
"estimates": "Cenové odhady",
|
||||
"payments": "Payments"
|
||||
"payments": "Platby"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "Predaje",
|
||||
@ -151,27 +151,27 @@
|
||||
"no_results_found": "Neboli nájdené žiadne výsledky"
|
||||
},
|
||||
"company_switcher": {
|
||||
"label": "SWITCH COMPANY",
|
||||
"no_results_found": "No Results Found",
|
||||
"add_new_company": "Add new company",
|
||||
"new_company": "New company",
|
||||
"created_message": "Company created successfully"
|
||||
"label": "PREPNÚŤ SPOLOČNOSŤ",
|
||||
"no_results_found": "Neboli nájdené žiadne výsledky",
|
||||
"add_new_company": "Pridať novú spoločnosť",
|
||||
"new_company": "Vytvorte spoločnosť",
|
||||
"created_message": "Spoločnosť úspešne vytvorená"
|
||||
},
|
||||
"dateRange": {
|
||||
"today": "Today",
|
||||
"this_week": "This Week",
|
||||
"this_month": "This Month",
|
||||
"this_quarter": "This Quarter",
|
||||
"this_year": "This Year",
|
||||
"previous_week": "Previous Week",
|
||||
"previous_month": "Previous Month",
|
||||
"previous_quarter": "Previous Quarter",
|
||||
"previous_year": "Previous Year",
|
||||
"custom": "Custom"
|
||||
"today": "Dnes",
|
||||
"this_week": "Tento týždeň",
|
||||
"this_month": "Tento mesiac",
|
||||
"this_quarter": "Tento štvrťrok",
|
||||
"this_year": "Tento rok",
|
||||
"previous_week": "Predchádzajúci týždeň",
|
||||
"previous_month": "Predchádzajúci mesiac",
|
||||
"previous_quarter": "Predchádzajúci štvrťrok",
|
||||
"previous_year": "Predchádzajúci rok",
|
||||
"custom": "Vlastný"
|
||||
},
|
||||
"customers": {
|
||||
"title": "Zákazníci",
|
||||
"prefix": "Prefix",
|
||||
"prefix": "Predpona",
|
||||
"add_customer": "Pridať Zákazníka",
|
||||
"contacts_list": "Zoznam zákazníkov",
|
||||
"name": "Meno",
|
||||
@ -186,9 +186,9 @@
|
||||
"phone": "Telefón",
|
||||
"website": "Webové stránky",
|
||||
"overview": "Prehľad",
|
||||
"invoice_prefix": "Invoice Prefix",
|
||||
"estimate_prefix": "Estimate Prefix",
|
||||
"payment_prefix": "Payment Prefix",
|
||||
"invoice_prefix": "Predpona Faktúry",
|
||||
"estimate_prefix": "Predpona cenového odhadu",
|
||||
"payment_prefix": "Predpona platby",
|
||||
"enable_portal": "Aktivovať portál",
|
||||
"country": "Krajina",
|
||||
"state": "Štát",
|
||||
@ -197,7 +197,7 @@
|
||||
"added_on": "Pridané Dňa",
|
||||
"action": "Akcia",
|
||||
"password": "Heslo",
|
||||
"confirm_password": "Confirm Password",
|
||||
"confirm_password": "Potvrdiť heslo",
|
||||
"street_number": "Číslo Ulice",
|
||||
"primary_currency": "Hlavná Mena",
|
||||
"description": "Popis",
|
||||
@ -208,17 +208,17 @@
|
||||
"new_customer": "Nový Zákazník",
|
||||
"edit_customer": "Upraviť Zákazníka",
|
||||
"basic_info": "Základné Informácie",
|
||||
"portal_access": "Portal Access",
|
||||
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||
"portal_access_url": "Customer Portal Login URL",
|
||||
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||
"portal_access": "Prístupy na portál",
|
||||
"portal_access_text": "Chcete povoliť tomuto používateľovi pripojiť sa na Zákaznícky Portál?",
|
||||
"portal_access_url": "Adresa zákazníckeho portálu",
|
||||
"portal_access_url_help": "Prosím, skopírujte a prepošlite URL adresu uvedenú vyššie vášmu klientovi pre udelenie prístupu.",
|
||||
"billing_address": "Fakturačná Adresa",
|
||||
"shipping_address": "Doručovacia Adresa",
|
||||
"copy_billing_address": "Kopírovať podľa Fakturačnej adresy",
|
||||
"no_customers": "Zatiaľ nebol pridaný žiadny zákazník!",
|
||||
"no_customers_found": "Nenájdení žiadni zákazníci!",
|
||||
"no_contact": "No contact",
|
||||
"no_contact_name": "No contact name",
|
||||
"no_contact": "Žiadny kontakt",
|
||||
"no_contact_name": "Žiadny kontakt",
|
||||
"list_of_customers": "Táto sekcia bude obsahovať zoznam zákazníkov.",
|
||||
"primary_display_name": "Hlavné meno pre zobrazenie",
|
||||
"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é.",
|
||||
"created_message": "Zákazník úspešne vytvorený",
|
||||
"updated_message": "Zákazník úspešne aktualizovaný",
|
||||
"address_updated_message": "Address Information Updated succesfully",
|
||||
"address_updated_message": "Nastavenia adresy úspešne aktualizované",
|
||||
"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."
|
||||
},
|
||||
@ -244,7 +244,7 @@
|
||||
"added_on": "Pridané Dňa",
|
||||
"price": "Cena",
|
||||
"date_of_creation": "Dátum Vytvorenia",
|
||||
"not_selected": "No item selected",
|
||||
"not_selected": "Nie je vybratá žiadna položka",
|
||||
"action": "Akcia",
|
||||
"add_item": "Pridať Položku",
|
||||
"save_item": "Uložiť Položku",
|
||||
@ -317,7 +317,7 @@
|
||||
"required": "Pole je povinné"
|
||||
},
|
||||
"accepted": "Prijátá",
|
||||
"rejected": "Rejected",
|
||||
"rejected": "Odmietnuté",
|
||||
"expired": "Expired",
|
||||
"sent": "Odoslaná",
|
||||
"draft": "Koncept",
|
||||
@ -359,8 +359,8 @@
|
||||
},
|
||||
"invoices": {
|
||||
"title": "Faktúry",
|
||||
"download": "Download",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"download": "Stiahnuť",
|
||||
"pay_invoice": "Zaplatiť faktúru",
|
||||
"invoices_list": "Zoznam Faktúr",
|
||||
"invoice_information": "Invoice Information",
|
||||
"days": "{days} Ďeň",
|
||||
@ -370,8 +370,8 @@
|
||||
"paid": "Zaplatené",
|
||||
"unpaid": "Nezaplatené",
|
||||
"viewed": "Viewed",
|
||||
"overdue": "Overdue",
|
||||
"completed": "Completed",
|
||||
"overdue": "Po splatnosti",
|
||||
"completed": "Dokončené",
|
||||
"customer": "ZÁKAZNÍK",
|
||||
"paid_status": "Stav platby",
|
||||
"ref_no": "REF Č.",
|
||||
@ -408,7 +408,7 @@
|
||||
"invoice_date": "Dátum Vystavenia",
|
||||
"record_payment": "Zaznamenať Platbu",
|
||||
"add_new_invoice": "Nová Faktúra",
|
||||
"update_expense": "Update Expense",
|
||||
"update_expense": "Aktualizovať Výdaj",
|
||||
"edit_invoice": "Upraviť Faktúru",
|
||||
"new_invoice": "Nová Faktúra",
|
||||
"save_invoice": "Uložiť Faktúru",
|
||||
@ -421,7 +421,7 @@
|
||||
"select_invoice": "Vybrať Faktúru",
|
||||
"no_matching_invoices": "Nenašli sa žiadne faktúry!",
|
||||
"mark_as_sent_successfully": "Faktúra označená ako úspešne odoslaná",
|
||||
"invoice_sent_successfully": "Invoice sent successfully",
|
||||
"invoice_sent_successfully": "Faktúra bola úspešne odoslaná",
|
||||
"cloned_successfully": "Faktúra bola úspešne okopírovaná",
|
||||
"clone_invoice": "Kopírovať faktúru",
|
||||
"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."
|
||||
},
|
||||
"recurring_invoices": {
|
||||
"title": "Recurring Invoices",
|
||||
"invoices_list": "Recurring Invoices List",
|
||||
"title": "Pravidelné faktúry",
|
||||
"invoices_list": "Zoznam pravidelných faktúr",
|
||||
"days": "{days} Days",
|
||||
"months": "{months} Month",
|
||||
"years": "{years} Year",
|
||||
"all": "All",
|
||||
"paid": "Paid",
|
||||
"unpaid": "Unpaid",
|
||||
"all": "Všetko",
|
||||
"paid": "Zaplatené",
|
||||
"unpaid": "Nezaplatené",
|
||||
"viewed": "Viewed",
|
||||
"overdue": "Overdue",
|
||||
"overdue": "Po splatnosti",
|
||||
"active": "Active",
|
||||
"completed": "Completed",
|
||||
"customer": "CUSTOMER",
|
||||
"completed": "Dokončené",
|
||||
"customer": "ZÁKAZNÍK",
|
||||
"paid_status": "PAID STATUS",
|
||||
"ref_no": "REF NO.",
|
||||
"number": "NUMBER",
|
||||
"ref_no": "REF Č.",
|
||||
"number": "ČÍSLO",
|
||||
"amount_due": "AMOUNT DUE",
|
||||
"partially_paid": "Partially Paid",
|
||||
"total": "Total",
|
||||
"discount": "Discount",
|
||||
"sub_total": "Sub Total",
|
||||
"invoice": "Recurring Invoice | Recurring Invoices",
|
||||
"invoice_number": "Recurring Invoice Number",
|
||||
"next_invoice_date": "Next Invoice Date",
|
||||
"ref_number": "Ref Number",
|
||||
"contact": "Contact",
|
||||
"add_item": "Add an Item",
|
||||
"date": "Date",
|
||||
"partially_paid": "Čiastočne Zaplatené",
|
||||
"total": "Celkom",
|
||||
"discount": "Zľava",
|
||||
"sub_total": "Medzisúčet",
|
||||
"invoice": "Pravidelná faktúra | Pravidelné faktúry",
|
||||
"invoice_number": "Číslo pravidelnej faktúry",
|
||||
"next_invoice_date": "Dátum nasledujúceho vystavenia",
|
||||
"ref_number": "Ref. Číslo",
|
||||
"contact": "Kontakt",
|
||||
"add_item": "Pridať položku",
|
||||
"date": "Dátum",
|
||||
"limit_by": "Limit by",
|
||||
"limit_date": "Limit Date",
|
||||
"limit_count": "Limit Count",
|
||||
@ -506,15 +506,15 @@
|
||||
"starts_at": "Start Date",
|
||||
"due_date": "Invoice Due Date",
|
||||
"record_payment": "Record Payment",
|
||||
"add_new_invoice": "Add New Recurring Invoice",
|
||||
"update_expense": "Update Expense",
|
||||
"edit_invoice": "Edit Recurring Invoice",
|
||||
"new_invoice": "New Recurring Invoice",
|
||||
"send_automatically": "Send Automatically",
|
||||
"add_new_invoice": "Vytvoriť novú pravidelnú faktúru",
|
||||
"update_expense": "Aktualizovať Výdaj",
|
||||
"edit_invoice": "Upraviť pravidelnú faktúru",
|
||||
"new_invoice": "Nová pravidelná faktúra",
|
||||
"send_automatically": "Odoslať automaticky",
|
||||
"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",
|
||||
"update_invoice": "Update Recurring Invoice",
|
||||
"add_new_tax": "Add New Tax",
|
||||
"save_invoice": "Uložiť pravidelnú faktúru",
|
||||
"update_invoice": "Upraviť pravidelnú faktúru",
|
||||
"add_new_tax": "Pridať novú daň",
|
||||
"no_invoices": "No Recurring Invoices yet!",
|
||||
"mark_as_rejected": "Mark as rejected",
|
||||
"mark_as_accepted": "Mark as accepted",
|
||||
@ -528,27 +528,27 @@
|
||||
"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.",
|
||||
"item": {
|
||||
"title": "Item Title",
|
||||
"description": "Description",
|
||||
"quantity": "Quantity",
|
||||
"price": "Price",
|
||||
"discount": "Discount",
|
||||
"total": "Total",
|
||||
"total_discount": "Total Discount",
|
||||
"sub_total": "Sub Total",
|
||||
"tax": "Tax",
|
||||
"amount": "Amount",
|
||||
"select_an_item": "Type or click to select an item",
|
||||
"type_item_description": "Type Item Description (optional)"
|
||||
"title": "Názov položky",
|
||||
"description": "Popis",
|
||||
"quantity": "Množstvo",
|
||||
"price": "Cena",
|
||||
"discount": "Zľava",
|
||||
"total": "Súčet",
|
||||
"total_discount": "Celková zľava",
|
||||
"sub_total": "Medzisúčet",
|
||||
"tax": "Daň",
|
||||
"amount": "Množstvo",
|
||||
"select_an_item": "Začnite písať alebo kliknite pre vybratie položky",
|
||||
"type_item_description": "Popis položky (voliteľné)"
|
||||
},
|
||||
"frequency": {
|
||||
"title": "Frequency",
|
||||
"select_frequency": "Select Frequency",
|
||||
"minute": "Minute",
|
||||
"hour": "Hour",
|
||||
"day_month": "Day of month",
|
||||
"month": "Month",
|
||||
"day_week": "Day of week"
|
||||
"title": "Frekvencia",
|
||||
"select_frequency": "Vybrať frekvenciu",
|
||||
"minute": "Minúta",
|
||||
"hour": "Hodina",
|
||||
"day_month": "Deň v mesiaci",
|
||||
"month": "Mesiac",
|
||||
"day_week": "Deň v týždni"
|
||||
},
|
||||
"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",
|
||||
@ -686,12 +686,12 @@
|
||||
"api_token": "API token",
|
||||
"invalid_api_token": "Invalid API Token.",
|
||||
"other_modules": "Other Modules",
|
||||
"view_all": "View All",
|
||||
"no_reviews_found": "There are no reviews for this module yet!",
|
||||
"module_not_purchased": "Module Not Purchased",
|
||||
"module_not_found": "Module Not Found",
|
||||
"view_all": "Zobraziť všetky",
|
||||
"no_reviews_found": "Zatiaľ nie sú dostupné žiadne hodnotenia pre tento modul!",
|
||||
"module_not_purchased": "Modul nie je kúpený",
|
||||
"module_not_found": "Modul nebol nájdený",
|
||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||
"last_updated": "Last Updated On",
|
||||
"last_updated": "Naposledy aktualizované",
|
||||
"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.",
|
||||
"view_module": "View Module",
|
||||
@ -806,8 +806,8 @@
|
||||
"custom_fields": "Vlastné Polia",
|
||||
"payment_modes": "Spôsoby Platby",
|
||||
"notes": "Poznámky",
|
||||
"exchange_rate": "Exchange Rate",
|
||||
"address_information": "Address Information"
|
||||
"exchange_rate": "Výmenný kurz",
|
||||
"address_information": "Údaje adresy"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " You can update Your Address information using form below."
|
||||
@ -872,9 +872,9 @@
|
||||
"address": "Adresa",
|
||||
"zip": "PSČ",
|
||||
"save": "Uložiť",
|
||||
"delete": "Delete",
|
||||
"delete": "Odstrániť",
|
||||
"updated_message": "Informácie o firme úspešne aktualizované",
|
||||
"delete_company": "Delete Company",
|
||||
"delete_company": "Odstrániť spoločnosť",
|
||||
"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?",
|
||||
"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_number": "Číslo cenového odhadu",
|
||||
"pdf_estimate_date": "Dátum cenového odhadu",
|
||||
"pdf_estimate_expire_date": "Platnosť cenového odhadu",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "Faktúra",
|
||||
"pdf_invoice_number": "Číslo faktúry",
|
||||
"pdf_invoice_date": "Dátum vystavenia",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -12,7 +12,7 @@
|
||||
"settings": "Podešavanja",
|
||||
"logout": "Odjavi se",
|
||||
"users": "Korisnici",
|
||||
"modules": "Modules"
|
||||
"modules": "Moduli"
|
||||
},
|
||||
"general": {
|
||||
"add_company": "Dodaj kompaniju",
|
||||
@ -30,8 +30,8 @@
|
||||
"from": "Pošiljalac",
|
||||
"to": "Primalac",
|
||||
"ok": "Ok",
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
"yes": "Da",
|
||||
"no": "Ne",
|
||||
"sort_by": "Rasporedi Po",
|
||||
"ascending": "Rastuće",
|
||||
"descending": "Opadajuće",
|
||||
@ -39,7 +39,7 @@
|
||||
"body": "Telo",
|
||||
"message": "Poruka",
|
||||
"send": "Pošalji",
|
||||
"preview": "Preview",
|
||||
"preview": "Pregled",
|
||||
"go_back": "Idi nazad",
|
||||
"back_to_login": "Nazad na prijavu?",
|
||||
"home": "Početna",
|
||||
@ -95,9 +95,9 @@
|
||||
"copied_pdf_url_clipboard": "Link do PDF fajla kopiran!",
|
||||
"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",
|
||||
"do_you_wish_to_continue": "Da li želite nastaviti?",
|
||||
"note": "Bilješka",
|
||||
"pay_invoice": "Plati račun",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"mark_as_default": "Mark as default"
|
||||
@ -318,10 +318,10 @@
|
||||
},
|
||||
"accepted": "Prihvaćeno",
|
||||
"rejected": "Odbijeno",
|
||||
"expired": "Expired",
|
||||
"expired": "Istekao",
|
||||
"sent": "Poslato",
|
||||
"draft": "U izradi",
|
||||
"viewed": "Viewed",
|
||||
"viewed": "Pregledano",
|
||||
"declined": "Odbijeno",
|
||||
"new_estimate": "Nova Profaktura",
|
||||
"add_new_estimate": "Dodaj novu Profakturu",
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Profaktura",
|
||||
"pdf_estimate_number": "Broj Profakture",
|
||||
"pdf_estimate_date": "Datum Profakture",
|
||||
"pdf_estimate_expire_date": "Datum isteka Profakture",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "Faktura",
|
||||
"pdf_invoice_number": "Broj Fakture",
|
||||
"pdf_invoice_date": "Datum Fakture",
|
||||
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Kostnadsförslag",
|
||||
"pdf_estimate_number": "Kostnadsförslagsnummer",
|
||||
"pdf_estimate_date": "Kostnadsförslagsdatum",
|
||||
"pdf_estimate_expire_date": "Utgångsdatum",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "Faktura",
|
||||
"pdf_invoice_number": "Fakturanummer",
|
||||
"pdf_invoice_date": "Fakturadatum",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Estimate",
|
||||
"pdf_estimate_number": "Estimate Number",
|
||||
"pdf_estimate_date": "Estimate Date",
|
||||
"pdf_estimate_expire_date": "Expiry date",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "Invoice",
|
||||
"pdf_invoice_number": "Invoice Number",
|
||||
"pdf_invoice_date": "Invoice Date",
|
||||
|
||||
1526
resources/scripts/locales/uk.json
Normal file
1526
resources/scripts/locales/uk.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -12,7 +12,7 @@
|
||||
"settings": "Cài đặt",
|
||||
"logout": "Đăng xuất",
|
||||
"users": "Người dùng",
|
||||
"modules": "Modules"
|
||||
"modules": "Các Mô-Đun"
|
||||
},
|
||||
"general": {
|
||||
"add_company": "Thêm công ty",
|
||||
@ -93,13 +93,13 @@
|
||||
"no_note_found": "Không tìm thấy ghi chú",
|
||||
"insert_note": "Chèn ghi chú",
|
||||
"copied_pdf_url_clipboard": "Đã sao chép url PDF vào khay nhớ tạm!",
|
||||
"copied_url_clipboard": "Copied url to clipboard!",
|
||||
"copied_url_clipboard": "Đã sao chép url vào khay nhớ tạm!",
|
||||
"docs": "Tài liệu",
|
||||
"do_you_wish_to_continue": "Bạn có muốn tiếp tục không?",
|
||||
"note": "Ghi chú",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"pay_invoice": "Thanh toán hóa đơn",
|
||||
"login_successfully": "Đăng nhập thành công!",
|
||||
"logged_out_successfully": "Đăng xuất thành công",
|
||||
"mark_as_default": "Đánh dấu mặc định"
|
||||
},
|
||||
"dashboard": {
|
||||
@ -109,7 +109,7 @@
|
||||
"customers": "Khách hàng",
|
||||
"invoices": "Hóa đơn",
|
||||
"estimates": "Ước tính",
|
||||
"payments": "Payments"
|
||||
"payments": "Thanh toán"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "Bán hàng",
|
||||
@ -208,10 +208,10 @@
|
||||
"new_customer": "Khách hàng mới",
|
||||
"edit_customer": "Chỉnh sửa khách hàng",
|
||||
"basic_info": "Thông tin cơ bản",
|
||||
"portal_access": "Portal Access",
|
||||
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||
"portal_access_url": "Customer Portal Login URL",
|
||||
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||
"portal_access": "Truy cập cổng thông tin",
|
||||
"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_url": "Đường dẫn đăng nhập cổng thông tin khách hàng",
|
||||
"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.",
|
||||
"billing_address": "Địa chỉ thanh toán",
|
||||
"shipping_address": "Địa chỉ giao hàng",
|
||||
"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.",
|
||||
"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",
|
||||
"address_updated_message": "Address Information Updated succesfully",
|
||||
"address_updated_message": "Thông tin địa chỉ được cập nhật 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."
|
||||
},
|
||||
@ -265,7 +265,7 @@
|
||||
},
|
||||
"estimates": {
|
||||
"title": "Ước tính",
|
||||
"accept_estimate": "Accept Estimate",
|
||||
"accept_estimate": "Chấp nhận ước tính",
|
||||
"reject_estimate": "Reject Estimate",
|
||||
"estimate": "Ước tính | Ước tính",
|
||||
"estimates_list": "Danh sách ước tính",
|
||||
@ -318,7 +318,7 @@
|
||||
},
|
||||
"accepted": "Đã được chấp nhận",
|
||||
"rejected": "Từ chối",
|
||||
"expired": "Expired",
|
||||
"expired": "Hết hạn",
|
||||
"sent": "Gởi",
|
||||
"draft": "Bản nháp",
|
||||
"viewed": "Viewed",
|
||||
@ -463,36 +463,36 @@
|
||||
"active": "Hoạt động",
|
||||
"completed": "Hoàn thành",
|
||||
"customer": "KHÁCH HÀNG",
|
||||
"paid_status": "PAID STATUS",
|
||||
"ref_no": "REF NO.",
|
||||
"number": "NUMBER",
|
||||
"paid_status": "TÌNH TRẠNG THANH TOÁN",
|
||||
"ref_no": "Số tham chiếu.",
|
||||
"number": "SỐ",
|
||||
"amount_due": "AMOUNT DUE",
|
||||
"partially_paid": "Partially Paid",
|
||||
"total": "Total",
|
||||
"discount": "Discount",
|
||||
"total": "Tổng",
|
||||
"discount": "Giảm giá",
|
||||
"sub_total": "Sub Total",
|
||||
"invoice": "Recurring Invoice | Recurring Invoices",
|
||||
"invoice_number": "Recurring Invoice Number",
|
||||
"next_invoice_date": "Next Invoice Date",
|
||||
"ref_number": "Ref Number",
|
||||
"contact": "Contact",
|
||||
"add_item": "Add an Item",
|
||||
"date": "Date",
|
||||
"limit_by": "Limit by",
|
||||
"limit_date": "Limit Date",
|
||||
"invoice_number": "Số hóa đơn định kì",
|
||||
"next_invoice_date": "Ngày lập hoá đơn tiếp theo",
|
||||
"ref_number": "Số tham chiếu",
|
||||
"contact": "Liên hệ",
|
||||
"add_item": "Thêm một mặt hàng",
|
||||
"date": "Ngày",
|
||||
"limit_by": "Giới hạn bởi",
|
||||
"limit_date": "Ngày giới hạn",
|
||||
"limit_count": "Limit Count",
|
||||
"count": "Count",
|
||||
"status": "Status",
|
||||
"select_a_status": "Select a status",
|
||||
"working": "Working",
|
||||
"on_hold": "On Hold",
|
||||
"complete": "Completed",
|
||||
"add_tax": "Add Tax",
|
||||
"amount": "Amount",
|
||||
"action": "Action",
|
||||
"notes": "Notes",
|
||||
"view": "View",
|
||||
"basic_info": "Basic Info",
|
||||
"status": "Trạng thái",
|
||||
"select_a_status": "Chọn một trạng thái",
|
||||
"working": "Đang hoạt động",
|
||||
"on_hold": "Đang chờ",
|
||||
"complete": "Hoàn thành",
|
||||
"add_tax": "Thêm thuế",
|
||||
"amount": "Số tiền",
|
||||
"action": "Hành động",
|
||||
"notes": "Ghi chú",
|
||||
"view": "Xem",
|
||||
"basic_info": "Thông tin cơ bản",
|
||||
"send_invoice": "Send Recurring Invoice",
|
||||
"auto_send": "Auto Send",
|
||||
"resend_invoice": "Resend Recurring Invoice",
|
||||
@ -504,9 +504,9 @@
|
||||
"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",
|
||||
"starts_at": "Start Date",
|
||||
"due_date": "Invoice Due Date",
|
||||
"record_payment": "Record Payment",
|
||||
"add_new_invoice": "Add New Recurring Invoice",
|
||||
"due_date": "Ngày lập hóa đơn",
|
||||
"record_payment": "Ghi lại Thanh toán",
|
||||
"add_new_invoice": "Cập nhật Hóa đơn định kỳ",
|
||||
"update_expense": "Update Expense",
|
||||
"edit_invoice": "Edit Recurring Invoice",
|
||||
"new_invoice": "New Recurring Invoice",
|
||||
@ -533,7 +533,7 @@
|
||||
"quantity": "Quantity",
|
||||
"price": "Price",
|
||||
"discount": "Discount",
|
||||
"total": "Total",
|
||||
"total": "Tổng cộng",
|
||||
"total_discount": "Total Discount",
|
||||
"sub_total": "Sub Total",
|
||||
"tax": "Tax",
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "Ước tính",
|
||||
"pdf_estimate_number": "Số ước tính",
|
||||
"pdf_estimate_date": "Ngày ước tính",
|
||||
"pdf_estimate_expire_date": "Ngày hết hạn",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "Hóa đơn",
|
||||
"pdf_invoice_number": "Số hóa đơn",
|
||||
"pdf_invoice_date": "Ngày lập hóa đơn",
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
"settings": "設定",
|
||||
"logout": "登出",
|
||||
"users": "使用者",
|
||||
"modules": "Modules"
|
||||
"modules": "功能模組"
|
||||
},
|
||||
"general": {
|
||||
"add_company": "新增公司",
|
||||
@ -93,14 +93,14 @@
|
||||
"no_note_found": "沒有找到備註",
|
||||
"insert_note": "插入備註",
|
||||
"copied_pdf_url_clipboard": "複製PDF位址到剪貼簿!",
|
||||
"copied_url_clipboard": "Copied url to clipboard!",
|
||||
"copied_url_clipboard": "將網址複製到剪貼簿!",
|
||||
"docs": "文檔",
|
||||
"do_you_wish_to_continue": "你確定要繼續?",
|
||||
"note": "備註",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"mark_as_default": "Mark as default"
|
||||
"pay_invoice": "支付發票",
|
||||
"login_successfully": "已成功登入!",
|
||||
"logged_out_successfully": "已成功登出",
|
||||
"mark_as_default": "標記為預設值"
|
||||
},
|
||||
"dashboard": {
|
||||
"select_year": "選擇年份",
|
||||
@ -109,7 +109,7 @@
|
||||
"customers": "客户",
|
||||
"invoices": "發票",
|
||||
"estimates": "報價",
|
||||
"payments": "Payments"
|
||||
"payments": "付款"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "銷售",
|
||||
@ -208,10 +208,10 @@
|
||||
"new_customer": "新客戶",
|
||||
"edit_customer": "編輯客戶",
|
||||
"basic_info": "基本資料",
|
||||
"portal_access": "Portal Access",
|
||||
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||
"portal_access_url": "Customer Portal Login URL",
|
||||
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||
"portal_access": "門戶訪問",
|
||||
"portal_access_text": "您想允許此客戶登入客戶門戶嗎?",
|
||||
"portal_access_url": "客戶門戶登入URL",
|
||||
"portal_access_url_help": "請將上述給定的URL複製並轉發給您的客戶以提供訪問許可權。",
|
||||
"billing_address": "帳單地址",
|
||||
"shipping_address": "送貨地址",
|
||||
"copy_billing_address": "由帳單複製",
|
||||
@ -231,7 +231,7 @@
|
||||
"confirm_delete": "你將不能夠還原此客戶, 以及此客戶相關的發票, 報價及付款. | 你將不能夠還原此客戶, 以及此客戶相關的發票, 報價及付款.",
|
||||
"created_message": "成功新增客戶",
|
||||
"updated_message": "成功更新客戶",
|
||||
"address_updated_message": "Address Information Updated succesfully",
|
||||
"address_updated_message": "地址資訊已成功更新",
|
||||
"deleted_message": "成功刪除客戶 | 成功刪除客戶",
|
||||
"edit_currency_not_allowed": "交易一旦創建後就不能改變貨幣!"
|
||||
},
|
||||
@ -265,8 +265,8 @@
|
||||
},
|
||||
"estimates": {
|
||||
"title": "報價",
|
||||
"accept_estimate": "Accept Estimate",
|
||||
"reject_estimate": "Reject Estimate",
|
||||
"accept_estimate": "接受估價",
|
||||
"reject_estimate": "拒絕估算",
|
||||
"estimate": "報價 | 報價",
|
||||
"estimates_list": "報價列表",
|
||||
"days": "{days} 天",
|
||||
@ -318,10 +318,10 @@
|
||||
},
|
||||
"accepted": "已接受",
|
||||
"rejected": "已拒絕",
|
||||
"expired": "Expired",
|
||||
"expired": "已過期",
|
||||
"sent": "傳送",
|
||||
"draft": "草稿",
|
||||
"viewed": "Viewed",
|
||||
"viewed": "已檢視",
|
||||
"declined": "拒絕",
|
||||
"new_estimate": "新報價",
|
||||
"add_new_estimate": "新增報價",
|
||||
@ -355,14 +355,14 @@
|
||||
"select_an_item": "輸入或點擊去選擇商品",
|
||||
"type_item_description": "商品詳情(可選)"
|
||||
},
|
||||
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||
"mark_as_default_estimate_template_description": "如果啟用,所選模板將自動選擇新的估算。"
|
||||
},
|
||||
"invoices": {
|
||||
"title": "發票",
|
||||
"download": "Download",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"download": "下載",
|
||||
"pay_invoice": "支付發票",
|
||||
"invoices_list": "發票列表",
|
||||
"invoice_information": "Invoice Information",
|
||||
"invoice_information": "發票資訊",
|
||||
"days": "{days} 天",
|
||||
"months": "{months} 月",
|
||||
"years": "{years} 年",
|
||||
@ -447,7 +447,7 @@
|
||||
"marked_as_sent_message": "發票已標示為成功傳送",
|
||||
"something_went_wrong": "出現錯誤",
|
||||
"invalid_due_amount_message": "發票總額不能少於支付總額. 請更新發票或刪除相關支付再繼續.",
|
||||
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||
"mark_as_default_invoice_template_description": "如果啟用,所選模板將自動選擇新發票"
|
||||
},
|
||||
"recurring_invoices": {
|
||||
"title": "定期發票",
|
||||
@ -464,12 +464,12 @@
|
||||
"completed": "已完成",
|
||||
"customer": "客戶",
|
||||
"paid_status": "付款狀態",
|
||||
"ref_no": "REF NO.",
|
||||
"number": "NUMBER",
|
||||
"amount_due": "AMOUNT DUE",
|
||||
"partially_paid": "Partially Paid",
|
||||
"total": "Total",
|
||||
"discount": "Discount",
|
||||
"ref_no": "參考號碼",
|
||||
"number": "號",
|
||||
"amount_due": "到期金額",
|
||||
"partially_paid": "部分支付",
|
||||
"total": "總計",
|
||||
"discount": "折扣",
|
||||
"sub_total": "Sub Total",
|
||||
"invoice": "Recurring Invoice | Recurring Invoices",
|
||||
"invoice_number": "Recurring Invoice Number",
|
||||
@ -504,16 +504,16 @@
|
||||
"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",
|
||||
"starts_at": "Start Date",
|
||||
"due_date": "Invoice Due Date",
|
||||
"record_payment": "Record Payment",
|
||||
"add_new_invoice": "Add New Recurring Invoice",
|
||||
"update_expense": "Update Expense",
|
||||
"edit_invoice": "Edit Recurring Invoice",
|
||||
"new_invoice": "New Recurring Invoice",
|
||||
"send_automatically": "Send Automatically",
|
||||
"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",
|
||||
"update_invoice": "Update Recurring Invoice",
|
||||
"due_date": "發票到期日期",
|
||||
"record_payment": "紀錄付款",
|
||||
"add_new_invoice": "添加定期發票",
|
||||
"update_expense": "更新支出",
|
||||
"edit_invoice": "編輯定期發票",
|
||||
"new_invoice": "添加定期發票",
|
||||
"send_automatically": "自動發送",
|
||||
"send_automatically_desc": "如果您希望在建立發票時自動將發票發送給客戶,請啟用此選項。",
|
||||
"save_invoice": "保存定期發票",
|
||||
"update_invoice": "更新定期發票",
|
||||
"add_new_tax": "Add New Tax",
|
||||
"no_invoices": "No Recurring Invoices yet!",
|
||||
"mark_as_rejected": "Mark as rejected",
|
||||
@ -1485,7 +1485,7 @@
|
||||
"pdf_estimate_label": "報價",
|
||||
"pdf_estimate_number": "報價單號",
|
||||
"pdf_estimate_date": "報價日期",
|
||||
"pdf_estimate_expire_date": "有效日期",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "發票",
|
||||
"pdf_invoice_number": "發票號碼",
|
||||
"pdf_invoice_date": "發票日期",
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user