mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-28 04:01:10 -04:00
Compare commits
57 Commits
fcd992179e
...
dark-custo
| Author | SHA1 | Date | |
|---|---|---|---|
| 475b63e351 | |||
| e15d2da07c | |||
| c2f41c6d1f | |||
| c5acf1343e | |||
| 0321ca5515 | |||
| bd345949e5 | |||
| b4b00ebdd6 | |||
| 43316dae28 | |||
| 80e2548b38 | |||
| e8d92cd641 | |||
| 2c8bb38531 | |||
| 04c7ae39a2 | |||
| af2482a69c | |||
| cac35826c2 | |||
| 18b5705372 | |||
| c61fbad5ce | |||
| 15f3f566e3 | |||
| 2e93082282 | |||
| ca55221c4f | |||
| 98196194e2 | |||
| 7447cc24f9 | |||
| 889d22d92c | |||
| bc8f2cd484 | |||
| 4e47f58bad | |||
| d8c429912e | |||
| df04fd9e53 | |||
| 0aaf0e7e75 | |||
| 3d0b89bb4d | |||
| 38c4b9ebce | |||
| 7be59e78e0 | |||
| 189c51cdf4 | |||
| 204483836a | |||
| 33bc9ded65 | |||
| 4271ef451e | |||
| 6eb44fba93 | |||
| 96e7300583 | |||
| a479d966d1 | |||
| bd5f0fe5cf | |||
| 787619b907 | |||
| fd70ab9a99 | |||
| 33315638df | |||
| bba14bf51a | |||
| ea41989034 | |||
| 3f3f83a00a | |||
| adc5962071 | |||
| c4c00002d7 | |||
| a7c1e12db6 | |||
| 32949d1eec | |||
| 7718f77f3d | |||
| a9e54981bf | |||
| ef35293f8a | |||
| 5c63770b6b | |||
| d130e20c92 | |||
| 586fb1ae10 | |||
| 20c2502e31 | |||
| 0e31f85c18 | |||
| e7301eb7a3 |
162
.github/workflows/uffizzi-build.yml
vendored
Normal file
162
.github/workflows/uffizzi-build.yml
vendored
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
name: Build PR Image
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened,synchronize,reopened,closed]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
build-application:
|
||||||
|
name: Build and Push `application`
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout git repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
- name: Generate UUID image name
|
||||||
|
id: uuid
|
||||||
|
run: echo "UUID_TAG_APP=$(uuidgen)" >> $GITHUB_ENV
|
||||||
|
- name: Docker metadata
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v3
|
||||||
|
with:
|
||||||
|
images: registry.uffizzi.com/${{ env.UUID_TAG_APP }}
|
||||||
|
tags: type=raw,value=60d
|
||||||
|
- name: Build and Push Image to registry.uffizzi.com ephemeral registry
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
push: true
|
||||||
|
context: ./
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
file: ./uffizzi/Dockerfile
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
|
|
||||||
|
|
||||||
|
build-nginx:
|
||||||
|
name: Build and Push `nginx`
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout git repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
- name: Generate UUID image name
|
||||||
|
id: uuid
|
||||||
|
run: echo "UUID_TAG_NGINX=$(uuidgen)" >> $GITHUB_ENV
|
||||||
|
- name: Docker metadata
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v3
|
||||||
|
with:
|
||||||
|
images: registry.uffizzi.com/${{ env.UUID_TAG_NGINX }}
|
||||||
|
tags: type=raw,value=60d
|
||||||
|
- name: Build and Push Image to Uffizzi ephemeral registry
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
push: true
|
||||||
|
context: ./
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
file: ./uffizzi/nginx/Dockerfile
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
|
|
||||||
|
|
||||||
|
build-crond:
|
||||||
|
name: Build and Push `crond`
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout git repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
- name: Generate UUID image name
|
||||||
|
id: uuid
|
||||||
|
run: echo "UUID_TAG_CROND=$(uuidgen)" >> $GITHUB_ENV
|
||||||
|
- name: Docker metadata
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v3
|
||||||
|
with:
|
||||||
|
images: registry.uffizzi.com/${{ env.UUID_TAG_CROND }}
|
||||||
|
tags: type=raw,value=60d
|
||||||
|
- name: Build and Push Image to registry.uffizzi.com ephemeral registry
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
push: true
|
||||||
|
context: ./
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
file: ./uffizzi/crond/Dockerfile
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
render-compose-file:
|
||||||
|
name: Render Docker Compose File
|
||||||
|
# Pass output of this workflow to another triggered by `workflow_run` event.
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
compose-file-cache-key: ${{ steps.hash.outputs.hash }}
|
||||||
|
needs:
|
||||||
|
- build-application
|
||||||
|
- build-nginx
|
||||||
|
- build-crond
|
||||||
|
steps:
|
||||||
|
- name: Checkout git repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Render Compose File
|
||||||
|
run: |
|
||||||
|
APP_IMAGE=$(echo ${{ needs.build-application.outputs.tags }})
|
||||||
|
export APP_IMAGE
|
||||||
|
NGINX_IMAGE=$(echo ${{ needs.build-nginx.outputs.tags }})
|
||||||
|
export NGINX_IMAGE
|
||||||
|
CROND_IMAGE=$(echo ${{ needs.build-crond.outputs.tags }})
|
||||||
|
export CROND_IMAGE
|
||||||
|
# Render simple template from environment variables.
|
||||||
|
envsubst < ./uffizzi/docker-compose.uffizzi.yml > docker-compose.rendered.yml
|
||||||
|
cat docker-compose.rendered.yml
|
||||||
|
- name: Upload Rendered Compose File as Artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: preview-spec
|
||||||
|
path: docker-compose.rendered.yml
|
||||||
|
retention-days: 2
|
||||||
|
- name: Serialize PR Event to File
|
||||||
|
run: |
|
||||||
|
cat << EOF > event.json
|
||||||
|
${{ toJSON(github.event) }}
|
||||||
|
|
||||||
|
EOF
|
||||||
|
- name: Upload PR Event as Artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: preview-spec
|
||||||
|
path: event.json
|
||||||
|
retention-days: 2
|
||||||
|
|
||||||
|
delete-preview:
|
||||||
|
name: Call for Preview Deletion
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ github.event.action == 'closed' }}
|
||||||
|
steps:
|
||||||
|
# If this PR is closing, we will not render a compose file nor pass it to the next workflow.
|
||||||
|
- name: Serialize PR Event to File
|
||||||
|
run: echo '${{ toJSON(github.event) }}' > event.json
|
||||||
|
- name: Upload PR Event as Artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: preview-spec
|
||||||
|
path: event.json
|
||||||
|
retention-days: 2
|
||||||
|
|
||||||
84
.github/workflows/uffizzi-preview.yml
vendored
Normal file
84
.github/workflows/uffizzi-preview.yml
vendored
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
name: Deploy Uffizzi Preview
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_run:
|
||||||
|
workflows:
|
||||||
|
- "Build PR Image"
|
||||||
|
types:
|
||||||
|
- completed
|
||||||
|
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cache-compose-file:
|
||||||
|
name: Cache Compose File
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
compose-file-cache-key: ${{ env.COMPOSE_FILE_HASH }}
|
||||||
|
pr-number: ${{ env.PR_NUMBER }}
|
||||||
|
steps:
|
||||||
|
- name: 'Download artifacts'
|
||||||
|
# Fetch output (zip archive) from the workflow run that triggered this workflow.
|
||||||
|
uses: actions/github-script@v6
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
run_id: context.payload.workflow_run.id,
|
||||||
|
});
|
||||||
|
let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
|
||||||
|
return artifact.name == "preview-spec"
|
||||||
|
})[0];
|
||||||
|
let download = await github.rest.actions.downloadArtifact({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
artifact_id: matchArtifact.id,
|
||||||
|
archive_format: 'zip',
|
||||||
|
});
|
||||||
|
let fs = require('fs');
|
||||||
|
fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/preview-spec.zip`, Buffer.from(download.data));
|
||||||
|
- name: 'Unzip artifact'
|
||||||
|
run: unzip preview-spec.zip
|
||||||
|
- name: Read Event into ENV
|
||||||
|
run: |
|
||||||
|
echo 'EVENT_JSON<<EOF' >> $GITHUB_ENV
|
||||||
|
cat event.json >> $GITHUB_ENV
|
||||||
|
echo 'EOF' >> $GITHUB_ENV
|
||||||
|
- name: Hash Rendered Compose File
|
||||||
|
id: hash
|
||||||
|
# If the previous workflow was triggered by a PR close event, we will not have a compose file artifact.
|
||||||
|
if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }}
|
||||||
|
run: echo "COMPOSE_FILE_HASH=$(md5sum docker-compose.rendered.yml | awk '{ print $1 }')" >> $GITHUB_ENV
|
||||||
|
- name: Cache Rendered Compose File
|
||||||
|
if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }}
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: docker-compose.rendered.yml
|
||||||
|
key: ${{ env.COMPOSE_FILE_HASH }}
|
||||||
|
|
||||||
|
- name: Read PR Number From Event Object
|
||||||
|
id: pr
|
||||||
|
run: echo "PR_NUMBER=${{ fromJSON(env.EVENT_JSON).number }}" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: DEBUG - Print Job Outputs
|
||||||
|
if: ${{ runner.debug }}
|
||||||
|
run: |
|
||||||
|
echo "PR number: ${{ env.PR_NUMBER }}"
|
||||||
|
echo "Compose file hash: ${{ env.COMPOSE_FILE_HASH }}"
|
||||||
|
cat event.json
|
||||||
|
deploy-uffizzi-preview:
|
||||||
|
name: Use Remote Workflow to Preview on Uffizzi
|
||||||
|
needs:
|
||||||
|
- cache-compose-file
|
||||||
|
uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2.6.1
|
||||||
|
with:
|
||||||
|
# If this workflow was triggered by a PR close event, cache-key will be an empty string
|
||||||
|
# and this reusable workflow will delete the preview deployment.
|
||||||
|
compose-file-cache-key: ${{ needs.cache-compose-file.outputs.compose-file-cache-key }}
|
||||||
|
compose-file-cache-path: docker-compose.rendered.yml
|
||||||
|
server: https://app.uffizzi.com/
|
||||||
|
pr-number: ${{ needs.cache-compose-file.outputs.pr-number }}
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
id-token: write
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -16,3 +16,4 @@ Homestead.yaml
|
|||||||
.gitkeep
|
.gitkeep
|
||||||
/public/docs
|
/public/docs
|
||||||
/.scribe
|
/.scribe
|
||||||
|
!storage/fonts/.gitkeep
|
||||||
@ -1,4 +1,4 @@
|
|||||||
FROM php:7.4-fpm
|
FROM php:8.1-fpm
|
||||||
|
|
||||||
# Arguments defined in docker-compose.yml
|
# Arguments defined in docker-compose.yml
|
||||||
ARG user
|
ARG user
|
||||||
|
|||||||
@ -103,6 +103,7 @@ class CustomerStatsController extends Controller
|
|||||||
)
|
)
|
||||||
->whereCompany()
|
->whereCompany()
|
||||||
->whereCustomer($customer->id)
|
->whereCustomer($customer->id)
|
||||||
|
->where('status', '<>', Invoice::STATUS_DRAFT)
|
||||||
->sum('total');
|
->sum('total');
|
||||||
$totalReceipts = Payment::whereBetween(
|
$totalReceipts = Payment::whereBetween(
|
||||||
'payment_date',
|
'payment_date',
|
||||||
|
|||||||
@ -104,6 +104,7 @@ class DashboardController extends Controller
|
|||||||
'invoice_date',
|
'invoice_date',
|
||||||
[$startDate->format('Y-m-d'), $start->format('Y-m-d')]
|
[$startDate->format('Y-m-d'), $start->format('Y-m-d')]
|
||||||
)
|
)
|
||||||
|
->where('status', '<>', Invoice::STATUS_DRAFT)
|
||||||
->whereCompany()
|
->whereCompany()
|
||||||
->sum('base_total');
|
->sum('base_total');
|
||||||
|
|
||||||
@ -141,6 +142,7 @@ class DashboardController extends Controller
|
|||||||
$recent_due_invoices = Invoice::with('customer')
|
$recent_due_invoices = Invoice::with('customer')
|
||||||
->whereCompany()
|
->whereCompany()
|
||||||
->where('base_due_amount', '>', 0)
|
->where('base_due_amount', '>', 0)
|
||||||
|
->where('status', '<>', Invoice::STATUS_DRAFT)
|
||||||
->take(5)
|
->take(5)
|
||||||
->latest()
|
->latest()
|
||||||
->get();
|
->get();
|
||||||
|
|||||||
@ -24,6 +24,7 @@ class InvoicesController extends Controller
|
|||||||
$limit = $request->has('limit') ? $request->limit : 10;
|
$limit = $request->has('limit') ? $request->limit : 10;
|
||||||
|
|
||||||
$invoices = Invoice::whereCompany()
|
$invoices = Invoice::whereCompany()
|
||||||
|
->whereTabFilters($request->tab_status)
|
||||||
->join('customers', 'customers.id', '=', 'invoices.customer_id')
|
->join('customers', 'customers.id', '=', 'invoices.customer_id')
|
||||||
->applyFilters($request->all())
|
->applyFilters($request->all())
|
||||||
->select('invoices.*', 'customers.name')
|
->select('invoices.*', 'customers.name')
|
||||||
|
|||||||
@ -2,24 +2,25 @@
|
|||||||
|
|
||||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||||
|
|
||||||
|
use PDF;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Crater\Http\Controllers\Controller;
|
|
||||||
use Crater\Models\Company;
|
use Crater\Models\Company;
|
||||||
use Crater\Models\CompanySetting;
|
use Crater\Models\Currency;
|
||||||
use Crater\Models\Customer;
|
use Crater\Models\Customer;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
use Crater\Models\CompanySetting;
|
||||||
use Illuminate\Support\Facades\App;
|
use Illuminate\Support\Facades\App;
|
||||||
use PDF;
|
use Crater\Http\Controllers\Controller;
|
||||||
|
|
||||||
class CustomerSalesReportController extends Controller
|
class CustomerSalesReportController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Handle the incoming request.
|
* Handle the incoming request.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @param string $hash
|
* @param string $hash
|
||||||
* @return \Illuminate\Http\JsonResponse
|
* @return \Illuminate\Http\JsonResponse
|
||||||
*/
|
*/
|
||||||
public function __invoke(Request $request, $hash)
|
public function __invoke(Request $request, $hash)
|
||||||
{
|
{
|
||||||
$company = Company::where('unique_hash', $hash)->first();
|
$company = Company::where('unique_hash', $hash)->first();
|
||||||
@ -56,6 +57,7 @@ class CustomerSalesReportController extends Controller
|
|||||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||||
|
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
||||||
|
|
||||||
$colors = [
|
$colors = [
|
||||||
'primary_text_color',
|
'primary_text_color',
|
||||||
@ -80,6 +82,7 @@ class CustomerSalesReportController extends Controller
|
|||||||
'company' => $company,
|
'company' => $company,
|
||||||
'from_date' => $from_date,
|
'from_date' => $from_date,
|
||||||
'to_date' => $to_date,
|
'to_date' => $to_date,
|
||||||
|
'currency' => $currency,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$pdf = PDF::loadView('app.pdf.reports.sales-customers');
|
$pdf = PDF::loadView('app.pdf.reports.sales-customers');
|
||||||
|
|||||||
@ -2,24 +2,25 @@
|
|||||||
|
|
||||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
|
||||||
use Crater\Http\Controllers\Controller;
|
|
||||||
use Crater\Models\Company;
|
|
||||||
use Crater\Models\CompanySetting;
|
|
||||||
use Crater\Models\Expense;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Illuminate\Support\Facades\App;
|
|
||||||
use PDF;
|
use PDF;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Crater\Models\Company;
|
||||||
|
use Crater\Models\Expense;
|
||||||
|
use Crater\Models\Currency;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Crater\Models\CompanySetting;
|
||||||
|
use Illuminate\Support\Facades\App;
|
||||||
|
use Crater\Http\Controllers\Controller;
|
||||||
|
|
||||||
class ExpensesReportController extends Controller
|
class ExpensesReportController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Handle the incoming request.
|
* Handle the incoming request.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @param string $hash
|
* @param string $hash
|
||||||
* @return \Illuminate\Http\JsonResponse
|
* @return \Illuminate\Http\JsonResponse
|
||||||
*/
|
*/
|
||||||
public function __invoke(Request $request, $hash)
|
public function __invoke(Request $request, $hash)
|
||||||
{
|
{
|
||||||
$company = Company::where('unique_hash', $hash)->first();
|
$company = Company::where('unique_hash', $hash)->first();
|
||||||
@ -43,6 +44,7 @@ class ExpensesReportController extends Controller
|
|||||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||||
|
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
||||||
|
|
||||||
$colors = [
|
$colors = [
|
||||||
'primary_text_color',
|
'primary_text_color',
|
||||||
@ -66,6 +68,7 @@ class ExpensesReportController extends Controller
|
|||||||
'company' => $company,
|
'company' => $company,
|
||||||
'from_date' => $from_date,
|
'from_date' => $from_date,
|
||||||
'to_date' => $to_date,
|
'to_date' => $to_date,
|
||||||
|
'currency' => $currency,
|
||||||
]);
|
]);
|
||||||
$pdf = PDF::loadView('app.pdf.reports.expenses');
|
$pdf = PDF::loadView('app.pdf.reports.expenses');
|
||||||
|
|
||||||
|
|||||||
@ -2,24 +2,25 @@
|
|||||||
|
|
||||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
|
||||||
use Crater\Http\Controllers\Controller;
|
|
||||||
use Crater\Models\Company;
|
|
||||||
use Crater\Models\CompanySetting;
|
|
||||||
use Crater\Models\InvoiceItem;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Illuminate\Support\Facades\App;
|
|
||||||
use PDF;
|
use PDF;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Crater\Models\Company;
|
||||||
|
use Crater\Models\Currency;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Crater\Models\InvoiceItem;
|
||||||
|
use Crater\Models\CompanySetting;
|
||||||
|
use Illuminate\Support\Facades\App;
|
||||||
|
use Crater\Http\Controllers\Controller;
|
||||||
|
|
||||||
class ItemSalesReportController extends Controller
|
class ItemSalesReportController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Handle the incoming request.
|
* Handle the incoming request.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @param string $hash
|
* @param string $hash
|
||||||
* @return \Illuminate\Http\JsonResponse
|
* @return \Illuminate\Http\JsonResponse
|
||||||
*/
|
*/
|
||||||
public function __invoke(Request $request, $hash)
|
public function __invoke(Request $request, $hash)
|
||||||
{
|
{
|
||||||
$company = Company::where('unique_hash', $hash)->first();
|
$company = Company::where('unique_hash', $hash)->first();
|
||||||
@ -43,6 +44,7 @@ class ItemSalesReportController extends Controller
|
|||||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||||
|
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
||||||
|
|
||||||
$colors = [
|
$colors = [
|
||||||
'primary_text_color',
|
'primary_text_color',
|
||||||
@ -66,6 +68,7 @@ class ItemSalesReportController extends Controller
|
|||||||
'company' => $company,
|
'company' => $company,
|
||||||
'from_date' => $from_date,
|
'from_date' => $from_date,
|
||||||
'to_date' => $to_date,
|
'to_date' => $to_date,
|
||||||
|
'currency' => $currency,
|
||||||
]);
|
]);
|
||||||
$pdf = PDF::loadView('app.pdf.reports.sales-items');
|
$pdf = PDF::loadView('app.pdf.reports.sales-items');
|
||||||
|
|
||||||
|
|||||||
@ -2,25 +2,26 @@
|
|||||||
|
|
||||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||||
|
|
||||||
|
use PDF;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Crater\Http\Controllers\Controller;
|
|
||||||
use Crater\Models\Company;
|
use Crater\Models\Company;
|
||||||
use Crater\Models\CompanySetting;
|
|
||||||
use Crater\Models\Expense;
|
use Crater\Models\Expense;
|
||||||
use Crater\Models\Payment;
|
use Crater\Models\Payment;
|
||||||
|
use Crater\Models\Currency;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
use Crater\Models\CompanySetting;
|
||||||
use Illuminate\Support\Facades\App;
|
use Illuminate\Support\Facades\App;
|
||||||
use PDF;
|
use Crater\Http\Controllers\Controller;
|
||||||
|
|
||||||
class ProfitLossReportController extends Controller
|
class ProfitLossReportController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Handle the incoming request.
|
* Handle the incoming request.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @param string $hash
|
* @param string $hash
|
||||||
* @return \Illuminate\Http\JsonResponse
|
* @return \Illuminate\Http\JsonResponse
|
||||||
*/
|
*/
|
||||||
public function __invoke(Request $request, $hash)
|
public function __invoke(Request $request, $hash)
|
||||||
{
|
{
|
||||||
$company = Company::where('unique_hash', $hash)->first();
|
$company = Company::where('unique_hash', $hash)->first();
|
||||||
@ -49,6 +50,8 @@ class ProfitLossReportController extends Controller
|
|||||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||||
|
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
||||||
|
|
||||||
|
|
||||||
$colors = [
|
$colors = [
|
||||||
'primary_text_color',
|
'primary_text_color',
|
||||||
@ -74,6 +77,7 @@ class ProfitLossReportController extends Controller
|
|||||||
'company' => $company,
|
'company' => $company,
|
||||||
'from_date' => $from_date,
|
'from_date' => $from_date,
|
||||||
'to_date' => $to_date,
|
'to_date' => $to_date,
|
||||||
|
'currency' => $currency,
|
||||||
]);
|
]);
|
||||||
$pdf = PDF::loadView('app.pdf.reports.profit-loss');
|
$pdf = PDF::loadView('app.pdf.reports.profit-loss');
|
||||||
|
|
||||||
|
|||||||
@ -2,24 +2,25 @@
|
|||||||
|
|
||||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
|
||||||
use Crater\Http\Controllers\Controller;
|
|
||||||
use Crater\Models\Company;
|
|
||||||
use Crater\Models\CompanySetting;
|
|
||||||
use Crater\Models\Tax;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Illuminate\Support\Facades\App;
|
|
||||||
use PDF;
|
use PDF;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Crater\Models\Tax;
|
||||||
|
use Crater\Models\Company;
|
||||||
|
use Crater\Models\Currency;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Crater\Models\CompanySetting;
|
||||||
|
use Illuminate\Support\Facades\App;
|
||||||
|
use Crater\Http\Controllers\Controller;
|
||||||
|
|
||||||
class TaxSummaryReportController extends Controller
|
class TaxSummaryReportController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Handle the incoming request.
|
* Handle the incoming request.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @param string $hash
|
* @param string $hash
|
||||||
* @return \Illuminate\Http\JsonResponse
|
* @return \Illuminate\Http\JsonResponse
|
||||||
*/
|
*/
|
||||||
public function __invoke(Request $request, $hash)
|
public function __invoke(Request $request, $hash)
|
||||||
{
|
{
|
||||||
$company = Company::where('unique_hash', $hash)->first();
|
$company = Company::where('unique_hash', $hash)->first();
|
||||||
@ -44,6 +45,8 @@ class TaxSummaryReportController extends Controller
|
|||||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||||
|
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
||||||
|
|
||||||
|
|
||||||
$colors = [
|
$colors = [
|
||||||
'primary_text_color',
|
'primary_text_color',
|
||||||
@ -68,6 +71,7 @@ class TaxSummaryReportController extends Controller
|
|||||||
'company' => $company,
|
'company' => $company,
|
||||||
'from_date' => $from_date,
|
'from_date' => $from_date,
|
||||||
'to_date' => $to_date,
|
'to_date' => $to_date,
|
||||||
|
'currency' => $currency,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$pdf = PDF::loadView('app.pdf.reports.tax-summary');
|
$pdf = PDF::loadView('app.pdf.reports.tax-summary');
|
||||||
|
|||||||
@ -3,7 +3,6 @@
|
|||||||
namespace Crater\Http\Requests;
|
namespace Crater\Http\Requests;
|
||||||
|
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
use Illuminate\Support\Str;
|
|
||||||
use Illuminate\Validation\Rule;
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
class CompaniesRequest extends FormRequest
|
class CompaniesRequest extends FormRequest
|
||||||
@ -34,6 +33,10 @@ class CompaniesRequest extends FormRequest
|
|||||||
'currency' => [
|
'currency' => [
|
||||||
'required'
|
'required'
|
||||||
],
|
],
|
||||||
|
'slug' => [
|
||||||
|
'required',
|
||||||
|
Rule::unique('companies')
|
||||||
|
],
|
||||||
'address.name' => [
|
'address.name' => [
|
||||||
'nullable',
|
'nullable',
|
||||||
],
|
],
|
||||||
@ -68,11 +71,11 @@ class CompaniesRequest extends FormRequest
|
|||||||
{
|
{
|
||||||
return collect($this->validated())
|
return collect($this->validated())
|
||||||
->only([
|
->only([
|
||||||
'name'
|
'name',
|
||||||
|
'slug'
|
||||||
])
|
])
|
||||||
->merge([
|
->merge([
|
||||||
'owner_id' => $this->user()->id,
|
'owner_id' => $this->user()->id
|
||||||
'slug' => Str::slug($this->name)
|
|
||||||
])
|
])
|
||||||
->toArray();
|
->toArray();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,7 +30,8 @@ class CompanyRequest extends FormRequest
|
|||||||
Rule::unique('companies')->ignore($this->header('company'), 'id'),
|
Rule::unique('companies')->ignore($this->header('company'), 'id'),
|
||||||
],
|
],
|
||||||
'slug' => [
|
'slug' => [
|
||||||
'nullable'
|
'required',
|
||||||
|
Rule::unique('companies')->ignore($this->header('company'), 'id'),
|
||||||
],
|
],
|
||||||
'address.country_id' => [
|
'address.country_id' => [
|
||||||
'required',
|
'required',
|
||||||
|
|||||||
@ -23,7 +23,7 @@ class EstimateResource extends JsonResource
|
|||||||
'reference_number' => $this->reference_number,
|
'reference_number' => $this->reference_number,
|
||||||
'tax_per_item' => $this->tax_per_item,
|
'tax_per_item' => $this->tax_per_item,
|
||||||
'discount_per_item' => $this->discount_per_item,
|
'discount_per_item' => $this->discount_per_item,
|
||||||
'notes' => $this->getNotes(),
|
'notes' => $this->notes,
|
||||||
'discount' => $this->discount,
|
'discount' => $this->discount,
|
||||||
'discount_type' => $this->discount_type,
|
'discount_type' => $this->discount_type,
|
||||||
'discount_val' => $this->discount_val,
|
'discount_val' => $this->discount_val,
|
||||||
|
|||||||
@ -18,7 +18,7 @@ class PaymentResource extends JsonResource
|
|||||||
'id' => $this->id,
|
'id' => $this->id,
|
||||||
'payment_number' => $this->payment_number,
|
'payment_number' => $this->payment_number,
|
||||||
'payment_date' => $this->payment_date,
|
'payment_date' => $this->payment_date,
|
||||||
'notes' => $this->getNotes(),
|
'notes' => $this->notes,
|
||||||
'amount' => $this->amount,
|
'amount' => $this->amount,
|
||||||
'unique_hash' => $this->unique_hash,
|
'unique_hash' => $this->unique_hash,
|
||||||
'invoice_id' => $this->invoice_id,
|
'invoice_id' => $this->invoice_id,
|
||||||
|
|||||||
@ -217,7 +217,7 @@ class Company extends Model implements HasMedia
|
|||||||
'estimate_billing_address_format' => $billingAddressFormat,
|
'estimate_billing_address_format' => $billingAddressFormat,
|
||||||
'payment_company_address_format' => $companyAddressFormat,
|
'payment_company_address_format' => $companyAddressFormat,
|
||||||
'payment_from_customer_address_format' => $paymentFromCustomerAddress,
|
'payment_from_customer_address_format' => $paymentFromCustomerAddress,
|
||||||
'currency' => request()->currency ?? 13,
|
'currency' => request()->currency ?? 1,
|
||||||
'time_zone' => 'Asia/Kolkata',
|
'time_zone' => 'Asia/Kolkata',
|
||||||
'language' => 'en',
|
'language' => 'en',
|
||||||
'fiscal_year' => '1-12',
|
'fiscal_year' => '1-12',
|
||||||
|
|||||||
@ -483,7 +483,8 @@ class Estimate extends Model implements HasMedia
|
|||||||
'{ESTIMATE_DATE}' => $this->formattedEstimateDate,
|
'{ESTIMATE_DATE}' => $this->formattedEstimateDate,
|
||||||
'{ESTIMATE_EXPIRY_DATE}' => $this->formattedExpiryDate,
|
'{ESTIMATE_EXPIRY_DATE}' => $this->formattedExpiryDate,
|
||||||
'{ESTIMATE_NUMBER}' => $this->estimate_number,
|
'{ESTIMATE_NUMBER}' => $this->estimate_number,
|
||||||
'{ESTIMATE_REF_NUMBER}' => $this->reference_number,
|
'{PDF_LINK}' => $this->estimatePdfUrl,
|
||||||
|
'{TOTAL_AMOUNT}' => format_money_pdf($this->total, $this->customer->currency)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -240,7 +240,7 @@ class Expense extends Model implements HasMedia
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($request->hasFile('attachment_receipt')) {
|
if ($request->hasFile('attachment_receipt')) {
|
||||||
$expense->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts');
|
$expense->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts', 'local');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($request->customFields) {
|
if ($request->customFields) {
|
||||||
@ -262,12 +262,12 @@ class Expense extends Model implements HasMedia
|
|||||||
ExchangeRateLog::addExchangeRateLog($this);
|
ExchangeRateLog::addExchangeRateLog($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($request->is_attachment_receipt_removed) && (bool) $request->is_attachment_receipt_removed) {
|
if (isset($request->is_attachment_receipt_removed) && $request->is_attachment_receipt_removed == "true") {
|
||||||
$this->clearMediaCollection('receipts');
|
$this->clearMediaCollection('receipts');
|
||||||
}
|
}
|
||||||
if ($request->hasFile('attachment_receipt')) {
|
if ($request->hasFile('attachment_receipt')) {
|
||||||
$this->clearMediaCollection('receipts');
|
$this->clearMediaCollection('receipts');
|
||||||
$this->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts');
|
$this->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts', 'local');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($request->customFields) {
|
if ($request->customFields) {
|
||||||
|
|||||||
@ -187,16 +187,6 @@ class Invoice extends Model implements HasMedia
|
|||||||
return Carbon::parse($this->invoice_date)->format($dateFormat);
|
return Carbon::parse($this->invoice_date)->format($dateFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function scopeWhereStatus($query, $status)
|
|
||||||
{
|
|
||||||
return $query->where('invoices.status', $status);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function scopeWherePaidStatus($query, $status)
|
|
||||||
{
|
|
||||||
return $query->where('invoices.paid_status', $status);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function scopeWhereDueStatus($query, $status)
|
public function scopeWhereDueStatus($query, $status)
|
||||||
{
|
{
|
||||||
return $query->whereIn('invoices.paid_status', [
|
return $query->whereIn('invoices.paid_status', [
|
||||||
@ -234,6 +224,40 @@ class Invoice extends Model implements HasMedia
|
|||||||
$query->orderBy($orderByField, $orderBy);
|
$query->orderBy($orderByField, $orderBy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function scopeWhereStatus($query, $status)
|
||||||
|
{
|
||||||
|
return $query->where('invoices.status', $status);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeWherePaidStatus($query, $status)
|
||||||
|
{
|
||||||
|
return $query->where('invoices.paid_status', $status);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeWhereTabFilters($query, $status)
|
||||||
|
{
|
||||||
|
if ($status == "DRAFT") {
|
||||||
|
return $query->where('invoices.status', $status);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($status == "SENT") {
|
||||||
|
return $query->whereIn('invoices.status', [
|
||||||
|
self::STATUS_SENT,
|
||||||
|
self::STATUS_VIEWED,
|
||||||
|
self::STATUS_COMPLETED
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($status == 'DUE') {
|
||||||
|
return $query->whereIn('invoices.paid_status', [
|
||||||
|
self::STATUS_UNPAID,
|
||||||
|
self::STATUS_PARTIALLY_PAID,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
public function scopeApplyFilters($query, array $filters)
|
public function scopeApplyFilters($query, array $filters)
|
||||||
{
|
{
|
||||||
$filters = collect($filters);
|
$filters = collect($filters);
|
||||||
@ -249,17 +273,11 @@ class Invoice extends Model implements HasMedia
|
|||||||
$filters->get('status') == self::STATUS_PAID
|
$filters->get('status') == self::STATUS_PAID
|
||||||
) {
|
) {
|
||||||
$query->wherePaidStatus($filters->get('status'));
|
$query->wherePaidStatus($filters->get('status'));
|
||||||
} elseif ($filters->get('status') == 'DUE') {
|
|
||||||
$query->whereDueStatus($filters->get('status'));
|
|
||||||
} else {
|
} else {
|
||||||
$query->whereStatus($filters->get('status'));
|
$query->whereStatus($filters->get('status'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($filters->get('paid_status')) {
|
|
||||||
$query->wherePaidStatus($filters->get('status'));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($filters->get('invoice_id')) {
|
if ($filters->get('invoice_id')) {
|
||||||
$query->whereInvoice($filters->get('invoice_id'));
|
$query->whereInvoice($filters->get('invoice_id'));
|
||||||
}
|
}
|
||||||
@ -651,7 +669,9 @@ class Invoice extends Model implements HasMedia
|
|||||||
'{INVOICE_DATE}' => $this->formattedInvoiceDate,
|
'{INVOICE_DATE}' => $this->formattedInvoiceDate,
|
||||||
'{INVOICE_DUE_DATE}' => $this->formattedDueDate,
|
'{INVOICE_DUE_DATE}' => $this->formattedDueDate,
|
||||||
'{INVOICE_NUMBER}' => $this->invoice_number,
|
'{INVOICE_NUMBER}' => $this->invoice_number,
|
||||||
'{INVOICE_REF_NUMBER}' => $this->reference_number,
|
'{PDF_LINK}' => $this->invoicePdfUrl,
|
||||||
|
'{DUE_AMOUNT}' => format_money_pdf($this->due_amount, $this->customer->currency),
|
||||||
|
'{TOTAL_AMOUNT}' => format_money_pdf($this->total, $this->customer->currency)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -435,7 +435,8 @@ class Payment extends Model implements HasMedia
|
|||||||
'{PAYMENT_DATE}' => $this->formattedPaymentDate,
|
'{PAYMENT_DATE}' => $this->formattedPaymentDate,
|
||||||
'{PAYMENT_MODE}' => $this->paymentMethod ? $this->paymentMethod->name : null,
|
'{PAYMENT_MODE}' => $this->paymentMethod ? $this->paymentMethod->name : null,
|
||||||
'{PAYMENT_NUMBER}' => $this->payment_number,
|
'{PAYMENT_NUMBER}' => $this->payment_number,
|
||||||
'{PAYMENT_AMOUNT}' => $this->reference_number,
|
'{PDF_LINK}' => $this->paymentPdfUrl,
|
||||||
|
'{PAYMENT_AMOUNT}' => format_money_pdf($this->amount, $this->customer->currency)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -38,15 +38,15 @@
|
|||||||
"barryvdh/laravel-ide-helper": "^2.6",
|
"barryvdh/laravel-ide-helper": "^2.6",
|
||||||
"beyondcode/laravel-dump-server": "^1.0",
|
"beyondcode/laravel-dump-server": "^1.0",
|
||||||
"facade/ignition": "^2.3.6",
|
"facade/ignition": "^2.3.6",
|
||||||
"friendsofphp/php-cs-fixer": "^3.0",
|
"friendsofphp/php-cs-fixer": "^3.8",
|
||||||
"fzaninotto/faker": "^1.9.1",
|
"fakerphp/faker": "^1.9.1",
|
||||||
"mockery/mockery": "^1.3.1",
|
"mockery/mockery": "^1.3.1",
|
||||||
"nunomaduro/collision": "^5.0",
|
"nunomaduro/collision": "^5.0",
|
||||||
"pestphp/pest": "^1.0",
|
"pestphp/pest": "^1.0",
|
||||||
"pestphp/pest-plugin-faker": "^1.0",
|
"pestphp/pest-plugin-faker": "^1.0",
|
||||||
"pestphp/pest-plugin-laravel": "^1.0",
|
"pestphp/pest-plugin-laravel": "^1.0",
|
||||||
"pestphp/pest-plugin-parallel": "^0.2.1",
|
"pestphp/pest-plugin-parallel": "^0.2.1",
|
||||||
"phpunit/phpunit": "^9.0"
|
"phpunit/phpunit": "^9.3"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
@ -81,11 +81,14 @@
|
|||||||
"config": {
|
"config": {
|
||||||
"optimize-autoloader": true,
|
"optimize-autoloader": true,
|
||||||
"preferred-install": "dist",
|
"preferred-install": "dist",
|
||||||
"sort-packages": true
|
"sort-packages": true,
|
||||||
|
"allow-plugins": {
|
||||||
|
"pestphp/pest-plugin": true
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"extra": {
|
"extra": {
|
||||||
"laravel": {
|
"laravel": {
|
||||||
"dont-discover": []
|
"dont-discover": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2347
composer.lock
generated
2347
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -71,6 +71,7 @@ return [
|
|||||||
["code" => "cs", "name" => "Czech"],
|
["code" => "cs", "name" => "Czech"],
|
||||||
["code" => "el", "name" => "Greek"],
|
["code" => "el", "name" => "Greek"],
|
||||||
["code" => "hr", "name" => "Crotian"],
|
["code" => "hr", "name" => "Crotian"],
|
||||||
|
["code" => "th", "name" => "ไทย"],
|
||||||
],
|
],
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@ -170,7 +170,7 @@ class CountriesTableSeeder extends Seeder
|
|||||||
['id' => 152,'code' => 'NR','name' => "Nauru",'phonecode' => 674],
|
['id' => 152,'code' => 'NR','name' => "Nauru",'phonecode' => 674],
|
||||||
['id' => 153,'code' => 'NP','name' => "Nepal",'phonecode' => 977],
|
['id' => 153,'code' => 'NP','name' => "Nepal",'phonecode' => 977],
|
||||||
['id' => 154,'code' => 'AN','name' => "Netherlands Antilles",'phonecode' => 599],
|
['id' => 154,'code' => 'AN','name' => "Netherlands Antilles",'phonecode' => 599],
|
||||||
['id' => 155,'code' => 'NL','name' => "Netherlands The",'phonecode' => 31],
|
['id' => 155,'code' => 'NL','name' => "Netherlands",'phonecode' => 31],
|
||||||
['id' => 156,'code' => 'NC','name' => "New Caledonia",'phonecode' => 687],
|
['id' => 156,'code' => 'NC','name' => "New Caledonia",'phonecode' => 687],
|
||||||
['id' => 157,'code' => 'NZ','name' => "New Zealand",'phonecode' => 64],
|
['id' => 157,'code' => 'NZ','name' => "New Zealand",'phonecode' => 64],
|
||||||
['id' => 158,'code' => 'NI','name' => "Nicaragua",'phonecode' => 505],
|
['id' => 158,'code' => 'NI','name' => "Nicaragua",'phonecode' => 505],
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
FROM php:7.4-fpm-alpine
|
FROM php:8.0-fpm-alpine
|
||||||
|
|
||||||
RUN apk add --no-cache \
|
RUN apk add --no-cache \
|
||||||
php7-bcmath
|
php8-bcmath
|
||||||
|
|
||||||
RUN docker-php-ext-install pdo pdo_mysql bcmath
|
RUN docker-php-ext-install pdo pdo_mysql bcmath
|
||||||
|
|
||||||
|
|||||||
@ -27,7 +27,7 @@
|
|||||||
"vite": "^2.6.1"
|
"vite": "^2.6.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@headlessui/vue": "^1.4.0",
|
"@headlessui/vue": "^1.5.0",
|
||||||
"@heroicons/vue": "^1.0.1",
|
"@heroicons/vue": "^1.0.1",
|
||||||
"@popperjs/core": "^2.9.2",
|
"@popperjs/core": "^2.9.2",
|
||||||
"@stripe/stripe-js": "^1.21.2",
|
"@stripe/stripe-js": "^1.21.2",
|
||||||
@ -48,7 +48,8 @@
|
|||||||
"mini-svg-data-uri": "^1.3.3",
|
"mini-svg-data-uri": "^1.3.3",
|
||||||
"moment": "^2.29.1",
|
"moment": "^2.29.1",
|
||||||
"pinia": "^2.0.4",
|
"pinia": "^2.0.4",
|
||||||
"v-money3": "^3.13.5",
|
"v-calendar": "3.0.0-alpha.8",
|
||||||
|
"v-money3": "3.16.1",
|
||||||
"v-tooltip": "^4.0.0-alpha.1",
|
"v-tooltip": "^4.0.0-alpha.1",
|
||||||
"vue": "^3.2.0-beta.5",
|
"vue": "^3.2.0-beta.5",
|
||||||
"vue-flatpickr-component": "^9.0.3",
|
"vue-flatpickr-component": "^9.0.3",
|
||||||
|
|||||||
@ -64,7 +64,7 @@ function mergeExistingValues() {
|
|||||||
if (props.isEdit) {
|
if (props.isEdit) {
|
||||||
props.store[props.storeProp].fields.forEach((field) => {
|
props.store[props.storeProp].fields.forEach((field) => {
|
||||||
const existingIndex = props.store[props.storeProp].customFields.findIndex(
|
const existingIndex = props.store[props.storeProp].customFields.findIndex(
|
||||||
(f) => f.id === field.custom_field_id
|
(f) => f.id == field.custom_field_id
|
||||||
)
|
)
|
||||||
|
|
||||||
if (existingIndex > -1) {
|
if (existingIndex > -1) {
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import { computed } from 'vue'
|
|||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
modelValue: {
|
modelValue: {
|
||||||
type: String,
|
type: String,
|
||||||
default: moment().format('YYYY-MM-DD hh:MM'),
|
default: moment().format('YYYY-MM-DD HH:mm'),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -17,18 +17,7 @@
|
|||||||
<td class="px-5 py-4 text-left align-top">
|
<td class="px-5 py-4 text-left align-top">
|
||||||
<div class="flex justify-start">
|
<div class="flex justify-start">
|
||||||
<div
|
<div
|
||||||
class="
|
class="flex items-center justify-center w-5 h-5 mt-2 mr-2 text-gray-300 cursor-move handle"
|
||||||
flex
|
|
||||||
items-center
|
|
||||||
justify-center
|
|
||||||
w-5
|
|
||||||
h-5
|
|
||||||
mt-2
|
|
||||||
text-gray-300
|
|
||||||
cursor-move
|
|
||||||
handle
|
|
||||||
mr-2
|
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<DragIcon />
|
<DragIcon />
|
||||||
</div>
|
</div>
|
||||||
@ -108,7 +97,7 @@
|
|||||||
|
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="ChevronDownIcon"
|
name="ChevronDownIcon"
|
||||||
class="w-4 h-4 text-gray-500 ml-1"
|
class="w-4 h-4 ml-1 text-gray-500"
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
@ -155,7 +144,7 @@
|
|||||||
<BaseContentPlaceholders v-if="loading">
|
<BaseContentPlaceholders v-if="loading">
|
||||||
<BaseContentPlaceholdersText
|
<BaseContentPlaceholdersText
|
||||||
:lines="1"
|
:lines="1"
|
||||||
class="w-24 h-8 rounded-md border"
|
class="w-24 h-8 border rounded-md"
|
||||||
/>
|
/>
|
||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
|
|
||||||
@ -175,6 +164,7 @@
|
|||||||
:ability="abilities.CREATE_INVOICE"
|
:ability="abilities.CREATE_INVOICE"
|
||||||
:store="store"
|
:store="store"
|
||||||
:store-prop="storeProp"
|
:store-prop="storeProp"
|
||||||
|
:discount="discount"
|
||||||
@update="updateTax"
|
@update="updateTax"
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@ -30,24 +30,13 @@
|
|||||||
<template v-if="userStore.hasAbilities(ability)" #action>
|
<template v-if="userStore.hasAbilities(ability)" #action>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="
|
class="flex items-center justify-center w-full px-2 py-2 bg-gray-200 border-none outline-none cursor-pointer "
|
||||||
flex
|
|
||||||
items-center
|
|
||||||
justify-center
|
|
||||||
w-full
|
|
||||||
px-2
|
|
||||||
cursor-pointer
|
|
||||||
py-2
|
|
||||||
bg-gray-200
|
|
||||||
border-none
|
|
||||||
outline-none
|
|
||||||
"
|
|
||||||
@click="openTaxModal"
|
@click="openTaxModal"
|
||||||
>
|
>
|
||||||
<BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" />
|
<BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" />
|
||||||
|
|
||||||
<label
|
<label
|
||||||
class="ml-2 text-sm leading-none text-primary-400 cursor-pointer"
|
class="ml-2 text-sm leading-none cursor-pointer text-primary-400"
|
||||||
>{{ $t('invoices.add_new_tax') }}</label
|
>{{ $t('invoices.add_new_tax') }}</label
|
||||||
>
|
>
|
||||||
</button>
|
</button>
|
||||||
@ -115,6 +104,10 @@ const props = defineProps({
|
|||||||
type: Number,
|
type: Number,
|
||||||
default: 0,
|
default: 0,
|
||||||
},
|
},
|
||||||
|
discountedTotal: {
|
||||||
|
type: Number,
|
||||||
|
default: 0,
|
||||||
|
},
|
||||||
currency: {
|
currency: {
|
||||||
type: [Object, String],
|
type: [Object, String],
|
||||||
required: true,
|
required: true,
|
||||||
@ -153,19 +146,19 @@ const filteredTypes = computed(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const taxAmount = computed(() => {
|
const taxAmount = computed(() => {
|
||||||
if (localTax.compound_tax && props.total) {
|
if (localTax.compound_tax && props.discountedTotal) {
|
||||||
return ((props.total + props.totalTax) * localTax.percent) / 100
|
return ((props.discountedTotal + props.totalTax) * localTax.percent) / 100
|
||||||
}
|
}
|
||||||
|
|
||||||
if (props.total && localTax.percent) {
|
if (props.discountedTotal && localTax.percent) {
|
||||||
return (props.total * localTax.percent) / 100
|
return (props.discountedTotal * localTax.percent) / 100
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
})
|
})
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => props.total,
|
() => props.discountedTotal,
|
||||||
() => {
|
() => {
|
||||||
updateRowTax()
|
updateRowTax()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,14 +29,7 @@
|
|||||||
|
|
||||||
<label
|
<label
|
||||||
v-else
|
v-else
|
||||||
class="
|
class="flex items-center justify-center m-0 text-lg text-black uppercase "
|
||||||
flex
|
|
||||||
items-center
|
|
||||||
justify-center
|
|
||||||
m-0
|
|
||||||
text-lg text-black
|
|
||||||
uppercase
|
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<BaseFormatMoney
|
<BaseFormatMoney
|
||||||
:amount="store.getSubTotal"
|
:amount="store.getSubTotal"
|
||||||
@ -66,14 +59,7 @@
|
|||||||
|
|
||||||
<label
|
<label
|
||||||
v-else-if="store[storeProp].tax_per_item === 'YES'"
|
v-else-if="store[storeProp].tax_per_item === 'YES'"
|
||||||
class="
|
class="flex items-center justify-center m-0 text-lg text-black uppercase "
|
||||||
flex
|
|
||||||
items-center
|
|
||||||
justify-center
|
|
||||||
m-0
|
|
||||||
text-lg text-black
|
|
||||||
uppercase
|
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<BaseFormatMoney :amount="tax.amount" :currency="defaultCurrency" />
|
<BaseFormatMoney :amount="tax.amount" :currency="defaultCurrency" />
|
||||||
</label>
|
</label>
|
||||||
@ -98,7 +84,7 @@
|
|||||||
<BaseContentPlaceholders v-if="isLoading">
|
<BaseContentPlaceholders v-if="isLoading">
|
||||||
<BaseContentPlaceholdersText
|
<BaseContentPlaceholdersText
|
||||||
:lines="1"
|
:lines="1"
|
||||||
class="w-24 h-8 rounded-md border"
|
class="w-24 h-8 border rounded-md"
|
||||||
/>
|
/>
|
||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
<div v-else class="flex" style="width: 140px" role="group">
|
<div v-else class="flex" style="width: 140px" role="group">
|
||||||
@ -114,7 +100,7 @@
|
|||||||
<BaseDropdown position="bottom-end">
|
<BaseDropdown position="bottom-end">
|
||||||
<template #activator>
|
<template #activator>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="rounded-tr-md rounded-br-md p-2 rounded-none"
|
class="p-2 rounded-none rounded-tr-md rounded-br-md"
|
||||||
type="button"
|
type="button"
|
||||||
variant="white"
|
variant="white"
|
||||||
>
|
>
|
||||||
@ -127,7 +113,7 @@
|
|||||||
|
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="ChevronDownIcon"
|
name="ChevronDownIcon"
|
||||||
class="w-4 h-4 text-gray-500 ml-1"
|
class="w-4 h-4 ml-1 text-gray-500"
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
@ -180,15 +166,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
class="
|
class="flex items-center justify-between w-full pt-2 mt-5 border-t border-gray-200 border-solid "
|
||||||
flex
|
|
||||||
items-center
|
|
||||||
justify-between
|
|
||||||
w-full
|
|
||||||
pt-2
|
|
||||||
mt-5
|
|
||||||
border-t border-gray-200 border-solid
|
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<BaseContentPlaceholders v-if="isLoading">
|
<BaseContentPlaceholders v-if="isLoading">
|
||||||
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
||||||
@ -204,14 +182,7 @@
|
|||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
<label
|
<label
|
||||||
v-else
|
v-else
|
||||||
class="
|
class="flex items-center justify-center text-lg uppercase text-primary-400"
|
||||||
flex
|
|
||||||
items-center
|
|
||||||
justify-center
|
|
||||||
text-lg
|
|
||||||
uppercase
|
|
||||||
text-primary-400
|
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<BaseFormatMoney :amount="store.getTotal" :currency="defaultCurrency" />
|
<BaseFormatMoney :amount="store.getTotal" :currency="defaultCurrency" />
|
||||||
</label>
|
</label>
|
||||||
@ -334,6 +305,7 @@ function selectPercentage() {
|
|||||||
|
|
||||||
function onSelectTax(selectedTax) {
|
function onSelectTax(selectedTax) {
|
||||||
let amount = 0
|
let amount = 0
|
||||||
|
|
||||||
if (selectedTax.compound_tax && props.store.getSubtotalWithDiscount) {
|
if (selectedTax.compound_tax && props.store.getSubtotalWithDiscount) {
|
||||||
amount = Math.round(
|
amount = Math.round(
|
||||||
((props.store.getSubtotalWithDiscount + props.store.getTotalSimpleTax) *
|
((props.store.getSubtotalWithDiscount + props.store.getTotalSimpleTax) *
|
||||||
|
|||||||
@ -48,6 +48,24 @@
|
|||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
|
||||||
|
<BaseInputGroup
|
||||||
|
:label="$tc('settings.company_info.company_slug')"
|
||||||
|
:help-text="$t('settings.company_info.company_slug_help_text')"
|
||||||
|
:error="
|
||||||
|
v$.newCompanyForm.slug.$error &&
|
||||||
|
v$.newCompanyForm.slug.$errors[0].$message
|
||||||
|
"
|
||||||
|
:content-loading="isFetchingInitialData"
|
||||||
|
required
|
||||||
|
>
|
||||||
|
<BaseInput
|
||||||
|
v-model="newCompanyForm.slug"
|
||||||
|
:invalid="v$.newCompanyForm.slug.$error"
|
||||||
|
:content-loading="isFetchingInitialData"
|
||||||
|
@input="v$.newCompanyForm.slug.$touch()"
|
||||||
|
/>
|
||||||
|
</BaseInputGroup>
|
||||||
|
|
||||||
<BaseInputGroup
|
<BaseInputGroup
|
||||||
:content-loading="isFetchingInitialData"
|
:content-loading="isFetchingInitialData"
|
||||||
:label="$tc('settings.company_info.country')"
|
:label="$tc('settings.company_info.country')"
|
||||||
@ -130,7 +148,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { useModalStore } from '@/scripts/stores/modal'
|
import { useModalStore } from '@/scripts/stores/modal'
|
||||||
import { computed, onMounted, ref, reactive } from 'vue'
|
import { computed, onMounted, ref, reactive, watch } from 'vue'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
import { required, minLength, helpers } from '@vuelidate/validators'
|
import { required, minLength, helpers } from '@vuelidate/validators'
|
||||||
import { useVuelidate } from '@vuelidate/core'
|
import { useVuelidate } from '@vuelidate/core'
|
||||||
@ -152,6 +170,7 @@ let companyLogoName = ref(null)
|
|||||||
|
|
||||||
const newCompanyForm = reactive({
|
const newCompanyForm = reactive({
|
||||||
name: null,
|
name: null,
|
||||||
|
slug: null,
|
||||||
currency: '',
|
currency: '',
|
||||||
address: {
|
address: {
|
||||||
country_id: null,
|
country_id: null,
|
||||||
@ -162,6 +181,9 @@ const modalActive = computed(() => {
|
|||||||
return modalStore.active && modalStore.componentName === 'CompanyModal'
|
return modalStore.active && modalStore.componentName === 'CompanyModal'
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const slugValidator = (value) => {
|
||||||
|
return value == slugify(value)
|
||||||
|
}
|
||||||
const rules = {
|
const rules = {
|
||||||
newCompanyForm: {
|
newCompanyForm: {
|
||||||
name: {
|
name: {
|
||||||
@ -171,6 +193,17 @@ const rules = {
|
|||||||
minLength(3)
|
minLength(3)
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
slug: {
|
||||||
|
required: helpers.withMessage(t('validation.required'), required),
|
||||||
|
minLength: helpers.withMessage(
|
||||||
|
t('validation.name_min_length', { count: 3 }),
|
||||||
|
minLength(3)
|
||||||
|
),
|
||||||
|
slugValidator: helpers.withMessage(
|
||||||
|
t('validation.invalid_slug'),
|
||||||
|
slugValidator
|
||||||
|
),
|
||||||
|
},
|
||||||
address: {
|
address: {
|
||||||
country_id: {
|
country_id: {
|
||||||
required: helpers.withMessage(t('validation.required'), required),
|
required: helpers.withMessage(t('validation.required'), required),
|
||||||
@ -243,6 +276,7 @@ async function submitCompanyData() {
|
|||||||
|
|
||||||
function resetNewCompanyForm() {
|
function resetNewCompanyForm() {
|
||||||
newCompanyForm.name = ''
|
newCompanyForm.name = ''
|
||||||
|
newCompanyForm.slug = ''
|
||||||
newCompanyForm.currency = ''
|
newCompanyForm.currency = ''
|
||||||
newCompanyForm.address.country_id = ''
|
newCompanyForm.address.country_id = ''
|
||||||
|
|
||||||
@ -257,4 +291,24 @@ function closeCompanyModal() {
|
|||||||
v$.value.$reset()
|
v$.value.$reset()
|
||||||
}, 300)
|
}, 300)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// watcher for if change company name then auto fill company slug value
|
||||||
|
watch(
|
||||||
|
() => newCompanyForm.name,
|
||||||
|
(currentValue) => {
|
||||||
|
newCompanyForm.slug = slugify(currentValue)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
function slugify(string) {
|
||||||
|
return string
|
||||||
|
.toString()
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/\s+/g, '-')
|
||||||
|
.replace(/[^\w\-]+/g, '')
|
||||||
|
.replace(/\-\-+/g, '-')
|
||||||
|
.replace(/^-+/, '')
|
||||||
|
.replace(/-+$/, '')
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -15,6 +15,13 @@
|
|||||||
bg-gradient-to-r
|
bg-gradient-to-r
|
||||||
from-primary-500
|
from-primary-500
|
||||||
to-primary-400
|
to-primary-400
|
||||||
|
dark:from-gray-700/70 dark:to-gray-800/70
|
||||||
|
bg-primary-500
|
||||||
|
dark:bg-transparent
|
||||||
|
dark:backdrop-blur-xl
|
||||||
|
dark:shadow-glass
|
||||||
|
dark:border
|
||||||
|
dark:border-white/10
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<router-link
|
<router-link
|
||||||
@ -53,6 +60,7 @@
|
|||||||
cursor-pointer
|
cursor-pointer
|
||||||
md:hidden md:ml-0
|
md:hidden md:ml-0
|
||||||
hover:bg-gray-100
|
hover:bg-gray-100
|
||||||
|
dark:bg-gray-800 dark:border-gray-500 dark:border
|
||||||
"
|
"
|
||||||
@click.prevent="onToggle"
|
@click.prevent="onToggle"
|
||||||
>
|
>
|
||||||
@ -143,7 +151,7 @@
|
|||||||
<template #activator>
|
<template #activator>
|
||||||
<img
|
<img
|
||||||
:src="previewAvatar"
|
:src="previewAvatar"
|
||||||
class="block w-8 h-8 rounded md:h-9 md:w-9"
|
class="block w-8 h-8 rounded md:h-9 md:w-9 object-cover"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@ -15,7 +15,9 @@
|
|||||||
leave-from="opacity-100"
|
leave-from="opacity-100"
|
||||||
leave-to="opacity-0"
|
leave-to="opacity-0"
|
||||||
>
|
>
|
||||||
<DialogOverlay class="fixed inset-0 bg-gray-600 bg-opacity-75" />
|
<DialogOverlay
|
||||||
|
class="fixed inset-0 bg-gray-600 bg-opacity-75 dark:bg-gray-900/90"
|
||||||
|
/>
|
||||||
</TransitionChild>
|
</TransitionChild>
|
||||||
|
|
||||||
<TransitionChild
|
<TransitionChild
|
||||||
@ -27,7 +29,9 @@
|
|||||||
leave-from="translate-x-0"
|
leave-from="translate-x-0"
|
||||||
leave-to="-translate-x-full"
|
leave-to="-translate-x-full"
|
||||||
>
|
>
|
||||||
<div class="relative flex flex-col flex-1 w-full max-w-xs bg-white">
|
<div
|
||||||
|
class="relative flex flex-col flex-1 w-full max-w-xs bg-white dark:bg-gray-800"
|
||||||
|
>
|
||||||
<TransitionChild
|
<TransitionChild
|
||||||
as="template"
|
as="template"
|
||||||
enter="ease-in-out duration-300"
|
enter="ease-in-out duration-300"
|
||||||
@ -40,18 +44,17 @@
|
|||||||
<div class="absolute top-0 right-0 pt-2 -mr-12">
|
<div class="absolute top-0 right-0 pt-2 -mr-12">
|
||||||
<button
|
<button
|
||||||
class="
|
class="
|
||||||
flex
|
flex
|
||||||
items-center
|
items-center
|
||||||
justify-center
|
justify-center
|
||||||
w-10
|
w-10
|
||||||
h-10
|
h-10
|
||||||
ml-1
|
ml-1
|
||||||
rounded-full
|
rounded-full
|
||||||
focus:outline-none
|
focus:outline-none
|
||||||
focus:ring-2
|
focus:ring-2
|
||||||
focus:ring-inset
|
focus:ring-inset
|
||||||
focus:ring-white
|
focus:ring-white"
|
||||||
"
|
|
||||||
@click="globalStore.setSidebarVisibility(false)"
|
@click="globalStore.setSidebarVisibility(false)"
|
||||||
>
|
>
|
||||||
<span class="sr-only">Close sidebar</span>
|
<span class="sr-only">Close sidebar</span>
|
||||||
@ -82,8 +85,8 @@
|
|||||||
:to="item.link"
|
:to="item.link"
|
||||||
:class="[
|
:class="[
|
||||||
hasActiveUrl(item.link)
|
hasActiveUrl(item.link)
|
||||||
? 'text-primary-500 border-primary-500 bg-gray-100 '
|
? 'text-primary-500 border-primary-500 bg-gray-100 dark:shadow-glass dark:backdrop-blur-xl dark:hover:bg-gray-700 dark:bg-gray-700/50 dark:text-primary-400 dark:font-medium'
|
||||||
: 'text-black',
|
: 'text-black dark:text-gray-300',
|
||||||
'cursor-pointer px-0 pl-4 py-3 border-transparent flex items-center border-l-4 border-solid text-sm not-italic font-medium',
|
'cursor-pointer px-0 pl-4 py-3 border-transparent flex items-center border-l-4 border-solid text-sm not-italic font-medium',
|
||||||
]"
|
]"
|
||||||
@click="globalStore.setSidebarVisibility(false)"
|
@click="globalStore.setSidebarVisibility(false)"
|
||||||
@ -100,6 +103,10 @@
|
|||||||
/>
|
/>
|
||||||
{{ $t(item.title) }}
|
{{ $t(item.title) }}
|
||||||
</router-link>
|
</router-link>
|
||||||
|
<LightDarkSwitch
|
||||||
|
:show-label="false"
|
||||||
|
class="absolute right-6 top-6 !w-auto"
|
||||||
|
/>
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -113,17 +120,16 @@
|
|||||||
<!-- DESKTOP MENU -->
|
<!-- DESKTOP MENU -->
|
||||||
<div
|
<div
|
||||||
class="
|
class="
|
||||||
hidden
|
hidden
|
||||||
w-56
|
w-56
|
||||||
h-screen
|
h-screen
|
||||||
pb-32
|
bg-white
|
||||||
overflow-y-auto
|
border-r border-gray-200 border-solid
|
||||||
bg-white
|
xl:w-64
|
||||||
border-r border-gray-200 border-solid
|
md:fixed md:flex md:flex-col md:inset-y-0
|
||||||
xl:w-64
|
pt-16
|
||||||
md:fixed md:flex md:flex-col md:inset-y-0
|
dark:border-gray-800
|
||||||
pt-16
|
dark:bg-gray-800/80"
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
v-for="menu in globalStore.menuGroups"
|
v-for="menu in globalStore.menuGroups"
|
||||||
@ -136,8 +142,8 @@
|
|||||||
:to="item.link"
|
:to="item.link"
|
||||||
:class="[
|
:class="[
|
||||||
hasActiveUrl(item.link)
|
hasActiveUrl(item.link)
|
||||||
? 'text-primary-500 border-primary-500 bg-gray-100 '
|
? 'text-primary-500 border-primary-500 bg-gray-100 dark:border-primary-400 dark:shadow-glass dark:backdrop-blur-xl dark:hover:bg-gray-700 dark:bg-gray-700/50 dark:text-primary-400 dark:font-medium'
|
||||||
: 'text-black',
|
: 'text-black dark:hover:bg-transparent dark:hover:text-white dark:text-gray-300',
|
||||||
'cursor-pointer px-0 pl-6 hover:bg-gray-50 py-3 group flex items-center border-l-4 border-solid border-transparent text-sm not-italic font-medium',
|
'cursor-pointer px-0 pl-6 hover:bg-gray-50 py-3 group flex items-center border-l-4 border-solid border-transparent text-sm not-italic font-medium',
|
||||||
]"
|
]"
|
||||||
>
|
>
|
||||||
@ -145,8 +151,8 @@
|
|||||||
:name="item.icon"
|
:name="item.icon"
|
||||||
:class="[
|
:class="[
|
||||||
hasActiveUrl(item.link)
|
hasActiveUrl(item.link)
|
||||||
? 'text-primary-500 group-hover:text-primary-500 '
|
? 'text-primary-500 group-hover:text-primary-500 dark:text-primary-400 dark:group-hover:text-primary-500 '
|
||||||
: 'text-gray-400 group-hover:text-black',
|
: 'text-gray-400 group-hover:text-black dark:text-gray-400 dark:group-hover:text-white',
|
||||||
'mr-4 shrink-0 h-5 w-5 ',
|
'mr-4 shrink-0 h-5 w-5 ',
|
||||||
]"
|
]"
|
||||||
/>
|
/>
|
||||||
@ -154,6 +160,9 @@
|
|||||||
{{ $t(item.title) }}
|
{{ $t(item.title) }}
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
|
<LightDarkSwitch
|
||||||
|
class="absolute bottom-0 py-4 border-t border-gray-200 dark:border-gray-700"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -169,6 +178,7 @@ import {
|
|||||||
|
|
||||||
import { useRoute } from 'vue-router'
|
import { useRoute } from 'vue-router'
|
||||||
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
||||||
|
import LightDarkSwitch from '@/scripts/components/LightDarkSwitcher.vue'
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const globalStore = useGlobalStore()
|
const globalStore = useGlobalStore()
|
||||||
|
|||||||
@ -184,6 +184,20 @@ export const useCompanyStore = (useWindow = false) => {
|
|||||||
setDefaultCurrency(data) {
|
setDefaultCurrency(data) {
|
||||||
this.defaultCurrency = data.currency
|
this.defaultCurrency = data.currency
|
||||||
},
|
},
|
||||||
|
|
||||||
|
checkCompanyHasCurrencyTransactions() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
axios
|
||||||
|
.get(`/api/v1/company/has-transactions`)
|
||||||
|
.then((response) => {
|
||||||
|
resolve(response)
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
handleError(err)
|
||||||
|
reject(err)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
},
|
},
|
||||||
})()
|
})()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,6 +34,7 @@ export const useGlobalStore = (useWindow = false) => {
|
|||||||
isAppLoaded: false,
|
isAppLoaded: false,
|
||||||
isSidebarOpen: false,
|
isSidebarOpen: false,
|
||||||
areCurrenciesLoading: false,
|
areCurrenciesLoading: false,
|
||||||
|
isDarkModeOn: false,
|
||||||
|
|
||||||
downloadReport: null,
|
downloadReport: null,
|
||||||
}),
|
}),
|
||||||
@ -70,8 +71,8 @@ export const useGlobalStore = (useWindow = false) => {
|
|||||||
moduleStore.apiToken = response.data.global_settings.api_token
|
moduleStore.apiToken = response.data.global_settings.api_token
|
||||||
moduleStore.enableModules = response.data.modules
|
moduleStore.enableModules = response.data.modules
|
||||||
|
|
||||||
// company store
|
// company store
|
||||||
companyStore.companies = response.data.companies
|
companyStore.companies = response.data.companies
|
||||||
companyStore.selectedCompany = response.data.current_company
|
companyStore.selectedCompany = response.data.current_company
|
||||||
companyStore.setSelectedCompany(response.data.current_company)
|
companyStore.setSelectedCompany(response.data.current_company)
|
||||||
companyStore.selectedCompanySettings =
|
companyStore.selectedCompanySettings =
|
||||||
|
|||||||
@ -32,6 +32,8 @@
|
|||||||
:content-loading="isLoading"
|
:content-loading="isLoading"
|
||||||
:calendar-button="true"
|
:calendar-button="true"
|
||||||
calendar-button-icon="calendar"
|
calendar-button-icon="calendar"
|
||||||
|
:show-extra-options="true"
|
||||||
|
:source-date="estimateStore.newEstimate.estimate_date"
|
||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
|
||||||
|
|||||||
@ -34,6 +34,24 @@
|
|||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
|
||||||
|
<BaseInputGroup
|
||||||
|
:label="$tc('wizard.company_slug')"
|
||||||
|
:help-text="$t('wizard.company_slug_help_text')"
|
||||||
|
:error="
|
||||||
|
v$.companyForm.slug.$error &&
|
||||||
|
v$.companyForm.slug.$errors[0].$message
|
||||||
|
"
|
||||||
|
required
|
||||||
|
>
|
||||||
|
<BaseInput
|
||||||
|
v-model="companyForm.slug"
|
||||||
|
:invalid="v$.companyForm.slug.$error"
|
||||||
|
type="text"
|
||||||
|
name="slug"
|
||||||
|
@input="v$.companyForm.slug.$touch()"
|
||||||
|
/>
|
||||||
|
</BaseInputGroup>
|
||||||
|
|
||||||
<BaseInputGroup
|
<BaseInputGroup
|
||||||
:label="$t('wizard.country')"
|
:label="$t('wizard.country')"
|
||||||
:error="
|
:error="
|
||||||
@ -57,9 +75,7 @@
|
|||||||
track-by="name"
|
track-by="name"
|
||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="grid grid-cols-1 gap-4 mb-4 md:grid-cols-2 md:mb-6">
|
|
||||||
<BaseInputGroup :label="$t('wizard.state')">
|
<BaseInputGroup :label="$t('wizard.state')">
|
||||||
<BaseInput
|
<BaseInput
|
||||||
v-model="companyForm.address.state"
|
v-model="companyForm.address.state"
|
||||||
@ -144,9 +160,9 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, onMounted, reactive } from 'vue'
|
import { ref, computed, onMounted, reactive, watch } from 'vue'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
import { required, maxLength, helpers } from '@vuelidate/validators'
|
import { required, minLength, maxLength, helpers } from '@vuelidate/validators'
|
||||||
import { useVuelidate } from '@vuelidate/core'
|
import { useVuelidate } from '@vuelidate/core'
|
||||||
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
||||||
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
||||||
@ -162,6 +178,7 @@ let logoFileName = ref(null)
|
|||||||
|
|
||||||
const companyForm = reactive({
|
const companyForm = reactive({
|
||||||
name: null,
|
name: null,
|
||||||
|
slug: null,
|
||||||
address: {
|
address: {
|
||||||
address_street_1: '',
|
address_street_1: '',
|
||||||
address_street_2: '',
|
address_street_2: '',
|
||||||
@ -188,10 +205,28 @@ onMounted(async () => {
|
|||||||
})?.id
|
})?.id
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const slugValidator = (value) => {
|
||||||
|
return value == slugify(value)
|
||||||
|
}
|
||||||
const rules = {
|
const rules = {
|
||||||
companyForm: {
|
companyForm: {
|
||||||
name: {
|
name: {
|
||||||
required: helpers.withMessage(t('validation.required'), required),
|
required: helpers.withMessage(t('validation.required'), required),
|
||||||
|
minLength: helpers.withMessage(
|
||||||
|
t('validation.name_min_length', { count: 3 }),
|
||||||
|
minLength(3)
|
||||||
|
),
|
||||||
|
},
|
||||||
|
slug: {
|
||||||
|
required: helpers.withMessage(t('validation.required'), required),
|
||||||
|
minLength: helpers.withMessage(
|
||||||
|
t('validation.name_min_length', { count: 3 }),
|
||||||
|
minLength(3)
|
||||||
|
),
|
||||||
|
slugValidator: helpers.withMessage(
|
||||||
|
t('validation.invalid_slug'),
|
||||||
|
slugValidator
|
||||||
|
),
|
||||||
},
|
},
|
||||||
address: {
|
address: {
|
||||||
country_id: {
|
country_id: {
|
||||||
@ -249,4 +284,24 @@ async function next() {
|
|||||||
emit('next', 7)
|
emit('next', 7)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// watcher for if change company name then auto fill company slug value
|
||||||
|
watch(
|
||||||
|
() => companyForm.name,
|
||||||
|
(currentValue) => {
|
||||||
|
companyForm.slug = slugify(currentValue)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
function slugify(string) {
|
||||||
|
return string
|
||||||
|
.toString()
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/\s+/g, '-')
|
||||||
|
.replace(/[^\w\-]+/g, '')
|
||||||
|
.replace(/\-\-+/g, '-')
|
||||||
|
.replace(/^-+/, '')
|
||||||
|
.replace(/-+$/, '')
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -56,7 +56,7 @@
|
|||||||
<BaseMultiselect
|
<BaseMultiselect
|
||||||
v-model="filters.status"
|
v-model="filters.status"
|
||||||
:groups="true"
|
:groups="true"
|
||||||
:options="status"
|
:options="invoiceStatus"
|
||||||
searchable
|
searchable
|
||||||
:placeholder="$t('general.select_a_status')"
|
:placeholder="$t('general.select_a_status')"
|
||||||
@update:modelValue="setActiveTab"
|
@update:modelValue="setActiveTab"
|
||||||
@ -130,11 +130,27 @@
|
|||||||
"
|
"
|
||||||
>
|
>
|
||||||
<!-- Tabs -->
|
<!-- Tabs -->
|
||||||
<BaseTabGroup class="-mb-5" @change="setStatusFilter">
|
<BaseTabGroup
|
||||||
<BaseTab :title="$t('general.all')" filter="" />
|
class="-mb-5"
|
||||||
<BaseTab :title="$t('general.draft')" filter="DRAFT" />
|
:selected-index="selectedIndex"
|
||||||
<BaseTab :title="$t('general.sent')" filter="SENT" />
|
@change="changeTabStatus"
|
||||||
<BaseTab :title="$t('general.due')" filter="DUE" />
|
>
|
||||||
|
<BaseTab
|
||||||
|
:title="invoiceTabStatus[0].title"
|
||||||
|
:tab-status="invoiceTabStatus[0].value"
|
||||||
|
/>
|
||||||
|
<BaseTab
|
||||||
|
:title="invoiceTabStatus[1].title"
|
||||||
|
:tab-status="invoiceTabStatus[1].value"
|
||||||
|
/>
|
||||||
|
<BaseTab
|
||||||
|
:title="invoiceTabStatus[2].title"
|
||||||
|
:tab-status="invoiceTabStatus[2].value"
|
||||||
|
/>
|
||||||
|
<BaseTab
|
||||||
|
:title="invoiceTabStatus[3].title"
|
||||||
|
:tab-status="invoiceTabStatus[3].value"
|
||||||
|
/>
|
||||||
</BaseTabGroup>
|
</BaseTabGroup>
|
||||||
|
|
||||||
<BaseDropdown
|
<BaseDropdown
|
||||||
@ -289,10 +305,10 @@ const utils = inject('$utils')
|
|||||||
const table = ref(null)
|
const table = ref(null)
|
||||||
const showFilters = ref(false)
|
const showFilters = ref(false)
|
||||||
|
|
||||||
const status = ref([
|
const invoiceStatus = ref([
|
||||||
{
|
{
|
||||||
label: 'Status',
|
label: 'Status',
|
||||||
options: ['DRAFT', 'DUE', 'SENT', 'VIEWED', 'COMPLETED'],
|
options: ['DRAFT', 'SENT', 'VIEWED', 'COMPLETED'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Paid Status',
|
label: 'Paid Status',
|
||||||
@ -300,10 +316,29 @@ const status = ref([
|
|||||||
},
|
},
|
||||||
,
|
,
|
||||||
])
|
])
|
||||||
|
|
||||||
|
const invoiceTabStatus = {
|
||||||
|
0: {
|
||||||
|
title: t('general.all'),
|
||||||
|
value: '',
|
||||||
|
},
|
||||||
|
1: {
|
||||||
|
title: t('general.draft'),
|
||||||
|
value: 'DRAFT',
|
||||||
|
},
|
||||||
|
2: {
|
||||||
|
title: t('general.sent'),
|
||||||
|
value: 'SENT',
|
||||||
|
},
|
||||||
|
3: {
|
||||||
|
title: t('general.due'),
|
||||||
|
value: 'DUE',
|
||||||
|
},
|
||||||
|
}
|
||||||
const isRequestOngoing = ref(true)
|
const isRequestOngoing = ref(true)
|
||||||
const activeTab = ref('general.draft')
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
|
const selectedIndex = ref(0)
|
||||||
|
|
||||||
let filters = reactive({
|
let filters = reactive({
|
||||||
customer_id: '',
|
customer_id: '',
|
||||||
@ -311,6 +346,7 @@ let filters = reactive({
|
|||||||
from_date: '',
|
from_date: '',
|
||||||
to_date: '',
|
to_date: '',
|
||||||
invoice_number: '',
|
invoice_number: '',
|
||||||
|
tab_status: '',
|
||||||
})
|
})
|
||||||
|
|
||||||
const showEmptyScreen = computed(
|
const showEmptyScreen = computed(
|
||||||
@ -401,6 +437,7 @@ async function fetchData({ page, filter, sort }) {
|
|||||||
from_date: filters.from_date,
|
from_date: filters.from_date,
|
||||||
to_date: filters.to_date,
|
to_date: filters.to_date,
|
||||||
invoice_number: filters.invoice_number,
|
invoice_number: filters.invoice_number,
|
||||||
|
tab_status: filters.tab_status,
|
||||||
orderByField: sort.fieldName || 'created_at',
|
orderByField: sort.fieldName || 'created_at',
|
||||||
orderBy: sort.order || 'desc',
|
orderBy: sort.order || 'desc',
|
||||||
page,
|
page,
|
||||||
@ -423,29 +460,9 @@ async function fetchData({ page, filter, sort }) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setStatusFilter(val) {
|
function changeTabStatus(val, index) {
|
||||||
if (activeTab.value == val.title) {
|
filters.tab_status = val['tab-status']
|
||||||
return true
|
selectedIndex.value = index
|
||||||
}
|
|
||||||
|
|
||||||
activeTab.value = val.title
|
|
||||||
|
|
||||||
switch (val.title) {
|
|
||||||
case t('general.draft'):
|
|
||||||
filters.status = 'DRAFT'
|
|
||||||
break
|
|
||||||
case t('general.sent'):
|
|
||||||
filters.status = 'SENT'
|
|
||||||
break
|
|
||||||
|
|
||||||
case t('general.due'):
|
|
||||||
filters.status = 'DUE'
|
|
||||||
break
|
|
||||||
|
|
||||||
default:
|
|
||||||
filters.status = ''
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function setFilters() {
|
function setFilters() {
|
||||||
@ -463,8 +480,6 @@ function clearFilter() {
|
|||||||
filters.from_date = ''
|
filters.from_date = ''
|
||||||
filters.to_date = ''
|
filters.to_date = ''
|
||||||
filters.invoice_number = ''
|
filters.invoice_number = ''
|
||||||
|
|
||||||
activeTab.value = t('general.all')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function removeMultipleInvoices() {
|
async function removeMultipleInvoices() {
|
||||||
@ -505,39 +520,21 @@ function toggleFilter() {
|
|||||||
function setActiveTab(val) {
|
function setActiveTab(val) {
|
||||||
switch (val) {
|
switch (val) {
|
||||||
case 'DRAFT':
|
case 'DRAFT':
|
||||||
activeTab.value = t('general.draft')
|
selectedIndex.value = 1
|
||||||
break
|
break
|
||||||
|
|
||||||
case 'SENT':
|
case 'SENT':
|
||||||
activeTab.value = t('general.sent')
|
case 'VIEWED':
|
||||||
break
|
|
||||||
|
|
||||||
case 'DUE':
|
|
||||||
activeTab.value = t('general.due')
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'COMPLETED':
|
case 'COMPLETED':
|
||||||
activeTab.value = t('invoices.completed')
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'PAID':
|
case 'PAID':
|
||||||
activeTab.value = t('invoices.paid')
|
selectedIndex.value = 2
|
||||||
break
|
break
|
||||||
|
|
||||||
case 'UNPAID':
|
case 'UNPAID':
|
||||||
activeTab.value = t('invoices.unpaid')
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'PARTIALLY_PAID':
|
case 'PARTIALLY_PAID':
|
||||||
activeTab.value = t('invoices.partially_paid')
|
selectedIndex.value = 3
|
||||||
break
|
|
||||||
|
|
||||||
case 'VIEWED':
|
|
||||||
activeTab.value = t('invoices.viewed')
|
|
||||||
break
|
|
||||||
|
|
||||||
default:
|
|
||||||
activeTab.value = t('general.all')
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
filters.tab_status = invoiceTabStatus[selectedIndex.value].value
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -32,6 +32,8 @@
|
|||||||
:content-loading="isLoading"
|
:content-loading="isLoading"
|
||||||
:calendar-button="true"
|
:calendar-button="true"
|
||||||
calendar-button-icon="calendar"
|
calendar-button-icon="calendar"
|
||||||
|
:show-extra-options="true"
|
||||||
|
:source-date="invoiceStore.newInvoice.invoice_date"
|
||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
|
||||||
|
|||||||
@ -54,8 +54,6 @@
|
|||||||
label="name"
|
label="name"
|
||||||
:options="itemStore.itemUnits"
|
:options="itemStore.itemUnits"
|
||||||
value-prop="id"
|
value-prop="id"
|
||||||
:can-deselect="false"
|
|
||||||
:can-clear="false"
|
|
||||||
:placeholder="$t('items.select_a_unit')"
|
:placeholder="$t('items.select_a_unit')"
|
||||||
searchable
|
searchable
|
||||||
track-by="name"
|
track-by="name"
|
||||||
|
|||||||
@ -82,9 +82,9 @@
|
|||||||
required
|
required
|
||||||
>
|
>
|
||||||
<BaseCustomerSelectInput
|
<BaseCustomerSelectInput
|
||||||
|
v-if="!isLoadingContent"
|
||||||
v-model="paymentStore.currentPayment.customer_id"
|
v-model="paymentStore.currentPayment.customer_id"
|
||||||
:content-loading="isLoadingContent"
|
:content-loading="isLoadingContent"
|
||||||
v-if="!isLoadingContent"
|
|
||||||
:invalid="v$.currentPayment.customer_id.$error"
|
:invalid="v$.currentPayment.customer_id.$error"
|
||||||
:placeholder="$t('customers.select_a_customer')"
|
:placeholder="$t('customers.select_a_customer')"
|
||||||
show-action
|
show-action
|
||||||
@ -423,7 +423,7 @@ function onCustomerChange(customer_id) {
|
|||||||
if (customer_id) {
|
if (customer_id) {
|
||||||
let data = {
|
let data = {
|
||||||
customer_id: customer_id,
|
customer_id: customer_id,
|
||||||
status: 'DUE',
|
tab_status: 'DUE',
|
||||||
limit: 'all',
|
limit: 'all',
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -446,7 +446,11 @@ function onCustomerChange(customer_id) {
|
|||||||
paymentStore.currentPayment.selectedCustomer = res2.data.data
|
paymentStore.currentPayment.selectedCustomer = res2.data.data
|
||||||
paymentStore.currentPayment.customer = res2.data.data
|
paymentStore.currentPayment.customer = res2.data.data
|
||||||
paymentStore.currentPayment.currency = res2.data.data.currency
|
paymentStore.currentPayment.currency = res2.data.data.currency
|
||||||
if(isEdit.value && !customerStore.editCustomer && paymentStore.currentPayment.customer_id) {
|
if (
|
||||||
|
isEdit.value &&
|
||||||
|
!customerStore.editCustomer &&
|
||||||
|
paymentStore.currentPayment.customer_id
|
||||||
|
) {
|
||||||
customerStore.editCustomer = res2.data.data
|
customerStore.editCustomer = res2.data.data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,6 +28,19 @@
|
|||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
|
||||||
|
<BaseInputGroup
|
||||||
|
:label="$tc('settings.company_info.company_slug')"
|
||||||
|
:help-text="$t('settings.company_info.company_slug_help_text')"
|
||||||
|
:error="v$.slug.$error && v$.slug.$errors[0].$message"
|
||||||
|
required
|
||||||
|
>
|
||||||
|
<BaseInput
|
||||||
|
v-model="companyForm.slug"
|
||||||
|
:invalid="v$.slug.$error"
|
||||||
|
@blur="v$.slug.$touch()"
|
||||||
|
/>
|
||||||
|
</BaseInputGroup>
|
||||||
|
|
||||||
<BaseInputGroup :label="$tc('settings.company_info.phone')">
|
<BaseInputGroup :label="$tc('settings.company_info.phone')">
|
||||||
<BaseInput v-model="companyForm.address.phone" />
|
<BaseInput v-model="companyForm.address.phone" />
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
@ -160,6 +173,7 @@ let isSaving = ref(false)
|
|||||||
|
|
||||||
const companyForm = reactive({
|
const companyForm = reactive({
|
||||||
name: null,
|
name: null,
|
||||||
|
slug: null,
|
||||||
logo: null,
|
logo: null,
|
||||||
address: {
|
address: {
|
||||||
address_street_1: '',
|
address_street_1: '',
|
||||||
@ -193,7 +207,14 @@ const rules = computed(() => {
|
|||||||
name: {
|
name: {
|
||||||
required: helpers.withMessage(t('validation.required'), required),
|
required: helpers.withMessage(t('validation.required'), required),
|
||||||
minLength: helpers.withMessage(
|
minLength: helpers.withMessage(
|
||||||
t('validation.name_min_length'),
|
t('validation.name_min_length', { count: 3 }),
|
||||||
|
minLength(3)
|
||||||
|
),
|
||||||
|
},
|
||||||
|
slug: {
|
||||||
|
required: helpers.withMessage(t('validation.required'), required),
|
||||||
|
minLength: helpers.withMessage(
|
||||||
|
t('validation.name_min_length', { count: 3 }),
|
||||||
minLength(3)
|
minLength(3)
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|||||||
@ -8,7 +8,11 @@
|
|||||||
<BaseInputGroup
|
<BaseInputGroup
|
||||||
:content-loading="isFetchingInitialData"
|
:content-loading="isFetchingInitialData"
|
||||||
:label="$tc('settings.preferences.currency')"
|
:label="$tc('settings.preferences.currency')"
|
||||||
:help-text="$t('settings.preferences.company_currency_unchangeable')"
|
:help-text="
|
||||||
|
isCurrencyDisabled
|
||||||
|
? $t('settings.preferences.company_currency_unchangeable')
|
||||||
|
: ''
|
||||||
|
"
|
||||||
:error="v$.currency.$error && v$.currency.$errors[0].$message"
|
:error="v$.currency.$error && v$.currency.$errors[0].$message"
|
||||||
required
|
required
|
||||||
>
|
>
|
||||||
@ -21,7 +25,7 @@
|
|||||||
:searchable="true"
|
:searchable="true"
|
||||||
track-by="name"
|
track-by="name"
|
||||||
:invalid="v$.currency.$error"
|
:invalid="v$.currency.$error"
|
||||||
disabled
|
:disabled="isCurrencyDisabled"
|
||||||
class="w-full"
|
class="w-full"
|
||||||
>
|
>
|
||||||
</BaseMultiselect>
|
</BaseMultiselect>
|
||||||
@ -187,6 +191,7 @@ const { t, tm } = useI18n()
|
|||||||
let isSaving = ref(false)
|
let isSaving = ref(false)
|
||||||
let isDataSaving = ref(false)
|
let isDataSaving = ref(false)
|
||||||
let isFetchingInitialData = ref(false)
|
let isFetchingInitialData = ref(false)
|
||||||
|
let isCurrencyDisabled = ref(true)
|
||||||
|
|
||||||
const settingsForm = reactive({ ...companyStore.selectedCompanySettings })
|
const settingsForm = reactive({ ...companyStore.selectedCompanySettings })
|
||||||
|
|
||||||
@ -282,10 +287,14 @@ setInitialData()
|
|||||||
async function setInitialData() {
|
async function setInitialData() {
|
||||||
isFetchingInitialData.value = true
|
isFetchingInitialData.value = true
|
||||||
Promise.all([
|
Promise.all([
|
||||||
|
companyStore.checkCompanyHasCurrencyTransactions(),
|
||||||
globalStore.fetchCurrencies(),
|
globalStore.fetchCurrencies(),
|
||||||
globalStore.fetchDateFormats(),
|
globalStore.fetchDateFormats(),
|
||||||
globalStore.fetchTimeZones(),
|
globalStore.fetchTimeZones(),
|
||||||
]).then(([res1]) => {
|
]).then(([res1]) => {
|
||||||
|
if (res1.data?.has_transactions == false) {
|
||||||
|
isCurrencyDisabled.value = false
|
||||||
|
}
|
||||||
isFetchingInitialData.value = false
|
isFetchingInitialData.value = false
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
101
resources/scripts/components/LightDarkSwitcher.vue
Normal file
101
resources/scripts/components/LightDarkSwitcher.vue
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
<!-- This example requires Tailwind CSS v2.0+ -->
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { Switch, SwitchGroup, SwitchLabel } from '@headlessui/vue'
|
||||||
|
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
||||||
|
import { computed, ref } from 'vue'
|
||||||
|
defineProps({
|
||||||
|
showLabel: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
|
vertical: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const globalStore = useGlobalStore()
|
||||||
|
|
||||||
|
const enabled = ref(
|
||||||
|
localStorage.getItem('theme') === 'dark' ||
|
||||||
|
document.documentElement.classList.contains('dark')
|
||||||
|
)
|
||||||
|
|
||||||
|
globalStore.isDarkModeOn = enabled
|
||||||
|
|
||||||
|
function onChange(val) {
|
||||||
|
if (val) {
|
||||||
|
localStorage.theme = 'dark'
|
||||||
|
document.documentElement.classList.add('dark')
|
||||||
|
document.documentElement.style.setProperty('color-scheme', 'dark')
|
||||||
|
globalStore.isDarkModeOn = true
|
||||||
|
} else {
|
||||||
|
localStorage.theme = 'light'
|
||||||
|
document.documentElement.classList.remove('dark')
|
||||||
|
document.documentElement.style.setProperty('color-scheme', 'light')
|
||||||
|
globalStore.isDarkModeOn = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="w-full flex justify-center">
|
||||||
|
<SwitchGroup
|
||||||
|
as="div"
|
||||||
|
class="flex items-center"
|
||||||
|
:class="vertical ? 'flex-col justify-center' : 'flex-row'"
|
||||||
|
>
|
||||||
|
<Switch
|
||||||
|
v-model="enabled"
|
||||||
|
class="relative inline-flex flex-shrink-0 h-6 w-11 border-2 border-transparent rounded-full cursor-pointer transition-colors ease-in-out duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 dark:ring-offset-gray-700"
|
||||||
|
:class="[enabled ? 'bg-primary-600' : 'bg-gray-200']"
|
||||||
|
@update:modelValue="onChange"
|
||||||
|
>
|
||||||
|
<span class="sr-only">Use setting</span>
|
||||||
|
<span
|
||||||
|
class="pointer-events-none relative inline-block h-5 w-5 rounded-full bg-white shadow transform ring-0 transition ease-in-out duration-200"
|
||||||
|
:class="[enabled ? 'translate-x-5' : 'translate-x-0']"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="absolute inset-0 h-full w-full flex items-center justify-center transition-opacity"
|
||||||
|
:class="[
|
||||||
|
enabled
|
||||||
|
? 'opacity-0 ease-out duration-100'
|
||||||
|
: 'opacity-100 ease-in duration-200',
|
||||||
|
]"
|
||||||
|
aria-hidden="true"
|
||||||
|
>
|
||||||
|
<BaseIcon class="h-3 w-3 text-yellow-500" name="SunIcon" />
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
class="absolute inset-0 h-full w-full flex items-center justify-center transition-opacity"
|
||||||
|
:class="[
|
||||||
|
enabled
|
||||||
|
? 'opacity-100 ease-in duration-200'
|
||||||
|
: 'opacity-0 ease-out duration-100',
|
||||||
|
]"
|
||||||
|
aria-hidden="true"
|
||||||
|
>
|
||||||
|
<BaseIcon class="h-3 w-3 text-primary-500" name="MoonIcon" />
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</Switch>
|
||||||
|
<SwitchLabel
|
||||||
|
v-if="showLabel"
|
||||||
|
as="span"
|
||||||
|
class="cursor-pointer"
|
||||||
|
:class="vertical ? 'px-1 text-center mt-2' : 'ml-3'"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
v-if="enabled"
|
||||||
|
class="text-sm font-medium text-gray-500 dark:text-gray-400"
|
||||||
|
>
|
||||||
|
Dark Mode
|
||||||
|
</span>
|
||||||
|
<span v-else class="text-sm font-medium text-gray-500">
|
||||||
|
Light Mode
|
||||||
|
</span>
|
||||||
|
</SwitchLabel>
|
||||||
|
</SwitchGroup>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@ -437,21 +437,22 @@ export default {
|
|||||||
required: false,
|
required: false,
|
||||||
default: () => ({
|
default: () => ({
|
||||||
container:
|
container:
|
||||||
'p-0 relative mx-auto w-full flex items-center justify-end box-border cursor-pointer border border-gray-200 rounded-md bg-white text-sm leading-snug outline-none max-h-10',
|
'p-0 relative mx-auto w-full flex items-center justify-end box-border cursor-pointer border border-gray-200 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-sm leading-snug outline-none max-h-10',
|
||||||
containerDisabled:
|
containerDisabled:
|
||||||
'cursor-default bg-gray-200 bg-opacity-50 !text-gray-400',
|
'bg-gray-200 bg-opacity-50 !text-gray-400 dark:!text-gray-800 !dark:text-gray-500 !cursor-default dark:opacity-25',
|
||||||
containerOpen: '',
|
containerOpen: '',
|
||||||
containerOpenTop: '',
|
containerOpenTop: '',
|
||||||
containerActive: 'ring-1 ring-primary-400 border-primary-400',
|
containerActive: 'ring-1 ring-primary-400 border-primary-400',
|
||||||
containerInvalid:
|
containerInvalid:
|
||||||
'border-red-400 ring-red-400 focus:ring-red-400 focus:border-red-400',
|
'border-red-500 ring-red-500 focus:ring-red-500 focus:border-red-500 dark:border-red-500 dark:ring-red-500 dark:focus:ring-red-500 dark:focus:border-red-500',
|
||||||
containerInvalidActive: 'ring-1 border-red-400 ring-red-400',
|
containerInvalidActive:
|
||||||
|
'ring-1 border-red-500 ring-red-500 dark:ring-1 dark:border-red-500 dark:ring-red-500',
|
||||||
singleLabel:
|
singleLabel:
|
||||||
'flex items-center h-full absolute left-0 top-0 pointer-events-none bg-transparent leading-snug pl-3.5',
|
'flex items-center h-full absolute left-0 top-0 pointer-events-none bg-transparent leading-snug pl-3.5 dark:text-white',
|
||||||
multipleLabel:
|
multipleLabel:
|
||||||
'flex items-center h-full absolute left-0 top-0 pointer-events-none bg-transparent leading-snug pl-3.5',
|
'flex items-center h-full absolute left-0 top-0 pointer-events-none bg-transparent leading-snug pl-3.5 dark:text-white',
|
||||||
search:
|
search:
|
||||||
'w-full absolute inset-0 outline-none appearance-none box-border border-0 text-sm font-sans bg-white rounded-md pl-3.5',
|
'w-full absolute inset-0 outline-none appearance-none box-border border-0 text-sm font-sans bg-white rounded-md pl-3.5 border-transparent focus:border-transparent focus:ring-0 dark:bg-gray-700 dark:text-white',
|
||||||
tags: 'grow shrink flex flex-wrap mt-1 pl-2',
|
tags: 'grow shrink flex flex-wrap mt-1 pl-2',
|
||||||
tag: 'bg-primary-500 text-white text-sm font-semibold py-0.5 pl-2 rounded mr-1 mb-1 flex items-center whitespace-nowrap',
|
tag: 'bg-primary-500 text-white text-sm font-semibold py-0.5 pl-2 rounded mr-1 mb-1 flex items-center whitespace-nowrap',
|
||||||
tagDisabled: 'pr-2 !bg-gray-400 text-white',
|
tagDisabled: 'pr-2 !bg-gray-400 text-white',
|
||||||
@ -461,12 +462,12 @@ export default {
|
|||||||
'bg-multiselect-remove text-white bg-center bg-no-repeat opacity-30 inline-block w-3 h-3 group-hover:opacity-60',
|
'bg-multiselect-remove text-white bg-center bg-no-repeat opacity-30 inline-block w-3 h-3 group-hover:opacity-60',
|
||||||
tagsSearchWrapper: 'inline-block relative mx-1 mb-1 grow shrink h-full',
|
tagsSearchWrapper: 'inline-block relative mx-1 mb-1 grow shrink h-full',
|
||||||
tagsSearch:
|
tagsSearch:
|
||||||
'absolute inset-0 border-0 focus:outline-none !shadow-none !focus:shadow-none appearance-none p-0 text-sm font-sans box-border w-full',
|
'absolute inset-0 border-0 focus:outline-none !shadow-none !focus:shadow-none appearance-none p-0 sm:text-sm font-sans box-border w-full dark:bg-gray-700',
|
||||||
tagsSearchCopy: 'invisible whitespace-pre-wrap inline-block h-px',
|
tagsSearchCopy: 'invisible whitespace-pre-wrap inline-block h-px',
|
||||||
placeholder:
|
placeholder:
|
||||||
'flex items-center h-full absolute left-0 top-0 pointer-events-none bg-transparent leading-snug pl-3.5 text-gray-400 text-sm',
|
'flex items-center h-full absolute left-0 top-0 pointer-events-none bg-transparent leading-snug pl-3.5 text-gray-400 sm:text-sm dark:text-gray-500',
|
||||||
caret:
|
caret:
|
||||||
'bg-multiselect-caret bg-center bg-no-repeat w-5 h-5 py-px box-content z-5 relative mr-1 opacity-40 shrink-0 grow-0 transition-transform',
|
'bg-multiselect-caret-black dark:bg-multiselect-caret-white bg-center bg-no-repeat w-5 h-5 py-px box-content z-5 relative mr-1 opacity-40 shrink-0 grow-0 transition-transform dark:text-white',
|
||||||
caretOpen: 'rotate-180 pointer-events-auto',
|
caretOpen: 'rotate-180 pointer-events-auto',
|
||||||
clear:
|
clear:
|
||||||
'pr-3.5 relative z-10 opacity-40 transition duration-300 shrink-0 grow-0 flex hover:opacity-80',
|
'pr-3.5 relative z-10 opacity-40 transition duration-300 shrink-0 grow-0 flex hover:opacity-80',
|
||||||
@ -475,7 +476,7 @@ export default {
|
|||||||
spinner:
|
spinner:
|
||||||
'bg-multiselect-spinner bg-center bg-no-repeat w-4 h-4 z-10 mr-3.5 animate-spin shrink-0 grow-0',
|
'bg-multiselect-spinner bg-center bg-no-repeat w-4 h-4 z-10 mr-3.5 animate-spin shrink-0 grow-0',
|
||||||
dropdown:
|
dropdown:
|
||||||
'max-h-60 shadow-lg absolute -left-px -right-px -bottom-1 translate-y-full border border-gray-300 mt-1 overflow-y-auto z-50 bg-white flex flex-col rounded-md',
|
'max-h-60 shadow-lg absolute -left-px -right-px -bottom-1 translate-y-full border border-gray-300 mt-1 overflow-y-auto z-50 bg-white dark:border-gray-600 flex flex-col rounded-md dark:bg-gray-800 dark:shadow-glass',
|
||||||
dropdownTop:
|
dropdownTop:
|
||||||
'-translate-y-full -top-2 bottom-auto flex-col-reverse rounded-md',
|
'-translate-y-full -top-2 bottom-auto flex-col-reverse rounded-md',
|
||||||
dropdownHidden: 'hidden',
|
dropdownHidden: 'hidden',
|
||||||
@ -483,7 +484,7 @@ export default {
|
|||||||
optionsTop: 'flex-col-reverse',
|
optionsTop: 'flex-col-reverse',
|
||||||
group: 'p-0 m-0',
|
group: 'p-0 m-0',
|
||||||
groupLabel:
|
groupLabel:
|
||||||
'flex text-sm box-border items-center justify-start text-left py-1 px-3 font-semibold bg-gray-200 cursor-default leading-normal',
|
'flex text-sm box-border items-center justify-start text-left py-1 px-3 font-semibold bg-gray-200 dark:bg-gray-700 dark:text-gray-400 cursor-default leading-normal',
|
||||||
groupLabelPointable: 'cursor-pointer',
|
groupLabelPointable: 'cursor-pointer',
|
||||||
groupLabelPointed: 'bg-gray-300 text-gray-700',
|
groupLabelPointed: 'bg-gray-300 text-gray-700',
|
||||||
groupLabelSelected: 'bg-primary-600 text-white',
|
groupLabelSelected: 'bg-primary-600 text-white',
|
||||||
@ -493,15 +494,18 @@ export default {
|
|||||||
'text-primary-100 bg-primary-600 bg-opacity-50 cursor-not-allowed',
|
'text-primary-100 bg-primary-600 bg-opacity-50 cursor-not-allowed',
|
||||||
groupOptions: 'p-0 m-0',
|
groupOptions: 'p-0 m-0',
|
||||||
option:
|
option:
|
||||||
'flex items-center justify-start box-border text-left cursor-pointer text-sm leading-snug py-2 px-3',
|
'flex items-center justify-start box-border text-left cursor-pointer text-sm leading-snug py-2 px-3 dark:text-gray-200',
|
||||||
optionPointed: 'text-gray-800 bg-gray-100',
|
optionPointed:
|
||||||
|
'text-gray-800 bg-gray-100 dark:text-white dark:bg-gray-700/30',
|
||||||
optionSelected: 'text-white bg-primary-500',
|
optionSelected: 'text-white bg-primary-500',
|
||||||
optionDisabled: 'text-gray-300 cursor-not-allowed',
|
optionDisabled: 'text-gray-300 cursor-not-allowed dark:text-gray-400',
|
||||||
optionSelectedPointed: 'text-white bg-primary-500 opacity-90',
|
optionSelectedPointed: 'text-white bg-primary-500 opacity-90',
|
||||||
optionSelectedDisabled:
|
optionSelectedDisabled:
|
||||||
'text-primary-100 bg-primary-500 bg-opacity-50 cursor-not-allowed',
|
'text-primary-100 bg-primary-500 bg-opacity-50 cursor-not-allowed',
|
||||||
noOptions: 'py-2 px-3 text-gray-600 bg-white',
|
noOptions:
|
||||||
noResults: 'py-2 px-3 text-gray-600 bg-white',
|
'py-2 px-3 text-gray-600 bg-white dark:bg-gray-700 dark:text-gray-200',
|
||||||
|
noResults:
|
||||||
|
'py-2 px-3 text-gray-600 bg-white dark:bg-gray-700 dark:text-gray-200',
|
||||||
fakeInput:
|
fakeInput:
|
||||||
'bg-transparent absolute left-0 right-0 -bottom-px w-full h-px border-0 p-0 appearance-none outline-none text-transparent',
|
'bg-transparent absolute left-0 right-0 -bottom-px w-full h-px border-0 p-0 appearance-none outline-none text-transparent',
|
||||||
spacer: 'h-9 py-px box-content',
|
spacer: 'h-9 py-px box-content',
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<nav>
|
<nav>
|
||||||
<ol class="flex flex-wrap py-4 text-gray-900 rounded list-reset">
|
<ol class="flex flex-wrap py-4 text-gray-900 rounded list-reset dark:text-gray-400">
|
||||||
<slot />
|
<slot />
|
||||||
</ol>
|
</ol>
|
||||||
</nav>
|
</nav>
|
||||||
|
|||||||
@ -8,7 +8,9 @@
|
|||||||
font-medium
|
font-medium
|
||||||
leading-5
|
leading-5
|
||||||
text-gray-900
|
text-gray-900
|
||||||
|
dark:text-gray-400
|
||||||
outline-none
|
outline-none
|
||||||
|
dark:focus:ring-offset-gray-900
|
||||||
focus:ring-2 focus:ring-offset-2 focus:ring-primary-400
|
focus:ring-2 focus:ring-offset-2 focus:ring-primary-400
|
||||||
"
|
"
|
||||||
:to="to"
|
:to="to"
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { computed, ref } from 'vue'
|
import { computed, ref } from 'vue'
|
||||||
import SpinnerIcon from '@/scripts/components/icons/SpinnerIcon.vue'
|
import SpinnerIcon from '@/scripts/components/icons/SpinnerIcon.vue'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
contentLoading: {
|
contentLoading: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
@ -9,7 +10,7 @@ const props = defineProps({
|
|||||||
defaultClass: {
|
defaultClass: {
|
||||||
type: String,
|
type: String,
|
||||||
default:
|
default:
|
||||||
'inline-flex whitespace-nowrap items-center border font-medium focus:outline-none focus:ring-2 focus:ring-offset-2',
|
'inline-flex whitespace-nowrap items-center border font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 dark:focus:ring-offset-gray-800',
|
||||||
},
|
},
|
||||||
tag: {
|
tag: {
|
||||||
type: String,
|
type: String,
|
||||||
@ -27,6 +28,10 @@ const props = defineProps({
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
loadingRight: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
size: {
|
size: {
|
||||||
type: String,
|
type: String,
|
||||||
default: 'md',
|
default: 'md',
|
||||||
@ -81,17 +86,17 @@ const placeHolderSize = computed(() => {
|
|||||||
|
|
||||||
const variantClass = computed(() => {
|
const variantClass = computed(() => {
|
||||||
return {
|
return {
|
||||||
'border-transparent shadow-sm text-white bg-primary-600 hover:bg-primary-700 focus:ring-primary-500':
|
'border-transparent shadow-sm text-white bg-primary-600 hover:bg-primary-700 focus:ring-primary-500 dark:bg-primary-500 dark:hover:bg-primary-600':
|
||||||
props.variant === 'primary',
|
props.variant === 'primary',
|
||||||
'border-transparent text-primary-700 bg-primary-100 hover:bg-primary-200 focus:ring-primary-500':
|
'border-transparent text-primary-700 bg-primary-100 hover:bg-primary-200 focus:ring-primary-500':
|
||||||
props.variant === 'secondary',
|
props.variant === 'secondary',
|
||||||
'border-transparent border-solid border-primary-500 font-normal transition ease-in-out duration-150 text-primary-500 hover:bg-primary-200 shadow-inner focus:ring-primary-500':
|
'border-transparent border-solid border-primary-500 font-normal transition ease-in-out duration-150 text-primary-500 hover:bg-primary-100 shadow-inner focus:ring-primary-500 dark:text-primary-400 dark:border-primary-400 dark:hover:bg-transparent dark:hover:text-primary-500 dark:hover:border-primary-500':
|
||||||
props.variant == 'primary-outline',
|
props.variant == 'primary-outline',
|
||||||
'border-gray-200 text-gray-700 bg-white hover:bg-gray-50 focus:ring-primary-500 focus:ring-offset-0':
|
'border-gray-200 text-gray-700 bg-white hover:bg-gray-50 focus:ring-primary-500 focus:ring-offset-0 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-900':
|
||||||
props.variant == 'white',
|
props.variant == 'white',
|
||||||
'border-transparent shadow-sm text-white bg-red-600 hover:bg-red-700 focus:ring-red-500':
|
'border-transparent shadow-sm text-white bg-red-600 hover:bg-red-700 focus:ring-red-500':
|
||||||
props.variant === 'danger',
|
props.variant === 'danger',
|
||||||
'border-transparent bg-gray-200 border hover:bg-opacity-60 focus:ring-gray-500 focus:ring-offset-0':
|
'border-transparent bg-gray-200 border hover:bg-opacity-60 focus:ring-gray-500 focus:ring-offset-0 dark:bg-gray-600 dark:text-white dark:hover:bg-opacity-60':
|
||||||
props.variant === 'gray',
|
props.variant === 'gray',
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -124,6 +129,13 @@ const iconRightClass = computed(() => {
|
|||||||
'ml-3 -mr-1 h-5 w-5': props.size === 'lg' || props.size === 'xl',
|
'ml-3 -mr-1 h-5 w-5': props.size === 'lg' || props.size === 'xl',
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const buttonDisabledClass = computed(() => {
|
||||||
|
if (props.disabled || props.loading)
|
||||||
|
return 'cursor-not-allowed bg-opacity-70 dark:!bg-opacity-40 hover:!bg-opacity-70 pointer-event-none'
|
||||||
|
|
||||||
|
return ''
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@ -141,15 +153,17 @@ const iconRightClass = computed(() => {
|
|||||||
<BaseCustomTag
|
<BaseCustomTag
|
||||||
v-else
|
v-else
|
||||||
:tag="tag"
|
:tag="tag"
|
||||||
:disabled="disabled"
|
:disabled="disabled || loading"
|
||||||
:class="[defaultClass, sizeClass, variantClass, roundedClass]"
|
:class="[defaultClass, sizeClass, variantClass, roundedClass, buttonDisabledClass]"
|
||||||
>
|
>
|
||||||
<SpinnerIcon v-if="loading" :class="[iconLeftClass, iconVariantClass]" />
|
<SpinnerIcon v-if="loading && !loadingRight" :class="[iconLeftClass, iconVariantClass]" />
|
||||||
|
|
||||||
<slot v-else name="left" :class="iconLeftClass"></slot>
|
<slot v-else name="left" :class="iconLeftClass" />
|
||||||
|
|
||||||
<slot />
|
<slot />
|
||||||
|
|
||||||
<slot name="right" :class="[iconRightClass, iconVariantClass]"></slot>
|
<SpinnerIcon v-if="loading && loadingRight" :class="[iconRightClass, iconVariantClass]" />
|
||||||
|
|
||||||
|
<slot v-else name="right" :class="[iconRightClass, iconVariantClass]" />
|
||||||
</BaseCustomTag>
|
</BaseCustomTag>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -1,5 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="bg-white rounded-lg shadow">
|
<div
|
||||||
|
class="bg-white rounded-lg shadow dark:bg-gray-800 dark:text-white dark:shadow-glass dark:border dark:border-white/10 dark:bg-gray-800/70 relative"
|
||||||
|
>
|
||||||
|
<BaseDarkHighlight class="z-[-1] mt-10" />
|
||||||
|
|
||||||
<div
|
<div
|
||||||
v-if="hasHeaderSlot"
|
v-if="hasHeaderSlot"
|
||||||
class="px-5 py-4 text-black border-b border-gray-100 border-solid"
|
class="px-5 py-4 text-black border-b border-gray-100 border-solid"
|
||||||
|
|||||||
@ -39,6 +39,8 @@ $base-content-placeholders-border-radius: 6px !default;
|
|||||||
$base-content-placeholders-line-height: 15px !default;
|
$base-content-placeholders-line-height: 15px !default;
|
||||||
$base-content-placeholders-spacing: 10px !default;
|
$base-content-placeholders-spacing: 10px !default;
|
||||||
|
|
||||||
|
$base-content-placeholders-primary-color-dark: rgb(71, 85, 105) !default;
|
||||||
|
$base-content-placeholders-secondary-color-dark: rgb(71, 85, 105) !default;
|
||||||
// Animations
|
// Animations
|
||||||
@keyframes vueContentPlaceholdersAnimation {
|
@keyframes vueContentPlaceholdersAnimation {
|
||||||
0% {
|
0% {
|
||||||
@ -57,6 +59,10 @@ $base-content-placeholders-spacing: 10px !default;
|
|||||||
min-height: $base-content-placeholders-line-height;
|
min-height: $base-content-placeholders-line-height;
|
||||||
background: $base-content-placeholders-secondary-color;
|
background: $base-content-placeholders-secondary-color;
|
||||||
|
|
||||||
|
.dark & {
|
||||||
|
background: $base-content-placeholders-secondary-color-dark;
|
||||||
|
}
|
||||||
|
|
||||||
.base-content-placeholders-is-rounded & {
|
.base-content-placeholders-is-rounded & {
|
||||||
border-radius: $base-content-placeholders-border-radius;
|
border-radius: $base-content-placeholders-border-radius;
|
||||||
}
|
}
|
||||||
@ -86,6 +92,15 @@ $base-content-placeholders-spacing: 10px !default;
|
|||||||
animation-name: vueContentPlaceholdersAnimation;
|
animation-name: vueContentPlaceholdersAnimation;
|
||||||
animation-timing-function: linear;
|
animation-timing-function: linear;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dark .base-content-placeholders-is-animated &::before {
|
||||||
|
background: linear-gradient(
|
||||||
|
to right,
|
||||||
|
transparent 0%,
|
||||||
|
darken($base-content-placeholders-secondary-color-dark, 5%) 15%,
|
||||||
|
transparent 30%
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin base-content-placeholders-spacing {
|
@mixin base-content-placeholders-spacing {
|
||||||
@ -156,6 +171,10 @@ $base-content-placeholders-spacing: 10px !default;
|
|||||||
min-height: $base-content-placeholders-line-height;
|
min-height: $base-content-placeholders-line-height;
|
||||||
background: $base-content-placeholders-secondary-color;
|
background: $base-content-placeholders-secondary-color;
|
||||||
|
|
||||||
|
.dark & {
|
||||||
|
background: $base-content-placeholders-secondary-color-dark;
|
||||||
|
}
|
||||||
|
|
||||||
.base-content-placeholders-is-animated &::before {
|
.base-content-placeholders-is-animated &::before {
|
||||||
content: '';
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -177,6 +196,14 @@ $base-content-placeholders-spacing: 10px !default;
|
|||||||
animation-timing-function: linear;
|
animation-timing-function: linear;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dark .base-content-placeholders-is-animated &::before {
|
||||||
|
background: linear-gradient(
|
||||||
|
to right,
|
||||||
|
transparent 0%,
|
||||||
|
darken($base-content-placeholders-secondary-color-dark, 5%) 15%,
|
||||||
|
transparent 30%
|
||||||
|
);
|
||||||
|
}
|
||||||
// @include base-content-placeholders-spacing;
|
// @include base-content-placeholders-spacing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -40,6 +40,7 @@
|
|||||||
font-normal
|
font-normal
|
||||||
cursor-pointer
|
cursor-pointer
|
||||||
hover:bg-gray-100
|
hover:bg-gray-100
|
||||||
|
dark:hover:bg-gray-700/60
|
||||||
rounded
|
rounded
|
||||||
ml-1
|
ml-1
|
||||||
py-0.5
|
py-0.5
|
||||||
@ -126,7 +127,7 @@ onMounted(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const value = computed({
|
const value = computed({
|
||||||
get: () => props.modelValue,
|
get: () => (props.modelValue ? props.modelValue : ''),
|
||||||
set: (value) => {
|
set: (value) => {
|
||||||
emit('update:modelValue', value)
|
emit('update:modelValue', value)
|
||||||
},
|
},
|
||||||
@ -195,7 +196,9 @@ async function getFields() {
|
|||||||
{ label: 'Date', value: 'INVOICE_DATE' },
|
{ label: 'Date', value: 'INVOICE_DATE' },
|
||||||
{ label: 'Due Date', value: 'INVOICE_DUE_DATE' },
|
{ label: 'Due Date', value: 'INVOICE_DUE_DATE' },
|
||||||
{ label: 'Number', value: 'INVOICE_NUMBER' },
|
{ label: 'Number', value: 'INVOICE_NUMBER' },
|
||||||
{ label: 'Ref Number', value: 'INVOICE_REF_NUMBER' },
|
{ label: 'PDF Link', value: 'PDF_LINK' },
|
||||||
|
{ label: 'Due Amount', value: 'DUE_AMOUNT' },
|
||||||
|
{ label: 'Total Amount', value: 'TOTAL_AMOUNT' },
|
||||||
...invoiceFields.value.map((i) => ({
|
...invoiceFields.value.map((i) => ({
|
||||||
label: i.label,
|
label: i.label,
|
||||||
value: i.slug,
|
value: i.slug,
|
||||||
@ -211,7 +214,8 @@ async function getFields() {
|
|||||||
{ label: 'Date', value: 'ESTIMATE_DATE' },
|
{ label: 'Date', value: 'ESTIMATE_DATE' },
|
||||||
{ label: 'Expiry Date', value: 'ESTIMATE_EXPIRY_DATE' },
|
{ label: 'Expiry Date', value: 'ESTIMATE_EXPIRY_DATE' },
|
||||||
{ label: 'Number', value: 'ESTIMATE_NUMBER' },
|
{ label: 'Number', value: 'ESTIMATE_NUMBER' },
|
||||||
{ label: 'Ref Number', value: 'ESTIMATE_REF_NUMBER' },
|
{ label: 'PDF Link', value: 'PDF_LINK' },
|
||||||
|
{ label: 'Total Amount', value: 'TOTAL_AMOUNT' },
|
||||||
...estimateFields.value.map((i) => ({
|
...estimateFields.value.map((i) => ({
|
||||||
label: i.label,
|
label: i.label,
|
||||||
value: i.slug,
|
value: i.slug,
|
||||||
@ -228,6 +232,7 @@ async function getFields() {
|
|||||||
{ label: 'Number', value: 'PAYMENT_NUMBER' },
|
{ label: 'Number', value: 'PAYMENT_NUMBER' },
|
||||||
{ label: 'Mode', value: 'PAYMENT_MODE' },
|
{ label: 'Mode', value: 'PAYMENT_MODE' },
|
||||||
{ label: 'Amount', value: 'PAYMENT_AMOUNT' },
|
{ label: 'Amount', value: 'PAYMENT_AMOUNT' },
|
||||||
|
{ label: 'PDF Link', value: 'PDF_LINK' },
|
||||||
...paymentFields.value.map((i) => ({
|
...paymentFields.value.map((i) => ({
|
||||||
label: i.label,
|
label: i.label,
|
||||||
value: i.slug,
|
value: i.slug,
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
v-if="address"
|
v-if="address"
|
||||||
class="text-sm font-bold leading-5 text-black non-italic space-y-1"
|
class="text-sm font-bold leading-5 text-black non-italic space-y-1 dark:text-white"
|
||||||
>
|
>
|
||||||
<p v-if="address?.address_street_1">{{ address?.address_street_1 }},</p>
|
<p v-if="address?.address_street_1">{{ address?.address_street_1 }},</p>
|
||||||
|
|
||||||
|
|||||||
@ -20,6 +20,7 @@
|
|||||||
border border-gray-200 border-solid
|
border border-gray-200 border-solid
|
||||||
min-h-[170px]
|
min-h-[170px]
|
||||||
rounded-md
|
rounded-md
|
||||||
|
dark:border-white/10 dark:bg-gray-800/50
|
||||||
"
|
"
|
||||||
@click.stop
|
@click.stop
|
||||||
>
|
>
|
||||||
@ -27,7 +28,7 @@
|
|||||||
<BaseText
|
<BaseText
|
||||||
:text="selectedCustomer.name"
|
:text="selectedCustomer.name"
|
||||||
:length="30"
|
:length="30"
|
||||||
class="flex-1 text-base font-medium text-left text-gray-900"
|
class="flex-1 text-base font-medium text-left text-gray-900 dark:text-white"
|
||||||
/>
|
/>
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<a
|
<a
|
||||||
@ -192,6 +193,7 @@
|
|||||||
border border-gray-200 border-solid
|
border border-gray-200 border-solid
|
||||||
rounded-md
|
rounded-md
|
||||||
min-h-[170px]
|
min-h-[170px]
|
||||||
|
dark:border-white/10 dark:bg-gray-700/60 dark:text-white
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
@ -207,11 +209,12 @@
|
|||||||
bg-gray-200
|
bg-gray-200
|
||||||
rounded-full
|
rounded-full
|
||||||
font-base
|
font-base
|
||||||
|
dark:bg-gray-700
|
||||||
"
|
"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div class="mt-1">
|
<div class="mt-1">
|
||||||
<label class="text-lg font-medium text-gray-900">
|
<label class="text-lg font-medium text-gray-900 dark:text-white">
|
||||||
{{ $t('customers.new_customer') }}
|
{{ $t('customers.new_customer') }}
|
||||||
<span class="text-red-500"> * </span>
|
<span class="text-red-500"> * </span>
|
||||||
</label>
|
</label>
|
||||||
@ -246,6 +249,11 @@
|
|||||||
shadow-lg
|
shadow-lg
|
||||||
ring-1 ring-black ring-opacity-5
|
ring-1 ring-black ring-opacity-5
|
||||||
bg-white
|
bg-white
|
||||||
|
dark:border
|
||||||
|
dark:border-white/10
|
||||||
|
dark:bg-gray-800
|
||||||
|
dark:text-white
|
||||||
|
dark:shadow-glass
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
@ -265,6 +273,7 @@
|
|||||||
overflow-auto
|
overflow-auto
|
||||||
list
|
list
|
||||||
border-t border-gray-200
|
border-t border-gray-200
|
||||||
|
dark:border-white/10
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<li
|
<li
|
||||||
@ -280,6 +289,7 @@
|
|||||||
hover:cursor-pointer hover:bg-gray-100
|
hover:cursor-pointer hover:bg-gray-100
|
||||||
focus:outline-none focus:bg-gray-100
|
focus:outline-none focus:bg-gray-100
|
||||||
last:border-b-0
|
last:border-b-0
|
||||||
|
dark:border-white/10 dark:hover:bg-gray-700/30
|
||||||
"
|
"
|
||||||
@click="selectNewCustomer(customer.id, close)"
|
@click="selectNewCustomer(customer.id, close)"
|
||||||
>
|
>
|
||||||
@ -299,6 +309,7 @@
|
|||||||
bg-gray-300
|
bg-gray-300
|
||||||
rounded-full
|
rounded-full
|
||||||
avatar
|
avatar
|
||||||
|
dark:bg-gray-600
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{ initGenerator(customer.name) }}
|
{{ initGenerator(customer.name) }}
|
||||||
@ -333,9 +344,9 @@
|
|||||||
</li>
|
</li>
|
||||||
<div
|
<div
|
||||||
v-if="customerStore.customers.length === 0"
|
v-if="customerStore.customers.length === 0"
|
||||||
class="flex justify-center p-5 text-gray-400"
|
class="flex justify-center p-5 text-gray-400 dark:text-gray-300"
|
||||||
>
|
>
|
||||||
<label class="text-base text-gray-500 cursor-pointer">
|
<label class="text-base text-gray-500 cursor-pointer dark:text-gray-300">
|
||||||
{{ $t('customers.no_customers_found') }}
|
{{ $t('customers.no_customers_found') }}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
@ -357,6 +368,10 @@
|
|||||||
border-none
|
border-none
|
||||||
outline-none
|
outline-none
|
||||||
focus:bg-gray-300
|
focus:bg-gray-300
|
||||||
|
dark:bg-gray-600/70
|
||||||
|
dark:shadow-glass
|
||||||
|
dark:backdrop-blur-xl
|
||||||
|
dark:hover:bg-gray-600/80
|
||||||
"
|
"
|
||||||
@click="openCustomerModal"
|
@click="openCustomerModal"
|
||||||
>
|
>
|
||||||
|
|||||||
21
resources/scripts/components/base/BaseDarkHighlight.vue
Normal file
21
resources/scripts/components/base/BaseDarkHighlight.vue
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="
|
||||||
|
hidden
|
||||||
|
top-0
|
||||||
|
w-full
|
||||||
|
absolute
|
||||||
|
ml-auto
|
||||||
|
mr-auto
|
||||||
|
left-0
|
||||||
|
right-0
|
||||||
|
text-center
|
||||||
|
h-full
|
||||||
|
rounded-full
|
||||||
|
bg-highlight/[.10]
|
||||||
|
blur-2xl
|
||||||
|
dark:block
|
||||||
|
z-[-1]
|
||||||
|
"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
@ -7,52 +7,108 @@
|
|||||||
/>
|
/>
|
||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
|
|
||||||
<div v-else :class="computedContainerClass" class="relative flex flex-row">
|
<div v-else :class="computedContainerClass">
|
||||||
<svg
|
<date-picker
|
||||||
v-if="showCalendarIcon && !hasIconSlot"
|
ref="vCalendar"
|
||||||
viewBox="0 0 20 20"
|
|
||||||
fill="currentColor"
|
|
||||||
class="
|
|
||||||
absolute
|
|
||||||
w-4
|
|
||||||
h-4
|
|
||||||
mx-2
|
|
||||||
my-2.5
|
|
||||||
text-sm
|
|
||||||
not-italic
|
|
||||||
font-black
|
|
||||||
text-gray-400
|
|
||||||
cursor-pointer
|
|
||||||
"
|
|
||||||
@click="onClickDp"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
fill-rule="evenodd"
|
|
||||||
d="M6 2a1 1 0 00-1 1v1H4a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2h-1V3a1 1 0 10-2 0v1H7V3a1 1 0 00-1-1zm0 5a1 1 0 000 2h8a1 1 0 100-2H6z"
|
|
||||||
clip-rule="evenodd"
|
|
||||||
></path>
|
|
||||||
</svg>
|
|
||||||
|
|
||||||
<slot v-if="showCalendarIcon && hasIconSlot" name="icon" />
|
|
||||||
|
|
||||||
<FlatPickr
|
|
||||||
ref="dp"
|
|
||||||
v-model="date"
|
v-model="date"
|
||||||
v-bind="$attrs"
|
:mode="mode"
|
||||||
:disabled="disabled"
|
:is24hr="time24hr"
|
||||||
:config="config"
|
class="w-full"
|
||||||
:class="[defaultInputClass, inputInvalidClass, inputDisabledClass]"
|
color="indigo"
|
||||||
/>
|
:input-debounce="500"
|
||||||
|
:update-on-input="false"
|
||||||
|
:is-range="false"
|
||||||
|
trim-weeks
|
||||||
|
:is-required="isRequired"
|
||||||
|
:popover="{
|
||||||
|
visibility: disabled ? 'hidden' : 'focus',
|
||||||
|
showDelay: 0,
|
||||||
|
hideDelay: 1,
|
||||||
|
}"
|
||||||
|
:attributes="attrs"
|
||||||
|
:model-config="config"
|
||||||
|
:masks="masks"
|
||||||
|
:locale="global.locale"
|
||||||
|
>
|
||||||
|
<template
|
||||||
|
#default="{ inputValue, inputEvents, togglePopover, hidePopover }"
|
||||||
|
>
|
||||||
|
<!-- calendar icon -->
|
||||||
|
<svg
|
||||||
|
v-if="showCalendarIcon && !hasIconSlot"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
fill="currentColor"
|
||||||
|
class="
|
||||||
|
absolute
|
||||||
|
w-4
|
||||||
|
h-4
|
||||||
|
mx-2
|
||||||
|
my-2.5
|
||||||
|
text-sm
|
||||||
|
not-italic
|
||||||
|
font-black
|
||||||
|
text-gray-400
|
||||||
|
cursor-pointer
|
||||||
|
"
|
||||||
|
@click="togglePopover()"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
d="M6 2a1 1 0 00-1 1v1H4a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2h-1V3a1 1 0 10-2 0v1H7V3a1 1 0 00-1-1zm0 5a1 1 0 000 2h8a1 1 0 100-2H6z"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
></path>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<slot v-if="showCalendarIcon && hasIconSlot" name="icon" />
|
||||||
|
|
||||||
|
<input
|
||||||
|
:value="inputValue"
|
||||||
|
:class="[defaultInputClass, inputInvalidClass, inputDisabledClass]"
|
||||||
|
readonly
|
||||||
|
v-on="inputEvents"
|
||||||
|
@blur="hidePopover()"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template v-if="showExtraOptions" #footer>
|
||||||
|
<div
|
||||||
|
class="bg-gray-100 grid grid-cols-3 gap-2 p-2 border-t rounded-b-lg"
|
||||||
|
>
|
||||||
|
<button type="button" class="extra-button" @click="moveToDate(sourceDate)">
|
||||||
|
{{ global.t('date_picker.same_day') }}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button type="button" class="extra-button" @click="withInDays(7)">
|
||||||
|
{{ global.t('date_picker.within_7_days') }}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button type="button" class="extra-button" @click="withInDays(15)">
|
||||||
|
{{ global.t('date_picker.within_15_days') }}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button type="button" class="extra-button" @click="withInDays(30)">
|
||||||
|
{{ global.t('date_picker.within_30_days') }}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button type="button" class="extra-button" @click="withInDays(45)">
|
||||||
|
{{ global.t('date_picker.within_45_days') }}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button type="button" class="extra-button" @click="withInDays(60)">
|
||||||
|
{{ global.t('date_picker.within_60_days') }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</date-picker>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script type="text/babel" setup>
|
<script type="text/babel" setup>
|
||||||
import FlatPickr from 'vue-flatpickr-component'
|
import { Calendar, DatePicker } from 'v-calendar'
|
||||||
import 'flatpickr/dist/flatpickr.css'
|
import 'v-calendar/dist/style.css'
|
||||||
import { computed, reactive, watch, ref, useSlots } from 'vue'
|
import { computed, reactive, watch, ref, useSlots } from 'vue'
|
||||||
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
||||||
|
import moment from 'moment'
|
||||||
const dp = ref(null)
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
modelValue: {
|
modelValue: {
|
||||||
@ -90,36 +146,31 @@ const props = defineProps({
|
|||||||
defaultInputClass: {
|
defaultInputClass: {
|
||||||
type: String,
|
type: String,
|
||||||
default:
|
default:
|
||||||
'font-base pl-8 py-2 outline-none focus:ring-primary-400 focus:outline-none focus:border-primary-400 block w-full sm:text-sm border-gray-200 rounded-md text-black',
|
'border-2 font-base pl-8 py-2 outline-none focus:ring-primary-400 focus:outline-none focus:border-primary-400 block w-full sm:text-sm border-gray-200 rounded-md text-black',
|
||||||
},
|
},
|
||||||
time24hr: {
|
time24hr: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
isRequired: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
showExtraOptions: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
sourceDate: {
|
||||||
|
type: [String, Date],
|
||||||
|
default: () => new Date(),
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const emit = defineEmits(['update:modelValue'])
|
const emit = defineEmits(['update:modelValue'])
|
||||||
|
|
||||||
const slots = useSlots()
|
const slots = useSlots()
|
||||||
|
|
||||||
const companyStore = useCompanyStore()
|
const companyStore = useCompanyStore()
|
||||||
|
const { global } = window.i18n
|
||||||
let config = reactive({
|
const vCalendar = ref(null)
|
||||||
altInput: true,
|
|
||||||
enableTime: props.enableTime,
|
|
||||||
time_24hr: props.time24hr,
|
|
||||||
})
|
|
||||||
|
|
||||||
const date = computed({
|
|
||||||
get: () => props.modelValue,
|
|
||||||
set: (value) => {
|
|
||||||
emit('update:modelValue', value)
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const carbonFormat = computed(() => {
|
|
||||||
return companyStore.selectedCompanySettings?.carbon_date_format
|
|
||||||
})
|
|
||||||
|
|
||||||
const hasIconSlot = computed(() => {
|
const hasIconSlot = computed(() => {
|
||||||
return !!slots.icon
|
return !!slots.icon
|
||||||
@ -135,7 +186,6 @@ const inputInvalidClass = computed(() => {
|
|||||||
if (props.invalid) {
|
if (props.invalid) {
|
||||||
return 'border-red-400 ring-red-400 focus:ring-red-400 focus:border-red-400'
|
return 'border-red-400 ring-red-400 focus:ring-red-400 focus:border-red-400'
|
||||||
}
|
}
|
||||||
|
|
||||||
return ''
|
return ''
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -143,35 +193,97 @@ const inputDisabledClass = computed(() => {
|
|||||||
if (props.disabled) {
|
if (props.disabled) {
|
||||||
return 'border border-solid rounded-md outline-none input-field box-border-2 base-date-picker-input placeholder-gray-400 bg-gray-200 text-gray-600 border-gray-200'
|
return 'border border-solid rounded-md outline-none input-field box-border-2 base-date-picker-input placeholder-gray-400 bg-gray-200 text-gray-600 border-gray-200'
|
||||||
}
|
}
|
||||||
|
|
||||||
return ''
|
return ''
|
||||||
})
|
})
|
||||||
|
|
||||||
function onClickDp(params) {
|
// to convert YYYY-MM-DD | YYYY-MM-DD HH:mm format
|
||||||
dp.value.fp.open()
|
function convertYMDFormat(date) {
|
||||||
|
let format = props.enableTime ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD'
|
||||||
|
return date ? moment(date).format(format) : date
|
||||||
}
|
}
|
||||||
|
|
||||||
watch(
|
const date = computed({
|
||||||
() => props.enableTime,
|
get: () => props.modelValue,
|
||||||
(val) => {
|
set: (value) => {
|
||||||
if (props.enableTime) {
|
emit('update:modelValue', value)
|
||||||
config.enableTime = props.enableTime
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{ immediate: true }
|
})
|
||||||
)
|
|
||||||
|
const mode = computed(() => {
|
||||||
|
return props.enableTime ? 'dateTime' : 'date'
|
||||||
|
})
|
||||||
|
|
||||||
|
const config = reactive({
|
||||||
|
type: 'string',
|
||||||
|
mask: 'YYYY-MM-DD', // Uses 'iso' if missing
|
||||||
|
//timeAdjust: '00:00:00',
|
||||||
|
})
|
||||||
|
|
||||||
|
const masks = reactive({
|
||||||
|
input: null,
|
||||||
|
inputDateTime: null,
|
||||||
|
inputDateTime24hr: null,
|
||||||
|
})
|
||||||
|
|
||||||
|
const attrs = reactive([
|
||||||
|
{
|
||||||
|
dates: new Date(),
|
||||||
|
highlight: {
|
||||||
|
fillMode: 'outline',
|
||||||
|
},
|
||||||
|
/* popover: {
|
||||||
|
label: 'Today Date',
|
||||||
|
visibility: 'hover',
|
||||||
|
}, */
|
||||||
|
},
|
||||||
|
])
|
||||||
|
|
||||||
|
const carbonFormat = computed(() => {
|
||||||
|
return companyStore.selectedCompanySettings?.moment_date_format
|
||||||
|
})
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => carbonFormat,
|
() => carbonFormat,
|
||||||
() => {
|
() => {
|
||||||
if (!props.enableTime) {
|
if (!props.enableTime) {
|
||||||
config.altFormat = carbonFormat.value ? carbonFormat.value : 'd M Y'
|
masks.input = carbonFormat.value ? carbonFormat.value : 'DD MMM YYYY'
|
||||||
|
config.mask = 'YYYY-MM-DD'
|
||||||
} else {
|
} else {
|
||||||
config.altFormat = carbonFormat.value
|
let timeFormat = 'HH:mm'
|
||||||
? `${carbonFormat.value} H:i `
|
if (props.time24hr) {
|
||||||
: 'd M Y H:i'
|
masks.inputDateTime24hr = carbonFormat.value
|
||||||
|
? `${carbonFormat.value} ${timeFormat}`
|
||||||
|
: `DD MMM YYYY ${timeFormat}`
|
||||||
|
} else {
|
||||||
|
masks.inputDateTime = carbonFormat.value
|
||||||
|
? `${carbonFormat.value} ${timeFormat}`
|
||||||
|
: `DD MMM YYYY ${timeFormat}`
|
||||||
|
}
|
||||||
|
config.mask = `YYYY-MM-DD ${timeFormat}`
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ immediate: true }
|
{ immediate: true }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
async function moveToDate(_date) {
|
||||||
|
const calendar = vCalendar.value
|
||||||
|
_date = _date ? _date : convertYMDFormat(new Date())
|
||||||
|
date.value = _date
|
||||||
|
// await calendar.move(_date)
|
||||||
|
calendar.hidePopover()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function withInDays(noOfDays) {
|
||||||
|
if (!noOfDays) return false
|
||||||
|
|
||||||
|
let newDate = moment(props.sourceDate).add(noOfDays, 'days').toDate()
|
||||||
|
newDate = convertYMDFormat(newDate)
|
||||||
|
moveToDate(newDate)
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.extra-button {
|
||||||
|
@apply bg-primary-500 text-white text-sm font-semibold px-2 py-1 rounded hover:bg-primary-700;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@ -30,8 +30,13 @@
|
|||||||
leave-to="opacity-0"
|
leave-to="opacity-0"
|
||||||
>
|
>
|
||||||
<DialogOverlay
|
<DialogOverlay
|
||||||
class="fixed inset-0 transition-opacity bg-gray-500 bg-opacity-75"
|
class="fixed inset-0 transition-opacity bg-gray-500 bg-opacity-75 dark:backdrop-blur-xl dark:bg-gray-900/80"
|
||||||
|
>
|
||||||
|
<BaseDarkHighlight
|
||||||
|
class="!bg-highlight/[.17] !top-1/2 h-60 -translate-y-1/2 mt-5"
|
||||||
|
:class="dialogSizeClasses"
|
||||||
/>
|
/>
|
||||||
|
</DialogOverlay>
|
||||||
</TransitionChild>
|
</TransitionChild>
|
||||||
|
|
||||||
<!-- This element is to trick the browser into centering the modal contents. -->
|
<!-- This element is to trick the browser into centering the modal contents. -->
|
||||||
@ -64,6 +69,11 @@
|
|||||||
shadow-xl
|
shadow-xl
|
||||||
sm:my-8 sm:align-middle sm:w-full sm:p-6
|
sm:my-8 sm:align-middle sm:w-full sm:p-6
|
||||||
relative
|
relative
|
||||||
|
dark:backdrop-blur-xl
|
||||||
|
dark:shadow-glass
|
||||||
|
dark:border
|
||||||
|
dark:border-white/10
|
||||||
|
dark:bg-gray-800
|
||||||
"
|
"
|
||||||
:class="dialogSizeClasses"
|
:class="dialogSizeClasses"
|
||||||
>
|
>
|
||||||
@ -80,31 +90,31 @@
|
|||||||
rounded-full
|
rounded-full
|
||||||
"
|
"
|
||||||
:class="{
|
:class="{
|
||||||
'bg-green-100': dialogStore.variant === 'primary',
|
'bg-green-100 dark:bg-primary-500': dialogStore.variant === 'primary',
|
||||||
'bg-red-100': dialogStore.variant === 'danger',
|
'bg-red-100 dark:bg-red-500': dialogStore.variant === 'danger',
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
v-if="dialogStore.variant === 'primary'"
|
v-if="dialogStore.variant === 'primary'"
|
||||||
name="CheckIcon"
|
name="CheckIcon"
|
||||||
class="w-6 h-6 text-green-600"
|
class="w-6 h-6 text-green-600 dark:text-white"
|
||||||
/>
|
/>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
v-else
|
v-else
|
||||||
name="ExclamationIcon"
|
name="ExclamationIcon"
|
||||||
class="w-6 h-6 text-red-600"
|
class="w-6 h-6 text-red-600 dark:text-white"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-3 text-center sm:mt-5">
|
<div class="mt-3 text-center sm:mt-5">
|
||||||
<DialogTitle
|
<DialogTitle
|
||||||
as="h3"
|
as="h3"
|
||||||
class="text-lg font-medium leading-6 text-gray-900"
|
class="text-lg font-medium leading-6 text-gray-900 dark:text-white"
|
||||||
>
|
>
|
||||||
{{ dialogStore.title }}
|
{{ dialogStore.title }}
|
||||||
</DialogTitle>
|
</DialogTitle>
|
||||||
<div class="mt-2">
|
<div class="mt-2">
|
||||||
<p class="text-sm text-gray-500">
|
<p class="text-sm text-gray-500 dark:text-gray-400">
|
||||||
{{ dialogStore.message }}
|
{{ dialogStore.message }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
leave-from-class="opacity-100"
|
leave-from-class="opacity-100"
|
||||||
leave-to-class="opacity-0"
|
leave-to-class="opacity-0"
|
||||||
>
|
>
|
||||||
<div v-show="show" class="relative z-10 p-4 md:p-8 bg-gray-200 rounded">
|
<div v-show="show" class="relative z-10 p-4 md:p-8 bg-gray-200 rounded dark:bg-gray-800">
|
||||||
<slot name="filter-header" />
|
<slot name="filter-header" />
|
||||||
|
|
||||||
<label
|
<label
|
||||||
@ -20,6 +20,7 @@
|
|||||||
hover:text-gray-700
|
hover:text-gray-700
|
||||||
top-2.5
|
top-2.5
|
||||||
right-3.5
|
right-3.5
|
||||||
|
dark:text-gray-300
|
||||||
"
|
"
|
||||||
@click="$emit('clear')"
|
@click="$emit('clear')"
|
||||||
>
|
>
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="flex flex-wrap justify-between">
|
<div class="flex flex-wrap justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h3 class="text-2xl font-bold text-left text-black">
|
<h3 class="text-2xl font-bold text-left text-black dark:text-white">
|
||||||
{{ title }}
|
{{ title }}
|
||||||
</h3>
|
</h3>
|
||||||
<slot />
|
<slot />
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
<Switch
|
<Switch
|
||||||
v-model="enabled"
|
v-model="enabled"
|
||||||
:class="enabled ? 'bg-primary-500' : 'bg-gray-300'"
|
:class="enabled ? 'bg-primary-500' : 'bg-gray-300 dark:bg-gray-900'"
|
||||||
class="
|
class="
|
||||||
relative
|
relative
|
||||||
inline-flex
|
inline-flex
|
||||||
@ -21,7 +21,11 @@
|
|||||||
v-bind="$attrs"
|
v-bind="$attrs"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
:class="enabled ? 'translate-x-6' : 'translate-x-1'"
|
:class="
|
||||||
|
enabled
|
||||||
|
? 'translate-x-6 dark:bg-white'
|
||||||
|
: 'translate-x-1 dark:bg-gray-500'
|
||||||
|
"
|
||||||
class="
|
class="
|
||||||
inline-block
|
inline-block
|
||||||
w-4
|
w-4
|
||||||
|
|||||||
@ -5,12 +5,12 @@
|
|||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<SwitchLabel
|
<SwitchLabel
|
||||||
as="p"
|
as="p"
|
||||||
class="p-0 mb-1 text-sm leading-snug text-black font-medium"
|
class="p-0 mb-1 text-sm leading-snug text-black font-medium dark:text-white"
|
||||||
passive
|
passive
|
||||||
>
|
>
|
||||||
{{ title }}
|
{{ title }}
|
||||||
</SwitchLabel>
|
</SwitchLabel>
|
||||||
<SwitchDescription class="text-sm text-gray-500">
|
<SwitchDescription class="text-sm text-gray-500 dark:text-gray-400">
|
||||||
{{ description }}
|
{{ description }}
|
||||||
</SwitchDescription>
|
</SwitchDescription>
|
||||||
</div>
|
</div>
|
||||||
@ -18,7 +18,7 @@
|
|||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
:model-value="modelValue"
|
:model-value="modelValue"
|
||||||
:class="[
|
:class="[
|
||||||
modelValue ? 'bg-primary-500' : 'bg-gray-200',
|
modelValue ? 'bg-primary-500' : 'bg-gray-200 dark:bg-gray-900',
|
||||||
'ml-4 relative inline-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',
|
'ml-4 relative inline-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',
|
||||||
]"
|
]"
|
||||||
@update:modelValue="onUpdate"
|
@update:modelValue="onUpdate"
|
||||||
@ -26,7 +26,7 @@
|
|||||||
<span
|
<span
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
:class="[
|
:class="[
|
||||||
modelValue ? 'translate-x-5' : 'translate-x-0',
|
modelValue ? 'translate-x-5 dark:bg-white' : 'translate-x-0 dark:bg-gray-500',
|
||||||
'inline-block h-5 w-5 rounded-full bg-white shadow ring-0 transition ease-in-out duration-200',
|
'inline-block h-5 w-5 rounded-full bg-white shadow ring-0 transition ease-in-out duration-200',
|
||||||
]"
|
]"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -1,6 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<TabGroup :default-index="defaultIndex" @change="onChange">
|
<TabGroup
|
||||||
|
:selected-index="selectedIndex"
|
||||||
|
:default-index="defaultIndex"
|
||||||
|
@change="onChange"
|
||||||
|
>
|
||||||
<TabList
|
<TabList
|
||||||
:class="[
|
:class="[
|
||||||
'flex border-b border-grey-light',
|
'flex border-b border-grey-light',
|
||||||
@ -54,6 +58,10 @@ const props = defineProps({
|
|||||||
type: Number,
|
type: Number,
|
||||||
default: 0,
|
default: 0,
|
||||||
},
|
},
|
||||||
|
selectedIndex: {
|
||||||
|
type: Number,
|
||||||
|
default: 0,
|
||||||
|
},
|
||||||
filter: {
|
filter: {
|
||||||
type: String,
|
type: String,
|
||||||
default: null,
|
default: null,
|
||||||
@ -67,6 +75,6 @@ const slots = useSlots()
|
|||||||
const tabs = computed(() => slots.default().map((tab) => tab.props))
|
const tabs = computed(() => slots.default().map((tab) => tab.props))
|
||||||
|
|
||||||
function onChange(d) {
|
function onChange(d) {
|
||||||
emit('change', tabs.value[d])
|
emit('change', tabs.value[d], d)
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -7,12 +7,12 @@ export function usePopper(options) {
|
|||||||
let popper = ref(null)
|
let popper = ref(null)
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
watchEffect(onInvalidate => {
|
watchEffect((onInvalidate) => {
|
||||||
if (!container.value) return
|
if (!container.value) return
|
||||||
if (!activator.value) return
|
if (!activator.value) return
|
||||||
|
|
||||||
let containerEl = container.value.el || container.value
|
let containerEl = container.value.el || container.value
|
||||||
let activatorEl = activator.value.el || activator.value
|
let activatorEl = activator.value.$el || activator.value
|
||||||
|
|
||||||
if (!(activatorEl instanceof HTMLElement)) return
|
if (!(activatorEl instanceof HTMLElement)) return
|
||||||
if (!(containerEl instanceof HTMLElement)) return
|
if (!(containerEl instanceof HTMLElement)) return
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
"customers": "العملاء",
|
"customers": "العملاء",
|
||||||
"items": "بضائع/خدمات",
|
"items": "بضائع/خدمات",
|
||||||
"invoices": "الفواتير",
|
"invoices": "الفواتير",
|
||||||
"recurring-invoices": "الفواتير المتكررة",
|
"recurring-invoices": "Recurring Invoices",
|
||||||
"expenses": "النفقات",
|
"expenses": "النفقات",
|
||||||
"estimates": "التقديرات",
|
"estimates": "التقديرات",
|
||||||
"payments": "الدفوعات",
|
"payments": "الدفوعات",
|
||||||
@ -12,7 +12,7 @@
|
|||||||
"settings": "الإعدادات",
|
"settings": "الإعدادات",
|
||||||
"logout": "تسجيل الخروج",
|
"logout": "تسجيل الخروج",
|
||||||
"users": "المستخدمون",
|
"users": "المستخدمون",
|
||||||
"modules": "الإضافات"
|
"modules": "Modules"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add_company": "أضف شركة",
|
"add_company": "أضف شركة",
|
||||||
@ -29,9 +29,9 @@
|
|||||||
"to_date": "إلى تاريخ",
|
"to_date": "إلى تاريخ",
|
||||||
"from": "من",
|
"from": "من",
|
||||||
"to": "إلى",
|
"to": "إلى",
|
||||||
"ok": "حسناً",
|
"ok": "Ok",
|
||||||
"yes": "نعم",
|
"yes": "Yes",
|
||||||
"no": "لا",
|
"no": "No",
|
||||||
"sort_by": "ترتيب حسب",
|
"sort_by": "ترتيب حسب",
|
||||||
"ascending": "تصاعدي",
|
"ascending": "تصاعدي",
|
||||||
"descending": "تنازلي",
|
"descending": "تنازلي",
|
||||||
@ -39,7 +39,7 @@
|
|||||||
"body": "الجسم",
|
"body": "الجسم",
|
||||||
"message": "رسالة",
|
"message": "رسالة",
|
||||||
"send": "إرسال",
|
"send": "إرسال",
|
||||||
"preview": "معاينة",
|
"preview": "Preview",
|
||||||
"go_back": "إلى الخلف",
|
"go_back": "إلى الخلف",
|
||||||
"back_to_login": "العودة إلى تسجيل الدخول؟",
|
"back_to_login": "العودة إلى تسجيل الدخول؟",
|
||||||
"home": "الرئيسية",
|
"home": "الرئيسية",
|
||||||
@ -65,7 +65,7 @@
|
|||||||
"sent": "ارسلت",
|
"sent": "ارسلت",
|
||||||
"all": "الكل",
|
"all": "الكل",
|
||||||
"select_all": "تحديد الكل",
|
"select_all": "تحديد الكل",
|
||||||
"select_template": "تحديد القالب",
|
"select_template": "Select Template",
|
||||||
"choose_file": "اضغط هنا لاختيار ملف",
|
"choose_file": "اضغط هنا لاختيار ملف",
|
||||||
"choose_template": "اختيار القالب",
|
"choose_template": "اختيار القالب",
|
||||||
"choose": "اختر",
|
"choose": "اختر",
|
||||||
@ -93,14 +93,14 @@
|
|||||||
"no_note_found": "لم يتم العثور على الملاحظة",
|
"no_note_found": "لم يتم العثور على الملاحظة",
|
||||||
"insert_note": "أدخل ملاحظة",
|
"insert_note": "أدخل ملاحظة",
|
||||||
"copied_pdf_url_clipboard": "تم نسخ رابط PDF إلى الحافظة!",
|
"copied_pdf_url_clipboard": "تم نسخ رابط PDF إلى الحافظة!",
|
||||||
"copied_url_clipboard": "تم نسخ الرابط إلى الحافظة!",
|
"copied_url_clipboard": "Copied url to clipboard!",
|
||||||
"docs": "المستندات",
|
"docs": "Docs",
|
||||||
"do_you_wish_to_continue": "هل ترغب في المتابعة؟",
|
"do_you_wish_to_continue": "Do you wish to continue?",
|
||||||
"note": "ملاحظة",
|
"note": "Note",
|
||||||
"pay_invoice": "سدد الفاتورة",
|
"pay_invoice": "Pay Invoice",
|
||||||
"login_successfully": "تم تسجيل الدخول بنجاح!",
|
"login_successfully": "Logged in successfully!",
|
||||||
"logged_out_successfully": "تم تسجيل الخروج",
|
"logged_out_successfully": "Logged out successfully",
|
||||||
"mark_as_default": "تحديد كافتراضي"
|
"mark_as_default": "Mark as default"
|
||||||
},
|
},
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"select_year": "اختر السنة",
|
"select_year": "اختر السنة",
|
||||||
@ -109,7 +109,7 @@
|
|||||||
"customers": "العملاء",
|
"customers": "العملاء",
|
||||||
"invoices": "الفواتير",
|
"invoices": "الفواتير",
|
||||||
"estimates": "التقديرات",
|
"estimates": "التقديرات",
|
||||||
"payments": "المدفوعات"
|
"payments": "Payments"
|
||||||
},
|
},
|
||||||
"chart_info": {
|
"chart_info": {
|
||||||
"total_sales": "المبيعات",
|
"total_sales": "المبيعات",
|
||||||
@ -151,27 +151,27 @@
|
|||||||
"no_results_found": "لم يتم العثور على نتائج"
|
"no_results_found": "لم يتم العثور على نتائج"
|
||||||
},
|
},
|
||||||
"company_switcher": {
|
"company_switcher": {
|
||||||
"label": "تبديل الشركة",
|
"label": "SWITCH COMPANY",
|
||||||
"no_results_found": "لا توجد نتائج",
|
"no_results_found": "No Results Found",
|
||||||
"add_new_company": "إضافة شركة جديدة",
|
"add_new_company": "Add new company",
|
||||||
"new_company": "شركة جديدة",
|
"new_company": "New company",
|
||||||
"created_message": "تم إنشاء الشركة بنجاح"
|
"created_message": "Company created successfully"
|
||||||
},
|
},
|
||||||
"dateRange": {
|
"dateRange": {
|
||||||
"today": "اليوم",
|
"today": "Today",
|
||||||
"this_week": "هذا الاسبوع",
|
"this_week": "This Week",
|
||||||
"this_month": "هذا الشهر",
|
"this_month": "This Month",
|
||||||
"this_quarter": "هذا الربع",
|
"this_quarter": "This Quarter",
|
||||||
"this_year": "هذه السنة",
|
"this_year": "This Year",
|
||||||
"previous_week": "الأسبوع السابق",
|
"previous_week": "Previous Week",
|
||||||
"previous_month": "الشهر الماضي",
|
"previous_month": "Previous Month",
|
||||||
"previous_quarter": "الربع السابق",
|
"previous_quarter": "Previous Quarter",
|
||||||
"previous_year": "السنة الماضية",
|
"previous_year": "Previous Year",
|
||||||
"custom": "مخصص"
|
"custom": "Custom"
|
||||||
},
|
},
|
||||||
"customers": {
|
"customers": {
|
||||||
"title": "العملاء",
|
"title": "العملاء",
|
||||||
"prefix": "البادئة",
|
"prefix": "Prefix",
|
||||||
"add_customer": "إضافة عميل",
|
"add_customer": "إضافة عميل",
|
||||||
"contacts_list": "قائمة العملاء",
|
"contacts_list": "قائمة العملاء",
|
||||||
"name": "الاسم",
|
"name": "الاسم",
|
||||||
@ -186,9 +186,9 @@
|
|||||||
"phone": "الهاتف",
|
"phone": "الهاتف",
|
||||||
"website": "موقع الإنترنت",
|
"website": "موقع الإنترنت",
|
||||||
"overview": "استعراض",
|
"overview": "استعراض",
|
||||||
"invoice_prefix": "بادئة الفاتورة",
|
"invoice_prefix": "Invoice Prefix",
|
||||||
"estimate_prefix": "بادئة رقم التقدير",
|
"estimate_prefix": "Estimate Prefix",
|
||||||
"payment_prefix": "بادئة رقم الدفعة",
|
"payment_prefix": "Payment Prefix",
|
||||||
"enable_portal": "تفعيل البوابة",
|
"enable_portal": "تفعيل البوابة",
|
||||||
"country": "الدولة",
|
"country": "الدولة",
|
||||||
"state": "الولاية/المنطقة",
|
"state": "الولاية/المنطقة",
|
||||||
@ -197,7 +197,7 @@
|
|||||||
"added_on": "أضيف في",
|
"added_on": "أضيف في",
|
||||||
"action": "إجراء",
|
"action": "إجراء",
|
||||||
"password": "كلمة المرور",
|
"password": "كلمة المرور",
|
||||||
"confirm_password": "تأكيد كلمة المرور",
|
"confirm_password": "Confirm Password",
|
||||||
"street_number": "رقم الشارع",
|
"street_number": "رقم الشارع",
|
||||||
"primary_currency": "العملة الرئيسية",
|
"primary_currency": "العملة الرئيسية",
|
||||||
"description": "الوصف",
|
"description": "الوصف",
|
||||||
@ -208,10 +208,10 @@
|
|||||||
"new_customer": "عميل جديد",
|
"new_customer": "عميل جديد",
|
||||||
"edit_customer": "تعديل عميل",
|
"edit_customer": "تعديل عميل",
|
||||||
"basic_info": "معلوات أساسية",
|
"basic_info": "معلوات أساسية",
|
||||||
"portal_access": "الوصول إلى بوابة العملاء",
|
"portal_access": "Portal Access",
|
||||||
"portal_access_text": "هل تريد السماح لهذا العميل بتسجيل الدخول إلى بوابة العملاء؟",
|
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||||
"portal_access_url": "رابط بوابة العملاء",
|
"portal_access_url": "Customer Portal Login URL",
|
||||||
"portal_access_url_help": "يرجى نسخ وإعادة إرسال عنوان URL أعلاه إلى الزبون لتوفير الوصول.",
|
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||||
"billing_address": "عنوان الفوترة",
|
"billing_address": "عنوان الفوترة",
|
||||||
"shipping_address": "عنوان الشحن",
|
"shipping_address": "عنوان الشحن",
|
||||||
"copy_billing_address": "نسخ من عنوان الفوترة",
|
"copy_billing_address": "نسخ من عنوان الفوترة",
|
||||||
@ -231,9 +231,9 @@
|
|||||||
"confirm_delete": "لن تتمكن من استرداد هذا العميل وجميع الفواتير والتقديرات والمدفوعات ذات الصلة. | لن تتمكن من استرداد هؤلاء العملاء وجميع الفواتير والتقديرات والمدفوعات ذات الصلة.",
|
"confirm_delete": "لن تتمكن من استرداد هذا العميل وجميع الفواتير والتقديرات والمدفوعات ذات الصلة. | لن تتمكن من استرداد هؤلاء العملاء وجميع الفواتير والتقديرات والمدفوعات ذات الصلة.",
|
||||||
"created_message": "تم إنشاء العملاء بنجاح",
|
"created_message": "تم إنشاء العملاء بنجاح",
|
||||||
"updated_message": "تم تحديث العملاء بنجاح",
|
"updated_message": "تم تحديث العملاء بنجاح",
|
||||||
"address_updated_message": "تم تحديث العنوان بنجاح",
|
"address_updated_message": "Address Information Updated succesfully",
|
||||||
"deleted_message": "تم حذف العملاء بنجاح | تم حذف العميل بنجاح",
|
"deleted_message": "تم حذف العملاء بنجاح | تم حذف العميل بنجاح",
|
||||||
"edit_currency_not_allowed": "لا يمكن تغيير العملة بمجرد إنشاء معاملة."
|
"edit_currency_not_allowed": "Cannot change currency once transactions created."
|
||||||
},
|
},
|
||||||
"items": {
|
"items": {
|
||||||
"title": "الأصناف",
|
"title": "الأصناف",
|
||||||
@ -265,8 +265,8 @@
|
|||||||
},
|
},
|
||||||
"estimates": {
|
"estimates": {
|
||||||
"title": "التقديرات",
|
"title": "التقديرات",
|
||||||
"accept_estimate": "قبول التقدير",
|
"accept_estimate": "Accept Estimate",
|
||||||
"reject_estimate": "رفض التقدير",
|
"reject_estimate": "Reject Estimate",
|
||||||
"estimate": "تقدير | تقديرات",
|
"estimate": "تقدير | تقديرات",
|
||||||
"estimates_list": "قائمة التقديرات",
|
"estimates_list": "قائمة التقديرات",
|
||||||
"days": "{days} أيام",
|
"days": "{days} أيام",
|
||||||
@ -318,10 +318,10 @@
|
|||||||
},
|
},
|
||||||
"accepted": "مقبول",
|
"accepted": "مقبول",
|
||||||
"rejected": "مرفوض",
|
"rejected": "مرفوض",
|
||||||
"expired": "انتهت مدة الصلاحية",
|
"expired": "Expired",
|
||||||
"sent": "مرسل",
|
"sent": "مرسل",
|
||||||
"draft": "مسودة",
|
"draft": "مسودة",
|
||||||
"viewed": "تمت المشاهدة",
|
"viewed": "Viewed",
|
||||||
"declined": "مرفوض",
|
"declined": "مرفوض",
|
||||||
"new_estimate": "تقدير جديد",
|
"new_estimate": "تقدير جديد",
|
||||||
"add_new_estimate": "إضافة تقدير جديد",
|
"add_new_estimate": "إضافة تقدير جديد",
|
||||||
@ -355,14 +355,14 @@
|
|||||||
"select_an_item": "اكتب أو اختر الصنف",
|
"select_an_item": "اكتب أو اختر الصنف",
|
||||||
"type_item_description": "اكتب وصف الصنف (اختياري)"
|
"type_item_description": "اكتب وصف الصنف (اختياري)"
|
||||||
},
|
},
|
||||||
"mark_as_default_estimate_template_description": "في حالة التعفيل، سيتم اختيار القالب المحدد تلقائياً للتقديرات الجديدة."
|
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||||
},
|
},
|
||||||
"invoices": {
|
"invoices": {
|
||||||
"title": "الفواتير",
|
"title": "الفواتير",
|
||||||
"download": "تحميل",
|
"download": "Download",
|
||||||
"pay_invoice": "سدد الفاتورة",
|
"pay_invoice": "Pay Invoice",
|
||||||
"invoices_list": "قائمة الفواتير",
|
"invoices_list": "قائمة الفواتير",
|
||||||
"invoice_information": "معلومات الفاتورة",
|
"invoice_information": "Invoice Information",
|
||||||
"days": "{days} أيام",
|
"days": "{days} أيام",
|
||||||
"months": "{months} أشهر",
|
"months": "{months} أشهر",
|
||||||
"years": "{years} سنوات",
|
"years": "{years} سنوات",
|
||||||
@ -397,13 +397,13 @@
|
|||||||
"send_invoice": "إرسال الفاتورة",
|
"send_invoice": "إرسال الفاتورة",
|
||||||
"resend_invoice": "إعادة إرسال الفاتورة",
|
"resend_invoice": "إعادة إرسال الفاتورة",
|
||||||
"invoice_template": "قالب الفاتورة",
|
"invoice_template": "قالب الفاتورة",
|
||||||
"conversion_message": "تم استنساخ الفاتورة بنجاح",
|
"conversion_message": "Invoice cloned successful",
|
||||||
"template": "قالب",
|
"template": "قالب",
|
||||||
"mark_as_sent": "تحديد كمرسل",
|
"mark_as_sent": "تحديد كمرسل",
|
||||||
"confirm_send_invoice": "سيتم إرسال هذه الفاتورة بالبريد الألكتروني إلى العميل",
|
"confirm_send_invoice": "سيتم إرسال هذه الفاتورة بالبريد الألكتروني إلى العميل",
|
||||||
"invoice_mark_as_sent": "سيتم تحديد هذه الفاتورة كمرسلة",
|
"invoice_mark_as_sent": "سيتم تحديد هذه الفاتورة كمرسلة",
|
||||||
"confirm_mark_as_accepted": "سيتم تحديد هذه الفاتورة كمقبولة",
|
"confirm_mark_as_accepted": "This invoice will be marked as Accepted",
|
||||||
"confirm_mark_as_rejected": "سيتم تحديد هذه الفاتورة كمرفوضة",
|
"confirm_mark_as_rejected": "This invoice will be marked as Rejected",
|
||||||
"confirm_send": "سيتم إرسال هذه الفاتورة بالبريد الألكتروني إلى العميل",
|
"confirm_send": "سيتم إرسال هذه الفاتورة بالبريد الألكتروني إلى العميل",
|
||||||
"invoice_date": "تاريخ الفاتورة",
|
"invoice_date": "تاريخ الفاتورة",
|
||||||
"record_payment": "تسجيل مدفوعات",
|
"record_payment": "تسجيل مدفوعات",
|
||||||
@ -415,13 +415,13 @@
|
|||||||
"update_invoice": "تحديث الفاتورة",
|
"update_invoice": "تحديث الفاتورة",
|
||||||
"add_new_tax": "إضافة ضريبة جديدة",
|
"add_new_tax": "إضافة ضريبة جديدة",
|
||||||
"no_invoices": "لا يوجد فواتير حتى الآن!",
|
"no_invoices": "لا يوجد فواتير حتى الآن!",
|
||||||
"mark_as_rejected": "تحديد كمرفوض",
|
"mark_as_rejected": "Mark as rejected",
|
||||||
"mark_as_accepted": "تحديد كمقبول",
|
"mark_as_accepted": "Mark as accepted",
|
||||||
"list_of_invoices": "قائمة الفواتير .",
|
"list_of_invoices": "قائمة الفواتير .",
|
||||||
"select_invoice": "اختر الفاتورة",
|
"select_invoice": "اختر الفاتورة",
|
||||||
"no_matching_invoices": "لا يوجد فواتير مطابقة!",
|
"no_matching_invoices": "لا يوجد فواتير مطابقة!",
|
||||||
"mark_as_sent_successfully": "تم تحديد الفاتورة كمرسلة بنجاح",
|
"mark_as_sent_successfully": "تم تحديد الفاتورة كمرسلة بنجاح",
|
||||||
"invoice_sent_successfully": "تم إرسال الفاتورة بنجاح",
|
"invoice_sent_successfully": "Invoice sent successfully",
|
||||||
"cloned_successfully": "تم استنساخ الفاتورة بنجاح",
|
"cloned_successfully": "تم استنساخ الفاتورة بنجاح",
|
||||||
"clone_invoice": "استنساخ الفاتورة",
|
"clone_invoice": "استنساخ الفاتورة",
|
||||||
"confirm_clone": "سيتم استنساخ هذه الفاتورة في فاتورة جديدة",
|
"confirm_clone": "سيتم استنساخ هذه الفاتورة في فاتورة جديدة",
|
||||||
@ -447,14 +447,14 @@
|
|||||||
"marked_as_sent_message": "تم إرسال الفاتورة بنجاح",
|
"marked_as_sent_message": "تم إرسال الفاتورة بنجاح",
|
||||||
"something_went_wrong": "خطأ غير معروف!",
|
"something_went_wrong": "خطأ غير معروف!",
|
||||||
"invalid_due_amount_message": "المبلغ النهائي للفاتورة لا يمكن أن يكون أقل من المبلغ المطلوب لها. رجاءاً حدث الفاتورة أو قم بحذف المدفوعات المرتبطة بها للاستمرار.",
|
"invalid_due_amount_message": "المبلغ النهائي للفاتورة لا يمكن أن يكون أقل من المبلغ المطلوب لها. رجاءاً حدث الفاتورة أو قم بحذف المدفوعات المرتبطة بها للاستمرار.",
|
||||||
"mark_as_default_invoice_template_description": "في حالة التفعيل، سيتم اختيار القالب المحدد تلقائياً للفواتير الجديدة."
|
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||||
},
|
},
|
||||||
"recurring_invoices": {
|
"recurring_invoices": {
|
||||||
"title": "الفواتير المتكررة",
|
"title": "Recurring Invoices",
|
||||||
"invoices_list": "الفواتير المتكررة",
|
"invoices_list": "Recurring Invoices List",
|
||||||
"days": "{days} أيام",
|
"days": "{days} Days",
|
||||||
"months": "{months} أشهر",
|
"months": "{months} Month",
|
||||||
"years": "{years} سنوات",
|
"years": "{years} Year",
|
||||||
"all": "All",
|
"all": "All",
|
||||||
"paid": "Paid",
|
"paid": "Paid",
|
||||||
"unpaid": "Unpaid",
|
"unpaid": "Unpaid",
|
||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "تقدير",
|
"pdf_estimate_label": "تقدير",
|
||||||
"pdf_estimate_number": "رقم تقدير",
|
"pdf_estimate_number": "رقم تقدير",
|
||||||
"pdf_estimate_date": "تاريخ التقدير",
|
"pdf_estimate_date": "تاريخ التقدير",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "تاريخ انتهاء الصلاحية",
|
||||||
"pdf_invoice_label": "الفاتورة",
|
"pdf_invoice_label": "الفاتورة",
|
||||||
"pdf_invoice_number": "رقم الفاتورة",
|
"pdf_invoice_number": "رقم الفاتورة",
|
||||||
"pdf_invoice_date": "تاريخ الفاتورة",
|
"pdf_invoice_date": "تاريخ الفاتورة",
|
||||||
|
|||||||
@ -112,7 +112,7 @@
|
|||||||
"payments": "Platby"
|
"payments": "Platby"
|
||||||
},
|
},
|
||||||
"chart_info": {
|
"chart_info": {
|
||||||
"total_sales": "Prodeje",
|
"total_sales": "Slevy",
|
||||||
"total_receipts": "Doklady",
|
"total_receipts": "Doklady",
|
||||||
"total_expense": "Výdaje",
|
"total_expense": "Výdaje",
|
||||||
"net_income": "Čistý příjem",
|
"net_income": "Čistý příjem",
|
||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Odhad",
|
"pdf_estimate_label": "Odhad",
|
||||||
"pdf_estimate_number": "Číslo odhadu",
|
"pdf_estimate_number": "Číslo odhadu",
|
||||||
"pdf_estimate_date": "Datum odhadu",
|
"pdf_estimate_date": "Datum odhadu",
|
||||||
"pdf_estimate_expire_date": "Datum expirace",
|
"pdf_estimate_expire_date": "Doba platnosti",
|
||||||
"pdf_invoice_label": "Faktura",
|
"pdf_invoice_label": "Faktura",
|
||||||
"pdf_invoice_number": "Číslo faktury",
|
"pdf_invoice_number": "Číslo faktury",
|
||||||
"pdf_invoice_date": "Datum fakturace",
|
"pdf_invoice_date": "Datum fakturace",
|
||||||
@ -1495,7 +1495,7 @@
|
|||||||
"pdf_quantity_label": "Množství",
|
"pdf_quantity_label": "Množství",
|
||||||
"pdf_price_label": "Cena",
|
"pdf_price_label": "Cena",
|
||||||
"pdf_discount_label": "Sleva",
|
"pdf_discount_label": "Sleva",
|
||||||
"pdf_amount_label": "Částka",
|
"pdf_amount_label": "Množství",
|
||||||
"pdf_subtotal": "Mezisoučet",
|
"pdf_subtotal": "Mezisoučet",
|
||||||
"pdf_total": "Celkem",
|
"pdf_total": "Celkem",
|
||||||
"pdf_payment_label": "Platba",
|
"pdf_payment_label": "Platba",
|
||||||
|
|||||||
@ -688,7 +688,7 @@
|
|||||||
"other_modules": "Weitere Module",
|
"other_modules": "Weitere Module",
|
||||||
"view_all": "Alle Anzeigen",
|
"view_all": "Alle Anzeigen",
|
||||||
"no_reviews_found": "Für dieses Modul gibt es noch keine Bewertungen!",
|
"no_reviews_found": "Für dieses Modul gibt es noch keine Bewertungen!",
|
||||||
"module_not_purchased": "Modul noch nicht erworben",
|
"module_not_purchased": "Module Not Purchased",
|
||||||
"module_not_found": "Modul nicht gefunden",
|
"module_not_found": "Modul nicht gefunden",
|
||||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||||
"last_updated": "Zuletzt aktualisiert am",
|
"last_updated": "Zuletzt aktualisiert am",
|
||||||
@ -1113,7 +1113,7 @@
|
|||||||
"default_currency_error": "Diese Währung wird bereits in einem der aktiven Anbieter verwendet",
|
"default_currency_error": "Diese Währung wird bereits in einem der aktiven Anbieter verwendet",
|
||||||
"exchange_help_text": "Wechselkurs eingeben um von {currency} nach {baseCurrency} zu konvertieren",
|
"exchange_help_text": "Wechselkurs eingeben um von {currency} nach {baseCurrency} zu konvertieren",
|
||||||
"currency_freak": "CurrencyFreaks",
|
"currency_freak": "CurrencyFreaks",
|
||||||
"currency_layer": "Währungsebene",
|
"currency_layer": "Currency Layer",
|
||||||
"open_exchange_rate": "Open Exchange Rate",
|
"open_exchange_rate": "Open Exchange Rate",
|
||||||
"currency_converter": "Währungsumrechner",
|
"currency_converter": "Währungsumrechner",
|
||||||
"server": "Server",
|
"server": "Server",
|
||||||
@ -1150,8 +1150,8 @@
|
|||||||
"payment_mode_added": "Zahlungsart hinzugefügt",
|
"payment_mode_added": "Zahlungsart hinzugefügt",
|
||||||
"payment_mode_updated": "Zahlungsart aktualisiert",
|
"payment_mode_updated": "Zahlungsart aktualisiert",
|
||||||
"payment_mode_confirm_delete": "Sie werden diese Zahlungsart nicht wiederherstellen können",
|
"payment_mode_confirm_delete": "Sie werden diese Zahlungsart nicht wiederherstellen können",
|
||||||
"payments_attached": "Diese Zahlungsmethode ist bereits mit Zahlungen verknüpft. Bitte löschen Sie die angehängten Zahlungen, um mit der Löschung fortzufahren.",
|
"payments_attached": "This payment method is already attached to payments. Please delete the attached payments to proceed with deletion.",
|
||||||
"expenses_attached": "Diese Zahlungsmethode ist bereits mit Ausgaben verknüpft. Bitte löschen Sie die angehängten Ausgaben, um mit der Löschung fortzufahren.",
|
"expenses_attached": "This payment method is already attached to expenses. Please delete the attached expenses to proceed with deletion.",
|
||||||
"deleted_message": "Zahlungsart erfolgreich gelöscht"
|
"deleted_message": "Zahlungsart erfolgreich gelöscht"
|
||||||
},
|
},
|
||||||
"expense_category": {
|
"expense_category": {
|
||||||
@ -1179,7 +1179,7 @@
|
|||||||
"discount_per_item": "Rabatt pro Artikel ",
|
"discount_per_item": "Rabatt pro Artikel ",
|
||||||
"discount_setting_description": "Aktivieren Sie diese Option, wenn Sie einzelnen Rechnungspositionen einen Rabatt hinzufügen möchten. Standardmäßig wird der Rabatt direkt zur Rechnung hinzugefügt.",
|
"discount_setting_description": "Aktivieren Sie diese Option, wenn Sie einzelnen Rechnungspositionen einen Rabatt hinzufügen möchten. Standardmäßig wird der Rabatt direkt zur Rechnung hinzugefügt.",
|
||||||
"expire_public_links": "Öffentliche Links automatisch ablaufen lassen",
|
"expire_public_links": "Öffentliche Links automatisch ablaufen lassen",
|
||||||
"expire_setting_description": "Geben Sie an, ob Sie alle von der Anwendung gesendeten Links zur Ansicht von Rechnungen, Kostenvoranschlägen und Zahlungen usw. nach einer bestimmten Zeit ablaufen lassen möchten.",
|
"expire_setting_description": "Specify whether you would like to expire all the links sent by application to view invoices, estimates & payments, etc after a specified duration.",
|
||||||
"save": "Speichern",
|
"save": "Speichern",
|
||||||
"preference": "Präferenz | Präferenzen",
|
"preference": "Präferenz | Präferenzen",
|
||||||
"general_settings": "Standardeinstellungen für das System.",
|
"general_settings": "Standardeinstellungen für das System.",
|
||||||
@ -1272,14 +1272,14 @@
|
|||||||
"do_spaces_secret": "Do Spaces Secret",
|
"do_spaces_secret": "Do Spaces Secret",
|
||||||
"do_spaces_region": "Do Spaced Region",
|
"do_spaces_region": "Do Spaced Region",
|
||||||
"do_spaces_bucket": "Do Spaces Bucket",
|
"do_spaces_bucket": "Do Spaces Bucket",
|
||||||
"do_spaces_endpoint": "Do Spaces Endpunkt",
|
"do_spaces_endpoint": "Do Spaces Endpoint",
|
||||||
"do_spaces_root": "Do Spaced Root",
|
"do_spaces_root": "Do Spaced Root",
|
||||||
"dropbox_type": "Dropbox Typ",
|
"dropbox_type": "Dropbox Typ",
|
||||||
"dropbox_token": "Dropbox Token",
|
"dropbox_token": "Dropbox Token",
|
||||||
"dropbox_key": "Dropbox Schlüssel",
|
"dropbox_key": "Dropbox Schlüssel",
|
||||||
"dropbox_secret": "Dropbox Secret",
|
"dropbox_secret": "Dropbox Secret",
|
||||||
"dropbox_app": "Dropbox App",
|
"dropbox_app": "Dropbox App",
|
||||||
"dropbox_root": "Dropbox Root Verzeichnis",
|
"dropbox_root": "Dropbox Root",
|
||||||
"default_driver": "Standard-Treiber",
|
"default_driver": "Standard-Treiber",
|
||||||
"is_default": "Standard",
|
"is_default": "Standard",
|
||||||
"set_default_disk": "Als Standard festlegen",
|
"set_default_disk": "Als Standard festlegen",
|
||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Angebot",
|
"pdf_estimate_label": "Angebot",
|
||||||
"pdf_estimate_number": "Angebotsnummer",
|
"pdf_estimate_number": "Angebotsnummer",
|
||||||
"pdf_estimate_date": "Angebotsdatum",
|
"pdf_estimate_date": "Angebotsdatum",
|
||||||
"pdf_estimate_expire_date": "Zahlungsziel",
|
"pdf_estimate_expire_date": "Gültig bis",
|
||||||
"pdf_invoice_label": "Rechnung",
|
"pdf_invoice_label": "Rechnung",
|
||||||
"pdf_invoice_number": "Rechnungsnummer",
|
"pdf_invoice_number": "Rechnungsnummer",
|
||||||
"pdf_invoice_date": "Rechnungsdatum",
|
"pdf_invoice_date": "Rechnungsdatum",
|
||||||
|
|||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Εκτίμηση",
|
"pdf_estimate_label": "Εκτίμηση",
|
||||||
"pdf_estimate_number": "Εκτίμηση Αριθμού",
|
"pdf_estimate_number": "Εκτίμηση Αριθμού",
|
||||||
"pdf_estimate_date": "Εκτιμώμενη ημ. επισκευής",
|
"pdf_estimate_date": "Εκτιμώμενη ημ. επισκευής",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "Ημερομηνία λήξης",
|
||||||
"pdf_invoice_label": "Τιμολόγιο",
|
"pdf_invoice_label": "Τιμολόγιο",
|
||||||
"pdf_invoice_number": "Αριθμός τιμολογίου",
|
"pdf_invoice_number": "Αριθμός τιμολογίου",
|
||||||
"pdf_invoice_date": "Ημ/νία Τιμολόγησης",
|
"pdf_invoice_date": "Ημ/νία Τιμολόγησης",
|
||||||
|
|||||||
@ -863,6 +863,8 @@
|
|||||||
"company_info": {
|
"company_info": {
|
||||||
"company_info": "Company info",
|
"company_info": "Company info",
|
||||||
"company_name": "Company Name",
|
"company_name": "Company Name",
|
||||||
|
"company_slug": "Company Slug",
|
||||||
|
"company_slug_help_text": "A unique URL friendly name for your company (It will appear on Customer Portal URL)",
|
||||||
"company_logo": "Company Logo",
|
"company_logo": "Company Logo",
|
||||||
"section_description": "Information about your company that will be displayed on invoices, estimates and other documents created by Crater.",
|
"section_description": "Information about your company that will be displayed on invoices, estimates and other documents created by Crater.",
|
||||||
"phone": "Phone",
|
"phone": "Phone",
|
||||||
@ -1324,6 +1326,8 @@
|
|||||||
"company_info": "Company Information",
|
"company_info": "Company Information",
|
||||||
"company_info_desc": "This information will be displayed on invoices. Note that you can edit this later on settings page.",
|
"company_info_desc": "This information will be displayed on invoices. Note that you can edit this later on settings page.",
|
||||||
"company_name": "Company Name",
|
"company_name": "Company Name",
|
||||||
|
"company_slug": "Company Slug",
|
||||||
|
"company_slug_help_text": "A unique URL friendly name for your company (It will appear on Customer Portal URL)",
|
||||||
"company_logo": "Company Logo",
|
"company_logo": "Company Logo",
|
||||||
"logo_preview": "Logo Preview",
|
"logo_preview": "Logo Preview",
|
||||||
"preferences": "Company Preferences",
|
"preferences": "Company Preferences",
|
||||||
@ -1454,7 +1458,8 @@
|
|||||||
"at_least_one_ability": "Please select atleast one Permission.",
|
"at_least_one_ability": "Please select atleast one Permission.",
|
||||||
"valid_driver_key": "Please enter a valid {driver} key.",
|
"valid_driver_key": "Please enter a valid {driver} key.",
|
||||||
"valid_exchange_rate": "Please enter a valid exchange rate.",
|
"valid_exchange_rate": "Please enter a valid exchange rate.",
|
||||||
"company_name_not_same": "Company name must match with given name."
|
"company_name_not_same": "Company name must match with given name.",
|
||||||
|
"invalid_slug": "Invalid Slug"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"starter_plan": "This feature is available on Starter plan and onwards!",
|
"starter_plan": "This feature is available on Starter plan and onwards!",
|
||||||
@ -1522,5 +1527,13 @@
|
|||||||
"pdf_bill_to": "Bill to,",
|
"pdf_bill_to": "Bill to,",
|
||||||
"pdf_ship_to": "Ship to,",
|
"pdf_ship_to": "Ship to,",
|
||||||
"pdf_received_from": "Received from:",
|
"pdf_received_from": "Received from:",
|
||||||
"pdf_tax_label": "Tax"
|
"pdf_tax_label": "Tax",
|
||||||
|
"date_picker": {
|
||||||
|
"same_day": "Same Day",
|
||||||
|
"within_7_days": "Within 7 Days",
|
||||||
|
"within_15_days": "Within 15 Days",
|
||||||
|
"within_30_days": "Within 30 Days",
|
||||||
|
"within_45_days": "Within 45 Days",
|
||||||
|
"within_60_days": "Within 60 Days"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"dashboard": "Panel de Control",
|
"dashboard": "Tablero",
|
||||||
"customers": "Clientes",
|
"customers": "Clientes",
|
||||||
"items": "Artículos",
|
"items": "Artículos",
|
||||||
"invoices": "Facturas",
|
"invoices": "Facturas",
|
||||||
@ -9,7 +9,7 @@
|
|||||||
"estimates": "Presupuestos",
|
"estimates": "Presupuestos",
|
||||||
"payments": "Pagos",
|
"payments": "Pagos",
|
||||||
"reports": "Informes",
|
"reports": "Informes",
|
||||||
"settings": "Configuración",
|
"settings": "Ajustes",
|
||||||
"logout": "Cerrar sesión",
|
"logout": "Cerrar sesión",
|
||||||
"users": "Usuarios",
|
"users": "Usuarios",
|
||||||
"modules": "Módulos"
|
"modules": "Módulos"
|
||||||
@ -47,7 +47,7 @@
|
|||||||
"delete": "Eliminar",
|
"delete": "Eliminar",
|
||||||
"edit": "Editar",
|
"edit": "Editar",
|
||||||
"view": "Ver",
|
"view": "Ver",
|
||||||
"add_new_item": "Agregar Nuevo Artículo",
|
"add_new_item": "Agregar ítem nuevo",
|
||||||
"clear_all": "Limpiar todo",
|
"clear_all": "Limpiar todo",
|
||||||
"showing": "Mostrar",
|
"showing": "Mostrar",
|
||||||
"of": "de",
|
"of": "de",
|
||||||
@ -87,7 +87,7 @@
|
|||||||
"select_city": "Seleccionar ciudad",
|
"select_city": "Seleccionar ciudad",
|
||||||
"street_1": "Calle 1",
|
"street_1": "Calle 1",
|
||||||
"street_2": "Calle 2",
|
"street_2": "Calle 2",
|
||||||
"action_failed": "Acción Fallida",
|
"action_failed": "Accion Fallida",
|
||||||
"retry": "Procesar de nuevo",
|
"retry": "Procesar de nuevo",
|
||||||
"choose_note": "Elegir nota",
|
"choose_note": "Elegir nota",
|
||||||
"no_note_found": "No se encontró ninguna nota",
|
"no_note_found": "No se encontró ninguna nota",
|
||||||
@ -98,7 +98,7 @@
|
|||||||
"do_you_wish_to_continue": "¿Deseas continuar?",
|
"do_you_wish_to_continue": "¿Deseas continuar?",
|
||||||
"note": "Nota",
|
"note": "Nota",
|
||||||
"pay_invoice": "Pagar factura",
|
"pay_invoice": "Pagar factura",
|
||||||
"login_successfully": "¡Sesión inciada con éxito!",
|
"login_successfully": "Logeado Satisfactoriamente!",
|
||||||
"logged_out_successfully": "Logeado Satisfactoriamente",
|
"logged_out_successfully": "Logeado Satisfactoriamente",
|
||||||
"mark_as_default": "Marcar como predeterminado"
|
"mark_as_default": "Marcar como predeterminado"
|
||||||
},
|
},
|
||||||
@ -113,7 +113,7 @@
|
|||||||
},
|
},
|
||||||
"chart_info": {
|
"chart_info": {
|
||||||
"total_sales": "Ventas",
|
"total_sales": "Ventas",
|
||||||
"total_receipts": "Recibos",
|
"total_receipts": "Ingresos",
|
||||||
"total_expense": "Gastos",
|
"total_expense": "Gastos",
|
||||||
"net_income": "Ingresos netos",
|
"net_income": "Ingresos netos",
|
||||||
"year": "Seleccione año"
|
"year": "Seleccione año"
|
||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Presupuestar",
|
"pdf_estimate_label": "Presupuestar",
|
||||||
"pdf_estimate_number": "Número de Presupuesto",
|
"pdf_estimate_number": "Número de Presupuesto",
|
||||||
"pdf_estimate_date": "Fecha presupuesto",
|
"pdf_estimate_date": "Fecha presupuesto",
|
||||||
"pdf_estimate_expire_date": "Fecha de vencimiento",
|
"pdf_estimate_expire_date": "Fecha de caducidad",
|
||||||
"pdf_invoice_label": "Factura",
|
"pdf_invoice_label": "Factura",
|
||||||
"pdf_invoice_number": "Numero de factura",
|
"pdf_invoice_number": "Numero de factura",
|
||||||
"pdf_invoice_date": "Fecha de la factura",
|
"pdf_invoice_date": "Fecha de la factura",
|
||||||
|
|||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Estimate",
|
"pdf_estimate_label": "Estimate",
|
||||||
"pdf_estimate_number": "Estimate Number",
|
"pdf_estimate_number": "Estimate Number",
|
||||||
"pdf_estimate_date": "Estimate Date",
|
"pdf_estimate_date": "Estimate Date",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "Expiry date",
|
||||||
"pdf_invoice_label": "Invoice",
|
"pdf_invoice_label": "Invoice",
|
||||||
"pdf_invoice_number": "Invoice Number",
|
"pdf_invoice_number": "Invoice Number",
|
||||||
"pdf_invoice_date": "Invoice Date",
|
"pdf_invoice_date": "Invoice Date",
|
||||||
|
|||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Tarjous",
|
"pdf_estimate_label": "Tarjous",
|
||||||
"pdf_estimate_number": "Tarjousnumero",
|
"pdf_estimate_number": "Tarjousnumero",
|
||||||
"pdf_estimate_date": "Tarjouksen päiväys",
|
"pdf_estimate_date": "Tarjouksen päiväys",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "Voimassaolo päivä",
|
||||||
"pdf_invoice_label": "Lasku",
|
"pdf_invoice_label": "Lasku",
|
||||||
"pdf_invoice_number": "Laskunumero",
|
"pdf_invoice_number": "Laskunumero",
|
||||||
"pdf_invoice_date": "Laskun päiväys",
|
"pdf_invoice_date": "Laskun päiväys",
|
||||||
|
|||||||
@ -310,7 +310,7 @@
|
|||||||
"confirm_mark_as_sent": "Ce devis sera marqué comme envoyé",
|
"confirm_mark_as_sent": "Ce devis sera marqué comme envoyé",
|
||||||
"confirm_mark_as_accepted": "Ce devis sera marqué comme accepté",
|
"confirm_mark_as_accepted": "Ce devis sera marqué comme accepté",
|
||||||
"confirm_mark_as_rejected": "Ce devis sera marqué comme rejeté",
|
"confirm_mark_as_rejected": "Ce devis sera marqué comme rejeté",
|
||||||
"no_matching_estimates": "Aucun devis correspondant !",
|
"no_matching_estimates": "Aucune estimation correspondante !",
|
||||||
"mark_as_sent_successfully": "Devis marqué comme envoyé",
|
"mark_as_sent_successfully": "Devis marqué comme envoyé",
|
||||||
"send_estimate_successfully": "Devis envoyé",
|
"send_estimate_successfully": "Devis envoyé",
|
||||||
"errors": {
|
"errors": {
|
||||||
@ -355,7 +355,7 @@
|
|||||||
"select_an_item": "Sélectionnez un article",
|
"select_an_item": "Sélectionnez un article",
|
||||||
"type_item_description": "Taper la description de l'article (facultatif)"
|
"type_item_description": "Taper la description de l'article (facultatif)"
|
||||||
},
|
},
|
||||||
"mark_as_default_estimate_template_description": "Si activé, le modèle sélectionné sera automatiquement utilisé pour les nouvelles estimations."
|
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||||
},
|
},
|
||||||
"invoices": {
|
"invoices": {
|
||||||
"title": "Factures",
|
"title": "Factures",
|
||||||
@ -447,7 +447,7 @@
|
|||||||
"marked_as_sent_message": "Facture supprimée | Factures supprimées",
|
"marked_as_sent_message": "Facture supprimée | Factures supprimées",
|
||||||
"something_went_wrong": "quelque chose a mal tourné",
|
"something_went_wrong": "quelque chose a mal tourné",
|
||||||
"invalid_due_amount_message": "Le paiement entré est supérieur au montant total dû pour cette facture. Veuillez vérifier et réessayer.",
|
"invalid_due_amount_message": "Le paiement entré est supérieur au montant total dû pour cette facture. Veuillez vérifier et réessayer.",
|
||||||
"mark_as_default_invoice_template_description": "Si activé, le modèle sélectionné sera automatiquement utilisé pour les nouvelles factures."
|
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||||
},
|
},
|
||||||
"recurring_invoices": {
|
"recurring_invoices": {
|
||||||
"title": "Factures récurrentes",
|
"title": "Factures récurrentes",
|
||||||
@ -526,7 +526,7 @@
|
|||||||
"cloned_successfully": "Facture récurrente clonée",
|
"cloned_successfully": "Facture récurrente clonée",
|
||||||
"clone_invoice": "Dupliquer",
|
"clone_invoice": "Dupliquer",
|
||||||
"confirm_clone": "Cette facture récurrente sera clonée dans une nouvelle facture récurrente",
|
"confirm_clone": "Cette facture récurrente sera clonée dans une nouvelle facture récurrente",
|
||||||
"add_customer_email": "Veuillez ajouter une adresse e-mail pour ce client afin d'envoyer les factures automatiquement.",
|
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
||||||
"item": {
|
"item": {
|
||||||
"title": "Nom",
|
"title": "Nom",
|
||||||
"description": "Description",
|
"description": "Description",
|
||||||
@ -844,9 +844,9 @@
|
|||||||
"secret": "Secret",
|
"secret": "Secret",
|
||||||
"mailgun_secret": "Secret Mailgun",
|
"mailgun_secret": "Secret Mailgun",
|
||||||
"mailgun_domain": "Domaine",
|
"mailgun_domain": "Domaine",
|
||||||
"mailgun_endpoint": "Endpoint de Mailgun",
|
"mailgun_endpoint": "Mailgun Endpoint",
|
||||||
"ses_secret": "Clé secrète SES",
|
"ses_secret": "SES Secret",
|
||||||
"ses_key": "Clé SES",
|
"ses_key": "SES Key",
|
||||||
"password": "Mot de passe",
|
"password": "Mot de passe",
|
||||||
"username": "Nom d'utilisateur",
|
"username": "Nom d'utilisateur",
|
||||||
"mail_config": "Envoi d'emails",
|
"mail_config": "Envoi d'emails",
|
||||||
@ -1112,10 +1112,10 @@
|
|||||||
"error": "Vous ne pouvez pas supprimer le fournisseur actif",
|
"error": "Vous ne pouvez pas supprimer le fournisseur actif",
|
||||||
"default_currency_error": "Cette devise est déjà affectée à un fournisseur",
|
"default_currency_error": "Cette devise est déjà affectée à un fournisseur",
|
||||||
"exchange_help_text": "Veuillez entrer le taux de change pour convertir {currency} en {baseCurrency}",
|
"exchange_help_text": "Veuillez entrer le taux de change pour convertir {currency} en {baseCurrency}",
|
||||||
"currency_freak": "Currency Freaks",
|
"currency_freak": "Currency Freak",
|
||||||
"currency_layer": "Currency Layer",
|
"currency_layer": "Currency Layer",
|
||||||
"open_exchange_rate": "Ouvrir le taux de change",
|
"open_exchange_rate": "Open Exchange Rate",
|
||||||
"currency_converter": "Convertisseur de devises",
|
"currency_converter": "Currency Converter",
|
||||||
"server": "Serveur",
|
"server": "Serveur",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"active": "Actif",
|
"active": "Actif",
|
||||||
@ -1150,8 +1150,8 @@
|
|||||||
"payment_mode_added": "Mode de paiement ajouté",
|
"payment_mode_added": "Mode de paiement ajouté",
|
||||||
"payment_mode_updated": "Mode de paiement mis à jour",
|
"payment_mode_updated": "Mode de paiement mis à jour",
|
||||||
"payment_mode_confirm_delete": "Vous ne pourrez pas récupérer ce mode de paiement",
|
"payment_mode_confirm_delete": "Vous ne pourrez pas récupérer ce mode de paiement",
|
||||||
"payments_attached": "Ce moyen de paiement est déjà utilisé par des paiements. Merci de supprimer les paiements associés avant de procéder à la suppression.",
|
"payments_attached": "This payment method is already attached to payments. Please delete the attached payments to proceed with deletion.",
|
||||||
"expenses_attached": "Ce moyen de paiement est déjà utilisé par des dépenses. Merci de supprimer les dépenses associés avant de procéder à la suppression.",
|
"expenses_attached": "This payment method is already attached to expenses. Please delete the attached expenses to proceed with deletion.",
|
||||||
"deleted_message": "Mode de paiement supprimé"
|
"deleted_message": "Mode de paiement supprimé"
|
||||||
},
|
},
|
||||||
"expense_category": {
|
"expense_category": {
|
||||||
@ -1262,8 +1262,8 @@
|
|||||||
"media_driver": "Stockage multimédia",
|
"media_driver": "Stockage multimédia",
|
||||||
"media_root": "Répertoire média",
|
"media_root": "Répertoire média",
|
||||||
"aws_driver": "AWS",
|
"aws_driver": "AWS",
|
||||||
"aws_key": "Clé AWS",
|
"aws_key": "AWS Key",
|
||||||
"aws_secret": "Clé secrète AWS",
|
"aws_secret": "AWS Secret",
|
||||||
"aws_region": "Région AWS",
|
"aws_region": "Région AWS",
|
||||||
"aws_bucket": "Bucket",
|
"aws_bucket": "Bucket",
|
||||||
"aws_root": "Répertoire",
|
"aws_root": "Répertoire",
|
||||||
@ -1491,7 +1491,7 @@
|
|||||||
"pdf_invoice_date": "Date",
|
"pdf_invoice_date": "Date",
|
||||||
"pdf_invoice_due_date": "Date d’échéance",
|
"pdf_invoice_due_date": "Date d’échéance",
|
||||||
"pdf_notes": "Notes de bas de page",
|
"pdf_notes": "Notes de bas de page",
|
||||||
"pdf_items_label": "Désignation",
|
"pdf_items_label": "Articles",
|
||||||
"pdf_quantity_label": "Quantité",
|
"pdf_quantity_label": "Quantité",
|
||||||
"pdf_price_label": "Prix",
|
"pdf_price_label": "Prix",
|
||||||
"pdf_discount_label": "Remise",
|
"pdf_discount_label": "Remise",
|
||||||
|
|||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Estimate",
|
"pdf_estimate_label": "Estimate",
|
||||||
"pdf_estimate_number": "Estimate Number",
|
"pdf_estimate_number": "Estimate Number",
|
||||||
"pdf_estimate_date": "Estimate Date",
|
"pdf_estimate_date": "Estimate Date",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "Expiry date",
|
||||||
"pdf_invoice_label": "Invoice",
|
"pdf_invoice_label": "Invoice",
|
||||||
"pdf_invoice_number": "Invoice Number",
|
"pdf_invoice_number": "Invoice Number",
|
||||||
"pdf_invoice_date": "Invoice Date",
|
"pdf_invoice_date": "Invoice Date",
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
"customers": "Klijenti",
|
"customers": "Klijenti",
|
||||||
"items": "Stavke",
|
"items": "Stavke",
|
||||||
"invoices": "Fakture",
|
"invoices": "Fakture",
|
||||||
"recurring-invoices": "Ponavljajuće fakture\n",
|
"recurring-invoices": "Recurring Invoices",
|
||||||
"expenses": "Rashodi",
|
"expenses": "Rashodi",
|
||||||
"estimates": "Ponude",
|
"estimates": "Ponude",
|
||||||
"payments": "Uplate",
|
"payments": "Uplate",
|
||||||
@ -12,7 +12,7 @@
|
|||||||
"settings": "Postavke",
|
"settings": "Postavke",
|
||||||
"logout": "Odjava",
|
"logout": "Odjava",
|
||||||
"users": "Korisnici",
|
"users": "Korisnici",
|
||||||
"modules": "Moduli"
|
"modules": "Modules"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add_company": "Dodaj tvrtku",
|
"add_company": "Dodaj tvrtku",
|
||||||
@ -30,8 +30,8 @@
|
|||||||
"from": "Pošiljatelj",
|
"from": "Pošiljatelj",
|
||||||
"to": "Primatelj",
|
"to": "Primatelj",
|
||||||
"ok": "Ok",
|
"ok": "Ok",
|
||||||
"yes": "Da",
|
"yes": "Yes",
|
||||||
"no": "Ne",
|
"no": "No",
|
||||||
"sort_by": "Posloži Po",
|
"sort_by": "Posloži Po",
|
||||||
"ascending": "Rastuće",
|
"ascending": "Rastuće",
|
||||||
"descending": "Padajuće",
|
"descending": "Padajuće",
|
||||||
@ -39,7 +39,7 @@
|
|||||||
"body": "Tijelo",
|
"body": "Tijelo",
|
||||||
"message": "Poruka",
|
"message": "Poruka",
|
||||||
"send": "Pošalji",
|
"send": "Pošalji",
|
||||||
"preview": "Pregled",
|
"preview": "Preview",
|
||||||
"go_back": "Natrag",
|
"go_back": "Natrag",
|
||||||
"back_to_login": "Natrag na prijavu?",
|
"back_to_login": "Natrag na prijavu?",
|
||||||
"home": "Početna",
|
"home": "Početna",
|
||||||
@ -65,7 +65,7 @@
|
|||||||
"sent": "Poslano",
|
"sent": "Poslano",
|
||||||
"all": "Sve",
|
"all": "Sve",
|
||||||
"select_all": "Izaberi sve",
|
"select_all": "Izaberi sve",
|
||||||
"select_template": "Odaberite predložak",
|
"select_template": "Select Template",
|
||||||
"choose_file": "Klikni ovdje da izabereš fajl",
|
"choose_file": "Klikni ovdje da izabereš fajl",
|
||||||
"choose_template": "Izaberi predložak",
|
"choose_template": "Izaberi predložak",
|
||||||
"choose": "Izaberi",
|
"choose": "Izaberi",
|
||||||
@ -93,13 +93,13 @@
|
|||||||
"no_note_found": "Ne postoje spremljene napomene",
|
"no_note_found": "Ne postoje spremljene napomene",
|
||||||
"insert_note": "Unesi bilješku",
|
"insert_note": "Unesi bilješku",
|
||||||
"copied_pdf_url_clipboard": "Link do PDF fajla kopiran!",
|
"copied_pdf_url_clipboard": "Link do PDF fajla kopiran!",
|
||||||
"copied_url_clipboard": "URL je kopiran u međuspremnik!",
|
"copied_url_clipboard": "Copied url to clipboard!",
|
||||||
"docs": "Dokumenti",
|
"docs": "Docs",
|
||||||
"do_you_wish_to_continue": "Želite li nastaviti?",
|
"do_you_wish_to_continue": "Do you wish to continue?",
|
||||||
"note": "Bilješka",
|
"note": "Note",
|
||||||
"pay_invoice": "Plati račun",
|
"pay_invoice": "Pay Invoice",
|
||||||
"login_successfully": "Uspješno ste prijavljeni!\n",
|
"login_successfully": "Logged in successfully!",
|
||||||
"logged_out_successfully": "Uspješno odjavljen\n",
|
"logged_out_successfully": "Logged out successfully",
|
||||||
"mark_as_default": "Postavi kao zadano"
|
"mark_as_default": "Postavi kao zadano"
|
||||||
},
|
},
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
@ -109,7 +109,7 @@
|
|||||||
"customers": "Klijenti",
|
"customers": "Klijenti",
|
||||||
"invoices": "Računi",
|
"invoices": "Računi",
|
||||||
"estimates": "Ponude",
|
"estimates": "Ponude",
|
||||||
"payments": "Plaćanja"
|
"payments": "Payments"
|
||||||
},
|
},
|
||||||
"chart_info": {
|
"chart_info": {
|
||||||
"total_sales": "Prodaja",
|
"total_sales": "Prodaja",
|
||||||
@ -151,18 +151,18 @@
|
|||||||
"no_results_found": "Nema rezultata"
|
"no_results_found": "Nema rezultata"
|
||||||
},
|
},
|
||||||
"company_switcher": {
|
"company_switcher": {
|
||||||
"label": "IZABERI TVRTKU",
|
"label": "SWITCH COMPANY",
|
||||||
"no_results_found": "Nema rezultata\n",
|
"no_results_found": "No Results Found",
|
||||||
"add_new_company": "Dodajte novu tvrtku\n",
|
"add_new_company": "Add new company",
|
||||||
"new_company": "Nova tvrtka\n",
|
"new_company": "New company",
|
||||||
"created_message": "Tvrtka uspješno stvorena\n"
|
"created_message": "Company created successfully"
|
||||||
},
|
},
|
||||||
"dateRange": {
|
"dateRange": {
|
||||||
"today": "Danas\n",
|
"today": "Today",
|
||||||
"this_week": "Danas\n",
|
"this_week": "This Week",
|
||||||
"this_month": "Danas\n",
|
"this_month": "This Month",
|
||||||
"this_quarter": "Danas\n",
|
"this_quarter": "This Quarter",
|
||||||
"this_year": "Danas\n",
|
"this_year": "This Year",
|
||||||
"previous_week": "Previous Week",
|
"previous_week": "Previous Week",
|
||||||
"previous_month": "Previous Month",
|
"previous_month": "Previous Month",
|
||||||
"previous_quarter": "Previous Quarter",
|
"previous_quarter": "Previous Quarter",
|
||||||
@ -456,32 +456,32 @@
|
|||||||
"months": "{months} Month",
|
"months": "{months} Month",
|
||||||
"years": "{years} Year",
|
"years": "{years} Year",
|
||||||
"all": "All",
|
"all": "All",
|
||||||
"paid": "Plaćeno",
|
"paid": "Paid",
|
||||||
"unpaid": "Ne plaćeno",
|
"unpaid": "Unpaid",
|
||||||
"viewed": "Pregledano",
|
"viewed": "Viewed",
|
||||||
"overdue": "Kašnjenja",
|
"overdue": "Overdue",
|
||||||
"active": "Aktivno",
|
"active": "Active",
|
||||||
"completed": "Završeno",
|
"completed": "Completed",
|
||||||
"customer": "KUPAC",
|
"customer": "CUSTOMER",
|
||||||
"paid_status": "STATUS PLAĆANJA",
|
"paid_status": "PAID STATUS",
|
||||||
"ref_no": "BR. REFERENCE",
|
"ref_no": "REF NO.",
|
||||||
"number": "BROJ",
|
"number": "NUMBER",
|
||||||
"amount_due": "AMOUNT DUE",
|
"amount_due": "AMOUNT DUE",
|
||||||
"partially_paid": "Djelomično plaćeno\n",
|
"partially_paid": "Partially Paid",
|
||||||
"total": "Ukupno",
|
"total": "Total",
|
||||||
"discount": "Popust",
|
"discount": "Discount",
|
||||||
"sub_total": "Popdzbroj",
|
"sub_total": "Sub Total",
|
||||||
"invoice": "Ponavljajuća faktura | Ponavjaljuća faktura",
|
"invoice": "Recurring Invoice | Recurring Invoices",
|
||||||
"invoice_number": "Broj ponavljajuće fakture\n",
|
"invoice_number": "Recurring Invoice Number",
|
||||||
"next_invoice_date": "Datum sljedećeg računa",
|
"next_invoice_date": "Next Invoice Date",
|
||||||
"ref_number": "Broj reference",
|
"ref_number": "Ref Number",
|
||||||
"contact": "Kontakt",
|
"contact": "Contact",
|
||||||
"add_item": "Dodaj stavku",
|
"add_item": "Add an Item",
|
||||||
"date": "Datum",
|
"date": "Date",
|
||||||
"limit_by": "Ograniči po",
|
"limit_by": "Limit by",
|
||||||
"limit_date": "Vremenski rok",
|
"limit_date": "Limit Date",
|
||||||
"limit_count": "Broj ograničenja\n",
|
"limit_count": "Limit Count",
|
||||||
"count": "Brojač",
|
"count": "Count",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"select_a_status": "Select a status",
|
"select_a_status": "Select a status",
|
||||||
"working": "Working",
|
"working": "Working",
|
||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Ponuda",
|
"pdf_estimate_label": "Ponuda",
|
||||||
"pdf_estimate_number": "Broj Ponude",
|
"pdf_estimate_number": "Broj Ponude",
|
||||||
"pdf_estimate_date": "Datum Ponude",
|
"pdf_estimate_date": "Datum Ponude",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "Datum isteka Ponude",
|
||||||
"pdf_invoice_label": "Faktura",
|
"pdf_invoice_label": "Faktura",
|
||||||
"pdf_invoice_number": "Broj Fakture",
|
"pdf_invoice_number": "Broj Fakture",
|
||||||
"pdf_invoice_date": "Datum Fakture",
|
"pdf_invoice_date": "Datum Fakture",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Estimate",
|
"pdf_estimate_label": "Estimate",
|
||||||
"pdf_estimate_number": "Estimate Number",
|
"pdf_estimate_number": "Estimate Number",
|
||||||
"pdf_estimate_date": "Estimate Date",
|
"pdf_estimate_date": "Estimate Date",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "Expiry date",
|
||||||
"pdf_invoice_label": "Invoice",
|
"pdf_invoice_label": "Invoice",
|
||||||
"pdf_invoice_number": "Invoice Number",
|
"pdf_invoice_number": "Invoice Number",
|
||||||
"pdf_invoice_date": "Invoice Date",
|
"pdf_invoice_date": "Invoice Date",
|
||||||
|
|||||||
@ -17,6 +17,7 @@ import sk from './sk.json'
|
|||||||
import vi from './vi.json'
|
import vi from './vi.json'
|
||||||
import el from './el.json'
|
import el from './el.json'
|
||||||
import hr from './hr.json'
|
import hr from './hr.json'
|
||||||
|
import th from './th.json'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
cs,
|
cs,
|
||||||
@ -37,5 +38,6 @@ export default {
|
|||||||
vi,
|
vi,
|
||||||
pl,
|
pl,
|
||||||
el,
|
el,
|
||||||
hr
|
hr,
|
||||||
|
th
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Pasiūlymas",
|
"pdf_estimate_label": "Pasiūlymas",
|
||||||
"pdf_estimate_number": "Pasiūlymo numeris",
|
"pdf_estimate_number": "Pasiūlymo numeris",
|
||||||
"pdf_estimate_date": "Pasiūlymo data",
|
"pdf_estimate_date": "Pasiūlymo data",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "Galiojimo laikas",
|
||||||
"pdf_invoice_label": "Sąskaita",
|
"pdf_invoice_label": "Sąskaita",
|
||||||
"pdf_invoice_number": "Invoice Number",
|
"pdf_invoice_number": "Invoice Number",
|
||||||
"pdf_invoice_date": "Invoice Date",
|
"pdf_invoice_date": "Invoice Date",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -4,7 +4,7 @@
|
|||||||
"customers": "Klanten",
|
"customers": "Klanten",
|
||||||
"items": "Artikelen",
|
"items": "Artikelen",
|
||||||
"invoices": "Facturen",
|
"invoices": "Facturen",
|
||||||
"recurring-invoices": "Periodieke facturen",
|
"recurring-invoices": "Periodieke factuur",
|
||||||
"expenses": "Uitgaven",
|
"expenses": "Uitgaven",
|
||||||
"estimates": "Offertes",
|
"estimates": "Offertes",
|
||||||
"payments": "Betalingen",
|
"payments": "Betalingen",
|
||||||
@ -28,16 +28,16 @@
|
|||||||
"from_date": "Vanaf datum",
|
"from_date": "Vanaf datum",
|
||||||
"to_date": "T/m datum",
|
"to_date": "T/m datum",
|
||||||
"from": "Vanaf",
|
"from": "Vanaf",
|
||||||
"to": "Naar",
|
"to": "Naar.",
|
||||||
"ok": "Oké",
|
"ok": "Oké.",
|
||||||
"yes": "Ja",
|
"yes": "Ja.",
|
||||||
"no": "Nee",
|
"no": "Nee.",
|
||||||
"sort_by": "Sorteer op",
|
"sort_by": "Sorteer op",
|
||||||
"ascending": "Oplopend",
|
"ascending": "Oplopend",
|
||||||
"descending": "Aflopend",
|
"descending": "Aflopend",
|
||||||
"subject": "Onderwerp",
|
"subject": "Onderwerp",
|
||||||
"body": "Inhoud",
|
"body": "Inhoud",
|
||||||
"message": "Bericht",
|
"message": "Bericht.",
|
||||||
"send": "Verstuur",
|
"send": "Verstuur",
|
||||||
"preview": "Voorbeeld",
|
"preview": "Voorbeeld",
|
||||||
"go_back": "Ga terug",
|
"go_back": "Ga terug",
|
||||||
@ -54,7 +54,7 @@
|
|||||||
"actions": "Acties",
|
"actions": "Acties",
|
||||||
"subtotal": "SUBTOTAAL",
|
"subtotal": "SUBTOTAAL",
|
||||||
"discount": "KORTING",
|
"discount": "KORTING",
|
||||||
"fixed": "Vast bedrag",
|
"fixed": "Gemaakt",
|
||||||
"percentage": "Percentage",
|
"percentage": "Percentage",
|
||||||
"tax": "BELASTING",
|
"tax": "BELASTING",
|
||||||
"total_amount": "TOTAALBEDRAG",
|
"total_amount": "TOTAALBEDRAG",
|
||||||
@ -85,17 +85,17 @@
|
|||||||
"select_state": "Selecteer staat",
|
"select_state": "Selecteer staat",
|
||||||
"select_country": "Selecteer land",
|
"select_country": "Selecteer land",
|
||||||
"select_city": "Selecteer stad",
|
"select_city": "Selecteer stad",
|
||||||
"street_1": "Straat 1",
|
"street_1": "straat 1",
|
||||||
"street_2": "Straat 2",
|
"street_2": "Straat # 2",
|
||||||
"action_failed": "Actie mislukt",
|
"action_failed": "Actie: mislukt",
|
||||||
"retry": "Opnieuw proberen",
|
"retry": "Retr",
|
||||||
"choose_note": "Kies notitie",
|
"choose_note": "Kies notitie",
|
||||||
"no_note_found": "Geen notitie gevonden",
|
"no_note_found": "Geen notitie gevonden",
|
||||||
"insert_note": "Notitie invoegen",
|
"insert_note": "Notitie invoegen",
|
||||||
"copied_pdf_url_clipboard": "PDF link naar klembord gekopieerd!",
|
"copied_pdf_url_clipboard": "PDF link naar klembord gekopieerd!",
|
||||||
"copied_url_clipboard": "URL naar klembord gekopieerd!",
|
"copied_url_clipboard": "URL naar klembord gekopieerd!",
|
||||||
"docs": "Documentatie",
|
"docs": "Documenten",
|
||||||
"do_you_wish_to_continue": "Wil je doorgaan?",
|
"do_you_wish_to_continue": "Wilt u Doorgaan?",
|
||||||
"note": "Notitie",
|
"note": "Notitie",
|
||||||
"pay_invoice": "Betaal factuur",
|
"pay_invoice": "Betaal factuur",
|
||||||
"login_successfully": "Succesvol ingelogd!",
|
"login_successfully": "Succesvol ingelogd!",
|
||||||
@ -526,7 +526,7 @@
|
|||||||
"cloned_successfully": "Terugkerende factuur succesvol gekopieerd",
|
"cloned_successfully": "Terugkerende factuur succesvol gekopieerd",
|
||||||
"clone_invoice": "Kopieer periodieke factuur",
|
"clone_invoice": "Kopieer periodieke factuur",
|
||||||
"confirm_clone": "Deze periodieke factuur wordt gekopieerd naar een nieuwe periodieke factuur",
|
"confirm_clone": "Deze periodieke factuur wordt gekopieerd naar een nieuwe periodieke factuur",
|
||||||
"add_customer_email": "Voeg een e-mailadres aan deze klant toe zodat facturen automatisch verzonden kunnen worden.",
|
"add_customer_email": "Voeg een e-mailadres aan deze klant toe, zodat facturen automatisch verzonden kunnen worden.",
|
||||||
"item": {
|
"item": {
|
||||||
"title": "Item titel",
|
"title": "Item titel",
|
||||||
"description": "Beschrijving",
|
"description": "Beschrijving",
|
||||||
@ -1114,13 +1114,13 @@
|
|||||||
"exchange_help_text": "Voer de wisselkoers in om te converteren van {currency} naar {baseCurrency}",
|
"exchange_help_text": "Voer de wisselkoers in om te converteren van {currency} naar {baseCurrency}",
|
||||||
"currency_freak": "Valuta Freak",
|
"currency_freak": "Valuta Freak",
|
||||||
"currency_layer": "Valuta-laag",
|
"currency_layer": "Valuta-laag",
|
||||||
"open_exchange_rate": "Open wisselkoers",
|
"open_exchange_rate": "Open Exchange Rate",
|
||||||
"currency_converter": "Valuta omzetter",
|
"currency_converter": "Valuta omzetter",
|
||||||
"server": "Server",
|
"server": "Server",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"active": "Actief",
|
"active": "Actief",
|
||||||
"currency_help_text": "Deze aanbieder wordt alleen gebruikt voor de hier boven geselecteerde valuta",
|
"currency_help_text": "This provider will only be used on above selected currencies",
|
||||||
"currency_in_used": "De volgende valuta zijn al actief bij een andere aanbieder. Verwijder deze valuta uit de selectie om deze aanbieder opnieuw te activeren."
|
"currency_in_used": "The following currencies are already active on another provider. Please remove these currencies from selection to activate this provider again."
|
||||||
},
|
},
|
||||||
"tax_types": {
|
"tax_types": {
|
||||||
"title": "Belastingtypen",
|
"title": "Belastingtypen",
|
||||||
@ -1143,16 +1143,16 @@
|
|||||||
},
|
},
|
||||||
"payment_modes": {
|
"payment_modes": {
|
||||||
"title": "Betaalmethodes",
|
"title": "Betaalmethodes",
|
||||||
"description": "Modi van transacties voor betalingen",
|
"description": "Modes of transaction for payments",
|
||||||
"add_payment_mode": "Voeg betaalwijze toe",
|
"add_payment_mode": "Add Payment Mode",
|
||||||
"edit_payment_mode": "Wijzig betaalwijze",
|
"edit_payment_mode": "Edit Payment Mode",
|
||||||
"mode_name": "Modusnaam",
|
"mode_name": "Mode Name",
|
||||||
"payment_mode_added": "Betaalwijze toegevoegd",
|
"payment_mode_added": "Betaalwijze toegevoegd",
|
||||||
"payment_mode_updated": "Betaalwijze bijgewerkt",
|
"payment_mode_updated": "Payment Mode Updated",
|
||||||
"payment_mode_confirm_delete": "U kunt deze betalingsmodus niet herstellen",
|
"payment_mode_confirm_delete": "You will not be able to recover this Payment Mode",
|
||||||
"payments_attached": "Deze betalingsmethode is al gekoppeld aan betalingen. Verwijder de gekoppelde betalingen om verder te gaan met het verwijderen.",
|
"payments_attached": "This payment method is already attached to payments. Please delete the attached payments to proceed with deletion.",
|
||||||
"expenses_attached": "Deze betaalmethode is al gekoppeld aan uitgaven. Verwijder de gekoppelde kosten om door te gaan met het verwijderen.",
|
"expenses_attached": "This payment method is already attached to expenses. Please delete the attached expenses to proceed with deletion.",
|
||||||
"deleted_message": "Betaalwijze succesvol verwijderd"
|
"deleted_message": "Payment Mode deleted successfully"
|
||||||
},
|
},
|
||||||
"expense_category": {
|
"expense_category": {
|
||||||
"title": "Onkostencategorieën",
|
"title": "Onkostencategorieën",
|
||||||
@ -1178,8 +1178,8 @@
|
|||||||
"discount_setting": "Kortingsinstelling",
|
"discount_setting": "Kortingsinstelling",
|
||||||
"discount_per_item": "Korting per item",
|
"discount_per_item": "Korting per item",
|
||||||
"discount_setting_description": "Schakel dit in als u korting wilt toevoegen aan afzonderlijke factuuritems. Standaard wordt korting rechtstreeks aan de factuur toegevoegd.",
|
"discount_setting_description": "Schakel dit in als u korting wilt toevoegen aan afzonderlijke factuuritems. Standaard wordt korting rechtstreeks aan de factuur toegevoegd.",
|
||||||
"expire_public_links": "Publieke links automatisch laten vervallen",
|
"expire_public_links": "Automatically Expire Public Links",
|
||||||
"expire_setting_description": "Geef aan of je alle links die eerder zijn verstuurd door de applicatie om facturen, offertes en betalingen te bekijken wilt laten verlopen na een bepaalde duur.",
|
"expire_setting_description": "Specify whether you would like to expire all the links sent by application to view invoices, estimates & payments, etc after a specified duration.",
|
||||||
"save": "Opslaan",
|
"save": "Opslaan",
|
||||||
"preference": "Voorkeur | Voorkeuren",
|
"preference": "Voorkeur | Voorkeuren",
|
||||||
"general_settings": "Standaardvoorkeuren voor het systeem.",
|
"general_settings": "Standaardvoorkeuren voor het systeem.",
|
||||||
@ -1188,9 +1188,9 @@
|
|||||||
"select_time_zone": "Selecteer Tijdzone",
|
"select_time_zone": "Selecteer Tijdzone",
|
||||||
"select_date_format": "Selecteer datum/tijdindeling",
|
"select_date_format": "Selecteer datum/tijdindeling",
|
||||||
"select_financial_year": "Selecteer financieel ja",
|
"select_financial_year": "Selecteer financieel ja",
|
||||||
"recurring_invoice_status": "Status periodieke facturen",
|
"recurring_invoice_status": "Recurring Invoice Status",
|
||||||
"create_status": "Status aanmaken",
|
"create_status": "Create Status",
|
||||||
"active": "Actief",
|
"active": "Active",
|
||||||
"on_hold": "In wacht",
|
"on_hold": "In wacht",
|
||||||
"update_status": "Updatestatus",
|
"update_status": "Updatestatus",
|
||||||
"completed": "Voltooid",
|
"completed": "Voltooid",
|
||||||
@ -1217,10 +1217,10 @@
|
|||||||
"finishing_update": "Afwerking Update",
|
"finishing_update": "Afwerking Update",
|
||||||
"update_failed": "Update mislukt",
|
"update_failed": "Update mislukt",
|
||||||
"update_failed_text": "Sorry! Je update is mislukt op: {step} step ",
|
"update_failed_text": "Sorry! Je update is mislukt op: {step} step ",
|
||||||
"update_warning": "Alle applicatiebestanden en de standaard sjabloonbestanden worden overschreven wanneer u de applicatie met behulp van dit hulpprogramma bijwerkt. Maak een reservekopie van uw sjablonen en database voordat u deze bijwerkt."
|
"update_warning": "All of the application files and default template files will be overwritten when you update the application using this utility. Please take a backup of your templates & database before updating."
|
||||||
},
|
},
|
||||||
"backup": {
|
"backup": {
|
||||||
"title": "Back-up | Back-ups",
|
"title": "Backup | Backups",
|
||||||
"description": "De back-up is een zipfile met alle bestanden in de mappen die je opgeeft samen met een dump van je database",
|
"description": "De back-up is een zipfile met alle bestanden in de mappen die je opgeeft samen met een dump van je database",
|
||||||
"new_backup": "Nieuwe back-up",
|
"new_backup": "Nieuwe back-up",
|
||||||
"create_backup": "Backup maken",
|
"create_backup": "Backup maken",
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
"navigation": {
|
"navigation": {
|
||||||
"dashboard": "Pulpit",
|
"dashboard": "Pulpit",
|
||||||
"customers": "Kontrahenci",
|
"customers": "Kontrahenci",
|
||||||
"items": "Produkty",
|
"items": "Pozycje",
|
||||||
"invoices": "Faktury",
|
"invoices": "Faktury",
|
||||||
"recurring-invoices": "Faktury cykliczne",
|
"recurring-invoices": "Faktury cykliczne",
|
||||||
"expenses": "Wydatki",
|
"expenses": "Wydatki",
|
||||||
@ -100,7 +100,7 @@
|
|||||||
"pay_invoice": "Zapłać Fakturę",
|
"pay_invoice": "Zapłać Fakturę",
|
||||||
"login_successfully": "Zalogowano pomyślnie!",
|
"login_successfully": "Zalogowano pomyślnie!",
|
||||||
"logged_out_successfully": "Wylogowano pomyślnie",
|
"logged_out_successfully": "Wylogowano pomyślnie",
|
||||||
"mark_as_default": "Oznacz jako domyślne"
|
"mark_as_default": "Mark as default"
|
||||||
},
|
},
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"select_year": "Wybierz rok",
|
"select_year": "Wybierz rok",
|
||||||
@ -355,7 +355,7 @@
|
|||||||
"select_an_item": "Wpisz lub kliknij aby wybrać element",
|
"select_an_item": "Wpisz lub kliknij aby wybrać element",
|
||||||
"type_item_description": "Opis pozycji (opcjonalnie)"
|
"type_item_description": "Opis pozycji (opcjonalnie)"
|
||||||
},
|
},
|
||||||
"mark_as_default_estimate_template_description": "Jeśli włączone, wybrany szablon zostanie automatycznie wybrany dla nowych ofert."
|
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||||
},
|
},
|
||||||
"invoices": {
|
"invoices": {
|
||||||
"title": "Faktury",
|
"title": "Faktury",
|
||||||
@ -447,7 +447,7 @@
|
|||||||
"marked_as_sent_message": "Faktura oznaczona jako wysłana pomyślnie",
|
"marked_as_sent_message": "Faktura oznaczona jako wysłana pomyślnie",
|
||||||
"something_went_wrong": "coś poszło nie tak",
|
"something_went_wrong": "coś poszło nie tak",
|
||||||
"invalid_due_amount_message": "Całkowita kwota faktury nie może być mniejsza niż całkowita kwota zapłacona za tę fakturę. Proszę zaktualizować fakturę lub usunąć powiązane płatności, aby kontynuować.",
|
"invalid_due_amount_message": "Całkowita kwota faktury nie może być mniejsza niż całkowita kwota zapłacona za tę fakturę. Proszę zaktualizować fakturę lub usunąć powiązane płatności, aby kontynuować.",
|
||||||
"mark_as_default_invoice_template_description": "Jeśli włączone, wybrany szablon zostanie automatycznie wybrany dla nowych faktur."
|
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||||
},
|
},
|
||||||
"recurring_invoices": {
|
"recurring_invoices": {
|
||||||
"title": "Faktury cykliczne",
|
"title": "Faktury cykliczne",
|
||||||
@ -526,7 +526,7 @@
|
|||||||
"cloned_successfully": "Faktura Cykliczna sklonowana pomyślnie",
|
"cloned_successfully": "Faktura Cykliczna sklonowana pomyślnie",
|
||||||
"clone_invoice": "Klonuj Fakturę Cykliczną",
|
"clone_invoice": "Klonuj Fakturę Cykliczną",
|
||||||
"confirm_clone": "Ta faktura cykliczna zostanie sklonowana do nowej faktury cyklicznej",
|
"confirm_clone": "Ta faktura cykliczna zostanie sklonowana do nowej faktury cyklicznej",
|
||||||
"add_customer_email": "Dodaj adres e-mail dla tego klienta, aby wysyłać faktury automatycznie.",
|
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
||||||
"item": {
|
"item": {
|
||||||
"title": "Tytuł pozycji",
|
"title": "Tytuł pozycji",
|
||||||
"description": "Opis",
|
"description": "Opis",
|
||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Oferta",
|
"pdf_estimate_label": "Oferta",
|
||||||
"pdf_estimate_number": "Numer oferty",
|
"pdf_estimate_number": "Numer oferty",
|
||||||
"pdf_estimate_date": "Data oferty",
|
"pdf_estimate_date": "Data oferty",
|
||||||
"pdf_estimate_expire_date": "Data ważności",
|
"pdf_estimate_expire_date": "Termin ważności",
|
||||||
"pdf_invoice_label": "Faktura",
|
"pdf_invoice_label": "Faktura",
|
||||||
"pdf_invoice_number": "Numer faktury",
|
"pdf_invoice_number": "Numer faktury",
|
||||||
"pdf_invoice_date": "Data faktury",
|
"pdf_invoice_date": "Data faktury",
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
"settings": "Configurações",
|
"settings": "Configurações",
|
||||||
"logout": "Encerrar sessão",
|
"logout": "Encerrar sessão",
|
||||||
"users": "Usuários",
|
"users": "Usuários",
|
||||||
"modules": "Módulos"
|
"modules": "Navegação → módulos"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add_company": "Adicionar Empresa",
|
"add_company": "Adicionar Empresa",
|
||||||
@ -29,13 +29,13 @@
|
|||||||
"to_date": "Até a Data",
|
"to_date": "Até a Data",
|
||||||
"from": "De",
|
"from": "De",
|
||||||
"to": "Para",
|
"to": "Para",
|
||||||
"ok": "Ok",
|
"ok": "Geral → Ok",
|
||||||
"yes": "Sim",
|
"yes": "Sim",
|
||||||
"no": "Não",
|
"no": "Não",
|
||||||
"sort_by": "Ordenar por",
|
"sort_by": "Ordenar por",
|
||||||
"ascending": "Crescente",
|
"ascending": "Crescente",
|
||||||
"descending": "Descendente",
|
"descending": "Descendente",
|
||||||
"subject": "Assunto",
|
"subject": "Sujeita",
|
||||||
"body": "Corpo",
|
"body": "Corpo",
|
||||||
"message": "Mensagem",
|
"message": "Mensagem",
|
||||||
"send": "Enviar",
|
"send": "Enviar",
|
||||||
@ -210,8 +210,8 @@
|
|||||||
"basic_info": "Informação Básica",
|
"basic_info": "Informação Básica",
|
||||||
"portal_access": "Clientes → Acessar portal",
|
"portal_access": "Clientes → Acessar portal",
|
||||||
"portal_access_text": "Clientes→ Texto do portal de acesso?",
|
"portal_access_text": "Clientes→ Texto do portal de acesso?",
|
||||||
"portal_access_url": "URL de login do Portal do Cliente",
|
"portal_access_url": "Customer Portal Login URL",
|
||||||
"portal_access_url_help": "Por favor, copie a URL fornecida acima e envie a seu cliente para fornecer acesso.",
|
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||||
"billing_address": "Endereço de cobrança",
|
"billing_address": "Endereço de cobrança",
|
||||||
"shipping_address": "Endereço de entrega",
|
"shipping_address": "Endereço de entrega",
|
||||||
"copy_billing_address": "Copiar Endereço de Faturamento",
|
"copy_billing_address": "Copiar Endereço de Faturamento",
|
||||||
@ -231,7 +231,7 @@
|
|||||||
"confirm_delete": "Você não poderá recuperar este cliente e todas as faturas, orçamentos e pagamentos relacionados. | Você não poderá recuperar esses clientes e todas as faturas, estimativas e pagamentos relacionados.",
|
"confirm_delete": "Você não poderá recuperar este cliente e todas as faturas, orçamentos e pagamentos relacionados. | Você não poderá recuperar esses clientes e todas as faturas, estimativas e pagamentos relacionados.",
|
||||||
"created_message": "Cliente criado com sucesso",
|
"created_message": "Cliente criado com sucesso",
|
||||||
"updated_message": "Cliente atualizado com sucesso",
|
"updated_message": "Cliente atualizado com sucesso",
|
||||||
"address_updated_message": "Informações de endereço atualizadas com sucesso",
|
"address_updated_message": "Address Information Updated succesfully",
|
||||||
"deleted_message": "Cliente excluído com sucesso | Clientes excluídos com sucesso",
|
"deleted_message": "Cliente excluído com sucesso | Clientes excluídos com sucesso",
|
||||||
"edit_currency_not_allowed": "Não é possível alterar a moeda depois de criar transações."
|
"edit_currency_not_allowed": "Não é possível alterar a moeda depois de criar transações."
|
||||||
},
|
},
|
||||||
@ -265,8 +265,8 @@
|
|||||||
},
|
},
|
||||||
"estimates": {
|
"estimates": {
|
||||||
"title": "Orçamentos",
|
"title": "Orçamentos",
|
||||||
"accept_estimate": "Aceitar Orçamento",
|
"accept_estimate": "Accept Estimate",
|
||||||
"reject_estimate": "Rejeitar Orçamento",
|
"reject_estimate": "Reject Estimate",
|
||||||
"estimate": "Orçamento | Orçamentos",
|
"estimate": "Orçamento | Orçamentos",
|
||||||
"estimates_list": "Lista de orçamentos",
|
"estimates_list": "Lista de orçamentos",
|
||||||
"days": "{days} Dias",
|
"days": "{days} Dias",
|
||||||
@ -318,10 +318,10 @@
|
|||||||
},
|
},
|
||||||
"accepted": "Aceito",
|
"accepted": "Aceito",
|
||||||
"rejected": "Rejeitado",
|
"rejected": "Rejeitado",
|
||||||
"expired": "Expirado",
|
"expired": "Expired",
|
||||||
"sent": "Enviado",
|
"sent": "Enviado",
|
||||||
"draft": "Rascunho",
|
"draft": "Rascunho",
|
||||||
"viewed": "Visualizado",
|
"viewed": "Viewed",
|
||||||
"declined": "Rejeitado",
|
"declined": "Rejeitado",
|
||||||
"new_estimate": "Novo orçamento",
|
"new_estimate": "Novo orçamento",
|
||||||
"add_new_estimate": "Adicionar novo orçamento",
|
"add_new_estimate": "Adicionar novo orçamento",
|
||||||
@ -355,14 +355,14 @@
|
|||||||
"select_an_item": "Escreva ou clique para selecionar um item",
|
"select_an_item": "Escreva ou clique para selecionar um item",
|
||||||
"type_item_description": "Descrição do Item (opcional)"
|
"type_item_description": "Descrição do Item (opcional)"
|
||||||
},
|
},
|
||||||
"mark_as_default_estimate_template_description": "Se habilitado, o modelo selecionado será automaticamente selecionado para novas estimativas."
|
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||||
},
|
},
|
||||||
"invoices": {
|
"invoices": {
|
||||||
"title": "Faturas",
|
"title": "Faturas",
|
||||||
"download": "Baixar",
|
"download": "Download",
|
||||||
"pay_invoice": "Pagar Fatura",
|
"pay_invoice": "Pay Invoice",
|
||||||
"invoices_list": "Lista de faturas",
|
"invoices_list": "Lista de faturas",
|
||||||
"invoice_information": "Informações da Fatura",
|
"invoice_information": "Invoice Information",
|
||||||
"days": "{days} dias",
|
"days": "{days} dias",
|
||||||
"months": "{months} Mês",
|
"months": "{months} Mês",
|
||||||
"years": "{years} Ano",
|
"years": "{years} Ano",
|
||||||
@ -374,7 +374,7 @@
|
|||||||
"completed": "Concluído",
|
"completed": "Concluído",
|
||||||
"customer": "CLIENTE",
|
"customer": "CLIENTE",
|
||||||
"paid_status": "STATUS PAGAMENTO",
|
"paid_status": "STATUS PAGAMENTO",
|
||||||
"ref_no": "N° de Referência",
|
"ref_no": "REF NO.",
|
||||||
"number": "NÚMERO",
|
"number": "NÚMERO",
|
||||||
"amount_due": "VALOR DEVIDO",
|
"amount_due": "VALOR DEVIDO",
|
||||||
"partially_paid": "Parcialmente Pago",
|
"partially_paid": "Parcialmente Pago",
|
||||||
@ -447,7 +447,7 @@
|
|||||||
"marked_as_sent_message": "Fatura marcada como enviada com sucesso",
|
"marked_as_sent_message": "Fatura marcada como enviada com sucesso",
|
||||||
"something_went_wrong": "algo deu errado",
|
"something_went_wrong": "algo deu errado",
|
||||||
"invalid_due_amount_message": "O valor total da fatura não pode ser menor que o valor total pago para esta fatura. Atualize a fatura ou exclua os pagamentos associados para continuar.",
|
"invalid_due_amount_message": "O valor total da fatura não pode ser menor que o valor total pago para esta fatura. Atualize a fatura ou exclua os pagamentos associados para continuar.",
|
||||||
"mark_as_default_invoice_template_description": "Se habilitado, o modelo selecionado será automaticamente selecionado para novas estimativas."
|
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||||
},
|
},
|
||||||
"recurring_invoices": {
|
"recurring_invoices": {
|
||||||
"title": "Faturas Recorrentes",
|
"title": "Faturas Recorrentes",
|
||||||
@ -464,56 +464,56 @@
|
|||||||
"completed": "Concluído",
|
"completed": "Concluído",
|
||||||
"customer": "CLIENTE",
|
"customer": "CLIENTE",
|
||||||
"paid_status": "STATUS PAGAMENTO",
|
"paid_status": "STATUS PAGAMENTO",
|
||||||
"ref_no": "N° de Referência",
|
"ref_no": "REF NO.",
|
||||||
"number": "NÚMERO",
|
"number": "NUMBER",
|
||||||
"amount_due": "VALOR DEVIDO",
|
"amount_due": "AMOUNT DUE",
|
||||||
"partially_paid": "Parcialmente Pago",
|
"partially_paid": "Partially Paid",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"discount": "Desconto",
|
"discount": "Discount",
|
||||||
"sub_total": "Subtotal",
|
"sub_total": "Sub Total",
|
||||||
"invoice": "Fatura Recorrente | Faturas Recorrentes",
|
"invoice": "Recurring Invoice | Recurring Invoices",
|
||||||
"invoice_number": "Número da Fatura Recorrente",
|
"invoice_number": "Recurring Invoice Number",
|
||||||
"next_invoice_date": "Data da Próxima Fatura",
|
"next_invoice_date": "Next Invoice Date",
|
||||||
"ref_number": "Número de Referência",
|
"ref_number": "Ref Number",
|
||||||
"contact": "Contato",
|
"contact": "Contact",
|
||||||
"add_item": "Adicionar um Item",
|
"add_item": "Add an Item",
|
||||||
"date": "Data",
|
"date": "Date",
|
||||||
"limit_by": "Limitar por",
|
"limit_by": "Limit by",
|
||||||
"limit_date": "Data Limite",
|
"limit_date": "Limit Date",
|
||||||
"limit_count": "Quantidade Máxima",
|
"limit_count": "Limit Count",
|
||||||
"count": "Quantidade",
|
"count": "Count",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"select_a_status": "Selecione o Status",
|
"select_a_status": "Select a status",
|
||||||
"working": "Processando",
|
"working": "Working",
|
||||||
"on_hold": "Pausado",
|
"on_hold": "On Hold",
|
||||||
"complete": "Concluído",
|
"complete": "Completed",
|
||||||
"add_tax": "Adicionar Imposto",
|
"add_tax": "Add Tax",
|
||||||
"amount": "Valor",
|
"amount": "Amount",
|
||||||
"action": "Ação",
|
"action": "Action",
|
||||||
"notes": "Observações",
|
"notes": "Notes",
|
||||||
"view": "Ver",
|
"view": "View",
|
||||||
"basic_info": "Informações Básicas",
|
"basic_info": "Basic Info",
|
||||||
"send_invoice": "Enviar Fatura Recorrente",
|
"send_invoice": "Send Recurring Invoice",
|
||||||
"auto_send": "Envio Automático",
|
"auto_send": "Auto Send",
|
||||||
"resend_invoice": "Reenviar Fatura Recorrente",
|
"resend_invoice": "Resend Recurring Invoice",
|
||||||
"invoice_template": "Modelo de Fatura Recorrente",
|
"invoice_template": "Recurring Invoice Template",
|
||||||
"conversion_message": "Fatura Recorrente clonada com sucesso",
|
"conversion_message": "Recurring Invoice cloned successful",
|
||||||
"template": "Modelo",
|
"template": "Template",
|
||||||
"mark_as_sent": "Marcar como enviado",
|
"mark_as_sent": "Mark as sent",
|
||||||
"confirm_send_invoice": "Esta fatura recorrente será enviada por e-mail para o cliente",
|
"confirm_send_invoice": "This recurring invoice will be sent via email to the customer",
|
||||||
"invoice_mark_as_sent": "Esta fatura recorrente será marcada como enviada",
|
"invoice_mark_as_sent": "This recurring invoice will be marked as sent",
|
||||||
"confirm_send": "Esta fatura recorrente será enviada por e-mail para o cliente",
|
"confirm_send": "This recurring invoice will be sent via email to the customer",
|
||||||
"starts_at": "Data de início",
|
"starts_at": "Start Date",
|
||||||
"due_date": "Vencimento da Fatura",
|
"due_date": "Invoice Due Date",
|
||||||
"record_payment": "Registrar Pagamento",
|
"record_payment": "Record Payment",
|
||||||
"add_new_invoice": "Adicionar nova fatura recorrente",
|
"add_new_invoice": "Add New Recurring Invoice",
|
||||||
"update_expense": "Atualizar Despesa",
|
"update_expense": "Update Expense",
|
||||||
"edit_invoice": "Editar fatura recorrente",
|
"edit_invoice": "Edit Recurring Invoice",
|
||||||
"new_invoice": "Nova fatura recorrente",
|
"new_invoice": "New Recurring Invoice",
|
||||||
"send_automatically": "Enviar automaticamente",
|
"send_automatically": "Send Automatically",
|
||||||
"send_automatically_desc": "Habilite isso, se você gostaria de enviar a fatura automaticamente para o cliente.",
|
"send_automatically_desc": "Enable this, if you would like to send the invoice automatically to the customer when its created.",
|
||||||
"save_invoice": "Salvar fatura recorrente",
|
"save_invoice": "Save Recurring Invoice",
|
||||||
"update_invoice": "Atualizar fatura recorrente",
|
"update_invoice": "Update Recurring Invoice",
|
||||||
"add_new_tax": "Adicionar Novo Imposto",
|
"add_new_tax": "Adicionar Novo Imposto",
|
||||||
"no_invoices": "Não há faturas recorrentes ainda!",
|
"no_invoices": "Não há faturas recorrentes ainda!",
|
||||||
"mark_as_rejected": "Marcar como rejeitada",
|
"mark_as_rejected": "Marcar como rejeitada",
|
||||||
@ -522,42 +522,42 @@
|
|||||||
"select_invoice": "Selecionar Fatura",
|
"select_invoice": "Selecionar Fatura",
|
||||||
"no_matching_invoices": "Não há faturas recorrentes correspondentes!",
|
"no_matching_invoices": "Não há faturas recorrentes correspondentes!",
|
||||||
"mark_as_sent_successfully": "Fatura recorrente marcada como enviada com sucesso",
|
"mark_as_sent_successfully": "Fatura recorrente marcada como enviada com sucesso",
|
||||||
"invoice_sent_successfully": "Fatura recorrente enviada com sucesso",
|
"invoice_sent_successfully": "Recurring Invoice sent successfully",
|
||||||
"cloned_successfully": "Fatura recorrente copiada com sucesso",
|
"cloned_successfully": "Recurring Invoice cloned successfully",
|
||||||
"clone_invoice": "Copiar Fatura Recorrente",
|
"clone_invoice": "Clone Recurring Invoice",
|
||||||
"confirm_clone": "Esta fatura recorrente será copiada em uma nova fatura recorrente",
|
"confirm_clone": "This recurring invoice will be cloned into a new Recurring Invoice",
|
||||||
"add_customer_email": "Por favor, adicione um endereço de e-mail para este cliente para enviar faturas automaticamente.",
|
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
||||||
"item": {
|
"item": {
|
||||||
"title": "Titulo do item",
|
"title": "Item Title",
|
||||||
"description": "Descrição",
|
"description": "Description",
|
||||||
"quantity": "Quantidade",
|
"quantity": "Quantity",
|
||||||
"price": "Preço",
|
"price": "Price",
|
||||||
"discount": "Desconto",
|
"discount": "Discount",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"total_discount": "Desconto total",
|
"total_discount": "Total Discount",
|
||||||
"sub_total": "Subtotal",
|
"sub_total": "Sub Total",
|
||||||
"tax": "Imposto",
|
"tax": "Tax",
|
||||||
"amount": "Valor",
|
"amount": "Amount",
|
||||||
"select_an_item": "Digite ou clique para selecionar",
|
"select_an_item": "Type or click to select an item",
|
||||||
"type_item_description": "Descrição do Item (opcional)"
|
"type_item_description": "Type Item Description (optional)"
|
||||||
},
|
},
|
||||||
"frequency": {
|
"frequency": {
|
||||||
"title": "Frequência",
|
"title": "Frequency",
|
||||||
"select_frequency": "Selecione a Frequência",
|
"select_frequency": "Select Frequency",
|
||||||
"minute": "Minuto",
|
"minute": "Minute",
|
||||||
"hour": "Hora",
|
"hour": "Hour",
|
||||||
"day_month": "Dia do mês",
|
"day_month": "Day of month",
|
||||||
"month": "Mês",
|
"month": "Month",
|
||||||
"day_week": "Dia da semana"
|
"day_week": "Day of week"
|
||||||
},
|
},
|
||||||
"confirm_delete": "Você não poderá recuperar esta fatura | Você não poderá recuperar essas faturas",
|
"confirm_delete": "You will not be able to recover this Invoice | You will not be able to recover these Invoices",
|
||||||
"created_message": "Fatura recorrente criada com sucesso",
|
"created_message": "Recurring Invoice created successfully",
|
||||||
"updated_message": "Fatura recorrente atualizada com sucesso",
|
"updated_message": "Recurring Invoice updated successfully",
|
||||||
"deleted_message": "Fatura recorrente excluída com sucesso | Faturas recorrentes excluídas com sucesso",
|
"deleted_message": "Recurring Invoice deleted successfully | Recurring Invoices deleted successfully",
|
||||||
"marked_as_sent_message": "Fatura recorrente marcada como enviada com sucesso",
|
"marked_as_sent_message": "Recurring Invoice marked as sent successfully",
|
||||||
"user_email_does_not_exist": "E-mail de usuário não existe",
|
"user_email_does_not_exist": "User email does not exist",
|
||||||
"something_went_wrong": "houve algo de errado",
|
"something_went_wrong": "something went wrong",
|
||||||
"invalid_due_amount_message": "O valor total da fatura não pode ser menor que o valor total pago para esta fatura. Atualize a fatura ou exclua os pagamentos associados para continuar."
|
"invalid_due_amount_message": "Total Recurring Invoice amount cannot be less than total paid amount for this Recurring Invoice. Please update the invoice or delete the associated payments to continue."
|
||||||
},
|
},
|
||||||
"payments": {
|
"payments": {
|
||||||
"title": "Pagamentos",
|
"title": "Pagamentos",
|
||||||
@ -603,7 +603,7 @@
|
|||||||
"select_a_customer": "Selecione um cliente",
|
"select_a_customer": "Selecione um cliente",
|
||||||
"expense_title": "Título",
|
"expense_title": "Título",
|
||||||
"customer": "Cliente",
|
"customer": "Cliente",
|
||||||
"currency": "Moeda",
|
"currency": "Currency",
|
||||||
"contact": "Contato",
|
"contact": "Contato",
|
||||||
"category": "Categoria",
|
"category": "Categoria",
|
||||||
"from_date": "A partir da Data",
|
"from_date": "A partir da Data",
|
||||||
@ -658,49 +658,49 @@
|
|||||||
"retype_password": "Confirme a Senha"
|
"retype_password": "Confirme a Senha"
|
||||||
},
|
},
|
||||||
"modules": {
|
"modules": {
|
||||||
"buy_now": "Compre agora",
|
"buy_now": "Buy Now",
|
||||||
"install": "Instalar",
|
"install": "Install",
|
||||||
"price": "Preço",
|
"price": "Price",
|
||||||
"download_zip_file": "Baixar arquivo ZIP",
|
"download_zip_file": "Download ZIP file",
|
||||||
"unzipping_package": "Descompactando pacote",
|
"unzipping_package": "Unzipping Package",
|
||||||
"copying_files": "Copiando arquivos",
|
"copying_files": "Copying Files",
|
||||||
"deleting_files": "Excluindo arquivos não utilizados",
|
"deleting_files": "Deleting Unused files",
|
||||||
"completing_installation": "Completando instalação",
|
"completing_installation": "Completing Installation",
|
||||||
"update_failed": "Atualização falhou",
|
"update_failed": "Update Failed",
|
||||||
"install_success": "Módulo foi instalado com sucesso!",
|
"install_success": "Module has been installed successfully!",
|
||||||
"customer_reviews": "Avaliações",
|
"customer_reviews": "Reviews",
|
||||||
"license": "Licença",
|
"license": "License",
|
||||||
"faq": "FAQ",
|
"faq": "FAQ",
|
||||||
"monthly": "Mensalmente",
|
"monthly": "Monthly",
|
||||||
"yearly": "Anual",
|
"yearly": "Yearly",
|
||||||
"updated": "Atualizado",
|
"updated": "Updated",
|
||||||
"version": "Versão",
|
"version": "Version",
|
||||||
"disable": "Desabilitar",
|
"disable": "Disable",
|
||||||
"module_disabled": "Módulo Desabilitado",
|
"module_disabled": "Module Disabled",
|
||||||
"enable": "Habilitar",
|
"enable": "Enable",
|
||||||
"module_enabled": "Módulo Habilitado",
|
"module_enabled": "Module Enabled",
|
||||||
"update_to": "Atualizar Para",
|
"update_to": "Update To",
|
||||||
"module_updated": "Módulo atualizado com sucesso!",
|
"module_updated": "Module Updated Successfully!",
|
||||||
"title": "Módulos",
|
"title": "Modules",
|
||||||
"module": "Módulo | Módulos",
|
"module": "Module | Modules",
|
||||||
"api_token": "Token de API",
|
"api_token": "API token",
|
||||||
"invalid_api_token": "Token da API inválido.",
|
"invalid_api_token": "Invalid API Token.",
|
||||||
"other_modules": "Outros Módulos",
|
"other_modules": "Other Modules",
|
||||||
"view_all": "Ver todos",
|
"view_all": "View All",
|
||||||
"no_reviews_found": "Não há avaliações para este módulo ainda!",
|
"no_reviews_found": "There are no reviews for this module yet!",
|
||||||
"module_not_purchased": "Módulo não comprado",
|
"module_not_purchased": "Module Not Purchased",
|
||||||
"module_not_found": "Módulo não encontrado",
|
"module_not_found": "Module Not Found",
|
||||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||||
"last_updated": "Última atualização em",
|
"last_updated": "Last Updated On",
|
||||||
"connect_installation": "Conecte sua instalação",
|
"connect_installation": "Connect your installation",
|
||||||
"api_token_description": "Faça login em {url} e conecte esta instalação digitando o Token da API. Os módulos comprados aparecerão aqui após a conexão ser estabelecida.",
|
"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": "Ver Módulo",
|
"view_module": "View Module",
|
||||||
"update_available": "Atualização disponível",
|
"update_available": "Update Available",
|
||||||
"purchased": "Comprado",
|
"purchased": "Purchased",
|
||||||
"installed": "Instalado",
|
"installed": "Installed",
|
||||||
"no_modules_installed": "Nenhum módulo instalado ainda!",
|
"no_modules_installed": "No Modules Installed Yet!",
|
||||||
"disable_warning": "Todas as configurações serão revertidas.",
|
"disable_warning": "All the settings for this particular will be reverted.",
|
||||||
"what_you_get": "O que você recebe?"
|
"what_you_get": "What you get"
|
||||||
},
|
},
|
||||||
"users": {
|
"users": {
|
||||||
"title": "Usuários",
|
"title": "Usuários",
|
||||||
@ -727,8 +727,8 @@
|
|||||||
"created_message": "Usuário criado com sucesso",
|
"created_message": "Usuário criado com sucesso",
|
||||||
"updated_message": "Usuário atualizado com sucesso",
|
"updated_message": "Usuário atualizado com sucesso",
|
||||||
"deleted_message": "Usuário excluído com sucesso | Usuários excluídos com sucesso",
|
"deleted_message": "Usuário excluído com sucesso | Usuários excluídos com sucesso",
|
||||||
"select_company_role": "Selecione o cargo da {company}",
|
"select_company_role": "Select Role for {company}",
|
||||||
"companies": "Empresas"
|
"companies": "Companies"
|
||||||
},
|
},
|
||||||
"reports": {
|
"reports": {
|
||||||
"title": "Relatório",
|
"title": "Relatório",
|
||||||
@ -801,16 +801,16 @@
|
|||||||
"tax_types": "Tipos de Impostos",
|
"tax_types": "Tipos de Impostos",
|
||||||
"expense_category": "Categorias de Despesas",
|
"expense_category": "Categorias de Despesas",
|
||||||
"update_app": "Atualizar Aplicativo",
|
"update_app": "Atualizar Aplicativo",
|
||||||
"backup": "Cópia de Segurança",
|
"backup": "Backup",
|
||||||
"file_disk": "Disco de Arquivos",
|
"file_disk": "Disco de Arquivos",
|
||||||
"custom_fields": "Os campos personalizados",
|
"custom_fields": "Os campos personalizados",
|
||||||
"payment_modes": "Meios de Pagamento",
|
"payment_modes": "Meios de Pagamento",
|
||||||
"notes": "Observações",
|
"notes": "Observações",
|
||||||
"exchange_rate": "Taxa de Câmbio",
|
"exchange_rate": "Exchange Rate",
|
||||||
"address_information": "Informações de Endereço"
|
"address_information": "Address Information"
|
||||||
},
|
},
|
||||||
"address_information": {
|
"address_information": {
|
||||||
"section_description": " Você pode atualizar suas informações de endereço usando o formulário abaixo."
|
"section_description": " You can update Your Address information using form below."
|
||||||
},
|
},
|
||||||
"title": "Configurações",
|
"title": "Configurações",
|
||||||
"setting": "Configuração | Configurações",
|
"setting": "Configuração | Configurações",
|
||||||
@ -872,13 +872,13 @@
|
|||||||
"address": "Endereço",
|
"address": "Endereço",
|
||||||
"zip": "CEP",
|
"zip": "CEP",
|
||||||
"save": "Salvar",
|
"save": "Salvar",
|
||||||
"delete": "Excluir",
|
"delete": "Delete",
|
||||||
"updated_message": "Informações da Empresa atualizadas com sucesso",
|
"updated_message": "Informações da Empresa atualizadas com sucesso",
|
||||||
"delete_company": "Excluir Empresa",
|
"delete_company": "Delete Company",
|
||||||
"delete_company_description": "Depois de excluir sua empresa, você perderá todos os dados e arquivos associados a ela permanentemente.",
|
"delete_company_description": "Once you delete your company, you will lose all the data and files associated with it permanently.",
|
||||||
"are_you_absolutely_sure": "Você tem certeza?",
|
"are_you_absolutely_sure": "Are you absolutely sure?",
|
||||||
"delete_company_modal_desc": "Esta ação não pode ser desfeita. Isto irá apagar permanentemente a {company} e todos os dados associados.",
|
"delete_company_modal_desc": "This action cannot be undone. This will permanently delete {company} and all of its associated data.",
|
||||||
"delete_company_modal_label": "Digite {company} para confirmar"
|
"delete_company_modal_label": "Please type {company} to confirm"
|
||||||
},
|
},
|
||||||
"custom_fields": {
|
"custom_fields": {
|
||||||
"title": "Os campos personalizados",
|
"title": "Os campos personalizados",
|
||||||
@ -916,103 +916,103 @@
|
|||||||
"ticked_by_default": "Marcado por padrão",
|
"ticked_by_default": "Marcado por padrão",
|
||||||
"updated_message": "Campo personalizado atualizado com sucesso",
|
"updated_message": "Campo personalizado atualizado com sucesso",
|
||||||
"added_message": "Campo personalizado adicionado com sucesso",
|
"added_message": "Campo personalizado adicionado com sucesso",
|
||||||
"press_enter_to_add": "Aperte enter para adicionar uma nova opção",
|
"press_enter_to_add": "Press enter to add new option",
|
||||||
"model_in_use": "Não é possível atualizar o modelo para campos que já estão em uso.",
|
"model_in_use": "Cannot update model for fields which are already in use.",
|
||||||
"type_in_use": "Não é possível atualizar o tipo para os campos que já estão em uso."
|
"type_in_use": "Cannot update type for fields which are already in use."
|
||||||
},
|
},
|
||||||
"customization": {
|
"customization": {
|
||||||
"customization": "personalização",
|
"customization": "personalização",
|
||||||
"updated_message": "Informações da Empresa atualizadas com sucesso",
|
"updated_message": "Informações da Empresa atualizadas com sucesso",
|
||||||
"save": "Salvar",
|
"save": "Salvar",
|
||||||
"insert_fields": "Inserir Campos",
|
"insert_fields": "Insert Fields",
|
||||||
"learn_custom_format": "Aprenda a usar o formato personalizado",
|
"learn_custom_format": "Learn how to use custom format",
|
||||||
"add_new_component": "Novo Componente",
|
"add_new_component": "Add New Component",
|
||||||
"component": "Componente",
|
"component": "Component",
|
||||||
"Parameter": "Parâmetro",
|
"Parameter": "Parameter",
|
||||||
"series": "Séries",
|
"series": "Series",
|
||||||
"series_description": "Para definir um prefixo/sufixo estático como 'INV' em sua empresa. Ele suporta o comprimento do caractere de até 6 caracteres.",
|
"series_description": "To set a static prefix/postfix like 'INV' across your company. It supports character length of up to 6 chars.",
|
||||||
"series_param_label": "Valor da Série",
|
"series_param_label": "Series Value",
|
||||||
"delimiter": "Delimitador",
|
"delimiter": "Delimiter",
|
||||||
"delimiter_description": "Caractere único para especificar o limite entre 2 componentes separados. Por padrão é -",
|
"delimiter_description": "Single character for specifying the boundary between 2 separate components. By default its set to -",
|
||||||
"delimiter_param_label": "Valor Delimitador",
|
"delimiter_param_label": "Delimiter Value",
|
||||||
"date_format": "Formato de Data",
|
"date_format": "Date Format",
|
||||||
"date_format_description": "Um campo de data e hora local que aceita um parâmetro de formato. O formato padrão: 'Y' apresenta o ano atual.",
|
"date_format_description": "A local date and time field which accepts a format parameter. The default format: 'Y' renders the current year.",
|
||||||
"date_format_param_label": "Formato",
|
"date_format_param_label": "Format",
|
||||||
"sequence": "Sequência",
|
"sequence": "Sequence",
|
||||||
"sequence_description": "Sequência consecutiva de números em sua empresa. Você pode especificar o comprimento nos parâmetros indicados.",
|
"sequence_description": "Consecutive sequence of numbers across your company. You can specify the length on the given parameter.",
|
||||||
"sequence_param_label": "Comprimento da sequência",
|
"sequence_param_label": "Sequence Length",
|
||||||
"customer_series": "Série do Cliente",
|
"customer_series": "Customer Series",
|
||||||
"customer_series_description": "Para definir um prefixo/sufixo diferente para cada cliente.",
|
"customer_series_description": "To set a different prefix/postfix for each customer.",
|
||||||
"customer_sequence": "Sequência do Cliente",
|
"customer_sequence": "Customer Sequence",
|
||||||
"customer_sequence_description": "Sequência consecutiva de números para cada um de seus clientes.",
|
"customer_sequence_description": "Consecutive sequence of numbers for each of your customer.",
|
||||||
"customer_sequence_param_label": "Comprimento da Sequência",
|
"customer_sequence_param_label": "Sequence Length",
|
||||||
"random_sequence": "Sequência aleatória",
|
"random_sequence": "Random Sequence",
|
||||||
"random_sequence_description": "Cadeia alfanumérica aleatória. Você pode especificar o comprimento no parâmetro fornecido.",
|
"random_sequence_description": "Random alphanumeric string. You can specify the length on the given parameter.",
|
||||||
"random_sequence_param_label": "Comprimento da Sequência",
|
"random_sequence_param_label": "Sequence Length",
|
||||||
"invoices": {
|
"invoices": {
|
||||||
"title": "Faturas",
|
"title": "Faturas",
|
||||||
"invoice_number_format": "Formato do Número da Fatura",
|
"invoice_number_format": "Invoice Number Format",
|
||||||
"invoice_number_format_description": "Personalize como o número da sua fatura é gerado automaticamente quando você cria uma nova fatura.",
|
"invoice_number_format_description": "Customize how your invoice number gets generated automatically when you create a new invoice.",
|
||||||
"preview_invoice_number": "Pré-visualizar número da fatura",
|
"preview_invoice_number": "Preview Invoice Number",
|
||||||
"due_date": "Vencimento",
|
"due_date": "Due Date",
|
||||||
"due_date_description": "Especifique como a data de vencimento é definida automaticamente ao criar uma fatura.",
|
"due_date_description": "Specify how due date is automatically set when you create an invoice.",
|
||||||
"due_date_days": "Número de dias antes do vencimento da fatura",
|
"due_date_days": "Invoice Due after days",
|
||||||
"set_due_date_automatically": "Definir Data de Vencimento Automaticamente",
|
"set_due_date_automatically": "Set Due Date Automatically",
|
||||||
"set_due_date_automatically_description": "Habilite isso se deseja definir a data de vencimento automaticamente ao criar uma fatura.",
|
"set_due_date_automatically_description": "Enable this if you wish to set due date automatically when you create a new invoice.",
|
||||||
"default_formats": "Formatos Padrão",
|
"default_formats": "Default Formats",
|
||||||
"default_formats_description": "Os formatos indicados abaixo são usados para preencher os campos automaticamente na criação da fatura.",
|
"default_formats_description": "Below given formats are used to fill up the fields automatically on invoice creation.",
|
||||||
"default_invoice_email_body": "Corpo Padrão de Email de Fatura",
|
"default_invoice_email_body": "Corpo Padrão de Email de Fatura",
|
||||||
"company_address_format": "Formato de Endereço de Empresa",
|
"company_address_format": "Formato de Endereço de Empresa",
|
||||||
"shipping_address_format": "Formato de Endereço de Envio",
|
"shipping_address_format": "Formato de Endereço de Envio",
|
||||||
"billing_address_format": "Formato de Endereço de Faturamento",
|
"billing_address_format": "Formato de Endereço de Faturamento",
|
||||||
"invoice_email_attachment": "Enviar faturas como anexos",
|
"invoice_email_attachment": "Enviar faturas como anexos",
|
||||||
"invoice_email_attachment_setting_description": "Ative esta opção se quiser anexar faturas no e-mail. Lembrando que quando habilitado, o botão 'Ver fatura' nos e-mails não será mais exibido.",
|
"invoice_email_attachment_setting_description": "Ative esta opção se quiser anexar faturas no e-mail. Lembrando que quando habilitado, o botão 'Ver fatura' nos e-mails não será mais exibido.",
|
||||||
"invoice_settings_updated": "Configurações da fatura atualizadas com sucesso",
|
"invoice_settings_updated": "Invoice Settings updated successfully",
|
||||||
"retrospective_edits": "Edições Retrospectivas",
|
"retrospective_edits": "Retrospective Edits",
|
||||||
"allow": "Permitir",
|
"allow": "Allow",
|
||||||
"disable_on_invoice_partial_paid": "Desativar após registrar um pagamento parcial",
|
"disable_on_invoice_partial_paid": "Disable after partial payment is recorded",
|
||||||
"disable_on_invoice_paid": "Desativar após registrar um pagamento completo",
|
"disable_on_invoice_paid": "Disable after full payment is recorded",
|
||||||
"disable_on_invoice_sent": "Desativar após o envio da fatura",
|
"disable_on_invoice_sent": "Disable after invoice is sent",
|
||||||
"retrospective_edits_description": " Com base nas leis do seu país ou na sua preferência, é possível restringir os usuários de editar faturas finalizadas."
|
"retrospective_edits_description": " Based on your country's laws or your preference, you can restrict users from editing finalised invoices."
|
||||||
},
|
},
|
||||||
"estimates": {
|
"estimates": {
|
||||||
"title": "Orçamentos",
|
"title": "Orçamentos",
|
||||||
"estimate_number_format": "Formato do Número de Orçamento",
|
"estimate_number_format": "Estimate Number Format",
|
||||||
"estimate_number_format_description": "Personalize como seu número de orçamento é gerado automaticamente quando você cria um orçamento.",
|
"estimate_number_format_description": "Customize how your estimate number gets generated automatically when you create a new estimate.",
|
||||||
"preview_estimate_number": "Pré-visualizar Número de Orçamento",
|
"preview_estimate_number": "Preview Estimate Number",
|
||||||
"expiry_date": "Vencimento",
|
"expiry_date": "Expiry Date",
|
||||||
"expiry_date_description": "Especifique como a data de vencimento é definida automaticamente quando você cria um orçamento.",
|
"expiry_date_description": "Specify how expiry date is automatically set when you create an estimate.",
|
||||||
"expiry_date_days": "Orçamento expira após dias",
|
"expiry_date_days": "Estimate Expires after days",
|
||||||
"set_expiry_date_automatically": "Definir Data de Vencimento Automaticamente",
|
"set_expiry_date_automatically": "Set Expiry Date Automatically",
|
||||||
"set_expiry_date_automatically_description": "Habilite isso se desejar definir a data de vencimento automaticamente ao criar um orçamento.",
|
"set_expiry_date_automatically_description": "Enable this if you wish to set expiry date automatically when you create a new estimate.",
|
||||||
"default_formats": "Formatos Padrão",
|
"default_formats": "Default Formats",
|
||||||
"default_formats_description": "Os formatos indicados abaixo são usados para preencher os campos automaticamente na criação do orçamento.",
|
"default_formats_description": "Below given formats are used to fill up the fields automatically on estimate creation.",
|
||||||
"default_estimate_email_body": "Corpo Padrão de Email de Orçamento",
|
"default_estimate_email_body": "Corpo Padrão de Email de Orçamento",
|
||||||
"company_address_format": "Formato de Endereço de Empresa",
|
"company_address_format": "Formato de Endereço de Empresa",
|
||||||
"shipping_address_format": "Formato de Endereço de Envio",
|
"shipping_address_format": "Formato de Endereço de Envio",
|
||||||
"billing_address_format": "Formato de Endereço de Faturamento",
|
"billing_address_format": "Formato de Endereço de Faturamento",
|
||||||
"estimate_email_attachment": "Enviar orçamentos como anexos",
|
"estimate_email_attachment": "Enviar orçamentos como anexos",
|
||||||
"estimate_email_attachment_setting_description": "Ative esta opção se quiser anexar orçamentos no e-mail. Lembrando que quando habilitado, o botão 'Ver orçamento' nos e-mails não será mais exibido.",
|
"estimate_email_attachment_setting_description": "Ative esta opção se quiser anexar orçamentos no e-mail. Lembrando que quando habilitado, o botão 'Ver orçamento' nos e-mails não será mais exibido.",
|
||||||
"estimate_settings_updated": "Configurações de orçamento atualizadas com sucesso",
|
"estimate_settings_updated": "Estimate Settings updated successfully",
|
||||||
"convert_estimate_options": "Ação de Conversão de Orçamento",
|
"convert_estimate_options": "Estimate Convert Action",
|
||||||
"convert_estimate_description": "Especifique o que acontece com o orçamento depois que ele é convertido em uma fatura.",
|
"convert_estimate_description": "Specify what happens to the estimate after it gets converted to an invoice.",
|
||||||
"no_action": "Nenhuma ação",
|
"no_action": "No action",
|
||||||
"delete_estimate": "Excluir orçamento",
|
"delete_estimate": "Delete estimate",
|
||||||
"mark_estimate_as_accepted": "Marcar orçamento como aceito"
|
"mark_estimate_as_accepted": "Mark estimate as accepted"
|
||||||
},
|
},
|
||||||
"payments": {
|
"payments": {
|
||||||
"title": "Pagamentos",
|
"title": "Pagamentos",
|
||||||
"payment_number_format": "Formato do Número de Pagamento",
|
"payment_number_format": "Payment Number Format",
|
||||||
"payment_number_format_description": "Personalize como seu número de pagamento é gerado automaticamente quando você cria um pagamento.",
|
"payment_number_format_description": "Customize how your payment number gets generated automatically when you create a new payment.",
|
||||||
"preview_payment_number": "Visualizar Número de Pagamento",
|
"preview_payment_number": "Preview Payment Number",
|
||||||
"default_formats": "Formato padrão",
|
"default_formats": "Default Formats",
|
||||||
"default_formats_description": "Os formatos abaixo são usados para preencher os campos automaticamente na criação de pagamentos.",
|
"default_formats_description": "Below given formats are used to fill up the fields automatically on payment creation.",
|
||||||
"default_payment_email_body": "Corpo Padrão de Email de Pagamento",
|
"default_payment_email_body": "Corpo Padrão de Email de Pagamento",
|
||||||
"company_address_format": "Formato de Endereço de Empresa",
|
"company_address_format": "Formato de Endereço de Empresa",
|
||||||
"from_customer_address_format": "Formato de Endereço de Cliente Remetente",
|
"from_customer_address_format": "Formato de Endereço de Cliente Remetente",
|
||||||
"payment_email_attachment": "Enviar pagamentos como anexos",
|
"payment_email_attachment": "Enviar pagamentos como anexos",
|
||||||
"payment_email_attachment_setting_description": "Ative esta opção se quiser enviar em anexo os recibos de pagamento no e-mail. Lembrando que quando habilitado, o botão 'Ver Pagamento' nos e-mails não será mais exibido.",
|
"payment_email_attachment_setting_description": "Ative esta opção se quiser enviar em anexo os recibos de pagamento no e-mail. Lembrando que quando habilitado, o botão 'Ver Pagamento' nos e-mails não será mais exibido.",
|
||||||
"payment_settings_updated": "Configurações de Pagamento atualizada com sucesso"
|
"payment_settings_updated": "Payment Settings updated successfully"
|
||||||
},
|
},
|
||||||
"items": {
|
"items": {
|
||||||
"title": "Itens",
|
"title": "Itens",
|
||||||
@ -1072,55 +1072,55 @@
|
|||||||
"please_enter_email": "Por favor digite um E-mail"
|
"please_enter_email": "Por favor digite um E-mail"
|
||||||
},
|
},
|
||||||
"roles": {
|
"roles": {
|
||||||
"title": "Nível de Acesso",
|
"title": "Roles",
|
||||||
"description": "Gerenciar os cargos e permissões desta empresa",
|
"description": "Manage the roles & permissions of this company",
|
||||||
"save": "Salvar",
|
"save": "Save",
|
||||||
"add_new_role": "Criar Nível de Acesso",
|
"add_new_role": "Add New Role",
|
||||||
"role_name": "Nome",
|
"role_name": "Role Name",
|
||||||
"added_on": "Adicionado em",
|
"added_on": "Added on",
|
||||||
"add_role": "Adicionar função",
|
"add_role": "Add Role",
|
||||||
"edit_role": "Editar Função",
|
"edit_role": "Edit Role",
|
||||||
"name": "Nome",
|
"name": "Name",
|
||||||
"permission": "Permissão | Permissões",
|
"permission": "Permission | Permissions",
|
||||||
"select_all": "Selecionar tudo",
|
"select_all": "Select All",
|
||||||
"none": "Nenhum",
|
"none": "None",
|
||||||
"confirm_delete": "Você não poderá recuperar este Cargo",
|
"confirm_delete": "You will not be able to recover this Role",
|
||||||
"created_message": "Cargo criado com sucesso",
|
"created_message": "Role created successfully",
|
||||||
"updated_message": "Cargo atualizado com sucesso",
|
"updated_message": "Role updated successfully",
|
||||||
"deleted_message": "Cargo deletado com sucesso",
|
"deleted_message": "Role deleted successfully",
|
||||||
"already_in_use": "Cargo já em uso"
|
"already_in_use": "Role is already in use"
|
||||||
},
|
},
|
||||||
"exchange_rate": {
|
"exchange_rate": {
|
||||||
"exchange_rate": "Taxa de Câmbio",
|
"exchange_rate": "Exchange Rate",
|
||||||
"title": "Corrigir problemas do câmbio",
|
"title": "Fix Currency Exchange issues",
|
||||||
"description": "Por favor, indique a taxa de câmbio de todas as moedas mencionadas abaixo para ajudar o Crater a calcular corretamente as quantidades em {currency}.",
|
"description": "Please enter exchange rate of all the currencies mentioned below to help Crater properly calculate the amounts in {currency}.",
|
||||||
"drivers": "Drivers",
|
"drivers": "Drivers",
|
||||||
"new_driver": "Adicionar Fornecedor",
|
"new_driver": "Add New Provider",
|
||||||
"edit_driver": "Editar fornecedor",
|
"edit_driver": "Edit Provider",
|
||||||
"select_driver": "Select Driver",
|
"select_driver": "Select Driver",
|
||||||
"update": "selecione a taxa de câmbio ",
|
"update": "select exchange rate ",
|
||||||
"providers_description": "Configure aqui a taxa de câmbio de seus fornecedores para buscar automaticamente a taxa de câmbio mais recente nas transações.",
|
"providers_description": "Configure your exchange rate providers here to automatically fetch the latest exchange rate on transactions.",
|
||||||
"key": "Chave da API",
|
"key": "API Key",
|
||||||
"name": "Nome",
|
"name": "Name",
|
||||||
"driver": "Driver",
|
"driver": "Driver",
|
||||||
"is_default": "É PADRÃO",
|
"is_default": "IS DEFAULT",
|
||||||
"currency": "Moedas",
|
"currency": "Currencies",
|
||||||
"exchange_rate_confirm_delete": "You will not be able to recover this driver",
|
"exchange_rate_confirm_delete": "You will not be able to recover this driver",
|
||||||
"created_message": "Fornecedor criado com sucesso",
|
"created_message": "Provider Created successfully",
|
||||||
"updated_message": "Fornecedor Atualizado com Sucesso",
|
"updated_message": "Provider Updated Successfully",
|
||||||
"deleted_message": "Fornecedor Excluído com Sucesso",
|
"deleted_message": "Provider Deleted Successfully",
|
||||||
"error": " You cannot Delete Active Driver",
|
"error": " You cannot Delete Active Driver",
|
||||||
"default_currency_error": "Esta moeda já é usada em um dos fornecedores ativos",
|
"default_currency_error": "This currency is already used in one of the Active Provider",
|
||||||
"exchange_help_text": "Digite a taxa de câmbio para converter de {currency} para {baseCurrency}",
|
"exchange_help_text": "Enter exchange rate to convert from {currency} to {baseCurrency}",
|
||||||
"currency_freak": "Currency Freak",
|
"currency_freak": "Currency Freak",
|
||||||
"currency_layer": "Currency Layer",
|
"currency_layer": "Currency Layer",
|
||||||
"open_exchange_rate": "Abrir Taxa de Câmbio",
|
"open_exchange_rate": "Open Exchange Rate",
|
||||||
"currency_converter": "Conversor de moeda",
|
"currency_converter": "Currency Converter",
|
||||||
"server": "Servidor",
|
"server": "Server",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"active": "Ativo",
|
"active": "Active",
|
||||||
"currency_help_text": "Este fornecedor será usado somente nas moedas selecionadas acima",
|
"currency_help_text": "This provider will only be used on above selected currencies",
|
||||||
"currency_in_used": "As seguintes moedas já estão ativas em outro fornecedor. Remova essas moedas da seleção para ativar este fornecedor novamente."
|
"currency_in_used": "The following currencies are already active on another provider. Please remove these currencies from selection to activate this provider again."
|
||||||
},
|
},
|
||||||
"tax_types": {
|
"tax_types": {
|
||||||
"title": "Tipos de Impostos",
|
"title": "Tipos de Impostos",
|
||||||
@ -1142,17 +1142,17 @@
|
|||||||
"already_in_use": "O Imposto já está em uso"
|
"already_in_use": "O Imposto já está em uso"
|
||||||
},
|
},
|
||||||
"payment_modes": {
|
"payment_modes": {
|
||||||
"title": "Forma de Pagamento",
|
"title": "Payment Modes",
|
||||||
"description": "Modos de transação para pagamentos",
|
"description": "Modes of transaction for payments",
|
||||||
"add_payment_mode": "Adicionar Forma de Pagamento",
|
"add_payment_mode": "Add Payment Mode",
|
||||||
"edit_payment_mode": "Editar Forma de Pagamento",
|
"edit_payment_mode": "Edit Payment Mode",
|
||||||
"mode_name": "Nome da Forma de Pagamento",
|
"mode_name": "Mode Name",
|
||||||
"payment_mode_added": "Forma de Pagamento Adicionada",
|
"payment_mode_added": "Payment Mode Added",
|
||||||
"payment_mode_updated": "Forma de Pagamento Atualizada",
|
"payment_mode_updated": "Payment Mode Updated",
|
||||||
"payment_mode_confirm_delete": "Você não poderá recuperar esta Forma de Pagamento",
|
"payment_mode_confirm_delete": "You will not be able to recover this Payment Mode",
|
||||||
"payments_attached": "Este método de pagamento já está anexado aos pagamentos. Por favor, exclua os pagamentos anexados para prosseguir com a exclusão.",
|
"payments_attached": "This payment method is already attached to payments. Please delete the attached payments to proceed with deletion.",
|
||||||
"expenses_attached": "Este método de pagamento já está anexado às despesas. Por favor, apague as despesas anexadas para prosseguir com a exclusão.",
|
"expenses_attached": "This payment method is already attached to expenses. Please delete the attached expenses to proceed with deletion.",
|
||||||
"deleted_message": "Forma de Pagamento excluída com sucesso"
|
"deleted_message": "Payment Mode deleted successfully"
|
||||||
},
|
},
|
||||||
"expense_category": {
|
"expense_category": {
|
||||||
"title": "Categoria de Despesa",
|
"title": "Categoria de Despesa",
|
||||||
@ -1178,8 +1178,8 @@
|
|||||||
"discount_setting": "Configuração de Desconto",
|
"discount_setting": "Configuração de Desconto",
|
||||||
"discount_per_item": "Desconto por Item ",
|
"discount_per_item": "Desconto por Item ",
|
||||||
"discount_setting_description": "Habilite isso se desejar adicionar desconto a itens de Fatura individualmente. Por padrão, o desconto é adicionado diretamente à Fatura.",
|
"discount_setting_description": "Habilite isso se desejar adicionar desconto a itens de Fatura individualmente. Por padrão, o desconto é adicionado diretamente à Fatura.",
|
||||||
"expire_public_links": "Expirar Links Públicos Automaticamente",
|
"expire_public_links": "Automatically Expire Public Links",
|
||||||
"expire_setting_description": "Especifique se deseja expirar todos os links enviados pelo aplicativo para visualizar faturas, orçamentos, pagamentos e etc., após um período especificado.",
|
"expire_setting_description": "Specify whether you would like to expire all the links sent by application to view invoices, estimates & payments, etc after a specified duration.",
|
||||||
"save": "Salvar",
|
"save": "Salvar",
|
||||||
"preference": "Preferência | Preferências",
|
"preference": "Preferência | Preferências",
|
||||||
"general_settings": "Preferências padrão para o sistema.",
|
"general_settings": "Preferências padrão para o sistema.",
|
||||||
@ -1188,13 +1188,13 @@
|
|||||||
"select_time_zone": "Selecione um fuso horário",
|
"select_time_zone": "Selecione um fuso horário",
|
||||||
"select_date_format": "Selecionar um Formato de Data",
|
"select_date_format": "Selecionar um Formato de Data",
|
||||||
"select_financial_year": "Selecione o ano financeiro",
|
"select_financial_year": "Selecione o ano financeiro",
|
||||||
"recurring_invoice_status": "Status da fatura recorrente",
|
"recurring_invoice_status": "Recurring Invoice Status",
|
||||||
"create_status": "Criar Status",
|
"create_status": "Create Status",
|
||||||
"active": "Ativo",
|
"active": "Active",
|
||||||
"on_hold": "Em espera",
|
"on_hold": "On Hold",
|
||||||
"update_status": "Atualizar Status",
|
"update_status": "Update Status",
|
||||||
"completed": "Concluído",
|
"completed": "Completed",
|
||||||
"company_currency_unchangeable": "Moeda da empresa não pode ser alterada"
|
"company_currency_unchangeable": "Company currency cannot be changed"
|
||||||
},
|
},
|
||||||
"update_app": {
|
"update_app": {
|
||||||
"title": "Atualizar Aplicativo",
|
"title": "Atualizar Aplicativo",
|
||||||
@ -1217,10 +1217,10 @@
|
|||||||
"finishing_update": "Acabando a Atualização",
|
"finishing_update": "Acabando a Atualização",
|
||||||
"update_failed": "Atualização falhou",
|
"update_failed": "Atualização falhou",
|
||||||
"update_failed_text": "Desculpa! Sua atualização falhou no passo: {step}",
|
"update_failed_text": "Desculpa! Sua atualização falhou no passo: {step}",
|
||||||
"update_warning": "Todos os arquivos de aplicativo e arquivos de modelo padrão serão substituídos quando você atualizar o aplicativo usando este utilitário. Faça um backup de seus templates e banco de dados antes de atualizar."
|
"update_warning": "All of the application files and default template files will be overwritten when you update the application using this utility. Please take a backup of your templates & database before updating."
|
||||||
},
|
},
|
||||||
"backup": {
|
"backup": {
|
||||||
"title": "Cópia de segurança | Cópias de segurança",
|
"title": "Backup | Backups",
|
||||||
"description": "O backup é um arquivo zip que contém todos os arquivos nas pastas que você especificou juntamente com um arquivo de backup de sua base de dados",
|
"description": "O backup é um arquivo zip que contém todos os arquivos nas pastas que você especificou juntamente com um arquivo de backup de sua base de dados",
|
||||||
"new_backup": "Adicionar Novo Backup",
|
"new_backup": "Adicionar Novo Backup",
|
||||||
"create_backup": "Criar Backup",
|
"create_backup": "Criar Backup",
|
||||||
@ -1248,7 +1248,7 @@
|
|||||||
"created_at": "criado em",
|
"created_at": "criado em",
|
||||||
"dropbox": "dropbox",
|
"dropbox": "dropbox",
|
||||||
"name": "Nome",
|
"name": "Nome",
|
||||||
"driver": "Motorista",
|
"driver": "Driver",
|
||||||
"disk_type": "Tipo",
|
"disk_type": "Tipo",
|
||||||
"disk_name": "Nome do disco",
|
"disk_name": "Nome do disco",
|
||||||
"new_disk": "Adicionar novo disco",
|
"new_disk": "Adicionar novo disco",
|
||||||
@ -1301,16 +1301,16 @@
|
|||||||
"invalid_disk_credentials": "Credencial inválida para o disco selecionado"
|
"invalid_disk_credentials": "Credencial inválida para o disco selecionado"
|
||||||
},
|
},
|
||||||
"taxations": {
|
"taxations": {
|
||||||
"add_billing_address": "Endereço de Cobrança do Cliente",
|
"add_billing_address": "Enter Billing Address",
|
||||||
"add_shipping_address": "Endereço de Entrega do Cliente",
|
"add_shipping_address": "Enter Shipping Address",
|
||||||
"add_company_address": "Insira o Endereço da Empresa",
|
"add_company_address": "Enter Company Address",
|
||||||
"modal_description": "As informações abaixo são necessárias para obter o imposto sobre vendas.",
|
"modal_description": "The information below is required in order to fetch sales tax.",
|
||||||
"add_address": "Adicionar endereço para buscar o imposto sobre vendas.",
|
"add_address": "Add Address for fetching sales tax.",
|
||||||
"address_placeholder": "Exemplo: 123, Minha Rua",
|
"address_placeholder": "Example: 123, My Street",
|
||||||
"city_placeholder": "Exemplo: Los Angeles",
|
"city_placeholder": "Example: Los Angeles",
|
||||||
"state_placeholder": "Exemplo: CA",
|
"state_placeholder": "Example: CA",
|
||||||
"zip_placeholder": "Exemplo: 90024",
|
"zip_placeholder": "Example: 90024",
|
||||||
"invalid_address": "Forneça detalhes do endereço válido."
|
"invalid_address": "Please provide valid address details."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"wizard": {
|
"wizard": {
|
||||||
@ -1328,7 +1328,7 @@
|
|||||||
"logo_preview": "Pré-visualizar Logotipo",
|
"logo_preview": "Pré-visualizar Logotipo",
|
||||||
"preferences": "Preferências",
|
"preferences": "Preferências",
|
||||||
"preferences_desc": "Preferências padrão para o sistema.",
|
"preferences_desc": "Preferências padrão para o sistema.",
|
||||||
"currency_set_alert": "A moeda da empresa não pode ser alterada mais tarde.",
|
"currency_set_alert": "The company's currency cannot be changed later.",
|
||||||
"country": "País",
|
"country": "País",
|
||||||
"state": "Estado",
|
"state": "Estado",
|
||||||
"city": "Cidade",
|
"city": "Cidade",
|
||||||
@ -1372,7 +1372,7 @@
|
|||||||
"app_domain": "Domínio do Aplicativo",
|
"app_domain": "Domínio do Aplicativo",
|
||||||
"verify_now": "Verificar Agora",
|
"verify_now": "Verificar Agora",
|
||||||
"success": "Domínio Verificado com Sucesso.",
|
"success": "Domínio Verificado com Sucesso.",
|
||||||
"failed": "Falha na verificação de domínio. Digite um nome de domínio válido.",
|
"failed": "Domain verification failed. Please enter valid domain name.",
|
||||||
"verify_and_continue": "Verificar e Continuar"
|
"verify_and_continue": "Verificar e Continuar"
|
||||||
},
|
},
|
||||||
"mail": {
|
"mail": {
|
||||||
@ -1425,7 +1425,7 @@
|
|||||||
"not_yet": "Ainda não? Envie novamente",
|
"not_yet": "Ainda não? Envie novamente",
|
||||||
"password_min_length": "A senha deve ter {count} caracteres",
|
"password_min_length": "A senha deve ter {count} caracteres",
|
||||||
"name_min_length": "O nome deve ter pelo menos {count} letras.",
|
"name_min_length": "O nome deve ter pelo menos {count} letras.",
|
||||||
"prefix_min_length": "O nome deve ter pelo menos {count} letras.",
|
"prefix_min_length": "Prefix must have at least {count} letters.",
|
||||||
"enter_valid_tax_rate": "Insira uma taxa de imposto válida",
|
"enter_valid_tax_rate": "Insira uma taxa de imposto válida",
|
||||||
"numbers_only": "Apenas Números.",
|
"numbers_only": "Apenas Números.",
|
||||||
"characters_only": "Apenas Caracteres.",
|
"characters_only": "Apenas Caracteres.",
|
||||||
@ -1440,7 +1440,7 @@
|
|||||||
"price_minvalue": "O preço deve ser maior que 0.",
|
"price_minvalue": "O preço deve ser maior que 0.",
|
||||||
"amount_maxlength": "Valor não deve ter mais de 20 dígitos.",
|
"amount_maxlength": "Valor não deve ter mais de 20 dígitos.",
|
||||||
"amount_minvalue": "O valor deve ser maior que 0.",
|
"amount_minvalue": "O valor deve ser maior que 0.",
|
||||||
"discount_maxlength": "Desconto não deve ser maior que o máximo de desconto",
|
"discount_maxlength": "Discount should not be greater than max discount",
|
||||||
"description_maxlength": "A descrição não deve ter mais que 255 caracteres.",
|
"description_maxlength": "A descrição não deve ter mais que 255 caracteres.",
|
||||||
"subject_maxlength": "O assunto não deve ter mais que 100 caracteres.",
|
"subject_maxlength": "O assunto não deve ter mais que 100 caracteres.",
|
||||||
"message_maxlength": "A mensagem não deve ter mais que 255 caracteres.",
|
"message_maxlength": "A mensagem não deve ter mais que 255 caracteres.",
|
||||||
@ -1451,41 +1451,41 @@
|
|||||||
"prefix_maxlength": "O prefixo não deve ter mais que 5 caracteres.",
|
"prefix_maxlength": "O prefixo não deve ter mais que 5 caracteres.",
|
||||||
"something_went_wrong": "algo deu errado",
|
"something_went_wrong": "algo deu errado",
|
||||||
"number_length_minvalue": "O valor deve ser maior que 0",
|
"number_length_minvalue": "O valor deve ser maior que 0",
|
||||||
"at_least_one_ability": "Você deve selecionar ao menos uma permissão.",
|
"at_least_one_ability": "Please select atleast one Permission.",
|
||||||
"valid_driver_key": "Por favor, insira uma chave válida de {driver}.",
|
"valid_driver_key": "Please enter a valid {driver} key.",
|
||||||
"valid_exchange_rate": "Por favor digite a taxa de câmbio.",
|
"valid_exchange_rate": "Please enter a valid exchange rate.",
|
||||||
"company_name_not_same": "O nome da empresa deve corresponder com o nome fornecido."
|
"company_name_not_same": "Company name must match with given name."
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"starter_plan": "Este recurso está disponível no plano de Starter!",
|
"starter_plan": "This feature is available on Starter plan and onwards!",
|
||||||
"invalid_provider_key": "Por favor, insira uma chave de API do provedor válido.",
|
"invalid_provider_key": "Please Enter Valid Provider API Key.",
|
||||||
"estimate_number_used": "O número de pagamento já está em uso.",
|
"estimate_number_used": "The estimate number has already been taken.",
|
||||||
"invoice_number_used": "O número da fatura já está em uso.",
|
"invoice_number_used": "The invoice number has already been taken.",
|
||||||
"payment_attached": "Uma das faturas selecionadas já possui um pagamento anexado. Certifique-se de excluir os pagamentos anexados primeiro, para continuar com a exclusão.",
|
"payment_attached": "This invoice already has a payment attached to it. Make sure to delete the attached payments first in order to go ahead with the removal.",
|
||||||
"payment_number_used": "O número de pagamento já está em uso.",
|
"payment_number_used": "The payment number has already been taken.",
|
||||||
"name_already_taken": "O nome já está em uso.",
|
"name_already_taken": "The name has already been taken.",
|
||||||
"receipt_does_not_exist": "O recibo não existe.",
|
"receipt_does_not_exist": "Receipt does not exist.",
|
||||||
"customer_cannot_be_changed_after_payment_is_added": "O cliente não pode ser alterado após o pagamento ser adicionado",
|
"customer_cannot_be_changed_after_payment_is_added": "Customer cannot be change after payment is added",
|
||||||
"invalid_credentials": "Credenciais inválidas",
|
"invalid_credentials": "Invalid Credentials.",
|
||||||
"not_allowed": "Não permitido",
|
"not_allowed": "Not Allowed",
|
||||||
"login_invalid_credentials": "Credenciais não correspondem aos nossos registros.",
|
"login_invalid_credentials": "These credentials do not match our records.",
|
||||||
"enter_valid_cron_format": "Por favor, insira um formato de URL válida",
|
"enter_valid_cron_format": "Please enter a valid cron format",
|
||||||
"email_could_not_be_sent": "Não foi possível enviar o e-mail para este endereço de e-mail.",
|
"email_could_not_be_sent": "Email could not be sent to this email address.",
|
||||||
"invalid_address": "Por favor, insira um endereço de e-mail válido.",
|
"invalid_address": "Please enter a valid address.",
|
||||||
"invalid_key": "Favor inserir uma chave válida.",
|
"invalid_key": "Please enter valid key.",
|
||||||
"invalid_state": "Por favor, insira um estado válido.",
|
"invalid_state": "Please enter a valid state.",
|
||||||
"invalid_city": "Por favor, insira uma cidade válida.",
|
"invalid_city": "Please enter a valid city.",
|
||||||
"invalid_postal_code": "Por favor, insira um CEP válido.",
|
"invalid_postal_code": "Please enter a valid zip.",
|
||||||
"invalid_format": "Por favor, insira o formato de texto de consulta válido.",
|
"invalid_format": "Please enter valid query string format.",
|
||||||
"api_error": "O servidor não está respondendo",
|
"api_error": "Server not responding.",
|
||||||
"feature_not_enabled": "Recurso não ativado.",
|
"feature_not_enabled": "Feature not enabled.",
|
||||||
"request_limit_met": "Limite de solicitações excedido",
|
"request_limit_met": "Api request limit exceeded.",
|
||||||
"address_incomplete": "Endereço Incompleto"
|
"address_incomplete": "Incomplete Address"
|
||||||
},
|
},
|
||||||
"pdf_estimate_label": "Orçamento",
|
"pdf_estimate_label": "Orçamento",
|
||||||
"pdf_estimate_number": "Numero do Orçamento",
|
"pdf_estimate_number": "Numero do Orçamento",
|
||||||
"pdf_estimate_date": "Data do Orçamento",
|
"pdf_estimate_date": "Data do Orçamento",
|
||||||
"pdf_estimate_expire_date": "Validade",
|
"pdf_estimate_expire_date": "Data de expiração",
|
||||||
"pdf_invoice_label": "Fatura",
|
"pdf_invoice_label": "Fatura",
|
||||||
"pdf_invoice_number": "Número da fatura",
|
"pdf_invoice_number": "Número da fatura",
|
||||||
"pdf_invoice_date": "Data da Fatura",
|
"pdf_invoice_date": "Data da Fatura",
|
||||||
@ -1522,5 +1522,5 @@
|
|||||||
"pdf_bill_to": "Cobrar a,",
|
"pdf_bill_to": "Cobrar a,",
|
||||||
"pdf_ship_to": "Envie a,",
|
"pdf_ship_to": "Envie a,",
|
||||||
"pdf_received_from": "Remetente:",
|
"pdf_received_from": "Remetente:",
|
||||||
"pdf_tax_label": "Imposto"
|
"pdf_tax_label": "Tax"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Estimate",
|
"pdf_estimate_label": "Estimate",
|
||||||
"pdf_estimate_number": "Estimate Number",
|
"pdf_estimate_number": "Estimate Number",
|
||||||
"pdf_estimate_date": "Estimate Date",
|
"pdf_estimate_date": "Estimate Date",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "Expiry date",
|
||||||
"pdf_invoice_label": "Invoice",
|
"pdf_invoice_label": "Invoice",
|
||||||
"pdf_invoice_number": "Invoice Number",
|
"pdf_invoice_number": "Invoice Number",
|
||||||
"pdf_invoice_date": "Invoice Date",
|
"pdf_invoice_date": "Invoice Date",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Cenový odhad",
|
"pdf_estimate_label": "Cenový odhad",
|
||||||
"pdf_estimate_number": "Číslo cenového odhadu",
|
"pdf_estimate_number": "Číslo cenového odhadu",
|
||||||
"pdf_estimate_date": "Dátum cenového odhadu",
|
"pdf_estimate_date": "Dátum cenového odhadu",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "Platnosť cenového odhadu",
|
||||||
"pdf_invoice_label": "Faktúra",
|
"pdf_invoice_label": "Faktúra",
|
||||||
"pdf_invoice_number": "Číslo faktúry",
|
"pdf_invoice_number": "Číslo faktúry",
|
||||||
"pdf_invoice_date": "Dátum vystavenia",
|
"pdf_invoice_date": "Dátum vystavenia",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -12,7 +12,7 @@
|
|||||||
"settings": "Podešavanja",
|
"settings": "Podešavanja",
|
||||||
"logout": "Odjavi se",
|
"logout": "Odjavi se",
|
||||||
"users": "Korisnici",
|
"users": "Korisnici",
|
||||||
"modules": "Moduli"
|
"modules": "Modules"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add_company": "Dodaj kompaniju",
|
"add_company": "Dodaj kompaniju",
|
||||||
@ -30,8 +30,8 @@
|
|||||||
"from": "Pošiljalac",
|
"from": "Pošiljalac",
|
||||||
"to": "Primalac",
|
"to": "Primalac",
|
||||||
"ok": "Ok",
|
"ok": "Ok",
|
||||||
"yes": "Da",
|
"yes": "Yes",
|
||||||
"no": "Ne",
|
"no": "No",
|
||||||
"sort_by": "Rasporedi Po",
|
"sort_by": "Rasporedi Po",
|
||||||
"ascending": "Rastuće",
|
"ascending": "Rastuće",
|
||||||
"descending": "Opadajuće",
|
"descending": "Opadajuće",
|
||||||
@ -39,7 +39,7 @@
|
|||||||
"body": "Telo",
|
"body": "Telo",
|
||||||
"message": "Poruka",
|
"message": "Poruka",
|
||||||
"send": "Pošalji",
|
"send": "Pošalji",
|
||||||
"preview": "Pregled",
|
"preview": "Preview",
|
||||||
"go_back": "Idi nazad",
|
"go_back": "Idi nazad",
|
||||||
"back_to_login": "Nazad na prijavu?",
|
"back_to_login": "Nazad na prijavu?",
|
||||||
"home": "Početna",
|
"home": "Početna",
|
||||||
@ -95,9 +95,9 @@
|
|||||||
"copied_pdf_url_clipboard": "Link do PDF fajla kopiran!",
|
"copied_pdf_url_clipboard": "Link do PDF fajla kopiran!",
|
||||||
"copied_url_clipboard": "Copied url to clipboard!",
|
"copied_url_clipboard": "Copied url to clipboard!",
|
||||||
"docs": "Docs",
|
"docs": "Docs",
|
||||||
"do_you_wish_to_continue": "Da li želite nastaviti?",
|
"do_you_wish_to_continue": "Do you wish to continue?",
|
||||||
"note": "Bilješka",
|
"note": "Note",
|
||||||
"pay_invoice": "Plati račun",
|
"pay_invoice": "Pay Invoice",
|
||||||
"login_successfully": "Logged in successfully!",
|
"login_successfully": "Logged in successfully!",
|
||||||
"logged_out_successfully": "Logged out successfully",
|
"logged_out_successfully": "Logged out successfully",
|
||||||
"mark_as_default": "Mark as default"
|
"mark_as_default": "Mark as default"
|
||||||
@ -318,10 +318,10 @@
|
|||||||
},
|
},
|
||||||
"accepted": "Prihvaćeno",
|
"accepted": "Prihvaćeno",
|
||||||
"rejected": "Odbijeno",
|
"rejected": "Odbijeno",
|
||||||
"expired": "Istekao",
|
"expired": "Expired",
|
||||||
"sent": "Poslato",
|
"sent": "Poslato",
|
||||||
"draft": "U izradi",
|
"draft": "U izradi",
|
||||||
"viewed": "Pregledano",
|
"viewed": "Viewed",
|
||||||
"declined": "Odbijeno",
|
"declined": "Odbijeno",
|
||||||
"new_estimate": "Nova Profaktura",
|
"new_estimate": "Nova Profaktura",
|
||||||
"add_new_estimate": "Dodaj novu Profakturu",
|
"add_new_estimate": "Dodaj novu Profakturu",
|
||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Profaktura",
|
"pdf_estimate_label": "Profaktura",
|
||||||
"pdf_estimate_number": "Broj Profakture",
|
"pdf_estimate_number": "Broj Profakture",
|
||||||
"pdf_estimate_date": "Datum Profakture",
|
"pdf_estimate_date": "Datum Profakture",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "Datum isteka Profakture",
|
||||||
"pdf_invoice_label": "Faktura",
|
"pdf_invoice_label": "Faktura",
|
||||||
"pdf_invoice_number": "Broj Fakture",
|
"pdf_invoice_number": "Broj Fakture",
|
||||||
"pdf_invoice_date": "Datum Fakture",
|
"pdf_invoice_date": "Datum Fakture",
|
||||||
|
|||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Kostnadsförslag",
|
"pdf_estimate_label": "Kostnadsförslag",
|
||||||
"pdf_estimate_number": "Kostnadsförslagsnummer",
|
"pdf_estimate_number": "Kostnadsförslagsnummer",
|
||||||
"pdf_estimate_date": "Kostnadsförslagsdatum",
|
"pdf_estimate_date": "Kostnadsförslagsdatum",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "Utgångsdatum",
|
||||||
"pdf_invoice_label": "Faktura",
|
"pdf_invoice_label": "Faktura",
|
||||||
"pdf_invoice_number": "Fakturanummer",
|
"pdf_invoice_number": "Fakturanummer",
|
||||||
"pdf_invoice_date": "Fakturadatum",
|
"pdf_invoice_date": "Fakturadatum",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Estimate",
|
"pdf_estimate_label": "Estimate",
|
||||||
"pdf_estimate_number": "Estimate Number",
|
"pdf_estimate_number": "Estimate Number",
|
||||||
"pdf_estimate_date": "Estimate Date",
|
"pdf_estimate_date": "Estimate Date",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "Expiry date",
|
||||||
"pdf_invoice_label": "Invoice",
|
"pdf_invoice_label": "Invoice",
|
||||||
"pdf_invoice_number": "Invoice Number",
|
"pdf_invoice_number": "Invoice Number",
|
||||||
"pdf_invoice_date": "Invoice Date",
|
"pdf_invoice_date": "Invoice Date",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -12,7 +12,7 @@
|
|||||||
"settings": "Cài đặt",
|
"settings": "Cài đặt",
|
||||||
"logout": "Đăng xuất",
|
"logout": "Đăng xuất",
|
||||||
"users": "Người dùng",
|
"users": "Người dùng",
|
||||||
"modules": "Các Mô-Đun"
|
"modules": "Modules"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add_company": "Thêm công ty",
|
"add_company": "Thêm công ty",
|
||||||
@ -93,7 +93,7 @@
|
|||||||
"no_note_found": "Không tìm thấy ghi chú",
|
"no_note_found": "Không tìm thấy ghi chú",
|
||||||
"insert_note": "Chèn ghi chú",
|
"insert_note": "Chèn ghi chú",
|
||||||
"copied_pdf_url_clipboard": "Đã sao chép url PDF vào khay nhớ tạm!",
|
"copied_pdf_url_clipboard": "Đã sao chép url PDF vào khay nhớ tạm!",
|
||||||
"copied_url_clipboard": "Đã sao chép url vào khay nhớ tạm!",
|
"copied_url_clipboard": "Copied url to clipboard!",
|
||||||
"docs": "Tài liệu",
|
"docs": "Tài liệu",
|
||||||
"do_you_wish_to_continue": "Bạn có muốn tiếp tục không?",
|
"do_you_wish_to_continue": "Bạn có muốn tiếp tục không?",
|
||||||
"note": "Ghi chú",
|
"note": "Ghi chú",
|
||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Ước tính",
|
"pdf_estimate_label": "Ước tính",
|
||||||
"pdf_estimate_number": "Số ước tính",
|
"pdf_estimate_number": "Số ước tính",
|
||||||
"pdf_estimate_date": "Ngày ước tính",
|
"pdf_estimate_date": "Ngày ước tính",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "Ngày hết hạn",
|
||||||
"pdf_invoice_label": "Hóa đơn",
|
"pdf_invoice_label": "Hóa đơn",
|
||||||
"pdf_invoice_number": "Số hóa đơn",
|
"pdf_invoice_number": "Số hóa đơn",
|
||||||
"pdf_invoice_date": "Ngày lập hóa đơn",
|
"pdf_invoice_date": "Ngày lập hóa đơn",
|
||||||
|
|||||||
@ -93,14 +93,14 @@
|
|||||||
"no_note_found": "沒有找到備註",
|
"no_note_found": "沒有找到備註",
|
||||||
"insert_note": "插入備註",
|
"insert_note": "插入備註",
|
||||||
"copied_pdf_url_clipboard": "複製PDF位址到剪貼簿!",
|
"copied_pdf_url_clipboard": "複製PDF位址到剪貼簿!",
|
||||||
"copied_url_clipboard": "將網址複製到剪貼簿!",
|
"copied_url_clipboard": "Copied url to clipboard!",
|
||||||
"docs": "文檔",
|
"docs": "文檔",
|
||||||
"do_you_wish_to_continue": "你確定要繼續?",
|
"do_you_wish_to_continue": "你確定要繼續?",
|
||||||
"note": "備註",
|
"note": "備註",
|
||||||
"pay_invoice": "支付發票",
|
"pay_invoice": "Pay Invoice",
|
||||||
"login_successfully": "已成功登入!",
|
"login_successfully": "Logged in successfully!",
|
||||||
"logged_out_successfully": "已成功登出",
|
"logged_out_successfully": "Logged out successfully",
|
||||||
"mark_as_default": "標記為預設值"
|
"mark_as_default": "Mark as default"
|
||||||
},
|
},
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"select_year": "選擇年份",
|
"select_year": "選擇年份",
|
||||||
@ -109,7 +109,7 @@
|
|||||||
"customers": "客户",
|
"customers": "客户",
|
||||||
"invoices": "發票",
|
"invoices": "發票",
|
||||||
"estimates": "報價",
|
"estimates": "報價",
|
||||||
"payments": "付款"
|
"payments": "Payments"
|
||||||
},
|
},
|
||||||
"chart_info": {
|
"chart_info": {
|
||||||
"total_sales": "銷售",
|
"total_sales": "銷售",
|
||||||
@ -208,10 +208,10 @@
|
|||||||
"new_customer": "新客戶",
|
"new_customer": "新客戶",
|
||||||
"edit_customer": "編輯客戶",
|
"edit_customer": "編輯客戶",
|
||||||
"basic_info": "基本資料",
|
"basic_info": "基本資料",
|
||||||
"portal_access": "門戶訪問",
|
"portal_access": "Portal Access",
|
||||||
"portal_access_text": "您想允許此客戶登入客戶門戶嗎?",
|
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||||
"portal_access_url": "客戶門戶登入URL",
|
"portal_access_url": "Customer Portal Login URL",
|
||||||
"portal_access_url_help": "請將上述給定的URL複製並轉發給您的客戶以提供訪問許可權。",
|
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||||
"billing_address": "帳單地址",
|
"billing_address": "帳單地址",
|
||||||
"shipping_address": "送貨地址",
|
"shipping_address": "送貨地址",
|
||||||
"copy_billing_address": "由帳單複製",
|
"copy_billing_address": "由帳單複製",
|
||||||
@ -231,7 +231,7 @@
|
|||||||
"confirm_delete": "你將不能夠還原此客戶, 以及此客戶相關的發票, 報價及付款. | 你將不能夠還原此客戶, 以及此客戶相關的發票, 報價及付款.",
|
"confirm_delete": "你將不能夠還原此客戶, 以及此客戶相關的發票, 報價及付款. | 你將不能夠還原此客戶, 以及此客戶相關的發票, 報價及付款.",
|
||||||
"created_message": "成功新增客戶",
|
"created_message": "成功新增客戶",
|
||||||
"updated_message": "成功更新客戶",
|
"updated_message": "成功更新客戶",
|
||||||
"address_updated_message": "地址資訊已成功更新",
|
"address_updated_message": "Address Information Updated succesfully",
|
||||||
"deleted_message": "成功刪除客戶 | 成功刪除客戶",
|
"deleted_message": "成功刪除客戶 | 成功刪除客戶",
|
||||||
"edit_currency_not_allowed": "交易一旦創建後就不能改變貨幣!"
|
"edit_currency_not_allowed": "交易一旦創建後就不能改變貨幣!"
|
||||||
},
|
},
|
||||||
@ -265,8 +265,8 @@
|
|||||||
},
|
},
|
||||||
"estimates": {
|
"estimates": {
|
||||||
"title": "報價",
|
"title": "報價",
|
||||||
"accept_estimate": "接受估價",
|
"accept_estimate": "Accept Estimate",
|
||||||
"reject_estimate": "拒絕估算",
|
"reject_estimate": "Reject Estimate",
|
||||||
"estimate": "報價 | 報價",
|
"estimate": "報價 | 報價",
|
||||||
"estimates_list": "報價列表",
|
"estimates_list": "報價列表",
|
||||||
"days": "{days} 天",
|
"days": "{days} 天",
|
||||||
@ -318,10 +318,10 @@
|
|||||||
},
|
},
|
||||||
"accepted": "已接受",
|
"accepted": "已接受",
|
||||||
"rejected": "已拒絕",
|
"rejected": "已拒絕",
|
||||||
"expired": "已過期",
|
"expired": "Expired",
|
||||||
"sent": "傳送",
|
"sent": "傳送",
|
||||||
"draft": "草稿",
|
"draft": "草稿",
|
||||||
"viewed": "已檢視",
|
"viewed": "Viewed",
|
||||||
"declined": "拒絕",
|
"declined": "拒絕",
|
||||||
"new_estimate": "新報價",
|
"new_estimate": "新報價",
|
||||||
"add_new_estimate": "新增報價",
|
"add_new_estimate": "新增報價",
|
||||||
@ -355,14 +355,14 @@
|
|||||||
"select_an_item": "輸入或點擊去選擇商品",
|
"select_an_item": "輸入或點擊去選擇商品",
|
||||||
"type_item_description": "商品詳情(可選)"
|
"type_item_description": "商品詳情(可選)"
|
||||||
},
|
},
|
||||||
"mark_as_default_estimate_template_description": "如果啟用,所選模板將自動選擇新的估算。"
|
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||||
},
|
},
|
||||||
"invoices": {
|
"invoices": {
|
||||||
"title": "發票",
|
"title": "發票",
|
||||||
"download": "下載",
|
"download": "Download",
|
||||||
"pay_invoice": "支付發票",
|
"pay_invoice": "Pay Invoice",
|
||||||
"invoices_list": "發票列表",
|
"invoices_list": "發票列表",
|
||||||
"invoice_information": "發票資訊",
|
"invoice_information": "Invoice Information",
|
||||||
"days": "{days} 天",
|
"days": "{days} 天",
|
||||||
"months": "{months} 月",
|
"months": "{months} 月",
|
||||||
"years": "{years} 年",
|
"years": "{years} 年",
|
||||||
@ -447,7 +447,7 @@
|
|||||||
"marked_as_sent_message": "發票已標示為成功傳送",
|
"marked_as_sent_message": "發票已標示為成功傳送",
|
||||||
"something_went_wrong": "出現錯誤",
|
"something_went_wrong": "出現錯誤",
|
||||||
"invalid_due_amount_message": "發票總額不能少於支付總額. 請更新發票或刪除相關支付再繼續.",
|
"invalid_due_amount_message": "發票總額不能少於支付總額. 請更新發票或刪除相關支付再繼續.",
|
||||||
"mark_as_default_invoice_template_description": "如果啟用,所選模板將自動選擇新發票"
|
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||||
},
|
},
|
||||||
"recurring_invoices": {
|
"recurring_invoices": {
|
||||||
"title": "定期發票",
|
"title": "定期發票",
|
||||||
@ -464,11 +464,11 @@
|
|||||||
"completed": "已完成",
|
"completed": "已完成",
|
||||||
"customer": "客戶",
|
"customer": "客戶",
|
||||||
"paid_status": "付款狀態",
|
"paid_status": "付款狀態",
|
||||||
"ref_no": "參考號碼",
|
"ref_no": "REF NO.",
|
||||||
"number": "號",
|
"number": "NUMBER",
|
||||||
"amount_due": "到期金額",
|
"amount_due": "AMOUNT DUE",
|
||||||
"partially_paid": "部分支付",
|
"partially_paid": "Partially Paid",
|
||||||
"total": "總計",
|
"total": "Total",
|
||||||
"discount": "Discount",
|
"discount": "Discount",
|
||||||
"sub_total": "Sub Total",
|
"sub_total": "Sub Total",
|
||||||
"invoice": "Recurring Invoice | Recurring Invoices",
|
"invoice": "Recurring Invoice | Recurring Invoices",
|
||||||
@ -504,16 +504,16 @@
|
|||||||
"invoice_mark_as_sent": "This recurring invoice will be marked as sent",
|
"invoice_mark_as_sent": "This recurring invoice will be marked as sent",
|
||||||
"confirm_send": "This recurring invoice will be sent via email to the customer",
|
"confirm_send": "This recurring invoice will be sent via email to the customer",
|
||||||
"starts_at": "Start Date",
|
"starts_at": "Start Date",
|
||||||
"due_date": "發票到期日期",
|
"due_date": "Invoice Due Date",
|
||||||
"record_payment": "紀錄付款",
|
"record_payment": "Record Payment",
|
||||||
"add_new_invoice": "添加定期發票",
|
"add_new_invoice": "Add New Recurring Invoice",
|
||||||
"update_expense": "更新支出",
|
"update_expense": "Update Expense",
|
||||||
"edit_invoice": "編輯定期發票",
|
"edit_invoice": "Edit Recurring Invoice",
|
||||||
"new_invoice": "添加定期發票",
|
"new_invoice": "New Recurring Invoice",
|
||||||
"send_automatically": "自動發送",
|
"send_automatically": "Send Automatically",
|
||||||
"send_automatically_desc": "如果您希望在建立發票時自動將發票發送給客戶,請啟用此選項。",
|
"send_automatically_desc": "Enable this, if you would like to send the invoice automatically to the customer when its created.",
|
||||||
"save_invoice": "保存定期發票",
|
"save_invoice": "Save Recurring Invoice",
|
||||||
"update_invoice": "更新定期發票",
|
"update_invoice": "Update Recurring Invoice",
|
||||||
"add_new_tax": "Add New Tax",
|
"add_new_tax": "Add New Tax",
|
||||||
"no_invoices": "No Recurring Invoices yet!",
|
"no_invoices": "No Recurring Invoices yet!",
|
||||||
"mark_as_rejected": "Mark as rejected",
|
"mark_as_rejected": "Mark as rejected",
|
||||||
@ -1485,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "報價",
|
"pdf_estimate_label": "報價",
|
||||||
"pdf_estimate_number": "報價單號",
|
"pdf_estimate_number": "報價單號",
|
||||||
"pdf_estimate_date": "報價日期",
|
"pdf_estimate_date": "報價日期",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "有效日期",
|
||||||
"pdf_invoice_label": "發票",
|
"pdf_invoice_label": "發票",
|
||||||
"pdf_invoice_number": "發票號碼",
|
"pdf_invoice_number": "發票號碼",
|
||||||
"pdf_invoice_date": "發票日期",
|
"pdf_invoice_date": "發票日期",
|
||||||
|
|||||||
BIN
resources/static/fonts/THSarabunNew-Bold.ttf
Normal file
BIN
resources/static/fonts/THSarabunNew-Bold.ttf
Normal file
Binary file not shown.
BIN
resources/static/fonts/THSarabunNew-BoldItalic.ttf
Normal file
BIN
resources/static/fonts/THSarabunNew-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
resources/static/fonts/THSarabunNew-Italic.ttf
Normal file
BIN
resources/static/fonts/THSarabunNew-Italic.ttf
Normal file
Binary file not shown.
BIN
resources/static/fonts/THSarabunNew.ttf
Normal file
BIN
resources/static/fonts/THSarabunNew.ttf
Normal file
Binary file not shown.
@ -17,7 +17,7 @@
|
|||||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||||
|
|
||||||
<!-- Module Styles -->
|
<!-- Module Styles -->
|
||||||
@foreach(\Crater\Services\Module\ModuleFacade::allStyles() as $name => $path)
|
@foreach (\Crater\Services\Module\ModuleFacade::allStyles() as $name => $path)
|
||||||
<link rel="stylesheet" href="/modules/styles/{{ $name }}">
|
<link rel="stylesheet" href="/modules/styles/{{ $name }}">
|
||||||
@endforeach
|
@endforeach
|
||||||
|
|
||||||
@ -25,8 +25,8 @@
|
|||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body
|
<body
|
||||||
class="h-full overflow-hidden bg-gray-100 font-base
|
class="h-full overflow-hidden bg-gray-100 dark:bg-gray-900 dark:text-white font-base
|
||||||
@if(isset($current_theme)) theme-{{ $current_theme }} @else theme-{{get_app_setting('admin_portal_theme') ?? 'crater'}} @endif ">
|
@if (isset($current_theme)) theme-{{ $current_theme }} @else theme-{{ get_app_setting('admin_portal_theme') ?? 'crater' }} @endif ">
|
||||||
|
|
||||||
<!-- Module Scripts -->
|
<!-- Module Scripts -->
|
||||||
@foreach (\Crater\Services\Module\ModuleFacade::allScripts() as $name => $path)
|
@foreach (\Crater\Services\Module\ModuleFacade::allScripts() as $name => $path)
|
||||||
@ -38,6 +38,14 @@
|
|||||||
@endforeach
|
@endforeach
|
||||||
|
|
||||||
<script type="module">
|
<script type="module">
|
||||||
|
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
||||||
|
document.documentElement.classList.add('dark')
|
||||||
|
document.documentElement.style.setProperty('color-scheme', 'dark');
|
||||||
|
} else {
|
||||||
|
document.documentElement.classList.remove('dark')
|
||||||
|
document.documentElement.style.setProperty('color-scheme', 'light')
|
||||||
|
}
|
||||||
|
|
||||||
@if(isset($customer_logo))
|
@if(isset($customer_logo))
|
||||||
|
|
||||||
window.customer_logo = "/storage/{{$customer_logo}}"
|
window.customer_logo = "/storage/{{$customer_logo}}"
|
||||||
@ -57,12 +65,12 @@
|
|||||||
|
|
||||||
window.login_page_description = "{{$login_page_description}}"
|
window.login_page_description = "{{$login_page_description}}"
|
||||||
|
|
||||||
@endif
|
@endif
|
||||||
@if(isset($copyright_text))
|
@if(isset($copyright_text))
|
||||||
|
|
||||||
window.copyright_text = "{{$copyright_text}}"
|
window.copyright_text = "{{$copyright_text}}"
|
||||||
|
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
window.Crater.start()
|
window.Crater.start()
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -386,6 +386,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@if (App::isLocale('th'))
|
||||||
|
@include('app.pdf.locale.th')
|
||||||
|
@endif
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user