mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-27 11:41:09 -04:00
Compare commits
54 Commits
develop
...
dark-BaseT
| Author | SHA1 | Date | |
|---|---|---|---|
| a8ffd2cf12 | |||
| 15f3f566e3 | |||
| 98196194e2 | |||
| 7447cc24f9 | |||
| 889d22d92c | |||
| bc8f2cd484 | |||
| 4e47f58bad | |||
| d8c429912e | |||
| df04fd9e53 | |||
| 0aaf0e7e75 | |||
| 3d0b89bb4d | |||
| 38c4b9ebce | |||
| 7be59e78e0 | |||
| 189c51cdf4 | |||
| 204483836a | |||
| 33bc9ded65 | |||
| 4271ef451e | |||
| 6eb44fba93 | |||
| 96e7300583 | |||
| a479d966d1 | |||
| bca2794c4c | |||
| cb88c19059 | |||
| 946c7efab4 | |||
| d7b1d15f93 | |||
| 94e1efe115 | |||
| b0e38b74e9 | |||
| bd5f0fe5cf | |||
| 787619b907 | |||
| fd70ab9a99 | |||
| 33315638df | |||
| 157559cc05 | |||
| bba14bf51a | |||
| 9d1484d62d | |||
| 654dd9e64d | |||
| ea41989034 | |||
| 3f3f83a00a | |||
| adc5962071 | |||
| c4c00002d7 | |||
| a7c1e12db6 | |||
| 32949d1eec | |||
| 7718f77f3d | |||
| 7cde971f8b | |||
| 4e7441a5cf | |||
| b714833b06 | |||
| 88035ea490 | |||
| a9e54981bf | |||
| ef35293f8a | |||
| 5c63770b6b | |||
| 80847529fa | |||
| 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
|
||||
/public/docs
|
||||
/.scribe
|
||||
!storage/fonts/.gitkeep
|
||||
@ -1,4 +1,4 @@
|
||||
FROM php:7.4-fpm
|
||||
FROM php:8.1-fpm
|
||||
|
||||
# Arguments defined in docker-compose.yml
|
||||
ARG user
|
||||
|
||||
@ -103,6 +103,7 @@ class CustomerStatsController extends Controller
|
||||
)
|
||||
->whereCompany()
|
||||
->whereCustomer($customer->id)
|
||||
->where('status', '<>', Invoice::STATUS_DRAFT)
|
||||
->sum('total');
|
||||
$totalReceipts = Payment::whereBetween(
|
||||
'payment_date',
|
||||
|
||||
@ -104,6 +104,7 @@ class DashboardController extends Controller
|
||||
'invoice_date',
|
||||
[$startDate->format('Y-m-d'), $start->format('Y-m-d')]
|
||||
)
|
||||
->where('status', '<>', Invoice::STATUS_DRAFT)
|
||||
->whereCompany()
|
||||
->sum('base_total');
|
||||
|
||||
@ -141,6 +142,7 @@ class DashboardController extends Controller
|
||||
$recent_due_invoices = Invoice::with('customer')
|
||||
->whereCompany()
|
||||
->where('base_due_amount', '>', 0)
|
||||
->where('status', '<>', Invoice::STATUS_DRAFT)
|
||||
->take(5)
|
||||
->latest()
|
||||
->get();
|
||||
|
||||
@ -24,6 +24,7 @@ class InvoicesController extends Controller
|
||||
$limit = $request->has('limit') ? $request->limit : 10;
|
||||
|
||||
$invoices = Invoice::whereCompany()
|
||||
->whereTabFilters($request->tab_status)
|
||||
->join('customers', 'customers.id', '=', 'invoices.customer_id')
|
||||
->applyFilters($request->all())
|
||||
->select('invoices.*', 'customers.name')
|
||||
|
||||
@ -3,18 +3,18 @@
|
||||
namespace Crater\Http\Controllers\V1\Admin\Modules;
|
||||
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Http\Requests\UnzipUpdateRequest;
|
||||
use Crater\Space\ModuleInstaller;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class UnzipModuleController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Crater\Http\Requests\UnzipUpdateRequest $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function __invoke(Request $request)
|
||||
public function __invoke(UnzipUpdateRequest $request)
|
||||
{
|
||||
$this->authorize('manage modules');
|
||||
|
||||
|
||||
@ -3,18 +3,18 @@
|
||||
namespace Crater\Http\Controllers\V1\Admin\Modules;
|
||||
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Http\Requests\UploadModuleRequest;
|
||||
use Crater\Space\ModuleInstaller;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class UploadModuleController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Crater\Http\Requests\UploadModuleRequest $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function __invoke(Request $request)
|
||||
public function __invoke(UploadModuleRequest $request)
|
||||
{
|
||||
$this->authorize('manage modules');
|
||||
|
||||
|
||||
@ -2,24 +2,25 @@
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||
|
||||
use PDF;
|
||||
use Carbon\Carbon;
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Models\Company;
|
||||
use Crater\Models\CompanySetting;
|
||||
use Crater\Models\Currency;
|
||||
use Crater\Models\Customer;
|
||||
use Illuminate\Http\Request;
|
||||
use Crater\Models\CompanySetting;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use PDF;
|
||||
use Crater\Http\Controllers\Controller;
|
||||
|
||||
class CustomerSalesReportController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function __invoke(Request $request, $hash)
|
||||
{
|
||||
$company = Company::where('unique_hash', $hash)->first();
|
||||
@ -56,6 +57,7 @@ class CustomerSalesReportController extends Controller
|
||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
||||
|
||||
$colors = [
|
||||
'primary_text_color',
|
||||
@ -80,6 +82,7 @@ class CustomerSalesReportController extends Controller
|
||||
'company' => $company,
|
||||
'from_date' => $from_date,
|
||||
'to_date' => $to_date,
|
||||
'currency' => $currency,
|
||||
]);
|
||||
|
||||
$pdf = PDF::loadView('app.pdf.reports.sales-customers');
|
||||
|
||||
@ -2,24 +2,25 @@
|
||||
|
||||
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 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
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function __invoke(Request $request, $hash)
|
||||
{
|
||||
$company = Company::where('unique_hash', $hash)->first();
|
||||
@ -43,6 +44,7 @@ class ExpensesReportController extends Controller
|
||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
||||
|
||||
$colors = [
|
||||
'primary_text_color',
|
||||
@ -66,6 +68,7 @@ class ExpensesReportController extends Controller
|
||||
'company' => $company,
|
||||
'from_date' => $from_date,
|
||||
'to_date' => $to_date,
|
||||
'currency' => $currency,
|
||||
]);
|
||||
$pdf = PDF::loadView('app.pdf.reports.expenses');
|
||||
|
||||
|
||||
@ -2,24 +2,25 @@
|
||||
|
||||
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 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
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function __invoke(Request $request, $hash)
|
||||
{
|
||||
$company = Company::where('unique_hash', $hash)->first();
|
||||
@ -43,6 +44,7 @@ class ItemSalesReportController extends Controller
|
||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
||||
|
||||
$colors = [
|
||||
'primary_text_color',
|
||||
@ -66,6 +68,7 @@ class ItemSalesReportController extends Controller
|
||||
'company' => $company,
|
||||
'from_date' => $from_date,
|
||||
'to_date' => $to_date,
|
||||
'currency' => $currency,
|
||||
]);
|
||||
$pdf = PDF::loadView('app.pdf.reports.sales-items');
|
||||
|
||||
|
||||
@ -2,25 +2,26 @@
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||
|
||||
use PDF;
|
||||
use Carbon\Carbon;
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Models\Company;
|
||||
use Crater\Models\CompanySetting;
|
||||
use Crater\Models\Expense;
|
||||
use Crater\Models\Payment;
|
||||
use Crater\Models\Currency;
|
||||
use Illuminate\Http\Request;
|
||||
use Crater\Models\CompanySetting;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use PDF;
|
||||
use Crater\Http\Controllers\Controller;
|
||||
|
||||
class ProfitLossReportController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function __invoke(Request $request, $hash)
|
||||
{
|
||||
$company = Company::where('unique_hash', $hash)->first();
|
||||
@ -49,6 +50,8 @@ class ProfitLossReportController extends Controller
|
||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
||||
|
||||
|
||||
$colors = [
|
||||
'primary_text_color',
|
||||
@ -74,6 +77,7 @@ class ProfitLossReportController extends Controller
|
||||
'company' => $company,
|
||||
'from_date' => $from_date,
|
||||
'to_date' => $to_date,
|
||||
'currency' => $currency,
|
||||
]);
|
||||
$pdf = PDF::loadView('app.pdf.reports.profit-loss');
|
||||
|
||||
|
||||
@ -2,24 +2,25 @@
|
||||
|
||||
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 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
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param string $hash
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function __invoke(Request $request, $hash)
|
||||
{
|
||||
$company = Company::where('unique_hash', $hash)->first();
|
||||
@ -44,6 +45,8 @@ class TaxSummaryReportController extends Controller
|
||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
||||
|
||||
|
||||
$colors = [
|
||||
'primary_text_color',
|
||||
@ -68,6 +71,7 @@ class TaxSummaryReportController extends Controller
|
||||
'company' => $company,
|
||||
'from_date' => $from_date,
|
||||
'to_date' => $to_date,
|
||||
'currency' => $currency,
|
||||
]);
|
||||
|
||||
$pdf = PDF::loadView('app.pdf.reports.tax-summary');
|
||||
|
||||
@ -3,7 +3,6 @@
|
||||
namespace Crater\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class CompaniesRequest extends FormRequest
|
||||
@ -34,6 +33,10 @@ class CompaniesRequest extends FormRequest
|
||||
'currency' => [
|
||||
'required'
|
||||
],
|
||||
'slug' => [
|
||||
'required',
|
||||
Rule::unique('companies')
|
||||
],
|
||||
'address.name' => [
|
||||
'nullable',
|
||||
],
|
||||
@ -68,11 +71,11 @@ class CompaniesRequest extends FormRequest
|
||||
{
|
||||
return collect($this->validated())
|
||||
->only([
|
||||
'name'
|
||||
'name',
|
||||
'slug'
|
||||
])
|
||||
->merge([
|
||||
'owner_id' => $this->user()->id,
|
||||
'slug' => Str::slug($this->name)
|
||||
'owner_id' => $this->user()->id
|
||||
])
|
||||
->toArray();
|
||||
}
|
||||
|
||||
@ -30,7 +30,8 @@ class CompanyRequest extends FormRequest
|
||||
Rule::unique('companies')->ignore($this->header('company'), 'id'),
|
||||
],
|
||||
'slug' => [
|
||||
'nullable'
|
||||
'required',
|
||||
Rule::unique('companies')->ignore($this->header('company'), 'id'),
|
||||
],
|
||||
'address.country_id' => [
|
||||
'required',
|
||||
|
||||
37
app/Http/Requests/UnzipUpdateRequest.php
Normal file
37
app/Http/Requests/UnzipUpdateRequest.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class UnzipUpdateRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'path' => [
|
||||
'required',
|
||||
'regex:/^[\.\/\w\-]+$/'
|
||||
],
|
||||
'module' => [
|
||||
'required',
|
||||
'string'
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
@ -25,7 +25,7 @@ class UploadExpenseReceiptRequest extends FormRequest
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'upload_receipt' => [
|
||||
'attachment_receipt' => [
|
||||
'nullable',
|
||||
new Base64Mime(['gif', 'jpg', 'png'])
|
||||
]
|
||||
|
||||
40
app/Http/Requests/UploadModuleRequest.php
Normal file
40
app/Http/Requests/UploadModuleRequest.php
Normal file
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class UploadModuleRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'avatar' => [
|
||||
'required',
|
||||
'file',
|
||||
'mimes:zip',
|
||||
'max:20000'
|
||||
],
|
||||
'module' => [
|
||||
'required',
|
||||
'string',
|
||||
'max:100'
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
@ -23,7 +23,7 @@ class EstimateResource extends JsonResource
|
||||
'reference_number' => $this->reference_number,
|
||||
'tax_per_item' => $this->tax_per_item,
|
||||
'discount_per_item' => $this->discount_per_item,
|
||||
'notes' => $this->getNotes(),
|
||||
'notes' => $this->notes,
|
||||
'discount' => $this->discount,
|
||||
'discount_type' => $this->discount_type,
|
||||
'discount_val' => $this->discount_val,
|
||||
|
||||
@ -18,7 +18,7 @@ class PaymentResource extends JsonResource
|
||||
'id' => $this->id,
|
||||
'payment_number' => $this->payment_number,
|
||||
'payment_date' => $this->payment_date,
|
||||
'notes' => $this->getNotes(),
|
||||
'notes' => $this->notes,
|
||||
'amount' => $this->amount,
|
||||
'unique_hash' => $this->unique_hash,
|
||||
'invoice_id' => $this->invoice_id,
|
||||
|
||||
@ -217,7 +217,7 @@ class Company extends Model implements HasMedia
|
||||
'estimate_billing_address_format' => $billingAddressFormat,
|
||||
'payment_company_address_format' => $companyAddressFormat,
|
||||
'payment_from_customer_address_format' => $paymentFromCustomerAddress,
|
||||
'currency' => request()->currency ?? 13,
|
||||
'currency' => request()->currency ?? 1,
|
||||
'time_zone' => 'Asia/Kolkata',
|
||||
'language' => 'en',
|
||||
'fiscal_year' => '1-12',
|
||||
|
||||
@ -483,7 +483,8 @@ class Estimate extends Model implements HasMedia
|
||||
'{ESTIMATE_DATE}' => $this->formattedEstimateDate,
|
||||
'{ESTIMATE_EXPIRY_DATE}' => $this->formattedExpiryDate,
|
||||
'{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')) {
|
||||
$expense->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts');
|
||||
$expense->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts', 'local');
|
||||
}
|
||||
|
||||
if ($request->customFields) {
|
||||
@ -262,12 +262,12 @@ class Expense extends Model implements HasMedia
|
||||
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');
|
||||
}
|
||||
if ($request->hasFile('attachment_receipt')) {
|
||||
$this->clearMediaCollection('receipts');
|
||||
$this->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts');
|
||||
$this->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts', 'local');
|
||||
}
|
||||
|
||||
if ($request->customFields) {
|
||||
|
||||
@ -187,16 +187,6 @@ class Invoice extends Model implements HasMedia
|
||||
return Carbon::parse($this->invoice_date)->format($dateFormat);
|
||||
}
|
||||
|
||||
public function scopeWhereStatus($query, $status)
|
||||
{
|
||||
return $query->where('invoices.status', $status);
|
||||
}
|
||||
|
||||
public function scopeWherePaidStatus($query, $status)
|
||||
{
|
||||
return $query->where('invoices.paid_status', $status);
|
||||
}
|
||||
|
||||
public function scopeWhereDueStatus($query, $status)
|
||||
{
|
||||
return $query->whereIn('invoices.paid_status', [
|
||||
@ -234,6 +224,40 @@ class Invoice extends Model implements HasMedia
|
||||
$query->orderBy($orderByField, $orderBy);
|
||||
}
|
||||
|
||||
public function scopeWhereStatus($query, $status)
|
||||
{
|
||||
return $query->where('invoices.status', $status);
|
||||
}
|
||||
|
||||
public function scopeWherePaidStatus($query, $status)
|
||||
{
|
||||
return $query->where('invoices.paid_status', $status);
|
||||
}
|
||||
|
||||
public function scopeWhereTabFilters($query, $status)
|
||||
{
|
||||
if ($status == "DRAFT") {
|
||||
return $query->where('invoices.status', $status);
|
||||
}
|
||||
|
||||
if ($status == "SENT") {
|
||||
return $query->whereIn('invoices.status', [
|
||||
self::STATUS_SENT,
|
||||
self::STATUS_VIEWED,
|
||||
self::STATUS_COMPLETED
|
||||
]);
|
||||
}
|
||||
|
||||
if ($status == 'DUE') {
|
||||
return $query->whereIn('invoices.paid_status', [
|
||||
self::STATUS_UNPAID,
|
||||
self::STATUS_PARTIALLY_PAID,
|
||||
]);
|
||||
}
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
public function scopeApplyFilters($query, array $filters)
|
||||
{
|
||||
$filters = collect($filters);
|
||||
@ -249,17 +273,11 @@ class Invoice extends Model implements HasMedia
|
||||
$filters->get('status') == self::STATUS_PAID
|
||||
) {
|
||||
$query->wherePaidStatus($filters->get('status'));
|
||||
} elseif ($filters->get('status') == 'DUE') {
|
||||
$query->whereDueStatus($filters->get('status'));
|
||||
} else {
|
||||
$query->whereStatus($filters->get('status'));
|
||||
}
|
||||
}
|
||||
|
||||
if ($filters->get('paid_status')) {
|
||||
$query->wherePaidStatus($filters->get('status'));
|
||||
}
|
||||
|
||||
if ($filters->get('invoice_id')) {
|
||||
$query->whereInvoice($filters->get('invoice_id'));
|
||||
}
|
||||
@ -443,7 +461,8 @@ class Invoice extends Model implements HasMedia
|
||||
$data['invoice'] = $this->toArray();
|
||||
$data['customer'] = $this->customer->toArray();
|
||||
$data['company'] = Company::find($this->company_id);
|
||||
$data['body'] = $this->getEmailBody($data['body']);
|
||||
$data['subject'] = $this->getEmailString($data['subject']);
|
||||
$data['body'] = $this->getEmailString($data['body']);
|
||||
$data['attach']['data'] = ($this->getEmailAttachmentSetting()) ? $this->getPDFData() : null;
|
||||
|
||||
return $data;
|
||||
@ -635,7 +654,7 @@ class Invoice extends Model implements HasMedia
|
||||
return $this->getFormattedString($this->notes);
|
||||
}
|
||||
|
||||
public function getEmailBody($body)
|
||||
public function getEmailString($body)
|
||||
{
|
||||
$values = array_merge($this->getFieldsArray(), $this->getExtraFields());
|
||||
|
||||
@ -650,7 +669,9 @@ class Invoice extends Model implements HasMedia
|
||||
'{INVOICE_DATE}' => $this->formattedInvoiceDate,
|
||||
'{INVOICE_DUE_DATE}' => $this->formattedDueDate,
|
||||
'{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_MODE}' => $this->paymentMethod ? $this->paymentMethod->name : null,
|
||||
'{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",
|
||||
"beyondcode/laravel-dump-server": "^1.0",
|
||||
"facade/ignition": "^2.3.6",
|
||||
"friendsofphp/php-cs-fixer": "^3.0",
|
||||
"fzaninotto/faker": "^1.9.1",
|
||||
"friendsofphp/php-cs-fixer": "^3.8",
|
||||
"fakerphp/faker": "^1.9.1",
|
||||
"mockery/mockery": "^1.3.1",
|
||||
"nunomaduro/collision": "^5.0",
|
||||
"pestphp/pest": "^1.0",
|
||||
"pestphp/pest-plugin-faker": "^1.0",
|
||||
"pestphp/pest-plugin-laravel": "^1.0",
|
||||
"pestphp/pest-plugin-parallel": "^0.2.1",
|
||||
"phpunit/phpunit": "^9.0"
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
@ -81,11 +81,14 @@
|
||||
"config": {
|
||||
"optimize-autoloader": true,
|
||||
"preferred-install": "dist",
|
||||
"sort-packages": true
|
||||
"sort-packages": true,
|
||||
"allow-plugins": {
|
||||
"pestphp/pest-plugin": true
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"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" => "el", "name" => "Greek"],
|
||||
["code" => "hr", "name" => "Crotian"],
|
||||
["code" => "th", "name" => "ไทย"],
|
||||
],
|
||||
|
||||
/*
|
||||
|
||||
@ -170,7 +170,7 @@ class CountriesTableSeeder extends Seeder
|
||||
['id' => 152,'code' => 'NR','name' => "Nauru",'phonecode' => 674],
|
||||
['id' => 153,'code' => 'NP','name' => "Nepal",'phonecode' => 977],
|
||||
['id' => 154,'code' => 'AN','name' => "Netherlands Antilles",'phonecode' => 599],
|
||||
['id' => 155,'code' => 'NL','name' => "Netherlands The",'phonecode' => 31],
|
||||
['id' => 155,'code' => 'NL','name' => "Netherlands",'phonecode' => 31],
|
||||
['id' => 156,'code' => 'NC','name' => "New Caledonia",'phonecode' => 687],
|
||||
['id' => 157,'code' => 'NZ','name' => "New Zealand",'phonecode' => 64],
|
||||
['id' => 158,'code' => 'NI','name' => "Nicaragua",'phonecode' => 505],
|
||||
|
||||
@ -275,6 +275,14 @@ class CurrenciesTableSeeder extends Seeder
|
||||
'thousand_separator' => '.',
|
||||
'decimal_separator' => ',',
|
||||
],
|
||||
[
|
||||
'name' => 'Central African Franc',
|
||||
'code' => 'XAF',
|
||||
'symbol' => 'CFA ',
|
||||
'precision' => '2',
|
||||
'thousand_separator' => ',',
|
||||
'decimal_separator' => '.',
|
||||
],
|
||||
[
|
||||
'name' => 'West African Franc',
|
||||
'code' => 'XOF',
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
FROM php:7.4-fpm-alpine
|
||||
FROM php:8.0-fpm-alpine
|
||||
|
||||
RUN apk add --no-cache \
|
||||
php7-bcmath
|
||||
php8-bcmath
|
||||
|
||||
RUN docker-php-ext-install pdo pdo_mysql bcmath
|
||||
|
||||
|
||||
@ -27,7 +27,7 @@
|
||||
"vite": "^2.6.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@headlessui/vue": "^1.4.0",
|
||||
"@headlessui/vue": "^1.5.0",
|
||||
"@heroicons/vue": "^1.0.1",
|
||||
"@popperjs/core": "^2.9.2",
|
||||
"@stripe/stripe-js": "^1.21.2",
|
||||
@ -48,7 +48,8 @@
|
||||
"mini-svg-data-uri": "^1.3.3",
|
||||
"moment": "^2.29.1",
|
||||
"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",
|
||||
"vue": "^3.2.0-beta.5",
|
||||
"vue-flatpickr-component": "^9.0.3",
|
||||
|
||||
@ -64,7 +64,7 @@ function mergeExistingValues() {
|
||||
if (props.isEdit) {
|
||||
props.store[props.storeProp].fields.forEach((field) => {
|
||||
const existingIndex = props.store[props.storeProp].customFields.findIndex(
|
||||
(f) => f.id === field.custom_field_id
|
||||
(f) => f.id == field.custom_field_id
|
||||
)
|
||||
|
||||
if (existingIndex > -1) {
|
||||
|
||||
@ -9,7 +9,7 @@ import { computed } from 'vue'
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
type: String,
|
||||
default: moment().format('YYYY-MM-DD hh:MM'),
|
||||
default: moment().format('YYYY-MM-DD HH:mm'),
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
@ -17,18 +17,7 @@
|
||||
<td class="px-5 py-4 text-left align-top">
|
||||
<div class="flex justify-start">
|
||||
<div
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
w-5
|
||||
h-5
|
||||
mt-2
|
||||
text-gray-300
|
||||
cursor-move
|
||||
handle
|
||||
mr-2
|
||||
"
|
||||
class="flex items-center justify-center w-5 h-5 mt-2 mr-2 text-gray-300 cursor-move handle"
|
||||
>
|
||||
<DragIcon />
|
||||
</div>
|
||||
@ -108,7 +97,7 @@
|
||||
|
||||
<BaseIcon
|
||||
name="ChevronDownIcon"
|
||||
class="w-4 h-4 text-gray-500 ml-1"
|
||||
class="w-4 h-4 ml-1 text-gray-500"
|
||||
/>
|
||||
</span>
|
||||
</BaseButton>
|
||||
@ -155,7 +144,7 @@
|
||||
<BaseContentPlaceholders v-if="loading">
|
||||
<BaseContentPlaceholdersText
|
||||
:lines="1"
|
||||
class="w-24 h-8 rounded-md border"
|
||||
class="w-24 h-8 border rounded-md"
|
||||
/>
|
||||
</BaseContentPlaceholders>
|
||||
|
||||
@ -175,6 +164,7 @@
|
||||
:ability="abilities.CREATE_INVOICE"
|
||||
:store="store"
|
||||
:store-prop="storeProp"
|
||||
:discount="discount"
|
||||
@update="updateTax"
|
||||
/>
|
||||
</td>
|
||||
|
||||
@ -30,24 +30,13 @@
|
||||
<template v-if="userStore.hasAbilities(ability)" #action>
|
||||
<button
|
||||
type="button"
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
w-full
|
||||
px-2
|
||||
cursor-pointer
|
||||
py-2
|
||||
bg-gray-200
|
||||
border-none
|
||||
outline-none
|
||||
"
|
||||
class="flex items-center justify-center w-full px-2 py-2 bg-gray-200 border-none outline-none cursor-pointer "
|
||||
@click="openTaxModal"
|
||||
>
|
||||
<BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" />
|
||||
|
||||
<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
|
||||
>
|
||||
</button>
|
||||
@ -115,6 +104,10 @@ const props = defineProps({
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
discountedTotal: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
currency: {
|
||||
type: [Object, String],
|
||||
required: true,
|
||||
@ -153,19 +146,19 @@ const filteredTypes = computed(() => {
|
||||
})
|
||||
|
||||
const taxAmount = computed(() => {
|
||||
if (localTax.compound_tax && props.total) {
|
||||
return ((props.total + props.totalTax) * localTax.percent) / 100
|
||||
if (localTax.compound_tax && props.discountedTotal) {
|
||||
return ((props.discountedTotal + props.totalTax) * localTax.percent) / 100
|
||||
}
|
||||
|
||||
if (props.total && localTax.percent) {
|
||||
return (props.total * localTax.percent) / 100
|
||||
if (props.discountedTotal && localTax.percent) {
|
||||
return (props.discountedTotal * localTax.percent) / 100
|
||||
}
|
||||
|
||||
return 0
|
||||
})
|
||||
|
||||
watch(
|
||||
() => props.total,
|
||||
() => props.discountedTotal,
|
||||
() => {
|
||||
updateRowTax()
|
||||
}
|
||||
|
||||
@ -29,14 +29,7 @@
|
||||
|
||||
<label
|
||||
v-else
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
m-0
|
||||
text-lg text-black
|
||||
uppercase
|
||||
"
|
||||
class="flex items-center justify-center m-0 text-lg text-black uppercase "
|
||||
>
|
||||
<BaseFormatMoney
|
||||
:amount="store.getSubTotal"
|
||||
@ -66,14 +59,7 @@
|
||||
|
||||
<label
|
||||
v-else-if="store[storeProp].tax_per_item === 'YES'"
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
m-0
|
||||
text-lg text-black
|
||||
uppercase
|
||||
"
|
||||
class="flex items-center justify-center m-0 text-lg text-black uppercase "
|
||||
>
|
||||
<BaseFormatMoney :amount="tax.amount" :currency="defaultCurrency" />
|
||||
</label>
|
||||
@ -98,7 +84,7 @@
|
||||
<BaseContentPlaceholders v-if="isLoading">
|
||||
<BaseContentPlaceholdersText
|
||||
:lines="1"
|
||||
class="w-24 h-8 rounded-md border"
|
||||
class="w-24 h-8 border rounded-md"
|
||||
/>
|
||||
</BaseContentPlaceholders>
|
||||
<div v-else class="flex" style="width: 140px" role="group">
|
||||
@ -114,7 +100,7 @@
|
||||
<BaseDropdown position="bottom-end">
|
||||
<template #activator>
|
||||
<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"
|
||||
variant="white"
|
||||
>
|
||||
@ -127,7 +113,7 @@
|
||||
|
||||
<BaseIcon
|
||||
name="ChevronDownIcon"
|
||||
class="w-4 h-4 text-gray-500 ml-1"
|
||||
class="w-4 h-4 ml-1 text-gray-500"
|
||||
/>
|
||||
</span>
|
||||
</BaseButton>
|
||||
@ -180,15 +166,7 @@
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-between
|
||||
w-full
|
||||
pt-2
|
||||
mt-5
|
||||
border-t border-gray-200 border-solid
|
||||
"
|
||||
class="flex items-center justify-between w-full pt-2 mt-5 border-t border-gray-200 border-solid "
|
||||
>
|
||||
<BaseContentPlaceholders v-if="isLoading">
|
||||
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
||||
@ -204,14 +182,7 @@
|
||||
</BaseContentPlaceholders>
|
||||
<label
|
||||
v-else
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
text-lg
|
||||
uppercase
|
||||
text-primary-400
|
||||
"
|
||||
class="flex items-center justify-center text-lg uppercase text-primary-400"
|
||||
>
|
||||
<BaseFormatMoney :amount="store.getTotal" :currency="defaultCurrency" />
|
||||
</label>
|
||||
@ -334,6 +305,7 @@ function selectPercentage() {
|
||||
|
||||
function onSelectTax(selectedTax) {
|
||||
let amount = 0
|
||||
|
||||
if (selectedTax.compound_tax && props.store.getSubtotalWithDiscount) {
|
||||
amount = Math.round(
|
||||
((props.store.getSubtotalWithDiscount + props.store.getTotalSimpleTax) *
|
||||
|
||||
@ -48,6 +48,24 @@
|
||||
/>
|
||||
</BaseInputGroup>
|
||||
|
||||
<BaseInputGroup
|
||||
:label="$tc('settings.company_info.company_slug')"
|
||||
:help-text="$t('settings.company_info.company_slug_help_text')"
|
||||
:error="
|
||||
v$.newCompanyForm.slug.$error &&
|
||||
v$.newCompanyForm.slug.$errors[0].$message
|
||||
"
|
||||
:content-loading="isFetchingInitialData"
|
||||
required
|
||||
>
|
||||
<BaseInput
|
||||
v-model="newCompanyForm.slug"
|
||||
:invalid="v$.newCompanyForm.slug.$error"
|
||||
:content-loading="isFetchingInitialData"
|
||||
@input="v$.newCompanyForm.slug.$touch()"
|
||||
/>
|
||||
</BaseInputGroup>
|
||||
|
||||
<BaseInputGroup
|
||||
:content-loading="isFetchingInitialData"
|
||||
:label="$tc('settings.company_info.country')"
|
||||
@ -130,7 +148,7 @@
|
||||
|
||||
<script setup>
|
||||
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 { required, minLength, helpers } from '@vuelidate/validators'
|
||||
import { useVuelidate } from '@vuelidate/core'
|
||||
@ -152,6 +170,7 @@ let companyLogoName = ref(null)
|
||||
|
||||
const newCompanyForm = reactive({
|
||||
name: null,
|
||||
slug: null,
|
||||
currency: '',
|
||||
address: {
|
||||
country_id: null,
|
||||
@ -162,6 +181,9 @@ const modalActive = computed(() => {
|
||||
return modalStore.active && modalStore.componentName === 'CompanyModal'
|
||||
})
|
||||
|
||||
const slugValidator = (value) => {
|
||||
return value == slugify(value)
|
||||
}
|
||||
const rules = {
|
||||
newCompanyForm: {
|
||||
name: {
|
||||
@ -171,6 +193,17 @@ const rules = {
|
||||
minLength(3)
|
||||
),
|
||||
},
|
||||
slug: {
|
||||
required: helpers.withMessage(t('validation.required'), required),
|
||||
minLength: helpers.withMessage(
|
||||
t('validation.name_min_length', { count: 3 }),
|
||||
minLength(3)
|
||||
),
|
||||
slugValidator: helpers.withMessage(
|
||||
t('validation.invalid_slug'),
|
||||
slugValidator
|
||||
),
|
||||
},
|
||||
address: {
|
||||
country_id: {
|
||||
required: helpers.withMessage(t('validation.required'), required),
|
||||
@ -243,6 +276,7 @@ async function submitCompanyData() {
|
||||
|
||||
function resetNewCompanyForm() {
|
||||
newCompanyForm.name = ''
|
||||
newCompanyForm.slug = ''
|
||||
newCompanyForm.currency = ''
|
||||
newCompanyForm.address.country_id = ''
|
||||
|
||||
@ -257,4 +291,24 @@ function closeCompanyModal() {
|
||||
v$.value.$reset()
|
||||
}, 300)
|
||||
}
|
||||
|
||||
// watcher for if change company name then auto fill company slug value
|
||||
watch(
|
||||
() => newCompanyForm.name,
|
||||
(currentValue) => {
|
||||
newCompanyForm.slug = slugify(currentValue)
|
||||
}
|
||||
)
|
||||
|
||||
function slugify(string) {
|
||||
return string
|
||||
.toString()
|
||||
.trim()
|
||||
.toLowerCase()
|
||||
.replace(/\s+/g, '-')
|
||||
.replace(/[^\w\-]+/g, '')
|
||||
.replace(/\-\-+/g, '-')
|
||||
.replace(/^-+/, '')
|
||||
.replace(/-+$/, '')
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -15,6 +15,13 @@
|
||||
bg-gradient-to-r
|
||||
from-primary-500
|
||||
to-primary-400
|
||||
dark:from-gray-700/70 dark:to-gray-800/70
|
||||
bg-primary-500
|
||||
dark:bg-transparent
|
||||
dark:backdrop-blur-xl
|
||||
dark:shadow-glass
|
||||
dark:border
|
||||
dark:border-white/10
|
||||
"
|
||||
>
|
||||
<router-link
|
||||
@ -53,6 +60,7 @@
|
||||
cursor-pointer
|
||||
md:hidden md:ml-0
|
||||
hover:bg-gray-100
|
||||
dark:bg-gray-800 dark:border-gray-500 dark:border
|
||||
"
|
||||
@click.prevent="onToggle"
|
||||
>
|
||||
@ -143,7 +151,7 @@
|
||||
<template #activator>
|
||||
<img
|
||||
: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>
|
||||
|
||||
|
||||
@ -15,7 +15,9 @@
|
||||
leave-from="opacity-100"
|
||||
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
|
||||
@ -27,7 +29,9 @@
|
||||
leave-from="translate-x-0"
|
||||
leave-to="-translate-x-full"
|
||||
>
|
||||
<div class="relative flex flex-col flex-1 w-full max-w-xs bg-white">
|
||||
<div
|
||||
class="relative flex flex-col flex-1 w-full max-w-xs bg-white dark:bg-gray-800"
|
||||
>
|
||||
<TransitionChild
|
||||
as="template"
|
||||
enter="ease-in-out duration-300"
|
||||
@ -40,18 +44,17 @@
|
||||
<div class="absolute top-0 right-0 pt-2 -mr-12">
|
||||
<button
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
w-10
|
||||
h-10
|
||||
ml-1
|
||||
rounded-full
|
||||
focus:outline-none
|
||||
focus:ring-2
|
||||
focus:ring-inset
|
||||
focus:ring-white
|
||||
"
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
w-10
|
||||
h-10
|
||||
ml-1
|
||||
rounded-full
|
||||
focus:outline-none
|
||||
focus:ring-2
|
||||
focus:ring-inset
|
||||
focus:ring-white"
|
||||
@click="globalStore.setSidebarVisibility(false)"
|
||||
>
|
||||
<span class="sr-only">Close sidebar</span>
|
||||
@ -82,8 +85,8 @@
|
||||
:to="item.link"
|
||||
:class="[
|
||||
hasActiveUrl(item.link)
|
||||
? 'text-primary-500 border-primary-500 bg-gray-100 '
|
||||
: 'text-black',
|
||||
? 'text-primary-500 border-primary-500 bg-gray-100 dark:shadow-glass dark:backdrop-blur-xl dark:hover:bg-gray-700 dark:bg-gray-700/50 dark:text-primary-400 dark:font-medium'
|
||||
: 'text-black dark:text-gray-300',
|
||||
'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)"
|
||||
@ -100,6 +103,10 @@
|
||||
/>
|
||||
{{ $t(item.title) }}
|
||||
</router-link>
|
||||
<LightDarkSwitch
|
||||
:show-label="false"
|
||||
class="absolute right-6 top-6 !w-auto"
|
||||
/>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
@ -113,17 +120,16 @@
|
||||
<!-- DESKTOP MENU -->
|
||||
<div
|
||||
class="
|
||||
hidden
|
||||
w-56
|
||||
h-screen
|
||||
pb-32
|
||||
overflow-y-auto
|
||||
bg-white
|
||||
border-r border-gray-200 border-solid
|
||||
xl:w-64
|
||||
md:fixed md:flex md:flex-col md:inset-y-0
|
||||
pt-16
|
||||
"
|
||||
hidden
|
||||
w-56
|
||||
h-screen
|
||||
bg-white
|
||||
border-r border-gray-200 border-solid
|
||||
xl:w-64
|
||||
md:fixed md:flex md:flex-col md:inset-y-0
|
||||
pt-16
|
||||
dark:border-gray-800
|
||||
dark:bg-gray-800/80"
|
||||
>
|
||||
<div
|
||||
v-for="menu in globalStore.menuGroups"
|
||||
@ -136,8 +142,8 @@
|
||||
:to="item.link"
|
||||
:class="[
|
||||
hasActiveUrl(item.link)
|
||||
? 'text-primary-500 border-primary-500 bg-gray-100 '
|
||||
: 'text-black',
|
||||
? 'text-primary-500 border-primary-500 bg-gray-100 dark:border-primary-400 dark:shadow-glass dark:backdrop-blur-xl dark:hover:bg-gray-700 dark:bg-gray-700/50 dark:text-primary-400 dark:font-medium'
|
||||
: 'text-black dark:hover:bg-transparent dark:hover:text-white dark:text-gray-300',
|
||||
'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"
|
||||
:class="[
|
||||
hasActiveUrl(item.link)
|
||||
? 'text-primary-500 group-hover:text-primary-500 '
|
||||
: 'text-gray-400 group-hover:text-black',
|
||||
? 'text-primary-500 group-hover:text-primary-500 dark:text-primary-400 dark:group-hover:text-primary-500 '
|
||||
: 'text-gray-400 group-hover:text-black dark:text-gray-400 dark:group-hover:text-white',
|
||||
'mr-4 shrink-0 h-5 w-5 ',
|
||||
]"
|
||||
/>
|
||||
@ -154,6 +160,9 @@
|
||||
{{ $t(item.title) }}
|
||||
</router-link>
|
||||
</div>
|
||||
<LightDarkSwitch
|
||||
class="absolute bottom-0 py-4 border-t border-gray-200 dark:border-gray-700"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -169,6 +178,7 @@ import {
|
||||
|
||||
import { useRoute } from 'vue-router'
|
||||
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
||||
import LightDarkSwitch from '@/scripts/components/LightDarkSwitcher.vue'
|
||||
|
||||
const route = useRoute()
|
||||
const globalStore = useGlobalStore()
|
||||
|
||||
@ -184,6 +184,20 @@ export const useCompanyStore = (useWindow = false) => {
|
||||
setDefaultCurrency(data) {
|
||||
this.defaultCurrency = data.currency
|
||||
},
|
||||
|
||||
checkCompanyHasCurrencyTransactions() {
|
||||
return new Promise((resolve, reject) => {
|
||||
axios
|
||||
.get(`/api/v1/company/has-transactions`)
|
||||
.then((response) => {
|
||||
resolve(response)
|
||||
})
|
||||
.catch((err) => {
|
||||
handleError(err)
|
||||
reject(err)
|
||||
})
|
||||
})
|
||||
},
|
||||
},
|
||||
})()
|
||||
}
|
||||
|
||||
@ -34,6 +34,7 @@ export const useGlobalStore = (useWindow = false) => {
|
||||
isAppLoaded: false,
|
||||
isSidebarOpen: false,
|
||||
areCurrenciesLoading: false,
|
||||
isDarkModeOn: false,
|
||||
|
||||
downloadReport: null,
|
||||
}),
|
||||
@ -70,8 +71,8 @@ export const useGlobalStore = (useWindow = false) => {
|
||||
moduleStore.apiToken = response.data.global_settings.api_token
|
||||
moduleStore.enableModules = response.data.modules
|
||||
|
||||
// company store
|
||||
companyStore.companies = response.data.companies
|
||||
// company store
|
||||
companyStore.companies = response.data.companies
|
||||
companyStore.selectedCompany = response.data.current_company
|
||||
companyStore.setSelectedCompany(response.data.current_company)
|
||||
companyStore.selectedCompanySettings =
|
||||
|
||||
@ -32,6 +32,8 @@
|
||||
:content-loading="isLoading"
|
||||
:calendar-button="true"
|
||||
calendar-button-icon="calendar"
|
||||
:show-extra-options="true"
|
||||
:source-date="estimateStore.newEstimate.estimate_date"
|
||||
/>
|
||||
</BaseInputGroup>
|
||||
|
||||
|
||||
@ -34,6 +34,24 @@
|
||||
/>
|
||||
</BaseInputGroup>
|
||||
|
||||
<BaseInputGroup
|
||||
:label="$tc('wizard.company_slug')"
|
||||
:help-text="$t('wizard.company_slug_help_text')"
|
||||
:error="
|
||||
v$.companyForm.slug.$error &&
|
||||
v$.companyForm.slug.$errors[0].$message
|
||||
"
|
||||
required
|
||||
>
|
||||
<BaseInput
|
||||
v-model="companyForm.slug"
|
||||
:invalid="v$.companyForm.slug.$error"
|
||||
type="text"
|
||||
name="slug"
|
||||
@input="v$.companyForm.slug.$touch()"
|
||||
/>
|
||||
</BaseInputGroup>
|
||||
|
||||
<BaseInputGroup
|
||||
:label="$t('wizard.country')"
|
||||
:error="
|
||||
@ -57,9 +75,7 @@
|
||||
track-by="name"
|
||||
/>
|
||||
</BaseInputGroup>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 gap-4 mb-4 md:grid-cols-2 md:mb-6">
|
||||
<BaseInputGroup :label="$t('wizard.state')">
|
||||
<BaseInput
|
||||
v-model="companyForm.address.state"
|
||||
@ -144,9 +160,9 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, computed, onMounted, reactive } from 'vue'
|
||||
import { ref, computed, onMounted, reactive, watch } from 'vue'
|
||||
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 { useGlobalStore } from '@/scripts/admin/stores/global'
|
||||
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
||||
@ -162,6 +178,7 @@ let logoFileName = ref(null)
|
||||
|
||||
const companyForm = reactive({
|
||||
name: null,
|
||||
slug: null,
|
||||
address: {
|
||||
address_street_1: '',
|
||||
address_street_2: '',
|
||||
@ -188,10 +205,28 @@ onMounted(async () => {
|
||||
})?.id
|
||||
})
|
||||
|
||||
const slugValidator = (value) => {
|
||||
return value == slugify(value)
|
||||
}
|
||||
const rules = {
|
||||
companyForm: {
|
||||
name: {
|
||||
required: helpers.withMessage(t('validation.required'), required),
|
||||
minLength: helpers.withMessage(
|
||||
t('validation.name_min_length', { count: 3 }),
|
||||
minLength(3)
|
||||
),
|
||||
},
|
||||
slug: {
|
||||
required: helpers.withMessage(t('validation.required'), required),
|
||||
minLength: helpers.withMessage(
|
||||
t('validation.name_min_length', { count: 3 }),
|
||||
minLength(3)
|
||||
),
|
||||
slugValidator: helpers.withMessage(
|
||||
t('validation.invalid_slug'),
|
||||
slugValidator
|
||||
),
|
||||
},
|
||||
address: {
|
||||
country_id: {
|
||||
@ -249,4 +284,24 @@ async function next() {
|
||||
emit('next', 7)
|
||||
}
|
||||
}
|
||||
|
||||
// watcher for if change company name then auto fill company slug value
|
||||
watch(
|
||||
() => companyForm.name,
|
||||
(currentValue) => {
|
||||
companyForm.slug = slugify(currentValue)
|
||||
}
|
||||
)
|
||||
|
||||
function slugify(string) {
|
||||
return string
|
||||
.toString()
|
||||
.trim()
|
||||
.toLowerCase()
|
||||
.replace(/\s+/g, '-')
|
||||
.replace(/[^\w\-]+/g, '')
|
||||
.replace(/\-\-+/g, '-')
|
||||
.replace(/^-+/, '')
|
||||
.replace(/-+$/, '')
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -56,7 +56,7 @@
|
||||
<BaseMultiselect
|
||||
v-model="filters.status"
|
||||
:groups="true"
|
||||
:options="status"
|
||||
:options="invoiceStatus"
|
||||
searchable
|
||||
:placeholder="$t('general.select_a_status')"
|
||||
@update:modelValue="setActiveTab"
|
||||
@ -130,11 +130,27 @@
|
||||
"
|
||||
>
|
||||
<!-- Tabs -->
|
||||
<BaseTabGroup class="-mb-5" @change="setStatusFilter">
|
||||
<BaseTab :title="$t('general.all')" filter="" />
|
||||
<BaseTab :title="$t('general.draft')" filter="DRAFT" />
|
||||
<BaseTab :title="$t('general.sent')" filter="SENT" />
|
||||
<BaseTab :title="$t('general.due')" filter="DUE" />
|
||||
<BaseTabGroup
|
||||
class="-mb-5"
|
||||
:selected-index="selectedIndex"
|
||||
@change="changeTabStatus"
|
||||
>
|
||||
<BaseTab
|
||||
:title="invoiceTabStatus[0].title"
|
||||
:tab-status="invoiceTabStatus[0].value"
|
||||
/>
|
||||
<BaseTab
|
||||
:title="invoiceTabStatus[1].title"
|
||||
:tab-status="invoiceTabStatus[1].value"
|
||||
/>
|
||||
<BaseTab
|
||||
:title="invoiceTabStatus[2].title"
|
||||
:tab-status="invoiceTabStatus[2].value"
|
||||
/>
|
||||
<BaseTab
|
||||
:title="invoiceTabStatus[3].title"
|
||||
:tab-status="invoiceTabStatus[3].value"
|
||||
/>
|
||||
</BaseTabGroup>
|
||||
|
||||
<BaseDropdown
|
||||
@ -289,10 +305,10 @@ const utils = inject('$utils')
|
||||
const table = ref(null)
|
||||
const showFilters = ref(false)
|
||||
|
||||
const status = ref([
|
||||
const invoiceStatus = ref([
|
||||
{
|
||||
label: 'Status',
|
||||
options: ['DRAFT', 'DUE', 'SENT', 'VIEWED', 'COMPLETED'],
|
||||
options: ['DRAFT', 'SENT', 'VIEWED', 'COMPLETED'],
|
||||
},
|
||||
{
|
||||
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 activeTab = ref('general.draft')
|
||||
const router = useRouter()
|
||||
const userStore = useUserStore()
|
||||
const selectedIndex = ref(0)
|
||||
|
||||
let filters = reactive({
|
||||
customer_id: '',
|
||||
@ -311,6 +346,7 @@ let filters = reactive({
|
||||
from_date: '',
|
||||
to_date: '',
|
||||
invoice_number: '',
|
||||
tab_status: '',
|
||||
})
|
||||
|
||||
const showEmptyScreen = computed(
|
||||
@ -401,6 +437,7 @@ async function fetchData({ page, filter, sort }) {
|
||||
from_date: filters.from_date,
|
||||
to_date: filters.to_date,
|
||||
invoice_number: filters.invoice_number,
|
||||
tab_status: filters.tab_status,
|
||||
orderByField: sort.fieldName || 'created_at',
|
||||
orderBy: sort.order || 'desc',
|
||||
page,
|
||||
@ -423,29 +460,9 @@ async function fetchData({ page, filter, sort }) {
|
||||
}
|
||||
}
|
||||
|
||||
function setStatusFilter(val) {
|
||||
if (activeTab.value == val.title) {
|
||||
return true
|
||||
}
|
||||
|
||||
activeTab.value = val.title
|
||||
|
||||
switch (val.title) {
|
||||
case t('general.draft'):
|
||||
filters.status = 'DRAFT'
|
||||
break
|
||||
case t('general.sent'):
|
||||
filters.status = 'SENT'
|
||||
break
|
||||
|
||||
case t('general.due'):
|
||||
filters.status = 'DUE'
|
||||
break
|
||||
|
||||
default:
|
||||
filters.status = ''
|
||||
break
|
||||
}
|
||||
function changeTabStatus(val, index) {
|
||||
filters.tab_status = val['tab-status']
|
||||
selectedIndex.value = index
|
||||
}
|
||||
|
||||
function setFilters() {
|
||||
@ -463,8 +480,6 @@ function clearFilter() {
|
||||
filters.from_date = ''
|
||||
filters.to_date = ''
|
||||
filters.invoice_number = ''
|
||||
|
||||
activeTab.value = t('general.all')
|
||||
}
|
||||
|
||||
async function removeMultipleInvoices() {
|
||||
@ -505,39 +520,21 @@ function toggleFilter() {
|
||||
function setActiveTab(val) {
|
||||
switch (val) {
|
||||
case 'DRAFT':
|
||||
activeTab.value = t('general.draft')
|
||||
selectedIndex.value = 1
|
||||
break
|
||||
|
||||
case 'SENT':
|
||||
activeTab.value = t('general.sent')
|
||||
break
|
||||
|
||||
case 'DUE':
|
||||
activeTab.value = t('general.due')
|
||||
break
|
||||
|
||||
case 'VIEWED':
|
||||
case 'COMPLETED':
|
||||
activeTab.value = t('invoices.completed')
|
||||
break
|
||||
|
||||
case 'PAID':
|
||||
activeTab.value = t('invoices.paid')
|
||||
selectedIndex.value = 2
|
||||
break
|
||||
|
||||
case 'UNPAID':
|
||||
activeTab.value = t('invoices.unpaid')
|
||||
break
|
||||
|
||||
case 'PARTIALLY_PAID':
|
||||
activeTab.value = t('invoices.partially_paid')
|
||||
break
|
||||
|
||||
case 'VIEWED':
|
||||
activeTab.value = t('invoices.viewed')
|
||||
break
|
||||
|
||||
default:
|
||||
activeTab.value = t('general.all')
|
||||
selectedIndex.value = 3
|
||||
break
|
||||
}
|
||||
filters.tab_status = invoiceTabStatus[selectedIndex.value].value
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -32,6 +32,8 @@
|
||||
:content-loading="isLoading"
|
||||
:calendar-button="true"
|
||||
calendar-button-icon="calendar"
|
||||
:show-extra-options="true"
|
||||
:source-date="invoiceStore.newInvoice.invoice_date"
|
||||
/>
|
||||
</BaseInputGroup>
|
||||
|
||||
|
||||
@ -54,8 +54,6 @@
|
||||
label="name"
|
||||
:options="itemStore.itemUnits"
|
||||
value-prop="id"
|
||||
:can-deselect="false"
|
||||
:can-clear="false"
|
||||
:placeholder="$t('items.select_a_unit')"
|
||||
searchable
|
||||
track-by="name"
|
||||
|
||||
@ -82,9 +82,9 @@
|
||||
required
|
||||
>
|
||||
<BaseCustomerSelectInput
|
||||
v-if="!isLoadingContent"
|
||||
v-model="paymentStore.currentPayment.customer_id"
|
||||
:content-loading="isLoadingContent"
|
||||
v-if="!isLoadingContent"
|
||||
:invalid="v$.currentPayment.customer_id.$error"
|
||||
:placeholder="$t('customers.select_a_customer')"
|
||||
show-action
|
||||
@ -423,7 +423,7 @@ function onCustomerChange(customer_id) {
|
||||
if (customer_id) {
|
||||
let data = {
|
||||
customer_id: customer_id,
|
||||
status: 'DUE',
|
||||
tab_status: 'DUE',
|
||||
limit: 'all',
|
||||
}
|
||||
|
||||
@ -446,7 +446,11 @@ function onCustomerChange(customer_id) {
|
||||
paymentStore.currentPayment.selectedCustomer = res2.data.data
|
||||
paymentStore.currentPayment.customer = res2.data.data
|
||||
paymentStore.currentPayment.currency = res2.data.data.currency
|
||||
if(isEdit.value && !customerStore.editCustomer && paymentStore.currentPayment.customer_id) {
|
||||
if (
|
||||
isEdit.value &&
|
||||
!customerStore.editCustomer &&
|
||||
paymentStore.currentPayment.customer_id
|
||||
) {
|
||||
customerStore.editCustomer = res2.data.data
|
||||
}
|
||||
}
|
||||
|
||||
@ -28,6 +28,19 @@
|
||||
/>
|
||||
</BaseInputGroup>
|
||||
|
||||
<BaseInputGroup
|
||||
:label="$tc('settings.company_info.company_slug')"
|
||||
:help-text="$t('settings.company_info.company_slug_help_text')"
|
||||
:error="v$.slug.$error && v$.slug.$errors[0].$message"
|
||||
required
|
||||
>
|
||||
<BaseInput
|
||||
v-model="companyForm.slug"
|
||||
:invalid="v$.slug.$error"
|
||||
@blur="v$.slug.$touch()"
|
||||
/>
|
||||
</BaseInputGroup>
|
||||
|
||||
<BaseInputGroup :label="$tc('settings.company_info.phone')">
|
||||
<BaseInput v-model="companyForm.address.phone" />
|
||||
</BaseInputGroup>
|
||||
@ -160,6 +173,7 @@ let isSaving = ref(false)
|
||||
|
||||
const companyForm = reactive({
|
||||
name: null,
|
||||
slug: null,
|
||||
logo: null,
|
||||
address: {
|
||||
address_street_1: '',
|
||||
@ -193,7 +207,14 @@ const rules = computed(() => {
|
||||
name: {
|
||||
required: helpers.withMessage(t('validation.required'), required),
|
||||
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)
|
||||
),
|
||||
},
|
||||
|
||||
@ -8,7 +8,11 @@
|
||||
<BaseInputGroup
|
||||
:content-loading="isFetchingInitialData"
|
||||
: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"
|
||||
required
|
||||
>
|
||||
@ -21,7 +25,7 @@
|
||||
:searchable="true"
|
||||
track-by="name"
|
||||
:invalid="v$.currency.$error"
|
||||
disabled
|
||||
:disabled="isCurrencyDisabled"
|
||||
class="w-full"
|
||||
>
|
||||
</BaseMultiselect>
|
||||
@ -187,6 +191,7 @@ const { t, tm } = useI18n()
|
||||
let isSaving = ref(false)
|
||||
let isDataSaving = ref(false)
|
||||
let isFetchingInitialData = ref(false)
|
||||
let isCurrencyDisabled = ref(true)
|
||||
|
||||
const settingsForm = reactive({ ...companyStore.selectedCompanySettings })
|
||||
|
||||
@ -282,10 +287,14 @@ setInitialData()
|
||||
async function setInitialData() {
|
||||
isFetchingInitialData.value = true
|
||||
Promise.all([
|
||||
companyStore.checkCompanyHasCurrencyTransactions(),
|
||||
globalStore.fetchCurrencies(),
|
||||
globalStore.fetchDateFormats(),
|
||||
globalStore.fetchTimeZones(),
|
||||
]).then(([res1]) => {
|
||||
if (res1.data?.has_transactions == false) {
|
||||
isCurrencyDisabled.value = false
|
||||
}
|
||||
isFetchingInitialData.value = false
|
||||
})
|
||||
}
|
||||
|
||||
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>
|
||||
@ -126,7 +126,7 @@ onMounted(() => {
|
||||
})
|
||||
|
||||
const value = computed({
|
||||
get: () => props.modelValue,
|
||||
get: () => (props.modelValue ? props.modelValue : ''),
|
||||
set: (value) => {
|
||||
emit('update:modelValue', value)
|
||||
},
|
||||
@ -195,7 +195,9 @@ async function getFields() {
|
||||
{ label: 'Date', value: 'INVOICE_DATE' },
|
||||
{ label: 'Due Date', value: 'INVOICE_DUE_DATE' },
|
||||
{ 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) => ({
|
||||
label: i.label,
|
||||
value: i.slug,
|
||||
@ -211,7 +213,8 @@ async function getFields() {
|
||||
{ label: 'Date', value: 'ESTIMATE_DATE' },
|
||||
{ label: 'Expiry Date', value: 'ESTIMATE_EXPIRY_DATE' },
|
||||
{ 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) => ({
|
||||
label: i.label,
|
||||
value: i.slug,
|
||||
@ -228,6 +231,7 @@ async function getFields() {
|
||||
{ label: 'Number', value: 'PAYMENT_NUMBER' },
|
||||
{ label: 'Mode', value: 'PAYMENT_MODE' },
|
||||
{ label: 'Amount', value: 'PAYMENT_AMOUNT' },
|
||||
{ label: 'PDF Link', value: 'PDF_LINK' },
|
||||
...paymentFields.value.map((i) => ({
|
||||
label: i.label,
|
||||
value: i.slug,
|
||||
|
||||
@ -7,52 +7,108 @@
|
||||
/>
|
||||
</BaseContentPlaceholders>
|
||||
|
||||
<div v-else :class="computedContainerClass" class="relative flex flex-row">
|
||||
<svg
|
||||
v-if="showCalendarIcon && !hasIconSlot"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="
|
||||
absolute
|
||||
w-4
|
||||
h-4
|
||||
mx-2
|
||||
my-2.5
|
||||
text-sm
|
||||
not-italic
|
||||
font-black
|
||||
text-gray-400
|
||||
cursor-pointer
|
||||
"
|
||||
@click="onClickDp"
|
||||
>
|
||||
<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"
|
||||
<div v-else :class="computedContainerClass">
|
||||
<date-picker
|
||||
ref="vCalendar"
|
||||
v-model="date"
|
||||
v-bind="$attrs"
|
||||
:disabled="disabled"
|
||||
:config="config"
|
||||
:class="[defaultInputClass, inputInvalidClass, inputDisabledClass]"
|
||||
/>
|
||||
:mode="mode"
|
||||
:is24hr="time24hr"
|
||||
class="w-full"
|
||||
color="indigo"
|
||||
:input-debounce="500"
|
||||
:update-on-input="false"
|
||||
:is-range="false"
|
||||
trim-weeks
|
||||
:is-required="isRequired"
|
||||
:popover="{
|
||||
visibility: disabled ? 'hidden' : 'focus',
|
||||
showDelay: 0,
|
||||
hideDelay: 1,
|
||||
}"
|
||||
:attributes="attrs"
|
||||
:model-config="config"
|
||||
:masks="masks"
|
||||
:locale="global.locale"
|
||||
>
|
||||
<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>
|
||||
</template>
|
||||
|
||||
<script type="text/babel" setup>
|
||||
import FlatPickr from 'vue-flatpickr-component'
|
||||
import 'flatpickr/dist/flatpickr.css'
|
||||
import { Calendar, DatePicker } from 'v-calendar'
|
||||
import 'v-calendar/dist/style.css'
|
||||
import { computed, reactive, watch, ref, useSlots } from 'vue'
|
||||
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
||||
|
||||
const dp = ref(null)
|
||||
import moment from 'moment'
|
||||
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
@ -90,36 +146,31 @@ const props = defineProps({
|
||||
defaultInputClass: {
|
||||
type: String,
|
||||
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: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
isRequired: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
showExtraOptions: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
sourceDate: {
|
||||
type: [String, Date],
|
||||
default: () => new Date(),
|
||||
}
|
||||
})
|
||||
|
||||
const emit = defineEmits(['update:modelValue'])
|
||||
|
||||
const slots = useSlots()
|
||||
|
||||
const companyStore = useCompanyStore()
|
||||
|
||||
let config = reactive({
|
||||
altInput: true,
|
||||
enableTime: props.enableTime,
|
||||
time_24hr: props.time24hr,
|
||||
})
|
||||
|
||||
const date = computed({
|
||||
get: () => props.modelValue,
|
||||
set: (value) => {
|
||||
emit('update:modelValue', value)
|
||||
},
|
||||
})
|
||||
|
||||
const carbonFormat = computed(() => {
|
||||
return companyStore.selectedCompanySettings?.carbon_date_format
|
||||
})
|
||||
const { global } = window.i18n
|
||||
const vCalendar = ref(null)
|
||||
|
||||
const hasIconSlot = computed(() => {
|
||||
return !!slots.icon
|
||||
@ -135,7 +186,6 @@ const inputInvalidClass = computed(() => {
|
||||
if (props.invalid) {
|
||||
return 'border-red-400 ring-red-400 focus:ring-red-400 focus:border-red-400'
|
||||
}
|
||||
|
||||
return ''
|
||||
})
|
||||
|
||||
@ -143,35 +193,97 @@ const inputDisabledClass = computed(() => {
|
||||
if (props.disabled) {
|
||||
return 'border border-solid rounded-md outline-none input-field box-border-2 base-date-picker-input placeholder-gray-400 bg-gray-200 text-gray-600 border-gray-200'
|
||||
}
|
||||
|
||||
return ''
|
||||
})
|
||||
|
||||
function onClickDp(params) {
|
||||
dp.value.fp.open()
|
||||
// to convert YYYY-MM-DD | YYYY-MM-DD HH:mm format
|
||||
function convertYMDFormat(date) {
|
||||
let format = props.enableTime ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD'
|
||||
return date ? moment(date).format(format) : date
|
||||
}
|
||||
|
||||
watch(
|
||||
() => props.enableTime,
|
||||
(val) => {
|
||||
if (props.enableTime) {
|
||||
config.enableTime = props.enableTime
|
||||
}
|
||||
const date = computed({
|
||||
get: () => props.modelValue,
|
||||
set: (value) => {
|
||||
emit('update:modelValue', value)
|
||||
},
|
||||
{ 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(
|
||||
() => carbonFormat,
|
||||
() => {
|
||||
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 {
|
||||
config.altFormat = carbonFormat.value
|
||||
? `${carbonFormat.value} H:i `
|
||||
: 'd M Y H:i'
|
||||
let timeFormat = 'HH:mm'
|
||||
if (props.time24hr) {
|
||||
masks.inputDateTime24hr = carbonFormat.value
|
||||
? `${carbonFormat.value} ${timeFormat}`
|
||||
: `DD MMM YYYY ${timeFormat}`
|
||||
} else {
|
||||
masks.inputDateTime = carbonFormat.value
|
||||
? `${carbonFormat.value} ${timeFormat}`
|
||||
: `DD MMM YYYY ${timeFormat}`
|
||||
}
|
||||
config.mask = `YYYY-MM-DD ${timeFormat}`
|
||||
}
|
||||
},
|
||||
{ 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>
|
||||
|
||||
<style scoped>
|
||||
.extra-button {
|
||||
@apply bg-primary-500 text-white text-sm font-semibold px-2 py-1 rounded hover:bg-primary-700;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -39,7 +39,7 @@ const props = defineProps({
|
||||
inputClass: {
|
||||
type: String,
|
||||
default:
|
||||
'font-base block w-full sm:text-sm border-gray-200 rounded-md text-black',
|
||||
'font-base block w-full sm:text-sm border-gray-200 rounded-md text-black dark:bg-gray-700 dark:border-gray-600 dark:text-white dark:placeholder-gray-500',
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
@ -86,7 +86,7 @@ const currencyBindings = computed(() => {
|
||||
|
||||
const invalidClass = computed(() => {
|
||||
if (props.invalid) {
|
||||
return 'border-red-500 ring-red-500 focus:ring-red-500 focus:border-red-500'
|
||||
return 'border-red-500 dark:border-red-500 ring-red-500 dark:ring-red-500 focus:ring-red-500 dark:focus:ring-red-500 focus:border-red-500 dark:focus:border-red-500'
|
||||
}
|
||||
return 'focus:ring-primary-400 focus:border-primary-400'
|
||||
})
|
||||
|
||||
@ -1,6 +1,10 @@
|
||||
<template>
|
||||
<div>
|
||||
<TabGroup :default-index="defaultIndex" @change="onChange">
|
||||
<TabGroup
|
||||
:selected-index="selectedIndex"
|
||||
:default-index="defaultIndex"
|
||||
@change="onChange"
|
||||
>
|
||||
<TabList
|
||||
:class="[
|
||||
'flex border-b border-grey-light',
|
||||
@ -54,6 +58,10 @@ const props = defineProps({
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
selectedIndex: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
filter: {
|
||||
type: String,
|
||||
default: null,
|
||||
@ -67,6 +75,6 @@ const slots = useSlots()
|
||||
const tabs = computed(() => slots.default().map((tab) => tab.props))
|
||||
|
||||
function onChange(d) {
|
||||
emit('change', tabs.value[d])
|
||||
emit('change', tabs.value[d], d)
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -45,7 +45,7 @@ const props = defineProps({
|
||||
defaultInputClass: {
|
||||
type: String,
|
||||
default:
|
||||
'box-border w-full px-3 py-2 text-sm not-italic font-normal leading-snug text-left text-black placeholder-gray-400 bg-white border border-gray-200 border-solid rounded outline-none',
|
||||
'box-border w-full px-3 py-2 text-sm not-italic font-normal leading-snug text-left text-black placeholder-gray-400 bg-white border border-gray-200 dark:border-gray-600 border-solid rounded outline-none dark:bg-gray-700 dark:text-white',
|
||||
},
|
||||
autosize: {
|
||||
type: Boolean,
|
||||
|
||||
@ -7,12 +7,12 @@ export function usePopper(options) {
|
||||
let popper = ref(null)
|
||||
|
||||
onMounted(() => {
|
||||
watchEffect(onInvalidate => {
|
||||
watchEffect((onInvalidate) => {
|
||||
if (!container.value) return
|
||||
if (!activator.value) return
|
||||
|
||||
let containerEl = container.value.el || container.value
|
||||
let activatorEl = activator.value.el || activator.value
|
||||
let activatorEl = activator.value.$el || activator.value
|
||||
|
||||
if (!(activatorEl instanceof HTMLElement)) return
|
||||
if (!(containerEl instanceof HTMLElement)) return
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
"settings": "Nastavení",
|
||||
"logout": "Odhlásit se",
|
||||
"users": "Uživatelé",
|
||||
"modules": "Modules"
|
||||
"modules": "Moduly"
|
||||
},
|
||||
"general": {
|
||||
"add_company": "Přidat firmu",
|
||||
@ -93,14 +93,14 @@
|
||||
"no_note_found": "Nebyly nalezeny žádné poznámky",
|
||||
"insert_note": "Vložit poznámku",
|
||||
"copied_pdf_url_clipboard": "Adresa PDF zkopírována do schránky!",
|
||||
"copied_url_clipboard": "Copied url to clipboard!",
|
||||
"copied_url_clipboard": "Zkopírováno do schránky!",
|
||||
"docs": "Dokumentace",
|
||||
"do_you_wish_to_continue": "Přejete si pokračovat?",
|
||||
"note": "Poznámka",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"mark_as_default": "Mark as default"
|
||||
"pay_invoice": "Zaplatit fakturu",
|
||||
"login_successfully": "Přihlášení proběhlo úspěšně!",
|
||||
"logged_out_successfully": "Odhlášení proběhlo úspěšně",
|
||||
"mark_as_default": "Označit jako výchozí"
|
||||
},
|
||||
"dashboard": {
|
||||
"select_year": "Vybrat rok",
|
||||
@ -108,8 +108,8 @@
|
||||
"due_amount": "Částka k zaplacení",
|
||||
"customers": "Zákazníci",
|
||||
"invoices": "Faktury",
|
||||
"estimates": "Odhady",
|
||||
"payments": "Payments"
|
||||
"estimates": "Nabídky",
|
||||
"payments": "Platby"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "Slevy",
|
||||
@ -187,7 +187,7 @@
|
||||
"website": "Webová stránka",
|
||||
"overview": "Přehled",
|
||||
"invoice_prefix": "Prefix pro faktury",
|
||||
"estimate_prefix": "Prefix pro odhady",
|
||||
"estimate_prefix": "Prefix pro nabídky",
|
||||
"payment_prefix": "Prefix pro platby",
|
||||
"enable_portal": "Povolit portál",
|
||||
"country": "Země",
|
||||
@ -208,10 +208,10 @@
|
||||
"new_customer": "Nový zákazník",
|
||||
"edit_customer": "Upravit zákazníka",
|
||||
"basic_info": "Základní informace",
|
||||
"portal_access": "Portal Access",
|
||||
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||
"portal_access_url": "Customer Portal Login URL",
|
||||
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||
"portal_access": "Přístup do portálu",
|
||||
"portal_access_text": "Chcete povolit tomuto zákazníkovi možnost přihlásit se na zákaznický portál?",
|
||||
"portal_access_url": "URL pro přihlášení do zákaznického portálu",
|
||||
"portal_access_url_help": "Zkopírujte a pošlete výše uvedenou adresu URL vašemu zákazníkovi pro poskytnutí přístupu.",
|
||||
"billing_address": "Fakturační adresa",
|
||||
"shipping_address": "Doručovací adresa",
|
||||
"copy_billing_address": "Zkopírovat z fakturace",
|
||||
@ -231,7 +231,7 @@
|
||||
"confirm_delete": "Nebudete moci obnovit tohoto zákazníka a všechny jeho faktury, odhady a platby. | Nebudete moci obnovit tyto zákazníky a všechny jejich faktury, odhady a platby.",
|
||||
"created_message": "Zákazník úspěšně vytvořen",
|
||||
"updated_message": "Zákazník úspěšně upraven",
|
||||
"address_updated_message": "Address Information Updated succesfully",
|
||||
"address_updated_message": "Adresa úspěšně aktualizována",
|
||||
"deleted_message": "Zákazník úspěšně smazán | Zákazníci úspěšně smazáni",
|
||||
"edit_currency_not_allowed": "Po vytvoření transakce nelze změnit měnu."
|
||||
},
|
||||
@ -264,11 +264,11 @@
|
||||
"deleted_message": "Položka byla úspěšně odstraněna | Položky byly úspěšně odstraněny"
|
||||
},
|
||||
"estimates": {
|
||||
"title": "Odhady",
|
||||
"accept_estimate": "Accept Estimate",
|
||||
"reject_estimate": "Reject Estimate",
|
||||
"estimate": "Odhad | Odhady",
|
||||
"estimates_list": "Seznam odhadů",
|
||||
"title": "Nabídky",
|
||||
"accept_estimate": "Přijmout nabídku",
|
||||
"reject_estimate": "Odmítnout nabídku",
|
||||
"estimate": "Nabídka | Nabídky",
|
||||
"estimates_list": "Seznam nabídek",
|
||||
"days": "{days} dní",
|
||||
"months": "{months} měsíc",
|
||||
"years": "{years} rok",
|
||||
@ -283,7 +283,7 @@
|
||||
"total": "Celkem",
|
||||
"discount": "Sleva",
|
||||
"sub_total": "Mezisoučet",
|
||||
"estimate_number": "Odhadované číslo",
|
||||
"estimate_number": "Číslo nabídky",
|
||||
"ref_number": "Referenční číslo",
|
||||
"contact": "Kontakt",
|
||||
"add_item": "Přidat položku",
|
||||
@ -299,11 +299,11 @@
|
||||
"estimate_template": "Šablona",
|
||||
"convert_to_invoice": "Převést na fakturu",
|
||||
"mark_as_sent": "Označit jako odeslané",
|
||||
"send_estimate": "Odeslat odhad",
|
||||
"resend_estimate": "Znovu odeslat odhad",
|
||||
"send_estimate": "Odeslat nabídku",
|
||||
"resend_estimate": "Znovu odeslat nabídku",
|
||||
"record_payment": "Zaznamenat platbu",
|
||||
"add_estimate": "Přidat odhad",
|
||||
"save_estimate": "Uložit odhad",
|
||||
"add_estimate": "Přidat nabídku",
|
||||
"save_estimate": "Uložit nabídku",
|
||||
"confirm_conversion": "Tento odhad bude použit k vytvoření nové faktury.",
|
||||
"conversion_message": "Faktura byla úspěšně vytvořena",
|
||||
"confirm_send_estimate": "Tento odhad bude zaslán e-mailem zákazníkovi",
|
||||
@ -318,10 +318,10 @@
|
||||
},
|
||||
"accepted": "Přijato",
|
||||
"rejected": "Odmítnuto",
|
||||
"expired": "Expired",
|
||||
"expired": "Vypršela platnost",
|
||||
"sent": "Odesláno",
|
||||
"draft": "Koncept",
|
||||
"viewed": "Viewed",
|
||||
"viewed": "Zobrazené",
|
||||
"declined": "Odmítnuto",
|
||||
"new_estimate": "Nový odhad",
|
||||
"add_new_estimate": "Přidat nový odhad",
|
||||
@ -355,14 +355,14 @@
|
||||
"select_an_item": "Pište nebo klikněte pro výběr položky",
|
||||
"type_item_description": "Zadejte popis položky (volitelné)"
|
||||
},
|
||||
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||
"mark_as_default_estimate_template_description": "Je-li povoleno, bude vybraná šablona automaticky vybrána pro nové nabídky."
|
||||
},
|
||||
"invoices": {
|
||||
"title": "Faktury",
|
||||
"download": "Download",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"download": "Stáhnout",
|
||||
"pay_invoice": "Zaplatit fakturu",
|
||||
"invoices_list": "Seznam faktur",
|
||||
"invoice_information": "Invoice Information",
|
||||
"invoice_information": "Informace o faktuře",
|
||||
"days": "{days} dní",
|
||||
"months": "{months} měsíc",
|
||||
"years": "{years} rok",
|
||||
@ -447,7 +447,7 @@
|
||||
"marked_as_sent_message": "Faktura označena jako úspěšně odeslaná",
|
||||
"something_went_wrong": "něco se nezdařilo",
|
||||
"invalid_due_amount_message": "Celková částka faktury nemůže být nižší než celková částka zaplacená za tuto fakturu. Chcete-li pokračovat, upravte fakturu nebo smažte související platby.",
|
||||
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||
"mark_as_default_invoice_template_description": "Je-li povoleno, bude vybraná šablona automaticky vybrána pro nové faktury."
|
||||
},
|
||||
"recurring_invoices": {
|
||||
"title": "Opakující se faktury",
|
||||
@ -526,7 +526,7 @@
|
||||
"cloned_successfully": "Opakující se faktura úspěšně naklonována",
|
||||
"clone_invoice": "Naklonovat opakující se fakturu",
|
||||
"confirm_clone": "Tato opakující se faktura bude naklonována do nové opakující se faktury",
|
||||
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
||||
"add_customer_email": "Pro automatické odesílání faktur prosím přidejte e-mailovou adresu tohoto zákazníka.",
|
||||
"item": {
|
||||
"title": "Název položky",
|
||||
"description": "Popis",
|
||||
@ -658,49 +658,49 @@
|
||||
"retype_password": "Zadejte heslo znovu"
|
||||
},
|
||||
"modules": {
|
||||
"buy_now": "Buy Now",
|
||||
"install": "Install",
|
||||
"price": "Price",
|
||||
"download_zip_file": "Download ZIP file",
|
||||
"unzipping_package": "Unzipping Package",
|
||||
"copying_files": "Copying Files",
|
||||
"deleting_files": "Deleting Unused files",
|
||||
"completing_installation": "Completing Installation",
|
||||
"update_failed": "Update Failed",
|
||||
"install_success": "Module has been installed successfully!",
|
||||
"customer_reviews": "Reviews",
|
||||
"license": "License",
|
||||
"faq": "FAQ",
|
||||
"monthly": "Monthly",
|
||||
"yearly": "Yearly",
|
||||
"updated": "Updated",
|
||||
"version": "Version",
|
||||
"disable": "Disable",
|
||||
"module_disabled": "Module Disabled",
|
||||
"enable": "Enable",
|
||||
"module_enabled": "Module Enabled",
|
||||
"update_to": "Update To",
|
||||
"module_updated": "Module Updated Successfully!",
|
||||
"title": "Modules",
|
||||
"module": "Module | Modules",
|
||||
"buy_now": "Koupit",
|
||||
"install": "Instalovat",
|
||||
"price": "Cena",
|
||||
"download_zip_file": "Stáhnout soubor ZIP",
|
||||
"unzipping_package": "Rozbalování balíku",
|
||||
"copying_files": "Kopírování souborů",
|
||||
"deleting_files": "Odstraňování nepoužitých souborů",
|
||||
"completing_installation": "Dokončování instalace",
|
||||
"update_failed": "Aktualizace se nezdařila",
|
||||
"install_success": "Modul byl úspěšně nainstalován!",
|
||||
"customer_reviews": "Recenze",
|
||||
"license": "Licence",
|
||||
"faq": "Často kladené dotazy (FAQ)",
|
||||
"monthly": "Měsíčně",
|
||||
"yearly": "Ročně",
|
||||
"updated": "Aktualizováno",
|
||||
"version": "Verze",
|
||||
"disable": "Zakázat",
|
||||
"module_disabled": "Modul zakázán",
|
||||
"enable": "Povolit",
|
||||
"module_enabled": "Modul povolen",
|
||||
"update_to": "Aktualizovat na",
|
||||
"module_updated": "Modul byl úspěšně aktualizován!",
|
||||
"title": "Moduly",
|
||||
"module": "Modul | Moduly",
|
||||
"api_token": "API token",
|
||||
"invalid_api_token": "Invalid API Token.",
|
||||
"other_modules": "Other Modules",
|
||||
"view_all": "View All",
|
||||
"no_reviews_found": "There are no reviews for this module yet!",
|
||||
"module_not_purchased": "Module Not Purchased",
|
||||
"module_not_found": "Module Not Found",
|
||||
"invalid_api_token": "Neplatný API token.",
|
||||
"other_modules": "Další moduly",
|
||||
"view_all": "Zobrazit vše",
|
||||
"no_reviews_found": "Pro tento modul zatím neexistují žádné recenze!",
|
||||
"module_not_purchased": "Modul není zakoupený",
|
||||
"module_not_found": "Modul nebyl nalezen",
|
||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||
"last_updated": "Last Updated On",
|
||||
"connect_installation": "Connect your installation",
|
||||
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
||||
"view_module": "View Module",
|
||||
"update_available": "Update Available",
|
||||
"purchased": "Purchased",
|
||||
"installed": "Installed",
|
||||
"no_modules_installed": "No Modules Installed Yet!",
|
||||
"disable_warning": "All the settings for this particular will be reverted.",
|
||||
"what_you_get": "What you get"
|
||||
"last_updated": "Naposledy aktualizováno",
|
||||
"connect_installation": "Připojte vaši instalaci",
|
||||
"api_token_description": "Přihlaste se k {url} a připojte tuto instalaci zadáním API tokenu. Vaše zakoupené moduly se zde zobrazí po navázání připojení.",
|
||||
"view_module": "Zobrazit modul",
|
||||
"update_available": "Je k dispozici aktualizace",
|
||||
"purchased": "Zakoupeno",
|
||||
"installed": "Nainstalováno",
|
||||
"no_modules_installed": "Nejsou nainstalovány žádné moduly!",
|
||||
"disable_warning": "Všechna nastavení pro tuto konkrétní položku budou vrácena zpět.",
|
||||
"what_you_get": "Co získáte"
|
||||
},
|
||||
"users": {
|
||||
"title": "Uživatelé",
|
||||
@ -731,7 +731,7 @@
|
||||
"companies": "Společnosti"
|
||||
},
|
||||
"reports": {
|
||||
"title": "Report",
|
||||
"title": "Hlášení",
|
||||
"from_date": "Datum od",
|
||||
"to_date": "Do data",
|
||||
"status": "Stav",
|
||||
@ -739,8 +739,8 @@
|
||||
"unpaid": "Nezaplaceno",
|
||||
"download_pdf": "Stáhnout PDF",
|
||||
"view_pdf": "Zobrazit PDF",
|
||||
"update_report": "Upravit report",
|
||||
"report": "Report | Reporty",
|
||||
"update_report": "Upravit hlášení",
|
||||
"report": "Hlášení | Hlášení",
|
||||
"profit_loss": {
|
||||
"profit_loss": "Zisk a ztráta",
|
||||
"to_date": "Do data",
|
||||
@ -752,7 +752,7 @@
|
||||
"date_range": "Vybrat časový rozsah",
|
||||
"to_date": "Do data",
|
||||
"from_date": "Od data",
|
||||
"report_type": "Typ reportu"
|
||||
"report_type": "Typ hlášení"
|
||||
},
|
||||
"taxes": {
|
||||
"taxes": "Daně",
|
||||
@ -807,10 +807,10 @@
|
||||
"payment_modes": "Způsoby plateb",
|
||||
"notes": "Poznámky",
|
||||
"exchange_rate": "Směnný kurz",
|
||||
"address_information": "Address Information"
|
||||
"address_information": "Adresa"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " You can update Your Address information using form below."
|
||||
"section_description": " Adresu můžete aktualizovat pomocí formuláře níže."
|
||||
},
|
||||
"title": "Nastavení",
|
||||
"setting": "Nastavení | Nastavení",
|
||||
@ -1114,7 +1114,7 @@
|
||||
"exchange_help_text": "Zadejte směnný kurz pro převod z {currency} do {baseCurrency}",
|
||||
"currency_freak": "Currency Freak",
|
||||
"currency_layer": "Currency Layer",
|
||||
"open_exchange_rate": "Open Exchange Rate",
|
||||
"open_exchange_rate": "Otevřít směnný kurz",
|
||||
"currency_converter": "Převodník měn",
|
||||
"server": "Server",
|
||||
"url": "URL",
|
||||
@ -1150,8 +1150,8 @@
|
||||
"payment_mode_added": "Platební metoda přidána",
|
||||
"payment_mode_updated": "Platební metoda upravena",
|
||||
"payment_mode_confirm_delete": "Nebudete moci obnovit tuto platební metodu",
|
||||
"payments_attached": "This payment method is already attached to payments. Please delete the attached payments to proceed with deletion.",
|
||||
"expenses_attached": "This payment method is already attached to expenses. Please delete the attached expenses to proceed with deletion.",
|
||||
"payments_attached": "Tento způsob platby je již připojen k platbám. Chcete-li pokračovat v odstranění, odstraňte připojené platby.",
|
||||
"expenses_attached": "Tento způsob platby je již připojen k výdajům. Chcete-li pokračovat v odstranění, odstraňte připojené výdaje.",
|
||||
"deleted_message": "Platební metoda byla úspěšně odstraněna"
|
||||
},
|
||||
"expense_category": {
|
||||
@ -1178,8 +1178,8 @@
|
||||
"discount_setting": "Nastavení slev",
|
||||
"discount_per_item": "Sleva za položku ",
|
||||
"discount_setting_description": "Povolte tuto možnost, pokud chcete přidat slevu do jednotlivých položek faktury. Ve výchozím nastavení je sleva přidána přímo na fakturu.",
|
||||
"expire_public_links": "Automatically Expire Public Links",
|
||||
"expire_setting_description": "Specify whether you would like to expire all the links sent by application to view invoices, estimates & payments, etc after a specified duration.",
|
||||
"expire_public_links": "Automaticky zrušit platnost veřejných odkazů",
|
||||
"expire_setting_description": "Určete, zda chcete zrušit všechny odkazy odeslané aplikací k zobrazení faktur, odhadů, plateb atd. po stanovené době trvání.",
|
||||
"save": "Uložit",
|
||||
"preference": "Předvolba | Předvolby",
|
||||
"general_settings": "Výchozí předvolby systému.",
|
||||
@ -1301,16 +1301,16 @@
|
||||
"invalid_disk_credentials": "Nesprávné přihlašovací údaje pro vybraný disk"
|
||||
},
|
||||
"taxations": {
|
||||
"add_billing_address": "Enter Billing Address",
|
||||
"add_shipping_address": "Enter Shipping Address",
|
||||
"add_company_address": "Enter Company Address",
|
||||
"modal_description": "The information below is required in order to fetch sales tax.",
|
||||
"add_address": "Add Address for fetching sales tax.",
|
||||
"address_placeholder": "Example: 123, My Street",
|
||||
"city_placeholder": "Example: Los Angeles",
|
||||
"state_placeholder": "Example: CA",
|
||||
"zip_placeholder": "Example: 90024",
|
||||
"invalid_address": "Please provide valid address details."
|
||||
"add_billing_address": "Zadejte fakturační adresu",
|
||||
"add_shipping_address": "Zadejte doručovací adresu",
|
||||
"add_company_address": "Zadejte adresu firmy",
|
||||
"modal_description": "Níže uvedené informace jsou vyžadovány pro načtení daně z prodeje.",
|
||||
"add_address": "Přidat adresu pro načtení daně z prodeje.",
|
||||
"address_placeholder": "Například: Moje Ulice 123",
|
||||
"city_placeholder": "Například: Praha",
|
||||
"state_placeholder": "Například: CZ",
|
||||
"zip_placeholder": "Například: 90024",
|
||||
"invalid_address": "Zadejte prosím platnou adresu."
|
||||
}
|
||||
},
|
||||
"wizard": {
|
||||
@ -1470,17 +1470,17 @@
|
||||
"not_allowed": "Není povoleno",
|
||||
"login_invalid_credentials": "Tyto údaje neodpovídají našim záznamům.",
|
||||
"enter_valid_cron_format": "Zadejte platný formát cronu",
|
||||
"email_could_not_be_sent": "Email could not be sent to this email address.",
|
||||
"invalid_address": "Please enter a valid address.",
|
||||
"invalid_key": "Please enter valid key.",
|
||||
"invalid_state": "Please enter a valid state.",
|
||||
"invalid_city": "Please enter a valid city.",
|
||||
"invalid_postal_code": "Please enter a valid zip.",
|
||||
"invalid_format": "Please enter valid query string format.",
|
||||
"api_error": "Server not responding.",
|
||||
"feature_not_enabled": "Feature not enabled.",
|
||||
"request_limit_met": "Api request limit exceeded.",
|
||||
"address_incomplete": "Incomplete Address"
|
||||
"email_could_not_be_sent": "E-mail nemohl být odeslán na tuto e-mailovou adresu.",
|
||||
"invalid_address": "Zadejte prosím platnou adresu.",
|
||||
"invalid_key": "Zadejte prosím platný klíč.",
|
||||
"invalid_state": "Zadejte prosím platný název státu.",
|
||||
"invalid_city": "Zadejte prosím platný název města.",
|
||||
"invalid_postal_code": "Zadejte prosím platné PSČ.",
|
||||
"invalid_format": "Zadejte prosím data v platném formátu.",
|
||||
"api_error": "Server neodpovídá.",
|
||||
"feature_not_enabled": "Funkce není zapnuta.",
|
||||
"request_limit_met": "Limit požadavků API překročen.",
|
||||
"address_incomplete": "Neúplná adresa"
|
||||
},
|
||||
"pdf_estimate_label": "Odhad",
|
||||
"pdf_estimate_number": "Číslo odhadu",
|
||||
@ -1504,18 +1504,18 @@
|
||||
"pdf_payment_number": "Číslo platby",
|
||||
"pdf_payment_mode": "Platební metoda",
|
||||
"pdf_payment_amount_received_label": "Obdržená částka",
|
||||
"pdf_expense_report_label": "REPORT VÝDAJŮ",
|
||||
"pdf_expense_report_label": "HLÁŠENÍ VÝDAJŮ",
|
||||
"pdf_total_expenses_label": "VÝDAJE CELKEM",
|
||||
"pdf_profit_loss_label": "REPORT ZISKU A ZTRÁT",
|
||||
"pdf_sales_customers_label": "Report o zákaznících prodeje",
|
||||
"pdf_sales_items_label": "Report o položkách prodeje",
|
||||
"pdf_tax_summery_label": "Report o shrnutí daní",
|
||||
"pdf_profit_loss_label": "HLÁŠENÍ ZISKU A ZTRÁT",
|
||||
"pdf_sales_customers_label": "Hlášení o zákaznících prodeje",
|
||||
"pdf_sales_items_label": "Hlášení o položkách prodeje",
|
||||
"pdf_tax_summery_label": "Hlášení o daních",
|
||||
"pdf_income_label": "PŘÍJEM",
|
||||
"pdf_net_profit_label": "ČISTÝ ZISK",
|
||||
"pdf_customer_sales_report": "Report o prodeji: Podle zákazníka",
|
||||
"pdf_customer_sales_report": "Hlášení o prodeji: Podle zákazníka",
|
||||
"pdf_total_sales_label": "PRODEJE CELKEM",
|
||||
"pdf_item_sales_label": "Report o prodeji: Podle položky",
|
||||
"pdf_tax_report_label": "DAŇOVÝ REPORT",
|
||||
"pdf_item_sales_label": "Hlášení o prodeji: Podle položky",
|
||||
"pdf_tax_report_label": "DAŇOVÉ HLÁŠENÍ",
|
||||
"pdf_total_tax_label": "DANĚ CELKEM",
|
||||
"pdf_tax_types_label": "Typy daní",
|
||||
"pdf_expenses_label": "Výdaje",
|
||||
|
||||
@ -526,7 +526,7 @@
|
||||
"cloned_successfully": "Serienrechnung erfolgreich kopiert",
|
||||
"clone_invoice": "Serienrechnung kopieren",
|
||||
"confirm_clone": "Diese Serienrechnung wird in eine neue Serienrechnung kopiert",
|
||||
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
||||
"add_customer_email": "Bitte fügen Sie eine E-Mail-Adresse für diesen Kunden hinzu, um Rechnungen automatisch zu senden.",
|
||||
"item": {
|
||||
"title": "Titel des Artikels",
|
||||
"description": "Beschreibung",
|
||||
@ -682,25 +682,25 @@
|
||||
"update_to": "Update auf",
|
||||
"module_updated": "Modul erfolgreich aktualisiert!",
|
||||
"title": "Module",
|
||||
"module": "Module | Modules",
|
||||
"module": "Modul | Module",
|
||||
"api_token": "API Schlüssel",
|
||||
"invalid_api_token": "Invalid API Token.",
|
||||
"invalid_api_token": "Ungültiger API-Schlüssel.",
|
||||
"other_modules": "Weitere Module",
|
||||
"view_all": "Alle Anzeigen",
|
||||
"no_reviews_found": "There are no reviews for this module yet!",
|
||||
"no_reviews_found": "Für dieses Modul gibt es noch keine Bewertungen!",
|
||||
"module_not_purchased": "Module Not Purchased",
|
||||
"module_not_found": "Module Not Found",
|
||||
"module_not_found": "Modul nicht gefunden",
|
||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||
"last_updated": "Zuletzt aktualisiert am",
|
||||
"connect_installation": "Installation verbinden",
|
||||
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
||||
"api_token_description": "Melden Sie sich bei {url} an und verbinden Sie diese Installation durch Eingabe des API-Token. Ihre gekauften Module werden hier angezeigt, nachdem die Verbindung hergestellt wurde.",
|
||||
"view_module": "Modul anzeigen",
|
||||
"update_available": "Aktualisierung verfügbar",
|
||||
"purchased": "Gekauft",
|
||||
"installed": "Installiert",
|
||||
"no_modules_installed": "Noch keine Module installiert!",
|
||||
"disable_warning": "All the settings for this particular will be reverted.",
|
||||
"what_you_get": "What you get"
|
||||
"disable_warning": "Alle Einstellungen für diesen speziellen Wert werden zurückgesetzt.",
|
||||
"what_you_get": "Was Sie erhalten"
|
||||
},
|
||||
"users": {
|
||||
"title": "Benutzer",
|
||||
@ -1304,8 +1304,8 @@
|
||||
"add_billing_address": "Rechnungsadresse eingeben",
|
||||
"add_shipping_address": "Lieferadresse eingeben",
|
||||
"add_company_address": "Firmenadresse eingeben",
|
||||
"modal_description": "The information below is required in order to fetch sales tax.",
|
||||
"add_address": "Add Address for fetching sales tax.",
|
||||
"modal_description": "Die untenstehenden Informationen sind erforderlich, um die Steuer berücksichtigen zu können.",
|
||||
"add_address": "Fügen Sie eine Adresse hinzu, um die Steuer abrufen zu können.",
|
||||
"address_placeholder": "Beispiel: 123, meine Straße",
|
||||
"city_placeholder": "Beispiel: Los Angeles",
|
||||
"state_placeholder": "Beispiel: CA",
|
||||
@ -1471,21 +1471,21 @@
|
||||
"login_invalid_credentials": "Diese Anmeldeinformationen stimmen nicht mit unseren Aufzeichnungen überein.",
|
||||
"enter_valid_cron_format": "Bitte geben Sie ein gültiges Cron-Format ein",
|
||||
"email_could_not_be_sent": "Die E-Mail konnte nicht an diese Adresse gesendet werden.",
|
||||
"invalid_address": "Please enter a valid address.",
|
||||
"invalid_key": "Please enter valid key.",
|
||||
"invalid_state": "Please enter a valid state.",
|
||||
"invalid_city": "Please enter a valid city.",
|
||||
"invalid_postal_code": "Please enter a valid zip.",
|
||||
"invalid_format": "Please enter valid query string format.",
|
||||
"invalid_address": "Bitte geben Sie eine gültige Adresse ein.",
|
||||
"invalid_key": "Bitte geben Sie einen gültigen Schlüssel ein.",
|
||||
"invalid_state": "Bitte geben Sie ein gültiges Bundesland ein.",
|
||||
"invalid_city": "Bitte geben Sie eine gültige Stadt an.",
|
||||
"invalid_postal_code": "Bitte geben Sie eine gültige PLZ an.",
|
||||
"invalid_format": "Bitte geben Sie ein gültiges Abfrageformat ein.",
|
||||
"api_error": "Der Server antwortet nicht.",
|
||||
"feature_not_enabled": "Funktion nicht aktiviert.",
|
||||
"request_limit_met": "Api request limit exceeded.",
|
||||
"request_limit_met": "Api Anfragelimit überschritten.",
|
||||
"address_incomplete": "Unvollständige Adresse"
|
||||
},
|
||||
"pdf_estimate_label": "Angebot",
|
||||
"pdf_estimate_number": "Angebotsnummer",
|
||||
"pdf_estimate_date": "Angebotsdatum",
|
||||
"pdf_estimate_expire_date": "Ablaufdatum",
|
||||
"pdf_estimate_expire_date": "Gültig bis",
|
||||
"pdf_invoice_label": "Rechnung",
|
||||
"pdf_invoice_number": "Rechnungsnummer",
|
||||
"pdf_invoice_date": "Rechnungsdatum",
|
||||
@ -1519,8 +1519,8 @@
|
||||
"pdf_total_tax_label": "Gesamte Umsatzsteuer",
|
||||
"pdf_tax_types_label": "Steuersätze",
|
||||
"pdf_expenses_label": "Ausgaben",
|
||||
"pdf_bill_to": "Rechnungsempfänger:",
|
||||
"pdf_ship_to": "Versand an:",
|
||||
"pdf_bill_to": "Rechnungsanschrift",
|
||||
"pdf_ship_to": "Lieferanschrift",
|
||||
"pdf_received_from": "Erhalten von:",
|
||||
"pdf_tax_label": "Steuer"
|
||||
}
|
||||
|
||||
@ -6,13 +6,13 @@
|
||||
"invoices": "Τιμολόγια",
|
||||
"recurring-invoices": "Επαναλαμβανόμενα τιμολόγια",
|
||||
"expenses": "Έξοδα",
|
||||
"estimates": "Εκτιμήσεις",
|
||||
"estimates": "Προσφορές",
|
||||
"payments": "Πληρωμές",
|
||||
"reports": "Αναφορές",
|
||||
"settings": "Ρυθμίσεις",
|
||||
"logout": "Αποσύνδεση",
|
||||
"users": "Χρήστες",
|
||||
"modules": "Modules"
|
||||
"modules": "Πρόσθετα"
|
||||
},
|
||||
"general": {
|
||||
"add_company": "Προσθήκη Εταιρείας",
|
||||
@ -93,14 +93,14 @@
|
||||
"no_note_found": "Δεν Βρέθηκε Σημείωση",
|
||||
"insert_note": "Εισαγωγή Σημείωσης",
|
||||
"copied_pdf_url_clipboard": "Αντιγράφηκε το url του PDF στo πρόχειρο!",
|
||||
"copied_url_clipboard": "Copied url to clipboard!",
|
||||
"copied_url_clipboard": "Ο σύνδεσμος αντιγράφηκε στο πρόχειρο!",
|
||||
"docs": "Έγγραφα",
|
||||
"do_you_wish_to_continue": "Θέλετε να συνεχίσετε;",
|
||||
"note": "Σημείωση",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"mark_as_default": "Mark as default"
|
||||
"pay_invoice": "Πληρωμή τιμολογίου",
|
||||
"login_successfully": "Η είσοδος ήταν επιτυχής!",
|
||||
"logged_out_successfully": "Η έξοδος ήταν επιτυχής",
|
||||
"mark_as_default": "Σημείωση ως προεπιλογή"
|
||||
},
|
||||
"dashboard": {
|
||||
"select_year": "Επιλογή έτους",
|
||||
@ -108,8 +108,8 @@
|
||||
"due_amount": "Οφειλόμενο Ποσό",
|
||||
"customers": "Πελάτες",
|
||||
"invoices": "Τιμολόγια",
|
||||
"estimates": "Εκτιμήσεις",
|
||||
"payments": "Payments"
|
||||
"estimates": "Προσφορές",
|
||||
"payments": "Πληρωμές"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "Πωλήσεις",
|
||||
@ -130,7 +130,7 @@
|
||||
"view_all": "Προβολή Όλων"
|
||||
},
|
||||
"recent_estimate_card": {
|
||||
"title": "Πρόσφατες Εκτιμήσεις",
|
||||
"title": "Πρόσφατες προσφορές",
|
||||
"date": "Ημερομηνία",
|
||||
"customer": "Πελάτης",
|
||||
"amount_due": "Οφειλόμενο Ποσό",
|
||||
@ -264,18 +264,18 @@
|
||||
"deleted_message": "Ο υπολογισμός διαγράφηκε επιτυχώς"
|
||||
},
|
||||
"estimates": {
|
||||
"title": "Εκτιμήσεις",
|
||||
"title": "Προσφορές",
|
||||
"accept_estimate": "Accept Estimate",
|
||||
"reject_estimate": "Reject Estimate",
|
||||
"estimate": "Εκτίμηση | Εκτιμήσεις",
|
||||
"estimates_list": "Λίστα Εκτιμήσεων",
|
||||
"estimate": "Προσφορά | Προσφορές",
|
||||
"estimates_list": "Λίστα προσφορών",
|
||||
"days": "{days} Ημέρες",
|
||||
"months": "{months} Μήνας",
|
||||
"years": "{years} Έτος",
|
||||
"all": "Όλα",
|
||||
"paid": "Εξοφλημένο",
|
||||
"unpaid": "Ανεξόφλητο",
|
||||
"customer": "ΤΕΛΩΝΕΙΑΚΗ",
|
||||
"customer": "Πελάτης",
|
||||
"ref_no": "REF NO.",
|
||||
"number": "ΑΡΙΘΜΟΣ",
|
||||
"amount_due": "ΠΟΣΟ ΠΡΟΣ ΠΛΗΡΩΜΗ",
|
||||
@ -300,7 +300,7 @@
|
||||
"convert_to_invoice": "Μετατράπηκε σε Τιμολόγιο",
|
||||
"mark_as_sent": "Σήμανση ως απεσταλμένου",
|
||||
"send_estimate": "Νέα Εκτίμηση",
|
||||
"resend_estimate": "Πρόσφατες Εκτιμήσεις",
|
||||
"resend_estimate": "Πρόσφατες προσφορές",
|
||||
"record_payment": "Καταγραφή Πληρωμής",
|
||||
"add_estimate": "Νέα Εκτίμηση",
|
||||
"save_estimate": "Νέα Εκτίμηση",
|
||||
@ -310,7 +310,7 @@
|
||||
"confirm_mark_as_sent": "Η εκτίμηση αυτή θα επισημανθεί ως εστάλη",
|
||||
"confirm_mark_as_accepted": "Αυτό το τιμολόγιο θα επισημανθεί ως Απορριπτόμενο",
|
||||
"confirm_mark_as_rejected": "Αυτό το τιμολόγιο θα επισημανθεί ως Απορριπτόμενο",
|
||||
"no_matching_estimates": "Δεν υπάρχουν αντίστοιχες εκτιμήσεις!",
|
||||
"no_matching_estimates": "Δεν υπάρχουν αντίστοιχες προσφορές!",
|
||||
"mark_as_sent_successfully": "Το τιμολόγιο επισημάνθηκε ως απεσταλμένο επιτυχώς",
|
||||
"send_estimate_successfully": "Το τιμολόγιο εστάλη επιτυχώς",
|
||||
"errors": {
|
||||
@ -328,9 +328,9 @@
|
||||
"update_Estimate": "Ενημέρωση εκτίμησης",
|
||||
"edit_estimate": "Επεξεργασία Εκτίμησης",
|
||||
"items": "στοιχεία",
|
||||
"Estimate": "Εκτίμηση | Εκτιμήσεις",
|
||||
"Estimate": "Προσφορά | Προσφορές",
|
||||
"add_new_tax": "Προσθήκη Νέου Φόρου",
|
||||
"no_estimates": "Δεν υπάρχουν εκτιμήσεις ακόμα!",
|
||||
"no_estimates": "Δεν υπάρχουν προσφορές ακόμα!",
|
||||
"list_of_estimates": "Αυτή η ενότητα θα περιέχει τη λίστα των στοιχείων.",
|
||||
"mark_as_rejected": "Σήμανση ως απορρίφθηκε",
|
||||
"mark_as_accepted": "Σήμανση ως αποδεκτό",
|
||||
@ -372,7 +372,7 @@
|
||||
"viewed": "Προβλήθηκαν",
|
||||
"overdue": "Εκπρόθεσμα",
|
||||
"completed": "Ολοκληρώθηκε",
|
||||
"customer": "ΤΕΛΩΝΕΙΑΚΗ",
|
||||
"customer": "Πελάτης",
|
||||
"paid_status": "ΚΑΤΑΣΤΑΣΗ ΠΛΗΡΩΜΗΣ",
|
||||
"ref_no": "REF NO.",
|
||||
"number": "ΑΡΙΘΜΟΣ",
|
||||
@ -462,7 +462,7 @@
|
||||
"overdue": "Εκπρόθεσμα",
|
||||
"active": "Ενεργή",
|
||||
"completed": "Ολοκληρώθηκε",
|
||||
"customer": "ΤΕΛΩΝΕΙΑΚΗ",
|
||||
"customer": "Πελάτης",
|
||||
"paid_status": "ΚΑΤΑΣΤΑΣΗ ΠΛΗΡΩΜΗΣ",
|
||||
"ref_no": "REF NO.",
|
||||
"number": "ΑΡΙΘΜΟΣ",
|
||||
@ -681,7 +681,7 @@
|
||||
"module_enabled": "Module Enabled",
|
||||
"update_to": "Update To",
|
||||
"module_updated": "Module Updated Successfully!",
|
||||
"title": "Modules",
|
||||
"title": "Πρόσθετα",
|
||||
"module": "Module | Modules",
|
||||
"api_token": "API token",
|
||||
"invalid_api_token": "Invalid API Token.",
|
||||
@ -692,13 +692,13 @@
|
||||
"module_not_found": "Module Not Found",
|
||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||
"last_updated": "Last Updated On",
|
||||
"connect_installation": "Connect your installation",
|
||||
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
||||
"view_module": "View Module",
|
||||
"update_available": "Update Available",
|
||||
"connect_installation": "Σύνδεση της εγκατάστασης σας",
|
||||
"api_token_description": "Συνδεθείτε στο {url} και συνδέστε αυτήν την εγκατάσταση εισάγοντας το API Token. Τα πρόσθετα που αγοράσατε θα εμφανιστούν εδώ μετά την ολοκλήρωση της σύνδεσης.",
|
||||
"view_module": "Δείτε το πρόσθετο",
|
||||
"update_available": "Διαθέσιμη ανανέωση",
|
||||
"purchased": "Purchased",
|
||||
"installed": "Installed",
|
||||
"no_modules_installed": "No Modules Installed Yet!",
|
||||
"installed": "Εγκαταστάθηκε",
|
||||
"no_modules_installed": "Δεν υπάρχουν ακόμα εγκατεστημένα πρόσθετα!",
|
||||
"disable_warning": "All the settings for this particular will be reverted.",
|
||||
"what_you_get": "What you get"
|
||||
},
|
||||
@ -815,7 +815,7 @@
|
||||
"title": "Ρυθμίσεις",
|
||||
"setting": "Ρύθμιση Ρυθμίσεων",
|
||||
"general": "General",
|
||||
"language": "Language",
|
||||
"language": "Γλώσσα",
|
||||
"primary_currency": "Κύριο Νόμισμα",
|
||||
"timezone": "Ζώνη Ώρας",
|
||||
"date_format": "Μορφή Ημερομηνίας",
|
||||
|
||||
@ -863,6 +863,8 @@
|
||||
"company_info": {
|
||||
"company_info": "Company info",
|
||||
"company_name": "Company Name",
|
||||
"company_slug": "Company Slug",
|
||||
"company_slug_help_text": "A unique URL friendly name for your company (It will appear on Customer Portal URL)",
|
||||
"company_logo": "Company Logo",
|
||||
"section_description": "Information about your company that will be displayed on invoices, estimates and other documents created by Crater.",
|
||||
"phone": "Phone",
|
||||
@ -1324,6 +1326,8 @@
|
||||
"company_info": "Company Information",
|
||||
"company_info_desc": "This information will be displayed on invoices. Note that you can edit this later on settings page.",
|
||||
"company_name": "Company Name",
|
||||
"company_slug": "Company Slug",
|
||||
"company_slug_help_text": "A unique URL friendly name for your company (It will appear on Customer Portal URL)",
|
||||
"company_logo": "Company Logo",
|
||||
"logo_preview": "Logo Preview",
|
||||
"preferences": "Company Preferences",
|
||||
@ -1454,7 +1458,8 @@
|
||||
"at_least_one_ability": "Please select atleast one Permission.",
|
||||
"valid_driver_key": "Please enter a valid {driver} key.",
|
||||
"valid_exchange_rate": "Please enter a valid exchange rate.",
|
||||
"company_name_not_same": "Company name must match with given name."
|
||||
"company_name_not_same": "Company name must match with given name.",
|
||||
"invalid_slug": "Invalid Slug"
|
||||
},
|
||||
"errors": {
|
||||
"starter_plan": "This feature is available on Starter plan and onwards!",
|
||||
@ -1485,7 +1490,7 @@
|
||||
"pdf_estimate_label": "Estimate",
|
||||
"pdf_estimate_number": "Estimate Number",
|
||||
"pdf_estimate_date": "Estimate Date",
|
||||
"pdf_estimate_expire_date": "Expiry date",
|
||||
"pdf_estimate_expire_date": "Expiry Date",
|
||||
"pdf_invoice_label": "Invoice",
|
||||
"pdf_invoice_number": "Invoice Number",
|
||||
"pdf_invoice_date": "Invoice Date",
|
||||
@ -1522,5 +1527,13 @@
|
||||
"pdf_bill_to": "Bill to,",
|
||||
"pdf_ship_to": "Ship to,",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
"settings": "Ajustes",
|
||||
"logout": "Cerrar sesión",
|
||||
"users": "Usuarios",
|
||||
"modules": "Modules"
|
||||
"modules": "Módulos"
|
||||
},
|
||||
"general": {
|
||||
"add_company": "Añadir empresa",
|
||||
@ -49,7 +49,7 @@
|
||||
"view": "Ver",
|
||||
"add_new_item": "Agregar ítem nuevo",
|
||||
"clear_all": "Limpiar todo",
|
||||
"showing": "Mostrando",
|
||||
"showing": "Mostrar",
|
||||
"of": "de",
|
||||
"actions": "Acciones",
|
||||
"subtotal": "SUBTOTAL",
|
||||
@ -93,14 +93,14 @@
|
||||
"no_note_found": "No se encontró ninguna nota",
|
||||
"insert_note": "Insertar una nota",
|
||||
"copied_pdf_url_clipboard": "Copiar Url al portapapeles",
|
||||
"copied_url_clipboard": "Copied url to clipboard!",
|
||||
"copied_url_clipboard": "¡URL copiada al portapapeles!",
|
||||
"docs": "Documentación",
|
||||
"do_you_wish_to_continue": "¿Deseas continuar?",
|
||||
"note": "Nota",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"mark_as_default": "Mark as default"
|
||||
"pay_invoice": "Pagar factura",
|
||||
"login_successfully": "Logeado Satisfactoriamente!",
|
||||
"logged_out_successfully": "Logeado Satisfactoriamente",
|
||||
"mark_as_default": "Marcar como predeterminado"
|
||||
},
|
||||
"dashboard": {
|
||||
"select_year": "Seleccionar año",
|
||||
@ -109,7 +109,7 @@
|
||||
"customers": "Clientes",
|
||||
"invoices": "Facturas",
|
||||
"estimates": "Presupuestos",
|
||||
"payments": "Payments"
|
||||
"payments": "Ver Medios de Pago"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "Ventas",
|
||||
@ -208,10 +208,10 @@
|
||||
"new_customer": "Nuevo cliente",
|
||||
"edit_customer": "Editar cliente",
|
||||
"basic_info": "Información básica",
|
||||
"portal_access": "Portal Access",
|
||||
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||
"portal_access_url": "Customer Portal Login URL",
|
||||
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||
"portal_access": "Acceso al portal",
|
||||
"portal_access_text": "¿Le gustaría permitir que este cliente inicie sesión en el Portal del Cliente?",
|
||||
"portal_access_url": "Portal URL del cliente",
|
||||
"portal_access_url_help": "Por favor, copie y reenvíe la URL anterior a su cliente para proporcionar acceso.",
|
||||
"billing_address": "Dirección de Facturación",
|
||||
"shipping_address": "Dirección de Envío",
|
||||
"copy_billing_address": "Copia de facturación",
|
||||
@ -231,7 +231,7 @@
|
||||
"confirm_delete": "No podrá recuperar este cliente y todas las facturas, estimaciones y pagos relacionados. | No podrá recuperar estos clientes y todas las facturas, estimaciones y pagos relacionados.",
|
||||
"created_message": "Cliente creado con éxito",
|
||||
"updated_message": "Cliente actualizado con éxito",
|
||||
"address_updated_message": "Address Information Updated succesfully",
|
||||
"address_updated_message": "Información del domicilio actualizado correctamente",
|
||||
"deleted_message": "Cliente eliminado correctamente | Clientes eliminados exitosamente",
|
||||
"edit_currency_not_allowed": "No se puede cambiar la divisa una vez creadas las transacciones."
|
||||
},
|
||||
@ -265,8 +265,8 @@
|
||||
},
|
||||
"estimates": {
|
||||
"title": "Presupuestos",
|
||||
"accept_estimate": "Accept Estimate",
|
||||
"reject_estimate": "Reject Estimate",
|
||||
"accept_estimate": "Aceptar cotización",
|
||||
"reject_estimate": "Rechazar cotización",
|
||||
"estimate": "Presupuesto | Presupuestos",
|
||||
"estimates_list": "Lista de presupuestos",
|
||||
"days": "{días} Días",
|
||||
@ -318,10 +318,10 @@
|
||||
},
|
||||
"accepted": "Aceptado",
|
||||
"rejected": "Rechazado",
|
||||
"expired": "Expired",
|
||||
"expired": "Caducado",
|
||||
"sent": "Enviado",
|
||||
"draft": "Borrador",
|
||||
"viewed": "Viewed",
|
||||
"viewed": "Visto",
|
||||
"declined": "Rechazado",
|
||||
"new_estimate": "Nuevo presupuesto",
|
||||
"add_new_estimate": "Añadir nuevo presupuesto",
|
||||
@ -355,14 +355,14 @@
|
||||
"select_an_item": "Escriba o haga clic para seleccionar un elemento",
|
||||
"type_item_description": "Descripción del tipo de elemento(opcional)"
|
||||
},
|
||||
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||
"mark_as_default_estimate_template_description": "Si se activa, esta plantilla se selccionará automáticamente para nuevos presupuestos. "
|
||||
},
|
||||
"invoices": {
|
||||
"title": "Facturas",
|
||||
"download": "Download",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"download": "Descargar",
|
||||
"pay_invoice": "Pagar factura",
|
||||
"invoices_list": "Lista de facturas",
|
||||
"invoice_information": "Invoice Information",
|
||||
"invoice_information": "Información de la factura",
|
||||
"days": "{días} Días",
|
||||
"months": "{meses} Mes",
|
||||
"years": "{años} Año",
|
||||
@ -447,7 +447,7 @@
|
||||
"marked_as_sent_message": "Factura marcada como enviada con éxito",
|
||||
"something_went_wrong": "Algo fue mal",
|
||||
"invalid_due_amount_message": "El pago introducido es mayor que el importe total pendiente de esta factura. Por favor, verificalo y vuelve a intentarlo.",
|
||||
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||
"mark_as_default_invoice_template_description": "Si se activa, esta plantilla se seleccionará automáticamente para nuevas facturas. "
|
||||
},
|
||||
"recurring_invoices": {
|
||||
"title": "Facturas recurrentes",
|
||||
@ -526,7 +526,7 @@
|
||||
"cloned_successfully": "Factura recurrente clonada con éxito",
|
||||
"clone_invoice": "Clonar factura recurrente",
|
||||
"confirm_clone": "Esta factura recurrente será clonada en una nueva factura recurrente",
|
||||
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
||||
"add_customer_email": "Por favor, agregue una dirección de correo electrónico para que este cliente envíe las facturas automáticamente.",
|
||||
"item": {
|
||||
"title": "Título del artículo",
|
||||
"description": "Descripción",
|
||||
@ -658,49 +658,49 @@
|
||||
"retype_password": "Reescriba la contraseña"
|
||||
},
|
||||
"modules": {
|
||||
"buy_now": "Buy Now",
|
||||
"install": "Install",
|
||||
"price": "Price",
|
||||
"download_zip_file": "Download ZIP file",
|
||||
"unzipping_package": "Unzipping Package",
|
||||
"copying_files": "Copying Files",
|
||||
"deleting_files": "Deleting Unused files",
|
||||
"completing_installation": "Completing Installation",
|
||||
"update_failed": "Update Failed",
|
||||
"install_success": "Module has been installed successfully!",
|
||||
"customer_reviews": "Reviews",
|
||||
"license": "License",
|
||||
"faq": "FAQ",
|
||||
"monthly": "Monthly",
|
||||
"yearly": "Yearly",
|
||||
"updated": "Updated",
|
||||
"version": "Version",
|
||||
"disable": "Disable",
|
||||
"module_disabled": "Module Disabled",
|
||||
"enable": "Enable",
|
||||
"module_enabled": "Module Enabled",
|
||||
"update_to": "Update To",
|
||||
"module_updated": "Module Updated Successfully!",
|
||||
"title": "Modules",
|
||||
"module": "Module | Modules",
|
||||
"buy_now": "Comprar ahora",
|
||||
"install": "Instalar",
|
||||
"price": "Precio",
|
||||
"download_zip_file": "Descargar archivo ZIP",
|
||||
"unzipping_package": "Descomprimir paquete",
|
||||
"copying_files": "Copiando archivos",
|
||||
"deleting_files": "Eliminando archivos no usados",
|
||||
"completing_installation": "Completando la instalación",
|
||||
"update_failed": "Falló la actualización",
|
||||
"install_success": "¡El módulo se ha instalado correctamente!",
|
||||
"customer_reviews": "Reseñas",
|
||||
"license": "Licencia",
|
||||
"faq": "Preguntas Frecuentes (FAQ)",
|
||||
"monthly": "Mensual",
|
||||
"yearly": "Anual",
|
||||
"updated": "Actualizado",
|
||||
"version": "Versión",
|
||||
"disable": "Deshabilitar",
|
||||
"module_disabled": "Módulo desactivado",
|
||||
"enable": "Habilitar",
|
||||
"module_enabled": "Módulo habilitado",
|
||||
"update_to": "Actualizar a",
|
||||
"module_updated": "¡Módulo actualizado correctamente!",
|
||||
"title": "Módulos",
|
||||
"module": "Módulo | Módulos",
|
||||
"api_token": "API token",
|
||||
"invalid_api_token": "Invalid API Token.",
|
||||
"other_modules": "Other Modules",
|
||||
"view_all": "View All",
|
||||
"no_reviews_found": "There are no reviews for this module yet!",
|
||||
"module_not_purchased": "Module Not Purchased",
|
||||
"module_not_found": "Module Not Found",
|
||||
"invalid_api_token": "API Token inválido.",
|
||||
"other_modules": "Otros módulos",
|
||||
"view_all": "Ver todo",
|
||||
"no_reviews_found": "¡Este módulo aún no tiene reseñas!",
|
||||
"module_not_purchased": "Módulo no comprado",
|
||||
"module_not_found": "Módulo no encontrado",
|
||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||
"last_updated": "Last Updated On",
|
||||
"connect_installation": "Connect your installation",
|
||||
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
||||
"view_module": "View Module",
|
||||
"update_available": "Update Available",
|
||||
"purchased": "Purchased",
|
||||
"installed": "Installed",
|
||||
"no_modules_installed": "No Modules Installed Yet!",
|
||||
"disable_warning": "All the settings for this particular will be reverted.",
|
||||
"what_you_get": "What you get"
|
||||
"last_updated": "Actualizado",
|
||||
"connect_installation": "Conecte su instalación",
|
||||
"api_token_description": "Inicie sesión en {url} y conecte esta instalación introduciendo el token de API. Los módulos comprados aparecerán aquí después de establecer la conexión.",
|
||||
"view_module": "Ver módulo",
|
||||
"update_available": "Actualización disponible",
|
||||
"purchased": "Comprado",
|
||||
"installed": "Instalado",
|
||||
"no_modules_installed": "¡No hay módulos instalados todavía!",
|
||||
"disable_warning": "Se revertirán todos los ajustes para este particular.",
|
||||
"what_you_get": "Beneficios que obtiene"
|
||||
},
|
||||
"users": {
|
||||
"title": "Usuarios",
|
||||
@ -807,10 +807,10 @@
|
||||
"payment_modes": "Formas de pago",
|
||||
"notes": "Notas",
|
||||
"exchange_rate": "Tasa de cambio",
|
||||
"address_information": "Address Information"
|
||||
"address_information": "Información de dirección"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " You can update Your Address information using form below."
|
||||
"section_description": "Puede actualizar la información de su dirección utilizando el siguiente formulario."
|
||||
},
|
||||
"title": "Configuraciones",
|
||||
"setting": "Configuraciones | Configuraciones",
|
||||
@ -1112,9 +1112,9 @@
|
||||
"error": " No puede eliminar el controlador activo",
|
||||
"default_currency_error": "Esta moneda ya se usa en uno de los proveedores activos",
|
||||
"exchange_help_text": "Ingrese el tipo de cambio para convertir de {currency} a {baseCurrency}",
|
||||
"currency_freak": "Currency Freak",
|
||||
"currency_layer": "Currency Layer",
|
||||
"open_exchange_rate": "Open Exchange Rate",
|
||||
"currency_freak": "Moneda",
|
||||
"currency_layer": "Capa de moneda",
|
||||
"open_exchange_rate": "Tasa de cambio",
|
||||
"currency_converter": "Conversor de moneda",
|
||||
"server": "Servidor",
|
||||
"url": "URL",
|
||||
@ -1150,8 +1150,8 @@
|
||||
"payment_mode_added": "Forma de pago añadida",
|
||||
"payment_mode_updated": "Forma de pago actualizada",
|
||||
"payment_mode_confirm_delete": "No podrás recuperar este Modo de Pago",
|
||||
"payments_attached": "This payment method is already attached to payments. Please delete the attached payments to proceed with deletion.",
|
||||
"expenses_attached": "This payment method is already attached to expenses. Please delete the attached expenses to proceed with deletion.",
|
||||
"payments_attached": "Esta forma de pago ya está vinculada a los pagos. Por favor, elimine los pagos adjuntos para proceder con la eliminación.",
|
||||
"expenses_attached": "Esta forma de pago ya está adjunta a los gastos. Por favor, elimine los gastos adjuntos para proceder con la eliminación.",
|
||||
"deleted_message": "Método de pago eliminado correctamente"
|
||||
},
|
||||
"expense_category": {
|
||||
@ -1178,8 +1178,8 @@
|
||||
"discount_setting": "Ajuste de descuento",
|
||||
"discount_per_item": "Descuento por artículo",
|
||||
"discount_setting_description": "Habilítelo si desea agregar Descuento a artículos de factura individuales. Por defecto, los descuentos se agregan directamente a la factura.",
|
||||
"expire_public_links": "Automatically Expire Public Links",
|
||||
"expire_setting_description": "Specify whether you would like to expire all the links sent by application to view invoices, estimates & payments, etc after a specified duration.",
|
||||
"expire_public_links": "Expirar automáticamente enlaces públicos",
|
||||
"expire_setting_description": "Especifique si desea expirar todos los enlaces enviados por la aplicación para ver facturas, estimaciones y pagos, etc. después de una duración especificada.",
|
||||
"save": "Guardar",
|
||||
"preference": "Preferencia | Preferencias",
|
||||
"general_settings": "Preferencias predeterminadas para el sistema.",
|
||||
@ -1301,16 +1301,16 @@
|
||||
"invalid_disk_credentials": "Credencial no válida del disco seleccionado"
|
||||
},
|
||||
"taxations": {
|
||||
"add_billing_address": "Enter Billing Address",
|
||||
"add_shipping_address": "Enter Shipping Address",
|
||||
"add_company_address": "Enter Company Address",
|
||||
"modal_description": "The information below is required in order to fetch sales tax.",
|
||||
"add_address": "Add Address for fetching sales tax.",
|
||||
"address_placeholder": "Example: 123, My Street",
|
||||
"city_placeholder": "Example: Los Angeles",
|
||||
"state_placeholder": "Example: CA",
|
||||
"zip_placeholder": "Example: 90024",
|
||||
"invalid_address": "Please provide valid address details."
|
||||
"add_billing_address": "Introduzca su dirección de facturación",
|
||||
"add_shipping_address": "Introduzca la dirección de envío",
|
||||
"add_company_address": "Introduzca la dirección de la empresa",
|
||||
"modal_description": "La siguiente información es requerida para obtener el impuesto de venta.",
|
||||
"add_address": "Añadir dirección para obtener impuestos de venta.",
|
||||
"address_placeholder": "Ejemplo: 123, Mi Calle",
|
||||
"city_placeholder": "Ejemplo: Los Angeles",
|
||||
"state_placeholder": "Ejemplo: CA",
|
||||
"zip_placeholder": "Ejemplo: 90024",
|
||||
"invalid_address": "Proporciona una dirección válida."
|
||||
}
|
||||
},
|
||||
"wizard": {
|
||||
@ -1470,17 +1470,17 @@
|
||||
"not_allowed": "No permitido",
|
||||
"login_invalid_credentials": "Estas credenciales no coinciden con nuestros registros.",
|
||||
"enter_valid_cron_format": "Por favor, introduzca un formato cron válido",
|
||||
"email_could_not_be_sent": "Email could not be sent to this email address.",
|
||||
"invalid_address": "Please enter a valid address.",
|
||||
"invalid_key": "Please enter valid key.",
|
||||
"invalid_state": "Please enter a valid state.",
|
||||
"invalid_city": "Please enter a valid city.",
|
||||
"invalid_postal_code": "Please enter a valid zip.",
|
||||
"invalid_format": "Please enter valid query string format.",
|
||||
"api_error": "Server not responding.",
|
||||
"feature_not_enabled": "Feature not enabled.",
|
||||
"request_limit_met": "Api request limit exceeded.",
|
||||
"address_incomplete": "Incomplete Address"
|
||||
"email_could_not_be_sent": "No se pudo enviar el correo a esta dirección de correo electrónico.",
|
||||
"invalid_address": "Por favor, introduzca una dirección válida.",
|
||||
"invalid_key": "Por favor, introduzca una clave válida.",
|
||||
"invalid_state": "Por favor, introduzca un estado válido.",
|
||||
"invalid_city": "Por favor, introduzca una ciudad válida.",
|
||||
"invalid_postal_code": "Por favor, introduzca un código postal válido.",
|
||||
"invalid_format": "Por favor, introduzca un formato de consulta válido.",
|
||||
"api_error": "El servidor no responde.",
|
||||
"feature_not_enabled": "Característica no habilitada.",
|
||||
"request_limit_met": "Ha alcanzado el límite de solicitudes.",
|
||||
"address_incomplete": "Dirección incompleta"
|
||||
},
|
||||
"pdf_estimate_label": "Presupuestar",
|
||||
"pdf_estimate_number": "Número de Presupuesto",
|
||||
|
||||
@ -100,7 +100,7 @@
|
||||
"pay_invoice": "Payer facture",
|
||||
"login_successfully": "Identifié avec succès!",
|
||||
"logged_out_successfully": "Déconnecté avec succès",
|
||||
"mark_as_default": "Mark as default"
|
||||
"mark_as_default": "Marquer par défaut"
|
||||
},
|
||||
"dashboard": {
|
||||
"select_year": "Sélectionnez l'année",
|
||||
@ -109,7 +109,7 @@
|
||||
"customers": "Clients",
|
||||
"invoices": "Factures",
|
||||
"estimates": "Devis",
|
||||
"payments": "Payments"
|
||||
"payments": "Paiements"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "Ventes",
|
||||
@ -318,10 +318,10 @@
|
||||
},
|
||||
"accepted": "Accepté",
|
||||
"rejected": "Refusé",
|
||||
"expired": "Expired",
|
||||
"expired": "Expiré",
|
||||
"sent": "Envoyé",
|
||||
"draft": "Brouillon",
|
||||
"viewed": "Viewed",
|
||||
"viewed": "Consultée",
|
||||
"declined": "Refusé",
|
||||
"new_estimate": "Nouveau devis",
|
||||
"add_new_estimate": "Nouveau devis",
|
||||
@ -658,49 +658,49 @@
|
||||
"retype_password": "Retaper le mot de passe"
|
||||
},
|
||||
"modules": {
|
||||
"buy_now": "Buy Now",
|
||||
"install": "Install",
|
||||
"price": "Price",
|
||||
"download_zip_file": "Download ZIP file",
|
||||
"unzipping_package": "Unzipping Package",
|
||||
"copying_files": "Copying Files",
|
||||
"deleting_files": "Deleting Unused files",
|
||||
"completing_installation": "Completing Installation",
|
||||
"update_failed": "Update Failed",
|
||||
"install_success": "Module has been installed successfully!",
|
||||
"customer_reviews": "Reviews",
|
||||
"buy_now": "Acheter maintenant",
|
||||
"install": "Installer",
|
||||
"price": "Prix",
|
||||
"download_zip_file": "Télécharger le fichier ZIP",
|
||||
"unzipping_package": "Décompresser le fichier",
|
||||
"copying_files": "Copie de fichiers en cours",
|
||||
"deleting_files": "Supprimer les fichiers inutilisés",
|
||||
"completing_installation": "Terminer l'installation",
|
||||
"update_failed": "Échec de la mise à jour",
|
||||
"install_success": "Votre module a été correctement installé !",
|
||||
"customer_reviews": "Évaluations",
|
||||
"license": "License",
|
||||
"faq": "FAQ",
|
||||
"monthly": "Monthly",
|
||||
"yearly": "Yearly",
|
||||
"updated": "Updated",
|
||||
"monthly": "Mensuel",
|
||||
"yearly": "Annuel",
|
||||
"updated": "Mis à jour",
|
||||
"version": "Version",
|
||||
"disable": "Disable",
|
||||
"module_disabled": "Module Disabled",
|
||||
"enable": "Enable",
|
||||
"module_enabled": "Module Enabled",
|
||||
"update_to": "Update To",
|
||||
"module_updated": "Module Updated Successfully!",
|
||||
"disable": "Désactiver",
|
||||
"module_disabled": "Module désactivé",
|
||||
"enable": "Activer",
|
||||
"module_enabled": "Module activé",
|
||||
"update_to": "Mise à jour vers",
|
||||
"module_updated": "Le module a bien été mis à jour !",
|
||||
"title": "Modules",
|
||||
"module": "Module | Modules",
|
||||
"api_token": "API token",
|
||||
"invalid_api_token": "Invalid API Token.",
|
||||
"other_modules": "Other Modules",
|
||||
"view_all": "View All",
|
||||
"no_reviews_found": "There are no reviews for this module yet!",
|
||||
"module_not_purchased": "Module Not Purchased",
|
||||
"module_not_found": "Module Not Found",
|
||||
"api_token": "Jeton API",
|
||||
"invalid_api_token": "Jeton API invalide.",
|
||||
"other_modules": "Autres modules",
|
||||
"view_all": "Tout afficher",
|
||||
"no_reviews_found": "Il n'y a pas encore d'avis pour ce module !",
|
||||
"module_not_purchased": "Module non acheté",
|
||||
"module_not_found": "Module non trouvé",
|
||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||
"last_updated": "Last Updated On",
|
||||
"connect_installation": "Connect your installation",
|
||||
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
||||
"view_module": "View Module",
|
||||
"update_available": "Update Available",
|
||||
"purchased": "Purchased",
|
||||
"installed": "Installed",
|
||||
"no_modules_installed": "No Modules Installed Yet!",
|
||||
"disable_warning": "All the settings for this particular will be reverted.",
|
||||
"what_you_get": "What you get"
|
||||
"last_updated": "Mis à jour le",
|
||||
"connect_installation": "Connectez votre installation",
|
||||
"api_token_description": "Rendez-vous à {url} et connectez votre application en entrant le jeton d'API. Vos modules achetés apparaîtront ici une fois la connexion établie.",
|
||||
"view_module": "Afficher le module",
|
||||
"update_available": "Mise à jour disponible",
|
||||
"purchased": "Acheté",
|
||||
"installed": "Installé",
|
||||
"no_modules_installed": "Aucun module installé !",
|
||||
"disable_warning": "Tous les paramètres de ce module seront réinitialisés.",
|
||||
"what_you_get": "Ce que vous obtenez"
|
||||
},
|
||||
"users": {
|
||||
"title": "Utilisateurs",
|
||||
@ -807,7 +807,7 @@
|
||||
"payment_modes": "Modes de paiement",
|
||||
"notes": "Notes de bas de page",
|
||||
"exchange_rate": "Taux de change",
|
||||
"address_information": "Address Information"
|
||||
"address_information": "Information d'adresse"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " Vous pouvez mettre à jour vos informations d'adresse via le formulaire ci dessous."
|
||||
@ -842,7 +842,7 @@
|
||||
"port": "Port",
|
||||
"driver": "Fournisseur",
|
||||
"secret": "Secret",
|
||||
"mailgun_secret": "Mailgun Secret",
|
||||
"mailgun_secret": "Secret Mailgun",
|
||||
"mailgun_domain": "Domaine",
|
||||
"mailgun_endpoint": "Mailgun Endpoint",
|
||||
"ses_secret": "SES Secret",
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
"customers": "ग्राहक",
|
||||
"items": "चीज़ें",
|
||||
"invoices": "चालान",
|
||||
"recurring-invoices": "Recurring Invoices",
|
||||
"recurring-invoices": "आवर्ती बिल",
|
||||
"expenses": "लागत",
|
||||
"estimates": "अनुमान",
|
||||
"payments": "भुगतान",
|
||||
@ -12,7 +12,7 @@
|
||||
"settings": "समायोजन",
|
||||
"logout": "लॉग आउट",
|
||||
"users": "कर्मचारी",
|
||||
"modules": "Modules"
|
||||
"modules": "मॉड्यूल"
|
||||
},
|
||||
"general": {
|
||||
"add_company": "कंपनी जोड़ें",
|
||||
@ -29,9 +29,9 @@
|
||||
"to_date": "इस तारीख तक",
|
||||
"from": "से",
|
||||
"to": "के लिये",
|
||||
"ok": "Ok",
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
"ok": "ठीक",
|
||||
"yes": "हां",
|
||||
"no": "नहीं",
|
||||
"sort_by": "इसके अनुसार क्रमबद्ध करें",
|
||||
"ascending": "आरोही",
|
||||
"descending": "उतरते",
|
||||
@ -39,7 +39,7 @@
|
||||
"body": "बॉडी",
|
||||
"message": "संदेश",
|
||||
"send": "भेजे",
|
||||
"preview": "Preview",
|
||||
"preview": "पूर्व दर्शन",
|
||||
"go_back": "पिचे जाओ",
|
||||
"back_to_login": "लॉगिन पर वापस जाएं",
|
||||
"home": "होम",
|
||||
@ -65,7 +65,7 @@
|
||||
"sent": "भेजा गया",
|
||||
"all": "सभी",
|
||||
"select_all": "सभी चुनें",
|
||||
"select_template": "Select Template",
|
||||
"select_template": "टेंपलेट चुने",
|
||||
"choose_file": "फ़ाइल चुनने के लिए यहां क्लिक करें",
|
||||
"choose_template": "एक टेम्पलेट चुनें",
|
||||
"choose": "चुनें",
|
||||
@ -93,14 +93,14 @@
|
||||
"no_note_found": "कोई नोट नहीं मिला",
|
||||
"insert_note": "टिप्पणी डालें...",
|
||||
"copied_pdf_url_clipboard": "पीडीएफ यूआरएल\nको क्लिपबोर्ड पर कॉपी किया गया!",
|
||||
"copied_url_clipboard": "Copied url to clipboard!",
|
||||
"docs": "Docs",
|
||||
"do_you_wish_to_continue": "Do you wish to continue?",
|
||||
"note": "Note",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"mark_as_default": "Mark as default"
|
||||
"copied_url_clipboard": "यूआरएल को क्लिपबोर्ड पर कॉपी किया गया!",
|
||||
"docs": "डॉक्स",
|
||||
"do_you_wish_to_continue": "क्या आप जारी रखना चाहते हैं?",
|
||||
"note": "ध्यान दें",
|
||||
"pay_invoice": "बिल का भुगतान करो",
|
||||
"login_successfully": "सफलतापूर्वक लॉगिन किया गया",
|
||||
"logged_out_successfully": "सफलतापूर्वक लॉग आउट किया गया",
|
||||
"mark_as_default": "डिफ़ॉल्ट के रूप में चिह्नित करें"
|
||||
},
|
||||
"dashboard": {
|
||||
"select_year": "वर्ष चुनें",
|
||||
@ -109,7 +109,7 @@
|
||||
"customers": "ग्राहक",
|
||||
"invoices": "चालान",
|
||||
"estimates": "अनुमान",
|
||||
"payments": "Payments"
|
||||
"payments": "भुगतान"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "बिक्री",
|
||||
@ -151,27 +151,27 @@
|
||||
"no_results_found": "कोई परिणाम नहीं मिला"
|
||||
},
|
||||
"company_switcher": {
|
||||
"label": "SWITCH COMPANY",
|
||||
"no_results_found": "No Results Found",
|
||||
"add_new_company": "Add new company",
|
||||
"new_company": "New company",
|
||||
"created_message": "Company created successfully"
|
||||
"label": "स्विच कंपनी",
|
||||
"no_results_found": "कोई परिणाम नहीं मिला",
|
||||
"add_new_company": "नई कंपनी जोड़ें",
|
||||
"new_company": "नई कंपनी",
|
||||
"created_message": "कंपनी सफलतापूर्वक बनाई गई"
|
||||
},
|
||||
"dateRange": {
|
||||
"today": "Today",
|
||||
"this_week": "This Week",
|
||||
"this_month": "This Month",
|
||||
"this_quarter": "This Quarter",
|
||||
"this_year": "This Year",
|
||||
"previous_week": "Previous Week",
|
||||
"previous_month": "Previous Month",
|
||||
"previous_quarter": "Previous Quarter",
|
||||
"previous_year": "Previous Year",
|
||||
"custom": "Custom"
|
||||
"today": "आज",
|
||||
"this_week": "इस सप्ताह",
|
||||
"this_month": "इस महीने",
|
||||
"this_quarter": "इस तिमाही",
|
||||
"this_year": "इस वर्ष",
|
||||
"previous_week": "पिछला सप्ताह",
|
||||
"previous_month": "पिछला महीना",
|
||||
"previous_quarter": "पिछली तिमाही",
|
||||
"previous_year": "पिछला साल",
|
||||
"custom": "कस्टम"
|
||||
},
|
||||
"customers": {
|
||||
"title": "ग्राहक",
|
||||
"prefix": "Prefix",
|
||||
"prefix": "प्रीफ़िक्स",
|
||||
"add_customer": "ग्राहक जोड़ें",
|
||||
"contacts_list": "ग्राहक सूची",
|
||||
"name": "नाम",
|
||||
@ -186,9 +186,9 @@
|
||||
"phone": "फ़ोन",
|
||||
"website": "वेबसाइट",
|
||||
"overview": "अवलोकन",
|
||||
"invoice_prefix": "Invoice Prefix",
|
||||
"estimate_prefix": "Estimate Prefix",
|
||||
"payment_prefix": "Payment Prefix",
|
||||
"invoice_prefix": "बिल उपसर्ग",
|
||||
"estimate_prefix": "अनुमान उपसर्ग",
|
||||
"payment_prefix": "भुगतान उपसर्ग",
|
||||
"enable_portal": "पोर्टल सक्षम करें",
|
||||
"country": "देश",
|
||||
"state": "राज्य",
|
||||
@ -197,7 +197,7 @@
|
||||
"added_on": "पर जोड़ा",
|
||||
"action": "कार्य",
|
||||
"password": "पासवर्ड",
|
||||
"confirm_password": "Confirm Password",
|
||||
"confirm_password": "पासवर्ड की पुष्टि करें",
|
||||
"street_number": "गली संख्या",
|
||||
"primary_currency": "प्राथमिक मुद्रा",
|
||||
"description": "विवरण",
|
||||
@ -208,10 +208,10 @@
|
||||
"new_customer": "नए ग्राहक",
|
||||
"edit_customer": "ग्राहक संपादित करें",
|
||||
"basic_info": "आधारभूत जानकारी",
|
||||
"portal_access": "Portal Access",
|
||||
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||
"portal_access_url": "Customer Portal Login URL",
|
||||
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||
"portal_access": "पोर्टल एक्सेस",
|
||||
"portal_access_text": "क्या आप इस ग्राहक को ग्राहक पोर्टल में लॉगिन करने की अनुमति देना चाहेंगे?",
|
||||
"portal_access_url": "ग्राहक पोर्टल लॉगिन URL",
|
||||
"portal_access_url_help": "कृपया ऊपर दिए गए URL को कॉपी करके अपने ग्राहक को एक्सेस प्रदान करने के लिए अग्रेषित करें।",
|
||||
"billing_address": "बिल भेजने का पता",
|
||||
"shipping_address": "शिपिंग पता",
|
||||
"copy_billing_address": "बिलिंग से प्रतिलिपि",
|
||||
@ -231,9 +231,9 @@
|
||||
"confirm_delete": "आप इस ग्राहक और सभी संबंधित चालानों, अनुमानों और भुगतानों को पुनर्प्राप्त नहीं कर पाएंगे। | आप इन ग्राहकों और सभी संबंधित चालानों, अनुमानों और भुगतानों को पुनर्प्राप्त नहीं कर पाएंगे।",
|
||||
"created_message": "सफलतापूर्वक प्रेषित",
|
||||
"updated_message": "सफलतापूर्वक प्रेषित",
|
||||
"address_updated_message": "Address Information Updated succesfully",
|
||||
"address_updated_message": "पते की जानकारी सफलतापूर्वक अपडेट की गई",
|
||||
"deleted_message": "ग्राहक सफलतापूर्वक हटा दिया गया | ग्राहक सफलतापूर्वक हटा दिए गए",
|
||||
"edit_currency_not_allowed": "Cannot change currency once transactions created."
|
||||
"edit_currency_not_allowed": "एक बार लेन-देन करने के बाद मुद्रा नहीं बदल सकते।"
|
||||
},
|
||||
"items": {
|
||||
"title": "चीज़ें",
|
||||
@ -265,8 +265,8 @@
|
||||
},
|
||||
"estimates": {
|
||||
"title": "अनुमान",
|
||||
"accept_estimate": "Accept Estimate",
|
||||
"reject_estimate": "Reject Estimate",
|
||||
"accept_estimate": "अनुमान स्वीकार करें",
|
||||
"reject_estimate": "अनुमान अस्वीकार करें",
|
||||
"estimate": "अनुमान | अनुमान",
|
||||
"estimates_list": "अनुमान सूची",
|
||||
"days": "{days} दिनों",
|
||||
@ -318,10 +318,10 @@
|
||||
},
|
||||
"accepted": "स्वीकृत",
|
||||
"rejected": "अस्वीकृत",
|
||||
"expired": "Expired",
|
||||
"expired": "समाप्त हुआ",
|
||||
"sent": "भेजा गया",
|
||||
"draft": "प्रारूप",
|
||||
"viewed": "Viewed",
|
||||
"viewed": "देखा गया",
|
||||
"declined": "नामंज़ूर किया गया",
|
||||
"new_estimate": "नया अनुमान",
|
||||
"add_new_estimate": "नया अनुमान जोड़ें",
|
||||
@ -355,14 +355,14 @@
|
||||
"select_an_item": "चुनने के लिए टाइप करें या क्लिक करें",
|
||||
"type_item_description": "आइटम विवरण टाइप करें (वैकल्पिक)"
|
||||
},
|
||||
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||
"mark_as_default_estimate_template_description": "यदि सक्षम किया गया है, तो चयनित टेम्पलेट स्वचालित रूप से नए अनुमानों के लिए चयनित हो जाएगा।"
|
||||
},
|
||||
"invoices": {
|
||||
"title": "चालान",
|
||||
"download": "Download",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"download": "डाउनलोड",
|
||||
"pay_invoice": "रसीद का भुगतान करो",
|
||||
"invoices_list": "चालान सूची",
|
||||
"invoice_information": "Invoice Information",
|
||||
"invoice_information": "चालान जानकारी",
|
||||
"days": "{days} दिनों",
|
||||
"months": "{months} महीने",
|
||||
"years": "{years} साल",
|
||||
@ -379,7 +379,7 @@
|
||||
"amount_due": "देय राशि",
|
||||
"partially_paid": "आंशिक रूप से भुगतान किया",
|
||||
"total": "कुल",
|
||||
"discount": "Discount",
|
||||
"discount": "छूट",
|
||||
"sub_total": "उप राशि",
|
||||
"invoice": "चालान | चालान",
|
||||
"invoice_number": "इनवॉयस संख्या:",
|
||||
@ -397,13 +397,13 @@
|
||||
"send_invoice": "चालान भेजें",
|
||||
"resend_invoice": "चालान फिर से भेजें",
|
||||
"invoice_template": "चालान टेम्पलेट",
|
||||
"conversion_message": "Invoice cloned successful",
|
||||
"conversion_message": "बिल क्लोन सफल",
|
||||
"template": "टेम्प्लेट",
|
||||
"mark_as_sent": "भेजे गए के रूप में चिह्नित करें",
|
||||
"confirm_send_invoice": "यह चालान ग्राहक को ईमेल के माध्यम से भेजा जाएगा",
|
||||
"invoice_mark_as_sent": "यह चालान भेजा के रूप में चिह्नित किया जाएगा",
|
||||
"confirm_mark_as_accepted": "This invoice will be marked as Accepted",
|
||||
"confirm_mark_as_rejected": "This invoice will be marked as Rejected",
|
||||
"confirm_mark_as_accepted": "इस बिल को स्वीकृत के रूप में चिह्नित किया जाएगा",
|
||||
"confirm_mark_as_rejected": "इस बिल को अस्वीकृत के रूप में चिह्नित किया जाएगा",
|
||||
"confirm_send": "यह चालान ग्राहक को ईमेल के माध्यम से भेजा जाएगा",
|
||||
"invoice_date": "चालान की तारीख",
|
||||
"record_payment": "रिकॉर्ड भुगतान",
|
||||
@ -415,13 +415,13 @@
|
||||
"update_invoice": "चालान संपादित करें",
|
||||
"add_new_tax": "नया टैक्स जोड़ें",
|
||||
"no_invoices": "अभी तक कोई चालान नहीं!",
|
||||
"mark_as_rejected": "Mark as rejected",
|
||||
"mark_as_accepted": "Mark as accepted",
|
||||
"mark_as_rejected": "अस्वीकृत के रूप में चिह्नित करें",
|
||||
"mark_as_accepted": "स्वीकृत के रूप में चिह्नित करें",
|
||||
"list_of_invoices": "इस खंड में वस्तुओं की सूची होगी।",
|
||||
"select_invoice": "चालान का चयन करें",
|
||||
"no_matching_invoices": "कोई मेल खाने वाले ग्राहक नहीं हैं!",
|
||||
"mark_as_sent_successfully": "चालान को सफलतापूर्वक भेजा गया के रूप में चिह्नित किया गया",
|
||||
"invoice_sent_successfully": "Invoice sent successfully",
|
||||
"invoice_sent_successfully": "चालान सफलतापूर्वक भेजा गया",
|
||||
"cloned_successfully": "चालान सफलतापूर्वक क्लोन किया गया",
|
||||
"clone_invoice": "क्लोन चालान",
|
||||
"confirm_clone": "यह चालान एक नए चालान में क्लोन किया जाएगा",
|
||||
@ -447,66 +447,66 @@
|
||||
"marked_as_sent_message": "अनुमान को सफलतापूर्वक भेजा गया के रूप में चिह्नित किया गया",
|
||||
"something_went_wrong": "कुछ गलत हो गया",
|
||||
"invalid_due_amount_message": "कुल चालान राशि इस चालान के लिए कुल भुगतान की गई राशि से कम नहीं हो सकती है। जारी रखने के लिए कृपया इनवॉइस अपडेट करें या संबद्ध भुगतानों को हटा दें।",
|
||||
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||
"mark_as_default_invoice_template_description": "यदि सक्षम किया गया है, तो चयनित टेम्पलेट स्वचालित रूप से नए चालानों के लिए चयनित हो जाएगा।"
|
||||
},
|
||||
"recurring_invoices": {
|
||||
"title": "Recurring Invoices",
|
||||
"invoices_list": "Recurring Invoices List",
|
||||
"days": "{days} Days",
|
||||
"months": "{months} Month",
|
||||
"years": "{years} Year",
|
||||
"all": "All",
|
||||
"paid": "Paid",
|
||||
"unpaid": "Unpaid",
|
||||
"viewed": "Viewed",
|
||||
"overdue": "Overdue",
|
||||
"active": "Active",
|
||||
"completed": "Completed",
|
||||
"customer": "CUSTOMER",
|
||||
"paid_status": "PAID STATUS",
|
||||
"ref_no": "REF NO.",
|
||||
"number": "NUMBER",
|
||||
"amount_due": "AMOUNT DUE",
|
||||
"partially_paid": "Partially Paid",
|
||||
"total": "Total",
|
||||
"discount": "Discount",
|
||||
"sub_total": "Sub Total",
|
||||
"invoice": "Recurring Invoice | Recurring Invoices",
|
||||
"invoice_number": "Recurring Invoice Number",
|
||||
"next_invoice_date": "Next Invoice Date",
|
||||
"ref_number": "Ref Number",
|
||||
"contact": "Contact",
|
||||
"add_item": "Add an Item",
|
||||
"date": "Date",
|
||||
"limit_by": "Limit by",
|
||||
"limit_date": "Limit Date",
|
||||
"limit_count": "Limit Count",
|
||||
"count": "Count",
|
||||
"status": "Status",
|
||||
"select_a_status": "Select a status",
|
||||
"working": "Working",
|
||||
"on_hold": "On Hold",
|
||||
"complete": "Completed",
|
||||
"add_tax": "Add Tax",
|
||||
"amount": "Amount",
|
||||
"action": "Action",
|
||||
"notes": "Notes",
|
||||
"view": "View",
|
||||
"basic_info": "Basic Info",
|
||||
"send_invoice": "Send Recurring Invoice",
|
||||
"auto_send": "Auto Send",
|
||||
"resend_invoice": "Resend Recurring Invoice",
|
||||
"invoice_template": "Recurring Invoice Template",
|
||||
"conversion_message": "Recurring Invoice cloned successful",
|
||||
"template": "Template",
|
||||
"mark_as_sent": "Mark as sent",
|
||||
"confirm_send_invoice": "This recurring invoice will be sent via email to the customer",
|
||||
"invoice_mark_as_sent": "This recurring invoice will be marked as sent",
|
||||
"confirm_send": "This recurring invoice will be sent via email to the customer",
|
||||
"starts_at": "Start Date",
|
||||
"due_date": "Invoice Due Date",
|
||||
"record_payment": "Record Payment",
|
||||
"add_new_invoice": "Add New Recurring Invoice",
|
||||
"title": "आवर्ती बिल",
|
||||
"invoices_list": "आवर्ती बिल सूची",
|
||||
"days": "{days} दिन",
|
||||
"months": "{months} महीना",
|
||||
"years": "{years} वर्ष",
|
||||
"all": "सभी",
|
||||
"paid": "भुगतान किया गया",
|
||||
"unpaid": "अवैतनिक",
|
||||
"viewed": "देखा गया",
|
||||
"overdue": "अतिदेय",
|
||||
"active": "सक्रिय",
|
||||
"completed": "पूर्ण",
|
||||
"customer": "ग्राहक",
|
||||
"paid_status": "भुगतान की स्थिति",
|
||||
"ref_no": "प्रसंग संख्या",
|
||||
"number": "संख्या",
|
||||
"amount_due": "देय राशि",
|
||||
"partially_paid": "आंशिक रूप से भुगतान किया",
|
||||
"total": "संपूर्ण",
|
||||
"discount": "छूट",
|
||||
"sub_total": "उप-योग",
|
||||
"invoice": "आवर्ती बिल",
|
||||
"invoice_number": "आवर्ती बिल संख्या",
|
||||
"next_invoice_date": "अगली बिल तिथि",
|
||||
"ref_number": "संदर्भ संख्या",
|
||||
"contact": "संपर्क",
|
||||
"add_item": "आइटम जोड़ें",
|
||||
"date": "दिनांक",
|
||||
"limit_by": "द्वारा सीमित करें",
|
||||
"limit_date": "सीमा तिथि",
|
||||
"limit_count": "सीमा गिनती",
|
||||
"count": "गिनती",
|
||||
"status": "स्थिति",
|
||||
"select_a_status": "स्टेटस चुनें",
|
||||
"working": "काम कर रहा है",
|
||||
"on_hold": "रुका हुआ है",
|
||||
"complete": "पूर्ण",
|
||||
"add_tax": "कर जोड़ें",
|
||||
"amount": "मात्रा",
|
||||
"action": "कार्य",
|
||||
"notes": "नोट्स",
|
||||
"view": "देखे",
|
||||
"basic_info": "आधारभूत जानकारी",
|
||||
"send_invoice": "आवर्ती चालान भेजें",
|
||||
"auto_send": "ऑटो भेजें",
|
||||
"resend_invoice": "आवर्ती चालान फिर से भेजें",
|
||||
"invoice_template": "आवर्ती चालान टेम्पलेट",
|
||||
"conversion_message": "आवर्ती चालान क्लोन सफल",
|
||||
"template": "टेम्प्लेट",
|
||||
"mark_as_sent": "भेजे गए के रूप में चिह्नित करें",
|
||||
"confirm_send_invoice": "यह आवर्ती चालान ग्राहक को ईमेल के माध्यम से भेजा जाएगा",
|
||||
"invoice_mark_as_sent": "यह आवर्ती चालान भेजा गया के रूप में चिह्नित किया जाएगा",
|
||||
"confirm_send": "यह आवर्ती चालान ग्राहक को ईमेल के माध्यम से भेजा जाएगा",
|
||||
"starts_at": "आरंभ करने की तिथि",
|
||||
"due_date": "बिल की देय तिथि",
|
||||
"record_payment": "भुगतान रिकॉर्ड करें",
|
||||
"add_new_invoice": "आवर्ती बिल फिर से भेजें",
|
||||
"update_expense": "Update Expense",
|
||||
"edit_invoice": "Edit Recurring Invoice",
|
||||
"new_invoice": "New Recurring Invoice",
|
||||
@ -659,46 +659,46 @@
|
||||
},
|
||||
"modules": {
|
||||
"buy_now": "Buy Now",
|
||||
"install": "Install",
|
||||
"price": "Price",
|
||||
"download_zip_file": "Download ZIP file",
|
||||
"unzipping_package": "Unzipping Package",
|
||||
"copying_files": "Copying Files",
|
||||
"deleting_files": "Deleting Unused files",
|
||||
"completing_installation": "Completing Installation",
|
||||
"update_failed": "Update Failed",
|
||||
"install_success": "Module has been installed successfully!",
|
||||
"customer_reviews": "Reviews",
|
||||
"license": "License",
|
||||
"faq": "FAQ",
|
||||
"monthly": "Monthly",
|
||||
"yearly": "Yearly",
|
||||
"updated": "Updated",
|
||||
"version": "Version",
|
||||
"disable": "Disable",
|
||||
"module_disabled": "Module Disabled",
|
||||
"enable": "Enable",
|
||||
"module_enabled": "Module Enabled",
|
||||
"update_to": "Update To",
|
||||
"module_updated": "Module Updated Successfully!",
|
||||
"title": "Modules",
|
||||
"module": "Module | Modules",
|
||||
"api_token": "API token",
|
||||
"invalid_api_token": "Invalid API Token.",
|
||||
"other_modules": "Other Modules",
|
||||
"view_all": "View All",
|
||||
"no_reviews_found": "There are no reviews for this module yet!",
|
||||
"module_not_purchased": "Module Not Purchased",
|
||||
"module_not_found": "Module Not Found",
|
||||
"install": "इंस्टॉल",
|
||||
"price": "मूल्य",
|
||||
"download_zip_file": "ज़िप डाउनलोड करे",
|
||||
"unzipping_package": "पैकेज खोल रहा है",
|
||||
"copying_files": "फ़ाइलें कॉपी हो रही है",
|
||||
"deleting_files": "अप्रयुक्त फाइलों को हटाना",
|
||||
"completing_installation": "स्थापना पूर्ण करना",
|
||||
"update_failed": "अद्यतनीकरण असफल रहा",
|
||||
"install_success": "मॉड्यूल सफलतापूर्वक स्थापित किया गया है!",
|
||||
"customer_reviews": "समीक्षा",
|
||||
"license": "लाइसेन्स",
|
||||
"faq": "हमेशा पूछे जाने वाले प्रश्न",
|
||||
"monthly": "महीने के",
|
||||
"yearly": "हर वर्ष",
|
||||
"updated": "अपडेट किया गया",
|
||||
"version": "वर्ज़न",
|
||||
"disable": "अक्षम करें",
|
||||
"module_disabled": "मॉड्यूल अक्षम",
|
||||
"enable": "सक्षम",
|
||||
"module_enabled": "मॉड्यूल सक्षम",
|
||||
"update_to": "अपडेट करें",
|
||||
"module_updated": "मॉड्यूल सफलतापूर्वक अपडेट किया गया!",
|
||||
"title": "मॉड्यूल",
|
||||
"module": "मॉड्यूल | मॉड्यूल",
|
||||
"api_token": "एपीआई टोकन",
|
||||
"invalid_api_token": "अमान्य एपीआई टोकन।",
|
||||
"other_modules": "अन्य मॉड्यूल",
|
||||
"view_all": "सभी को देखें",
|
||||
"no_reviews_found": "इस मॉड्युल के लिए अभी तक वहां कोई समीक्षा नहीं है!",
|
||||
"module_not_purchased": "मॉड्यूल खरीदा नहीं गया",
|
||||
"module_not_found": "मॉड्यूल नहीं मिला",
|
||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||
"last_updated": "Last Updated On",
|
||||
"connect_installation": "Connect your installation",
|
||||
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
||||
"view_module": "View Module",
|
||||
"update_available": "Update Available",
|
||||
"purchased": "Purchased",
|
||||
"installed": "Installed",
|
||||
"no_modules_installed": "No Modules Installed Yet!",
|
||||
"last_updated": "अंतिम बार अद्यतन किया गया",
|
||||
"connect_installation": "अपनी स्थापना कनेक्ट करें",
|
||||
"api_token_description": "{url} में लॉग इन करें और API टोकन दर्ज करके इस इंस्टॉलेशन को कनेक्ट करें। कनेक्शन स्थापित होने के बाद आपके खरीदे गए मॉड्यूल यहां दिखाई देंगे।",
|
||||
"view_module": "मॉड्यूल देखें",
|
||||
"update_available": "उपलब्ध अद्यतन",
|
||||
"purchased": "खरीदी",
|
||||
"installed": "इंस्टॉल हुआ।",
|
||||
"no_modules_installed": "अभी तक कोई मॉड्यूल स्थापित नहीं है!",
|
||||
"disable_warning": "All the settings for this particular will be reverted.",
|
||||
"what_you_get": "What you get"
|
||||
},
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
"settings": "Pengaturan",
|
||||
"logout": "Keluar",
|
||||
"users": "Pengguna",
|
||||
"modules": "Modules"
|
||||
"modules": "Modul"
|
||||
},
|
||||
"general": {
|
||||
"add_company": "Tambahkan Perusahaan",
|
||||
@ -93,14 +93,14 @@
|
||||
"no_note_found": "Tidak ada catatan yang ditemukan",
|
||||
"insert_note": "Sisipkan Catatan",
|
||||
"copied_pdf_url_clipboard": "URL file PDF disalin ke clipboard!",
|
||||
"copied_url_clipboard": "Copied url to clipboard!",
|
||||
"copied_url_clipboard": "Disalin ke clipboard!",
|
||||
"docs": "Dokumen",
|
||||
"do_you_wish_to_continue": "Apakah anda ingin melanjutkan?",
|
||||
"note": "Catatan",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"mark_as_default": "Mark as default"
|
||||
"pay_invoice": "Bayar tagihan",
|
||||
"login_successfully": "Login berhasil!",
|
||||
"logged_out_successfully": "Berhasil keluar",
|
||||
"mark_as_default": "Tandai sebagai default"
|
||||
},
|
||||
"dashboard": {
|
||||
"select_year": "Pilih tahun",
|
||||
@ -109,7 +109,7 @@
|
||||
"customers": "Pelanggan",
|
||||
"invoices": "Faktur",
|
||||
"estimates": "Perkiraan",
|
||||
"payments": "Payments"
|
||||
"payments": "Pembayaran"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "Penjualan",
|
||||
@ -208,10 +208,10 @@
|
||||
"new_customer": "Pelanggan Baru",
|
||||
"edit_customer": "Ubah Pelanggan",
|
||||
"basic_info": "Info dasar",
|
||||
"portal_access": "Portal Access",
|
||||
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||
"portal_access_url": "Customer Portal Login URL",
|
||||
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||
"portal_access": "Akses Portal",
|
||||
"portal_access_text": "Apakah Anda ingin mengizinkan pelanggan ini untuk masuk ke Portal Pelanggan?",
|
||||
"portal_access_url": "URL Masuk Portal Pelanggan",
|
||||
"portal_access_url_help": "Harap salin & teruskan URL yang diberikan di atas kepada pelanggan Anda untuk memberikan akses.",
|
||||
"billing_address": "Alamat Tagihan",
|
||||
"shipping_address": "Alamat Pengiriman",
|
||||
"copy_billing_address": "Menyalin dari Tagihan",
|
||||
@ -231,7 +231,7 @@
|
||||
"confirm_delete": "Anda tidak akan dapat mengembalikan pelanggan dan semua tagihan terkait. | Anda tidak akan dapat mengembalikan pelanggan dan semua Tagihan terkait, Penawaran dan Pembayaran.",
|
||||
"created_message": "Pelanggan berhasil dibuat",
|
||||
"updated_message": "Pelanggan berhasil diperbarui",
|
||||
"address_updated_message": "Address Information Updated succesfully",
|
||||
"address_updated_message": "Informasi Alamat Berhasil Diperbarui",
|
||||
"deleted_message": "Pelanggan berhasil dihapus",
|
||||
"edit_currency_not_allowed": "Ketika transaksi telah dibuat, mata uang tidak dapat dirubah."
|
||||
},
|
||||
@ -265,8 +265,8 @@
|
||||
},
|
||||
"estimates": {
|
||||
"title": "Perkiraan",
|
||||
"accept_estimate": "Accept Estimate",
|
||||
"reject_estimate": "Reject Estimate",
|
||||
"accept_estimate": "Perkiraan",
|
||||
"reject_estimate": "Tolak Perkiraan",
|
||||
"estimate": "Estimasi",
|
||||
"estimates_list": "Daftar Penawaran",
|
||||
"days": "{days} Hari",
|
||||
@ -276,7 +276,7 @@
|
||||
"paid": "Lunas",
|
||||
"unpaid": "Belum lunas",
|
||||
"customer": "PELANGGAN",
|
||||
"ref_no": "REF NO.",
|
||||
"ref_no": "NO. REF.",
|
||||
"number": "NOMOR",
|
||||
"amount_due": "Jumlah yang harus dibayar",
|
||||
"partially_paid": "Pembayaran Sebagian",
|
||||
@ -318,10 +318,10 @@
|
||||
},
|
||||
"accepted": "Diterima",
|
||||
"rejected": "Ditolak",
|
||||
"expired": "Expired",
|
||||
"expired": "Kadaluarsa",
|
||||
"sent": "Terkirim",
|
||||
"draft": "Draf",
|
||||
"viewed": "Viewed",
|
||||
"viewed": "Dilihat",
|
||||
"declined": "Ditolak",
|
||||
"new_estimate": "Penawaran Baru",
|
||||
"add_new_estimate": "Tambah Penawaran Baru",
|
||||
@ -355,14 +355,14 @@
|
||||
"select_an_item": "Ketik atau klik untuk memilih",
|
||||
"type_item_description": "Ketik Deskripsi Item (opsional)"
|
||||
},
|
||||
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||
"mark_as_default_estimate_template_description": "Jika diaktifkan, template terpilih akan secara otomatis digunakan saat pembuatan estimate baru."
|
||||
},
|
||||
"invoices": {
|
||||
"title": "Faktur",
|
||||
"download": "Download",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"download": "Unduh",
|
||||
"pay_invoice": "Bayar tagihan",
|
||||
"invoices_list": "Daftar Faktur",
|
||||
"invoice_information": "Invoice Information",
|
||||
"invoice_information": "Informasi tagihan",
|
||||
"days": "{days} Hari",
|
||||
"months": "{months} Bulan",
|
||||
"years": "{years} Tahun",
|
||||
@ -374,7 +374,7 @@
|
||||
"completed": "Selesai",
|
||||
"customer": "PELANGGAN",
|
||||
"paid_status": "STATUS PEMBAYARAN",
|
||||
"ref_no": "REF NO.",
|
||||
"ref_no": "NO. REF.",
|
||||
"number": "NOMOR",
|
||||
"amount_due": "Jumlah yang harus dibayar",
|
||||
"partially_paid": "Pembayaran Sebagian",
|
||||
@ -439,19 +439,19 @@
|
||||
"select_an_item": "Ketik atau klik untuk memilih",
|
||||
"type_item_description": "Ketik Deskripsi Item (opsional)"
|
||||
},
|
||||
"payment_attached_message": "One of the selected invoices already have a payment attached to it. Make sure to delete the attached payments first in order to go ahead with the removal",
|
||||
"confirm_delete": "You will not be able to recover this Invoice | You will not be able to recover these Invoices",
|
||||
"created_message": "Invoice created successfully",
|
||||
"updated_message": "Invoice updated successfully",
|
||||
"deleted_message": "Invoice deleted successfully | Invoices deleted successfully",
|
||||
"marked_as_sent_message": "Invoice marked as sent successfully",
|
||||
"something_went_wrong": "something went wrong",
|
||||
"invalid_due_amount_message": "Total Invoice amount cannot be less than total paid amount for this Invoice. Please update the invoice or delete the associated payments to continue.",
|
||||
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||
"payment_attached_message": "Salah satu faktur yang dipilih sudah memiliki pembayaran yang menyertainya. Pastikan untuk menghapus pembayaran terlampir terlebih dahulu untuk melanjutkan penghapusan",
|
||||
"confirm_delete": "Anda tidak akan dapat memulihkan Faktur ini | Anda tidak akan dapat memulihkan Faktur ini",
|
||||
"created_message": "Faktur berhasil dibuat",
|
||||
"updated_message": "Faktur berhasil diperbarui",
|
||||
"deleted_message": "Faktur berhasil dihapus | Faktur berhasil dihapus",
|
||||
"marked_as_sent_message": "Tandai Faktur sudah dikirim",
|
||||
"something_went_wrong": "terjadi kesalahan",
|
||||
"invalid_due_amount_message": "Jumlah Total Faktur tidak boleh kurang dari jumlah total yang dibayarkan untuk Faktur ini. Harap perbarui faktur atau hapus pembayaran terkait untuk melanjutkan.",
|
||||
"mark_as_default_invoice_template_description": "Jika diaktifkan, template terpilih akan secara otomatis digunakan saat pembuatan estimate baru."
|
||||
},
|
||||
"recurring_invoices": {
|
||||
"title": "Recurring Invoices",
|
||||
"invoices_list": "Recurring Invoices List",
|
||||
"title": "Tagihan-Tagihan Berulang",
|
||||
"invoices_list": "Daftar Faktur Berulang",
|
||||
"days": "{days} Hari",
|
||||
"months": "{months} Bulan",
|
||||
"years": "{years} Tahun",
|
||||
@ -459,61 +459,61 @@
|
||||
"paid": "Lunas",
|
||||
"unpaid": "Belum lunas",
|
||||
"viewed": "Dilihat",
|
||||
"overdue": "Overdue",
|
||||
"overdue": "Lewat jatuh tempo",
|
||||
"active": "Aktif",
|
||||
"completed": "Selesai",
|
||||
"customer": "PELANGGAN",
|
||||
"paid_status": "PAID STATUS",
|
||||
"ref_no": "REF NO.",
|
||||
"paid_status": "STATUS PEMBAYARAN",
|
||||
"ref_no": "NO. REF.",
|
||||
"number": "NOMOR",
|
||||
"amount_due": "AMOUNT DUE",
|
||||
"partially_paid": "Partially Paid",
|
||||
"amount_due": "Jumlah yang harus dibayar",
|
||||
"partially_paid": "Angsuran",
|
||||
"total": "Total",
|
||||
"discount": "Diskon",
|
||||
"sub_total": "Sub Total",
|
||||
"invoice": "Recurring Invoice | Recurring Invoices",
|
||||
"invoice_number": "Recurring Invoice Number",
|
||||
"next_invoice_date": "Next Invoice Date",
|
||||
"ref_number": "Ref Number",
|
||||
"invoice": "Faktur Berulang | Faktur Berulang",
|
||||
"invoice_number": "Nomor Faktur Berulang",
|
||||
"next_invoice_date": "Tanggal Faktur Berikutnya",
|
||||
"ref_number": "Nomor Referensi",
|
||||
"contact": "Kontak",
|
||||
"add_item": "Tambah Barang",
|
||||
"date": "Tanggal",
|
||||
"limit_by": "Limit by",
|
||||
"limit_date": "Limit Date",
|
||||
"limit_count": "Limit Count",
|
||||
"count": "Count",
|
||||
"limit_by": "Batasi oleh",
|
||||
"limit_date": "Batas Tanggal",
|
||||
"limit_count": "Batas Jumlah",
|
||||
"count": "Hitung",
|
||||
"status": "Status",
|
||||
"select_a_status": "Pilih status",
|
||||
"working": "Working",
|
||||
"on_hold": "On Hold",
|
||||
"working": "Sedang mengerjakan",
|
||||
"on_hold": "Ditangguhkan",
|
||||
"complete": "Selesai",
|
||||
"add_tax": "Tambah Pajak",
|
||||
"amount": "Jumlah",
|
||||
"action": "Aksi",
|
||||
"notes": "Catatan",
|
||||
"view": "View",
|
||||
"basic_info": "Basic Info",
|
||||
"send_invoice": "Send Recurring Invoice",
|
||||
"auto_send": "Auto Send",
|
||||
"resend_invoice": "Resend Recurring Invoice",
|
||||
"invoice_template": "Recurring Invoice Template",
|
||||
"conversion_message": "Recurring Invoice cloned successful",
|
||||
"view": "Tampilan",
|
||||
"basic_info": "Informasi dasar",
|
||||
"send_invoice": "Kirim Ulang Faktur Berulang",
|
||||
"auto_send": "Kirim Otomatis",
|
||||
"resend_invoice": "Kirim Ulang Faktur Berulang",
|
||||
"invoice_template": "Nomor Faktur Berulang",
|
||||
"conversion_message": "Faktur Berulang berhasil dikloning",
|
||||
"template": "Template",
|
||||
"mark_as_sent": "Mark as sent",
|
||||
"confirm_send_invoice": "This recurring invoice will be sent via email to the customer",
|
||||
"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",
|
||||
"mark_as_sent": "Tandai sebagai terkirim",
|
||||
"confirm_send_invoice": "Faktur berulang ini akan dikirim melalui email ke pelanggan",
|
||||
"invoice_mark_as_sent": "Faktur berulang ini akan ditandai sebagai terkirim",
|
||||
"confirm_send": "Faktur berulang ini akan dikirim melalui email ke pelanggan",
|
||||
"starts_at": "Tanggal Mulai",
|
||||
"due_date": "Invoice Due Date",
|
||||
"record_payment": "Record Payment",
|
||||
"add_new_invoice": "Add New Recurring Invoice",
|
||||
"update_expense": "Update Expense",
|
||||
"due_date": "Tanggal Jatuh Tempo Faktur",
|
||||
"record_payment": "Rekam Pembayaran",
|
||||
"add_new_invoice": "Tambahkan Faktur Berulang Baru",
|
||||
"update_expense": "Perbarui Biaya",
|
||||
"edit_invoice": "Edit Recurring Invoice",
|
||||
"new_invoice": "New Recurring Invoice",
|
||||
"send_automatically": "Send Automatically",
|
||||
"send_automatically_desc": "Enable this, if you would like to send the invoice automatically to the customer when its created.",
|
||||
"save_invoice": "Save Recurring Invoice",
|
||||
"update_invoice": "Update Recurring Invoice",
|
||||
"update_invoice": "Perbarui Faktur Berulang",
|
||||
"add_new_tax": "Tambah Pajak Baru",
|
||||
"no_invoices": "Belum ada Faktur Berulang!",
|
||||
"mark_as_rejected": "Ditandai telah ditolak",
|
||||
@ -526,7 +526,7 @@
|
||||
"cloned_successfully": "Faktur Berulang berhasil digandakan",
|
||||
"clone_invoice": "Gandakan Faktur Berulang",
|
||||
"confirm_clone": "Faktur Berulang ini akan digandakan menjadi Faktur Berulang yang baru",
|
||||
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
||||
"add_customer_email": "Tambahkan alamat email pelanggan untuk mengirimkan tagihan secara otomatis.",
|
||||
"item": {
|
||||
"title": "Judul item",
|
||||
"description": "Deskripsi",
|
||||
@ -550,19 +550,19 @@
|
||||
"month": "Bulan",
|
||||
"day_week": "Hari dalam minggu"
|
||||
},
|
||||
"confirm_delete": "You will not be able to recover this Invoice | You will not be able to recover these Invoices",
|
||||
"created_message": "Recurring Invoice created successfully",
|
||||
"updated_message": "Recurring Invoice updated successfully",
|
||||
"deleted_message": "Recurring Invoice deleted successfully | Recurring Invoices deleted successfully",
|
||||
"marked_as_sent_message": "Recurring Invoice marked as sent successfully",
|
||||
"user_email_does_not_exist": "User email does not exist",
|
||||
"something_went_wrong": "something went wrong",
|
||||
"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."
|
||||
"confirm_delete": "Anda tidak akan dapat memulihkan Faktur ini | Anda tidak akan dapat memulihkan Faktur ini",
|
||||
"created_message": "Faktur Berulang berhasil dibuat",
|
||||
"updated_message": "Faktur Berulang berhasil diperbaharui",
|
||||
"deleted_message": "Faktur Berulang berhasil dihapus | Faktur Berulang berhasil dihapus",
|
||||
"marked_as_sent_message": "Tandai Faktur Berulang sudah dikirim",
|
||||
"user_email_does_not_exist": "Email pengguna tidak ada",
|
||||
"something_went_wrong": "terjadi kesalahan",
|
||||
"invalid_due_amount_message": "Jumlah Total Faktur Berulang tidak boleh kurang dari jumlah total yang dibayarkan untuk Faktur Berulang ini. Harap perbarui faktur atau hapus pembayaran terkait untuk melanjutkan."
|
||||
},
|
||||
"payments": {
|
||||
"title": "Pembayaran",
|
||||
"payments_list": "Daftar Pembayaran",
|
||||
"record_payment": "Record Payment",
|
||||
"record_payment": "Rekam Pembayaran",
|
||||
"customer": "Pelanggan",
|
||||
"date": "Tanggal",
|
||||
"amount": "Jumlah",
|
||||
@ -573,29 +573,29 @@
|
||||
"note": "Catatan",
|
||||
"add_payment": "Tambah Pembayaran",
|
||||
"new_payment": "Pembayaran Baru",
|
||||
"edit_payment": "Edit Payment",
|
||||
"view_payment": "View Payment",
|
||||
"add_new_payment": "Add New Payment",
|
||||
"send_payment_receipt": "Send Payment Receipt",
|
||||
"send_payment": "Send Payment",
|
||||
"save_payment": "Save Payment",
|
||||
"update_payment": "Update Payment",
|
||||
"edit_payment": "Edit Pembayaran",
|
||||
"view_payment": "Lihat Pembayaran",
|
||||
"add_new_payment": "Tambahkan Pembayaran Baru",
|
||||
"send_payment_receipt": "Kirim Tanda Terima Pembayaran",
|
||||
"send_payment": "Kirim Pembayaran",
|
||||
"save_payment": "Simpan Pembayaran",
|
||||
"update_payment": "Perbaharui Pembayaran",
|
||||
"payment": "Pembayaran",
|
||||
"no_payments": "No payments yet!",
|
||||
"no_payments": "Belum ada pembayaran!",
|
||||
"not_selected": "Tidak dipilih",
|
||||
"no_invoice": "Tidak ada faktur",
|
||||
"no_matching_payments": "There are no matching payments!",
|
||||
"list_of_payments": "This section will contain the list of payments.",
|
||||
"select_payment_mode": "Select payment mode",
|
||||
"confirm_mark_as_sent": "This estimate will be marked as sent",
|
||||
"confirm_send_payment": "This payment will be sent via email to the customer",
|
||||
"send_payment_successfully": "Payment sent successfully",
|
||||
"something_went_wrong": "something went wrong",
|
||||
"confirm_delete": "You will not be able to recover this Payment | You will not be able to recover these Payments",
|
||||
"created_message": "Payment created successfully",
|
||||
"updated_message": "Payment updated successfully",
|
||||
"deleted_message": "Payment deleted successfully | Payments deleted successfully",
|
||||
"invalid_amount_message": "Payment amount is invalid"
|
||||
"no_matching_payments": "Tidak ada pembayaran yang cocok!",
|
||||
"list_of_payments": "Bagian ini akan berisi daftar pembayaran.",
|
||||
"select_payment_mode": "Pilih mode pembayaran",
|
||||
"confirm_mark_as_sent": "Penawaran ini akan ditandai telah dikirim",
|
||||
"confirm_send_payment": "Pembayaran ini akan dikirim melalui email ke pelanggan",
|
||||
"send_payment_successfully": "Pembayaran berhasil dikirim",
|
||||
"something_went_wrong": "terjadi kesalahan",
|
||||
"confirm_delete": "Anda tidak akan dapat memulihkan Pembayaran ini | Anda tidak akan dapat memulihkan Pembayaran ini",
|
||||
"created_message": "Pembayaran berhasil dibuat",
|
||||
"updated_message": "Pembayaran berhasil diperbaharui",
|
||||
"deleted_message": "Pembayaran berhasil dihapus | Pembayaran berhasil dihapus",
|
||||
"invalid_amount_message": "Jumlah pembayaran tidak valid"
|
||||
},
|
||||
"expenses": {
|
||||
"title": "Pengeluaran",
|
||||
@ -610,29 +610,29 @@
|
||||
"to_date": "Sampai Tanggal",
|
||||
"expense_date": "Tanggal",
|
||||
"description": "Deskripsi",
|
||||
"receipt": "Receipt",
|
||||
"receipt": "Tanda Terima",
|
||||
"amount": "Jumlah",
|
||||
"action": "Aksi",
|
||||
"not_selected": "Tidak dipilih",
|
||||
"note": "Catatan",
|
||||
"category_id": "Category Id",
|
||||
"category_id": "Id kategori",
|
||||
"date": "Tanggal",
|
||||
"add_expense": "Add Expense",
|
||||
"add_new_expense": "Add New Expense",
|
||||
"save_expense": "Save Expense",
|
||||
"update_expense": "Update Expense",
|
||||
"download_receipt": "Download Receipt",
|
||||
"edit_expense": "Edit Expense",
|
||||
"new_expense": "New Expense",
|
||||
"expense": "Expense | Expenses",
|
||||
"no_expenses": "No expenses yet!",
|
||||
"list_of_expenses": "This section will contain the list of expenses.",
|
||||
"confirm_delete": "You will not be able to recover this Expense | You will not be able to recover these Expenses",
|
||||
"created_message": "Expense created successfully",
|
||||
"updated_message": "Expense updated successfully",
|
||||
"deleted_message": "Expense deleted successfully | Expenses deleted successfully",
|
||||
"add_expense": "Tambahkan pengeluaran",
|
||||
"add_new_expense": "Tambah Pengeluaran Baru",
|
||||
"save_expense": "Simpan Pengeluaran",
|
||||
"update_expense": "Edit Pengeluaran",
|
||||
"download_receipt": "Unduh Tanda Terima",
|
||||
"edit_expense": "Edit Pengeluaran",
|
||||
"new_expense": "Pengeluaran Baru",
|
||||
"expense": "Biaya | Pengeluaran",
|
||||
"no_expenses": "Belum ada pengeluaran!",
|
||||
"list_of_expenses": "Bagian ini akan berisi daftar pengeluaran.",
|
||||
"confirm_delete": "Anda tidak akan dapat memulihkan Pengeluaran ini | Anda tidak akan dapat memulihkan Pengeluaran ini",
|
||||
"created_message": "Pengeluaran berhasil dibuat",
|
||||
"updated_message": "Pengeluaran berhasil diperbaharui",
|
||||
"deleted_message": "Pengeluaran berhasil dihapus | Pengeluaran berhasil dihapus",
|
||||
"categories": {
|
||||
"categories_list": "Categories List",
|
||||
"categories_list": "Daftar Kategori",
|
||||
"title": "Title",
|
||||
"name": "Name",
|
||||
"description": "Description",
|
||||
@ -694,65 +694,65 @@
|
||||
"last_updated": "Last Updated On",
|
||||
"connect_installation": "Connect your installation",
|
||||
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
||||
"view_module": "View Module",
|
||||
"update_available": "Update Available",
|
||||
"purchased": "Purchased",
|
||||
"installed": "Installed",
|
||||
"no_modules_installed": "No Modules Installed Yet!",
|
||||
"disable_warning": "All the settings for this particular will be reverted.",
|
||||
"what_you_get": "What you get"
|
||||
"view_module": "Lihat Module",
|
||||
"update_available": "Pembaruan Tersedia",
|
||||
"purchased": "Pembelian",
|
||||
"installed": "Terinstal",
|
||||
"no_modules_installed": "Belum Ada Modul yang Terpasang!",
|
||||
"disable_warning": "Semua pengaturan untuk saat ini akan dikembalikan.",
|
||||
"what_you_get": "Apa yang bisa Anda dapatkan"
|
||||
},
|
||||
"users": {
|
||||
"title": "Users",
|
||||
"users_list": "Users List",
|
||||
"name": "Name",
|
||||
"description": "Description",
|
||||
"added_on": "Added On",
|
||||
"date_of_creation": "Date Of Creation",
|
||||
"action": "Action",
|
||||
"add_user": "Add User",
|
||||
"save_user": "Save User",
|
||||
"update_user": "Update User",
|
||||
"user": "User | Users",
|
||||
"add_new_user": "Add New User",
|
||||
"new_user": "New User",
|
||||
"edit_user": "Edit User",
|
||||
"no_users": "No users yet!",
|
||||
"list_of_users": "This section will contain the list of users.",
|
||||
"title": "Pengguna",
|
||||
"users_list": "Daftar Pengguna",
|
||||
"name": "Nama",
|
||||
"description": "Deskripsi",
|
||||
"added_on": "Ditambahkan Pada",
|
||||
"date_of_creation": "Tanggal pembuatan",
|
||||
"action": "Aksi",
|
||||
"add_user": "Tambah Pengguna",
|
||||
"save_user": "Simpan Pengguna",
|
||||
"update_user": "Edit Pengguna",
|
||||
"user": "Pengguna | Pengguna",
|
||||
"add_new_user": "Tambahkan pengguna baru",
|
||||
"new_user": "Pengguna baru",
|
||||
"edit_user": "Edit Pengguna",
|
||||
"no_users": "Belum ada pengguna!",
|
||||
"list_of_users": "Bagian ini akan berisi daftar pengguna.",
|
||||
"email": "Email",
|
||||
"phone": "Telepon",
|
||||
"password": "Kata Sandi",
|
||||
"user_attached_message": "Cannot delete an item which is already in use",
|
||||
"confirm_delete": "You will not be able to recover this User | You will not be able to recover these Users",
|
||||
"created_message": "User created successfully",
|
||||
"updated_message": "User updated successfully",
|
||||
"deleted_message": "User deleted successfully | Users deleted successfully",
|
||||
"select_company_role": "Select Role for {company}",
|
||||
"companies": "Companies"
|
||||
"user_attached_message": "Tidak dapat menghapus item yang sudah digunakan",
|
||||
"confirm_delete": "Anda tidak akan dapat memulihkan Pengguna ini | Anda tidak akan dapat memulihkan Pengguna ini",
|
||||
"created_message": "Pengguna berhasil dibuat",
|
||||
"updated_message": "Pengguna berhasil diedit",
|
||||
"deleted_message": "Pengguna berhasil dihapus | Pengguna berhasil dihapus",
|
||||
"select_company_role": "Pilih Peran untuk {company}",
|
||||
"companies": "Perusahaan"
|
||||
},
|
||||
"reports": {
|
||||
"title": "Report",
|
||||
"from_date": "From Date",
|
||||
"to_date": "To Date",
|
||||
"title": "Laporan",
|
||||
"from_date": "Dari tanggal",
|
||||
"to_date": "Sampai tanggal",
|
||||
"status": "Status",
|
||||
"paid": "Paid",
|
||||
"unpaid": "Unpaid",
|
||||
"paid": "Lunas",
|
||||
"unpaid": "Belum dibayar",
|
||||
"download_pdf": "Download PDF",
|
||||
"view_pdf": "View PDF",
|
||||
"update_report": "Update Report",
|
||||
"report": "Report | Reports",
|
||||
"view_pdf": "Lihat PDF",
|
||||
"update_report": "Update Laporan",
|
||||
"report": "Laporan | Laporan",
|
||||
"profit_loss": {
|
||||
"profit_loss": "Profit & Loss",
|
||||
"to_date": "To Date",
|
||||
"from_date": "From Date",
|
||||
"date_range": "Select Date Range"
|
||||
"profit_loss": "Laba rugi",
|
||||
"to_date": "Sampai tanggal",
|
||||
"from_date": "Dari tanggal",
|
||||
"date_range": "Pilih Rentang Tanggal"
|
||||
},
|
||||
"sales": {
|
||||
"sales": "Sales",
|
||||
"date_range": "Select Date Range",
|
||||
"to_date": "To Date",
|
||||
"from_date": "From Date",
|
||||
"report_type": "Report Type"
|
||||
"sales": "Penjualan",
|
||||
"date_range": "Pilih Rentang Tanggal",
|
||||
"to_date": "Sampai tanggal",
|
||||
"from_date": "Dari tanggal",
|
||||
"report_type": "Jenis laporan"
|
||||
},
|
||||
"taxes": {
|
||||
"taxes": "Taxes",
|
||||
|
||||
@ -17,6 +17,7 @@ import sk from './sk.json'
|
||||
import vi from './vi.json'
|
||||
import el from './el.json'
|
||||
import hr from './hr.json'
|
||||
import th from './th.json'
|
||||
|
||||
export default {
|
||||
cs,
|
||||
@ -37,5 +38,6 @@ export default {
|
||||
vi,
|
||||
pl,
|
||||
el,
|
||||
hr
|
||||
hr,
|
||||
th
|
||||
}
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
"settings": "Nustatymai",
|
||||
"logout": "Atsijungti",
|
||||
"users": "Vartotojai",
|
||||
"modules": "Modules"
|
||||
"modules": "Moduliai"
|
||||
},
|
||||
"general": {
|
||||
"add_company": "Pridėti įmonę",
|
||||
@ -93,14 +93,14 @@
|
||||
"no_note_found": "Jokių žinučių nerasta",
|
||||
"insert_note": "Terpti prierašą",
|
||||
"copied_pdf_url_clipboard": "Nukopijuotas PDF url į iškarpinę!",
|
||||
"copied_url_clipboard": "Copied url to clipboard!",
|
||||
"copied_url_clipboard": "Nuoroda nukopijuota!",
|
||||
"docs": "Dokumentacija",
|
||||
"do_you_wish_to_continue": "Ar norite tęsti?",
|
||||
"note": "Užrašas",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"mark_as_default": "Mark as default"
|
||||
"pay_invoice": "Apmokėti",
|
||||
"login_successfully": "Prisijungta sėkmingai!",
|
||||
"logged_out_successfully": "Atsijungta sėkmingai",
|
||||
"mark_as_default": "Pažymėti kaip numatytąjį"
|
||||
},
|
||||
"dashboard": {
|
||||
"select_year": "Pasirinkite metus",
|
||||
@ -109,7 +109,7 @@
|
||||
"customers": "Klientai",
|
||||
"invoices": "Sąskaitos",
|
||||
"estimates": "Įverčiai",
|
||||
"payments": "Payments"
|
||||
"payments": "Mokėjimai"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "Pardavimai",
|
||||
|
||||
@ -93,14 +93,14 @@
|
||||
"no_note_found": "Geen notitie gevonden",
|
||||
"insert_note": "Notitie invoegen",
|
||||
"copied_pdf_url_clipboard": "PDF link naar klembord gekopieerd!",
|
||||
"copied_url_clipboard": "Copied url to clipboard!",
|
||||
"copied_url_clipboard": "URL naar klembord gekopieerd!",
|
||||
"docs": "Documenten",
|
||||
"do_you_wish_to_continue": "Wilt u Doorgaan?",
|
||||
"note": "Notitie",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"mark_as_default": "Mark as default"
|
||||
"pay_invoice": "Betaal factuur",
|
||||
"login_successfully": "Succesvol ingelogd!",
|
||||
"logged_out_successfully": "Succesvol afgemeld",
|
||||
"mark_as_default": "Markeren als standaard"
|
||||
},
|
||||
"dashboard": {
|
||||
"select_year": "Selecteer jaar",
|
||||
@ -109,7 +109,7 @@
|
||||
"customers": "Klanten",
|
||||
"invoices": "Facturen",
|
||||
"estimates": "Offertes",
|
||||
"payments": "Payments"
|
||||
"payments": "Betalingen"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "Verkoop",
|
||||
@ -208,10 +208,10 @@
|
||||
"new_customer": "Nieuwe klant",
|
||||
"edit_customer": "Klant bewerken",
|
||||
"basic_info": "Basis informatie",
|
||||
"portal_access": "Portal Access",
|
||||
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||
"portal_access_url": "Customer Portal Login URL",
|
||||
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||
"portal_access": "Portaaltoegang",
|
||||
"portal_access_text": "Wilt u deze klant toestaan om in te loggen op het Klantenportaal?",
|
||||
"portal_access_url": "Klantenportaal login URL",
|
||||
"portal_access_url_help": "Kopieer & stuur de bovenstaande URL door naar uw klant om toegang te geven.",
|
||||
"billing_address": "factuur adres",
|
||||
"shipping_address": "Verzendingsadres",
|
||||
"copy_billing_address": "Kopiëren van facturering",
|
||||
@ -231,7 +231,7 @@
|
||||
"confirm_delete": "Deze klant en alle gerelateerde facturen, offertes en betalingen worden permanent verwijderd. | Deze klanten en alle gerelateerde facturen, offertes en betalingen worden permanent verwijderd.",
|
||||
"created_message": "Klant succesvol aangemaakt",
|
||||
"updated_message": "Klant succesvol geüpdatet",
|
||||
"address_updated_message": "Address Information Updated succesfully",
|
||||
"address_updated_message": "Adresinformatie succesvol bijgewerkt",
|
||||
"deleted_message": "Klant succesvol verwijderd | Klanten zijn succesvol verwijderd",
|
||||
"edit_currency_not_allowed": "Kan valuta niet wijzigen zodra de transacties zijn aangemaakt."
|
||||
},
|
||||
@ -265,8 +265,8 @@
|
||||
},
|
||||
"estimates": {
|
||||
"title": "Offertes",
|
||||
"accept_estimate": "Accept Estimate",
|
||||
"reject_estimate": "Reject Estimate",
|
||||
"accept_estimate": "Offerte accepteren",
|
||||
"reject_estimate": "Offerte afwijzen",
|
||||
"estimate": "Offerte | Offertes",
|
||||
"estimates_list": "Lijst met offertes",
|
||||
"days": "{dagen} dagen",
|
||||
@ -318,10 +318,10 @@
|
||||
},
|
||||
"accepted": "Geaccepteerd",
|
||||
"rejected": "Afgewezen",
|
||||
"expired": "Expired",
|
||||
"expired": "Verlopen",
|
||||
"sent": "Verzonden",
|
||||
"draft": "Concept",
|
||||
"viewed": "Viewed",
|
||||
"viewed": "Bekeken",
|
||||
"declined": "Geweigerd",
|
||||
"new_estimate": "Nieuwe offerte",
|
||||
"add_new_estimate": "Offerte toevoegen",
|
||||
@ -355,14 +355,14 @@
|
||||
"select_an_item": "Typ of klik om een item te selecteren",
|
||||
"type_item_description": "Type Item Beschrijving (optioneel)"
|
||||
},
|
||||
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||
"mark_as_default_estimate_template_description": "Indien ingeschakeld, zal het geselecteerde sjabloon automatisch worden gekozen voor nieuwe offertes."
|
||||
},
|
||||
"invoices": {
|
||||
"title": "Facturen",
|
||||
"download": "Download",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"pay_invoice": "Betaal factuur",
|
||||
"invoices_list": "Facturenlijst",
|
||||
"invoice_information": "Invoice Information",
|
||||
"invoice_information": "Factuurgegevens",
|
||||
"days": "{dagen} dagen",
|
||||
"months": "{months} Maand",
|
||||
"years": "{jaar} jaar",
|
||||
@ -447,7 +447,7 @@
|
||||
"marked_as_sent_message": "Factuur gemarkeerd als succesvol verzonden",
|
||||
"something_went_wrong": "Er is iets fout gegaan",
|
||||
"invalid_due_amount_message": "Het totale factuurbedrag mag niet lager zijn dan het totale betaalde bedrag voor deze factuur. Werk de factuur bij of verwijder de bijbehorende betalingen om door te gaan.",
|
||||
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||
"mark_as_default_invoice_template_description": "Indien ingeschakeld, zal het geselecteerde sjabloon automatisch worden gekozen voor nieuwe offertes."
|
||||
},
|
||||
"recurring_invoices": {
|
||||
"title": "Periodieke facturen",
|
||||
@ -526,7 +526,7 @@
|
||||
"cloned_successfully": "Terugkerende factuur succesvol gekopieerd",
|
||||
"clone_invoice": "Kopieer periodieke factuur",
|
||||
"confirm_clone": "Deze periodieke factuur wordt gekopieerd naar een nieuwe periodieke factuur",
|
||||
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
||||
"add_customer_email": "Voeg een e-mailadres aan deze klant toe, zodat facturen automatisch verzonden kunnen worden.",
|
||||
"item": {
|
||||
"title": "Item titel",
|
||||
"description": "Beschrijving",
|
||||
@ -658,49 +658,49 @@
|
||||
"retype_password": "Geef nogmaals het wachtwoord"
|
||||
},
|
||||
"modules": {
|
||||
"buy_now": "Buy Now",
|
||||
"install": "Install",
|
||||
"price": "Price",
|
||||
"download_zip_file": "Download ZIP file",
|
||||
"unzipping_package": "Unzipping Package",
|
||||
"copying_files": "Copying Files",
|
||||
"deleting_files": "Deleting Unused files",
|
||||
"completing_installation": "Completing Installation",
|
||||
"update_failed": "Update Failed",
|
||||
"install_success": "Module has been installed successfully!",
|
||||
"customer_reviews": "Reviews",
|
||||
"license": "License",
|
||||
"faq": "FAQ",
|
||||
"monthly": "Monthly",
|
||||
"yearly": "Yearly",
|
||||
"updated": "Updated",
|
||||
"version": "Version",
|
||||
"disable": "Disable",
|
||||
"module_disabled": "Module Disabled",
|
||||
"enable": "Enable",
|
||||
"module_enabled": "Module Enabled",
|
||||
"update_to": "Update To",
|
||||
"module_updated": "Module Updated Successfully!",
|
||||
"buy_now": "Nu kopen",
|
||||
"install": "Installeer",
|
||||
"price": "Prijs",
|
||||
"download_zip_file": "Download ZIP-bestand",
|
||||
"unzipping_package": "Pakket uitpakken",
|
||||
"copying_files": "Bestanden kopiëren",
|
||||
"deleting_files": "Ongebruikte bestanden verwijderen",
|
||||
"completing_installation": "Installatie voltooien",
|
||||
"update_failed": "Update mislukt",
|
||||
"install_success": "Module is succesvol geïnstalleerd!",
|
||||
"customer_reviews": "Beoordelingen",
|
||||
"license": "Licentie",
|
||||
"faq": "Veelgestelde vragen",
|
||||
"monthly": "Maandelijks",
|
||||
"yearly": "Jaarlijks",
|
||||
"updated": "Bijgewerkt",
|
||||
"version": "Versie",
|
||||
"disable": "Uitschakelen",
|
||||
"module_disabled": "Module uitgeschakeld",
|
||||
"enable": "Inschakelen",
|
||||
"module_enabled": "Module ingeschakeld",
|
||||
"update_to": "Update naar",
|
||||
"module_updated": "Module succesvol bijgewerkt!",
|
||||
"title": "Modules",
|
||||
"module": "Module | Modules",
|
||||
"api_token": "API token",
|
||||
"invalid_api_token": "Invalid API Token.",
|
||||
"other_modules": "Other Modules",
|
||||
"view_all": "View All",
|
||||
"no_reviews_found": "There are no reviews for this module yet!",
|
||||
"module_not_purchased": "Module Not Purchased",
|
||||
"module_not_found": "Module Not Found",
|
||||
"api_token": "API-token",
|
||||
"invalid_api_token": "Ongeldig API-token.",
|
||||
"other_modules": "Andere modules",
|
||||
"view_all": "Toon alles",
|
||||
"no_reviews_found": "Er zijn nog geen beoordelingen voor deze module!",
|
||||
"module_not_purchased": "Module niet gekocht",
|
||||
"module_not_found": "Module niet gevonden",
|
||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||
"last_updated": "Last Updated On",
|
||||
"connect_installation": "Connect your installation",
|
||||
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
||||
"view_module": "View Module",
|
||||
"update_available": "Update Available",
|
||||
"purchased": "Purchased",
|
||||
"installed": "Installed",
|
||||
"no_modules_installed": "No Modules Installed Yet!",
|
||||
"disable_warning": "All the settings for this particular will be reverted.",
|
||||
"what_you_get": "What you get"
|
||||
"last_updated": "Laatst bijgewerkt op",
|
||||
"connect_installation": "Verbind uw installatie",
|
||||
"api_token_description": "Log in op {url} en verbind deze installatie door het API Token in te voeren. Uw gekochte modules zullen hier verschijnen nadat de verbinding is gemaakt.",
|
||||
"view_module": "Bekijk Module",
|
||||
"update_available": "Update beschikbaar",
|
||||
"purchased": "Gekocht",
|
||||
"installed": "Geïnstalleerd",
|
||||
"no_modules_installed": "Nog geen modules geïnstalleerd!",
|
||||
"disable_warning": "Alle instellingen voor dit specifiek zullen worden teruggedraaid.",
|
||||
"what_you_get": "Wat je krijgt"
|
||||
},
|
||||
"users": {
|
||||
"title": "Gebruikers",
|
||||
@ -807,10 +807,10 @@
|
||||
"payment_modes": "Betaalmethodes",
|
||||
"notes": "Opmerkingen",
|
||||
"exchange_rate": "Wisselkoers",
|
||||
"address_information": "Address Information"
|
||||
"address_information": "Adresgegevens"
|
||||
},
|
||||
"address_information": {
|
||||
"section_description": " You can update Your Address information using form below."
|
||||
"section_description": " U kunt uw adresgegevens bijwerken via het onderstaande formulier."
|
||||
},
|
||||
"title": "Instellingen",
|
||||
"setting": "Instellingen | Instellingen",
|
||||
@ -839,13 +839,13 @@
|
||||
},
|
||||
"mail": {
|
||||
"host": "Mail host",
|
||||
"port": "Mail Port",
|
||||
"port": "E-mail poort",
|
||||
"driver": "Mail-stuurprogramma",
|
||||
"secret": "Geheim",
|
||||
"mailgun_secret": "Mailgun Secret",
|
||||
"mailgun_secret": "Mailgun geheim",
|
||||
"mailgun_domain": "Domein",
|
||||
"mailgun_endpoint": "Mailgun-eindpunt",
|
||||
"ses_secret": "SES Secret",
|
||||
"ses_secret": "SES geheim",
|
||||
"ses_key": "SES-sleutel",
|
||||
"password": "Mail wachtwoord",
|
||||
"username": "Mail gebruikersnaam",
|
||||
@ -1113,7 +1113,7 @@
|
||||
"default_currency_error": "Deze valuta wordt al gebruikt in een van de Actieve Provider",
|
||||
"exchange_help_text": "Voer de wisselkoers in om te converteren van {currency} naar {baseCurrency}",
|
||||
"currency_freak": "Valuta Freak",
|
||||
"currency_layer": "Currency Layer",
|
||||
"currency_layer": "Valuta-laag",
|
||||
"open_exchange_rate": "Open Exchange Rate",
|
||||
"currency_converter": "Valuta omzetter",
|
||||
"server": "Server",
|
||||
@ -1263,7 +1263,7 @@
|
||||
"media_root": "Media schijf",
|
||||
"aws_driver": "AWS Stuurprogramma",
|
||||
"aws_key": "AWS Sleutel",
|
||||
"aws_secret": "AWS Secret",
|
||||
"aws_secret": "AWS-geheim",
|
||||
"aws_region": "AWS Regio",
|
||||
"aws_bucket": "AWS Bucket",
|
||||
"aws_root": "AWS Root",
|
||||
@ -1273,13 +1273,13 @@
|
||||
"do_spaces_region": "Do Spaces Regio",
|
||||
"do_spaces_bucket": "Do Spaces Bucket",
|
||||
"do_spaces_endpoint": "Do Spaces Endpoint",
|
||||
"do_spaces_root": "Do Spaces Root",
|
||||
"do_spaces_root": "Do Spaces hoofdmap",
|
||||
"dropbox_type": "Dropbox Type",
|
||||
"dropbox_token": "Dropbox Token",
|
||||
"dropbox_key": "Dropbox Key",
|
||||
"dropbox_secret": "Dropbox Secret",
|
||||
"dropbox_key": "Dropbox Sleutel",
|
||||
"dropbox_secret": "Dropbox Geheim",
|
||||
"dropbox_app": "Dropbox App",
|
||||
"dropbox_root": "Dropbox Root",
|
||||
"dropbox_root": "Dropbox Hoofdmap",
|
||||
"default_driver": "Standaard stuurprogramma",
|
||||
"is_default": "IS STANDAARD",
|
||||
"set_default_disk": "Standaardschijf instellen",
|
||||
@ -1301,16 +1301,16 @@
|
||||
"invalid_disk_credentials": "Ongeldige inloggegevens voor geselecteerde schijf"
|
||||
},
|
||||
"taxations": {
|
||||
"add_billing_address": "Enter Billing Address",
|
||||
"add_shipping_address": "Enter Shipping Address",
|
||||
"add_company_address": "Enter Company Address",
|
||||
"modal_description": "The information below is required in order to fetch sales tax.",
|
||||
"add_address": "Add Address for fetching sales tax.",
|
||||
"address_placeholder": "Example: 123, My Street",
|
||||
"city_placeholder": "Example: Los Angeles",
|
||||
"state_placeholder": "Example: CA",
|
||||
"zip_placeholder": "Example: 90024",
|
||||
"invalid_address": "Please provide valid address details."
|
||||
"add_billing_address": "Vul factuuradres in",
|
||||
"add_shipping_address": "Vul bezorgadres in",
|
||||
"add_company_address": "Vul bedrijfsadres in",
|
||||
"modal_description": "De onderstaande informatie is vereist om de verkoopbelasting op te halen.",
|
||||
"add_address": "Voeg adres toe voor het ophalen van verkoopbelasting.",
|
||||
"address_placeholder": "Voorbeeld: 123, Mijn Straat",
|
||||
"city_placeholder": "Voorbeeld: Amsterdam",
|
||||
"state_placeholder": "Voorbeeld: Noord-Holland",
|
||||
"zip_placeholder": "Voorbeeld: 1234 AB",
|
||||
"invalid_address": "Vul een geldig adres in a.u.b."
|
||||
}
|
||||
},
|
||||
"wizard": {
|
||||
@ -1328,7 +1328,7 @@
|
||||
"logo_preview": "Logo Voorbeeld",
|
||||
"preferences": "Voorkeuren",
|
||||
"preferences_desc": "Standaardvoorkeuren voor het systeem.",
|
||||
"currency_set_alert": "The company's currency cannot be changed later.",
|
||||
"currency_set_alert": "De valuta van het bedrijf kan later niet worden gewijzigd.",
|
||||
"country": "Land",
|
||||
"state": "Provincie",
|
||||
"city": "Stad",
|
||||
@ -1372,7 +1372,7 @@
|
||||
"app_domain": "App Domein",
|
||||
"verify_now": "Nu verifiëren",
|
||||
"success": "E-mailadres succesvol geverifieerd.",
|
||||
"failed": "Domain verification failed. Please enter valid domain name.",
|
||||
"failed": "Domeinverificatie is mislukt. Voer een geldige domeinnaam in.",
|
||||
"verify_and_continue": "Verifiëren en doorgaan"
|
||||
},
|
||||
"mail": {
|
||||
@ -1380,10 +1380,10 @@
|
||||
"port": "E-mail Poort",
|
||||
"driver": "Mail-stuurprogramma",
|
||||
"secret": "Geheim",
|
||||
"mailgun_secret": "Mailgun Secret",
|
||||
"mailgun_secret": "Mailgun geheim",
|
||||
"mailgun_domain": "Domein",
|
||||
"mailgun_endpoint": "Mailgun-eindpunt",
|
||||
"ses_secret": "SES Secret",
|
||||
"ses_secret": "SES geheim",
|
||||
"ses_key": "SES-sleutel",
|
||||
"password": "Mail wachtwoord",
|
||||
"username": "Mail gebruikersnaam",
|
||||
@ -1425,7 +1425,7 @@
|
||||
"not_yet": "Nog niet? Stuur het opnieuw",
|
||||
"password_min_length": "Wachtwoord moet {count} tekens bevatten",
|
||||
"name_min_length": "Naam moet minimaal {count} letters bevatten.",
|
||||
"prefix_min_length": "Prefix must have at least {count} letters.",
|
||||
"prefix_min_length": "Voorvoegsel moet minstens {count} letters bevatten.",
|
||||
"enter_valid_tax_rate": "Voer een geldig belastingtarief in",
|
||||
"numbers_only": "Alleen nummers.",
|
||||
"characters_only": "Alleen tekens.",
|
||||
@ -1440,7 +1440,7 @@
|
||||
"price_minvalue": "Prijs moet hoger zijn dan 0.",
|
||||
"amount_maxlength": "Bedrag mag niet groter zijn dan 20 cijfers.",
|
||||
"amount_minvalue": "Bedrag moet groter zijn dan 0.",
|
||||
"discount_maxlength": "Discount should not be greater than max discount",
|
||||
"discount_maxlength": "Korting mag niet meer zijn dan maximale korting",
|
||||
"description_maxlength": "De beschrijving mag niet meer dan 255 tekens bevatten.",
|
||||
"subject_maxlength": "Het onderwerp mag niet meer dan 100 tekens bevatten.",
|
||||
"message_maxlength": "Bericht mag niet groter zijn dan 255 tekens.",
|
||||
@ -1451,9 +1451,9 @@
|
||||
"prefix_maxlength": "Het voorvoegsel mag niet meer dan 5 tekens bevatten.",
|
||||
"something_went_wrong": "Er is iets fout gegaan",
|
||||
"number_length_minvalue": "Het getal moet groter zijn dan 0",
|
||||
"at_least_one_ability": "Please select atleast one Permission.",
|
||||
"valid_driver_key": "Please enter a valid {driver} key.",
|
||||
"valid_exchange_rate": "Please enter a valid exchange rate.",
|
||||
"at_least_one_ability": "Selecteer minstens één machtiging.",
|
||||
"valid_driver_key": "Voer een geldige {driver} sleutel in.",
|
||||
"valid_exchange_rate": "Voer a.u.b. een geldige wisselkoers in.",
|
||||
"company_name_not_same": "Bedrijfsnaam moet overeenkomen met de opgegeven naam."
|
||||
},
|
||||
"errors": {
|
||||
@ -1461,26 +1461,26 @@
|
||||
"invalid_provider_key": "Voer een geldige API-sleutel in.",
|
||||
"estimate_number_used": "Dit offertenummer is reeds in gebruik.",
|
||||
"invoice_number_used": "Dit factuurnummer is reeds in gebruik.",
|
||||
"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_attached": "Deze factuur heeft al een betaling gekoppeld. Zorg ervoor dat u de bijgevoegde betalingen eerst verwijdert om door te gaan met de verwijdering.",
|
||||
"payment_number_used": "Dit factuurnummer is reeds in gebruik.",
|
||||
"name_already_taken": "Deze naam is reeds in gebruik.",
|
||||
"receipt_does_not_exist": "Receipt does not exist.",
|
||||
"customer_cannot_be_changed_after_payment_is_added": "Customer cannot be change after payment is added",
|
||||
"receipt_does_not_exist": "Kwitantie bestaat niet.",
|
||||
"customer_cannot_be_changed_after_payment_is_added": "Klant kan niet worden gewijzigd nadat een betaling is toegevoegd",
|
||||
"invalid_credentials": "Inloggegevens ongeldig.",
|
||||
"not_allowed": "Niet toegestaan",
|
||||
"login_invalid_credentials": "Deze gegevens zijn niet correct.",
|
||||
"enter_valid_cron_format": "Please enter a valid cron format",
|
||||
"email_could_not_be_sent": "Email could not be sent to this email address.",
|
||||
"invalid_address": "Please enter a valid address.",
|
||||
"invalid_key": "Please enter valid key.",
|
||||
"invalid_state": "Please enter a valid state.",
|
||||
"invalid_city": "Please enter a valid city.",
|
||||
"invalid_postal_code": "Please enter a valid zip.",
|
||||
"invalid_format": "Please enter valid query string format.",
|
||||
"api_error": "Server not responding.",
|
||||
"feature_not_enabled": "Feature not enabled.",
|
||||
"request_limit_met": "Api request limit exceeded.",
|
||||
"address_incomplete": "Incomplete Address"
|
||||
"enter_valid_cron_format": "Voer een geldig cron-formaat in",
|
||||
"email_could_not_be_sent": "E-mail kon niet naar dit e-mailadres worden verzonden.",
|
||||
"invalid_address": "Vul een geldig adres in.",
|
||||
"invalid_key": "Vul een geldige sleutel in.",
|
||||
"invalid_state": "Vul een geldige provincie in.",
|
||||
"invalid_city": "Vul een geldige woonplaats in.",
|
||||
"invalid_postal_code": "Vul een geldige postcode in.",
|
||||
"invalid_format": "Vul een geldig query-string-formaat in.",
|
||||
"api_error": "Server reageert niet.",
|
||||
"feature_not_enabled": "Functie niet ingeschakeld.",
|
||||
"request_limit_met": "API-verzoeklimiet overschreden.",
|
||||
"address_incomplete": "Onvolledig adres"
|
||||
},
|
||||
"pdf_estimate_label": "Offerte",
|
||||
"pdf_estimate_number": "Offerte nummer",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -12,7 +12,7 @@
|
||||
"settings": "Настройки",
|
||||
"logout": "Выйти",
|
||||
"users": "Пользователи",
|
||||
"modules": "Modules"
|
||||
"modules": "Инструменты"
|
||||
},
|
||||
"general": {
|
||||
"add_company": "Добавить компанию",
|
||||
@ -29,9 +29,9 @@
|
||||
"to_date": "До даты",
|
||||
"from": "Отправитель",
|
||||
"to": "Получатель",
|
||||
"ok": "Ok",
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
"ok": "Ок",
|
||||
"yes": "Да",
|
||||
"no": "Нет",
|
||||
"sort_by": "Сортировать",
|
||||
"ascending": "По возрастанию",
|
||||
"descending": "По убыванию",
|
||||
@ -39,7 +39,7 @@
|
||||
"body": "Содержание",
|
||||
"message": "Сообщение",
|
||||
"send": "Отправить",
|
||||
"preview": "Preview",
|
||||
"preview": "Предпросмотр",
|
||||
"go_back": "Назад",
|
||||
"back_to_login": "Вернуться к логину?",
|
||||
"home": "Домой",
|
||||
@ -65,7 +65,7 @@
|
||||
"sent": "Отправлено",
|
||||
"all": "Все",
|
||||
"select_all": "Выбрать всё",
|
||||
"select_template": "Select Template",
|
||||
"select_template": "Выбрать шаблон",
|
||||
"choose_file": "Нажмите сюда чтобы выбрать файлы",
|
||||
"choose_template": "Выберите шаблон",
|
||||
"choose": "Выбор",
|
||||
@ -93,14 +93,14 @@
|
||||
"no_note_found": "Заметка не найдена",
|
||||
"insert_note": "Вставить заметку",
|
||||
"copied_pdf_url_clipboard": "Ссылка на PDF скопирована в буфер обмена!",
|
||||
"copied_url_clipboard": "Copied url to clipboard!",
|
||||
"copied_url_clipboard": "Ссылка скопирована!",
|
||||
"docs": "Docs",
|
||||
"do_you_wish_to_continue": "Do you wish to continue?",
|
||||
"do_you_wish_to_continue": "Хотите продолжить?",
|
||||
"note": "Note",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"mark_as_default": "Mark as default"
|
||||
"pay_invoice": "Оплатить счет",
|
||||
"login_successfully": "Вход выполнен!",
|
||||
"logged_out_successfully": "Вы успешно вышли",
|
||||
"mark_as_default": "Установить по умолчанию"
|
||||
},
|
||||
"dashboard": {
|
||||
"select_year": "Выберите год",
|
||||
@ -109,7 +109,7 @@
|
||||
"customers": "Клиенты",
|
||||
"invoices": "Счет-фактуры",
|
||||
"estimates": "Заказы",
|
||||
"payments": "Payments"
|
||||
"payments": "Платежи"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "Продажи",
|
||||
@ -151,27 +151,27 @@
|
||||
"no_results_found": "Ничего не найдено"
|
||||
},
|
||||
"company_switcher": {
|
||||
"label": "SWITCH COMPANY",
|
||||
"no_results_found": "No Results Found",
|
||||
"add_new_company": "Add new company",
|
||||
"new_company": "New company",
|
||||
"created_message": "Company created successfully"
|
||||
"label": "СМЕНИТЬ КОМПАНИЮ",
|
||||
"no_results_found": "Результаты не найдены",
|
||||
"add_new_company": "Добавить новую компанию",
|
||||
"new_company": "Новая компания",
|
||||
"created_message": "Компания создана успешно"
|
||||
},
|
||||
"dateRange": {
|
||||
"today": "Today",
|
||||
"this_week": "This Week",
|
||||
"this_month": "This Month",
|
||||
"this_quarter": "This Quarter",
|
||||
"this_year": "This Year",
|
||||
"previous_week": "Previous Week",
|
||||
"previous_month": "Previous Month",
|
||||
"previous_quarter": "Previous Quarter",
|
||||
"previous_year": "Previous Year",
|
||||
"custom": "Custom"
|
||||
"today": "Сегодня",
|
||||
"this_week": "На этой неделе",
|
||||
"this_month": "В этом месяце",
|
||||
"this_quarter": "Текущий квартал",
|
||||
"this_year": "В этом году",
|
||||
"previous_week": "Предыдущая неделя",
|
||||
"previous_month": "Предыдущий месяц",
|
||||
"previous_quarter": "Предыдущий квартал",
|
||||
"previous_year": "Предыдущий год",
|
||||
"custom": "Выбор"
|
||||
},
|
||||
"customers": {
|
||||
"title": "Клиенты",
|
||||
"prefix": "Prefix",
|
||||
"prefix": "Префикс",
|
||||
"add_customer": "Добавить клиента",
|
||||
"contacts_list": "Список клиентов",
|
||||
"name": "Имя",
|
||||
@ -186,9 +186,9 @@
|
||||
"phone": "Телефон",
|
||||
"website": "Сайт",
|
||||
"overview": "Обзор",
|
||||
"invoice_prefix": "Invoice Prefix",
|
||||
"invoice_prefix": "Префикс счета",
|
||||
"estimate_prefix": "Estimate Prefix",
|
||||
"payment_prefix": "Payment Prefix",
|
||||
"payment_prefix": "Префикс платежа",
|
||||
"enable_portal": "Разрешить портал",
|
||||
"country": "Страна",
|
||||
"state": "Область",
|
||||
@ -197,7 +197,7 @@
|
||||
"added_on": "Добавлено",
|
||||
"action": "Действие",
|
||||
"password": "Пароль",
|
||||
"confirm_password": "Confirm Password",
|
||||
"confirm_password": "Подтвердить пароль",
|
||||
"street_number": "Номер дома",
|
||||
"primary_currency": "Основная валюта",
|
||||
"description": "Описание",
|
||||
@ -208,10 +208,10 @@
|
||||
"new_customer": "New Клиент",
|
||||
"edit_customer": "Редактировать клиента",
|
||||
"basic_info": "Основное",
|
||||
"portal_access": "Portal Access",
|
||||
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||
"portal_access_url": "Customer Portal Login URL",
|
||||
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||
"portal_access": "Доступ к порталу",
|
||||
"portal_access_text": "Хотите ли вы разрешить данному клиенту доступ к порталу для клиентов?",
|
||||
"portal_access_url": "URL для входа на портал клиента",
|
||||
"portal_access_url_help": "Пожалуйста, скопируйте и перешлите вышеуказанный URL вашему клиенту для предоставления доступа.",
|
||||
"billing_address": "Адрес плательщика",
|
||||
"shipping_address": "Адрес доставки",
|
||||
"copy_billing_address": "Скопировать из биллинга",
|
||||
@ -231,9 +231,9 @@
|
||||
"confirm_delete": "Восстановление клиента вместе со всеми его оплатами, сметами и счетами-фактурами будет невозможно. | Восстановление клиентов вместе со всеми их оплатами, сметами и счетами-фактурами будет невозможно.",
|
||||
"created_message": "Клиент добавлен",
|
||||
"updated_message": "Клиент обновлён",
|
||||
"address_updated_message": "Address Information Updated succesfully",
|
||||
"address_updated_message": "Информация об адресе успешно обновлена",
|
||||
"deleted_message": "Клиент удалён | Клиенты удалены",
|
||||
"edit_currency_not_allowed": "Cannot change currency once transactions created."
|
||||
"edit_currency_not_allowed": "Невозможно изменить валюту после создания транзакций."
|
||||
},
|
||||
"items": {
|
||||
"title": "Товары",
|
||||
@ -265,8 +265,8 @@
|
||||
},
|
||||
"estimates": {
|
||||
"title": "Заказы",
|
||||
"accept_estimate": "Accept Estimate",
|
||||
"reject_estimate": "Reject Estimate",
|
||||
"accept_estimate": "Принять заказ",
|
||||
"reject_estimate": "Отклонить заказ",
|
||||
"estimate": "Заказ | Заказы",
|
||||
"estimates_list": "Список заказов",
|
||||
"days": "{days} дней",
|
||||
@ -318,10 +318,10 @@
|
||||
},
|
||||
"accepted": "Принято",
|
||||
"rejected": "Отклонено",
|
||||
"expired": "Expired",
|
||||
"expired": "Истёк",
|
||||
"sent": "Отправлено",
|
||||
"draft": "Черновик",
|
||||
"viewed": "Viewed",
|
||||
"viewed": "Просмотрено",
|
||||
"declined": "Отказано",
|
||||
"new_estimate": "Новый заказ",
|
||||
"add_new_estimate": "Добавить новый заказ",
|
||||
@ -355,14 +355,14 @@
|
||||
"select_an_item": "Выберите товар",
|
||||
"type_item_description": "Описание товара (необязательно)"
|
||||
},
|
||||
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||
"mark_as_default_estimate_template_description": "Если включено, выбранный шаблон будет автоматически выбираться для новых заказов."
|
||||
},
|
||||
"invoices": {
|
||||
"title": "Счет-фактуры",
|
||||
"download": "Download",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"download": "Загрузить",
|
||||
"pay_invoice": "Оплатить счет",
|
||||
"invoices_list": "Список счетов",
|
||||
"invoice_information": "Invoice Information",
|
||||
"invoice_information": "Информация о счете",
|
||||
"days": "{days} дн.",
|
||||
"months": "{months} мес.",
|
||||
"years": "{years} г.",
|
||||
@ -397,16 +397,16 @@
|
||||
"send_invoice": "Отправить счёт",
|
||||
"resend_invoice": "Повторно отправить счет",
|
||||
"invoice_template": "Шаблон счета",
|
||||
"conversion_message": "Invoice cloned successful",
|
||||
"conversion_message": "Счет успешно скопирован",
|
||||
"template": "Шаблон",
|
||||
"mark_as_sent": "Пометить как отправленное",
|
||||
"confirm_send_invoice": "Этот счет будет отправлен клиенту по электронной почте",
|
||||
"invoice_mark_as_sent": "Этот счет будет помечен как отправленный",
|
||||
"confirm_mark_as_accepted": "This invoice will be marked as Accepted",
|
||||
"confirm_mark_as_rejected": "This invoice will be marked as Rejected",
|
||||
"confirm_mark_as_accepted": "Данный счет будет помечен как принятый",
|
||||
"confirm_mark_as_rejected": "Данный счет будет помечен как отклоненный",
|
||||
"confirm_send": "Этот счет будет отправлен клиенту по электронной почте",
|
||||
"invoice_date": "Дата счета-фактуры",
|
||||
"record_payment": "Record Payment",
|
||||
"record_payment": "Добавить платёж",
|
||||
"add_new_invoice": "Добавить новый счёт",
|
||||
"update_expense": "Обновить расходы",
|
||||
"edit_invoice": "Редактировать счет-фактуру",
|
||||
@ -415,13 +415,13 @@
|
||||
"update_invoice": "Обновить счет",
|
||||
"add_new_tax": "Добавить новый налог",
|
||||
"no_invoices": "Пока нет счетов!",
|
||||
"mark_as_rejected": "Mark as rejected",
|
||||
"mark_as_accepted": "Mark as accepted",
|
||||
"mark_as_rejected": "Пометить как отклонённый",
|
||||
"mark_as_accepted": "Пометить как принятый",
|
||||
"list_of_invoices": "Этот раздел будет содержать список счетов-фактур.",
|
||||
"select_invoice": "Выберите счет",
|
||||
"no_matching_invoices": "Нет соответствующих счетов!",
|
||||
"mark_as_sent_successfully": "Счет помечен как успешно отправленный",
|
||||
"invoice_sent_successfully": "Invoice sent successfully",
|
||||
"invoice_sent_successfully": "Счет-фактура успешно отправлен",
|
||||
"cloned_successfully": "Счет успешно клонирован",
|
||||
"clone_invoice": "Клонировать счет",
|
||||
"confirm_clone": "Этот счет будет клонирован в новый счет",
|
||||
@ -439,74 +439,74 @@
|
||||
"select_an_item": "Выберите товар",
|
||||
"type_item_description": "Описание товара (необязательно)"
|
||||
},
|
||||
"payment_attached_message": "One of the selected invoices already have a payment attached to it. Make sure to delete the attached payments first in order to go ahead with the removal",
|
||||
"confirm_delete": "You will not be able to recover this Invoice | You will not be able to recover these Invoices",
|
||||
"payment_attached_message": "К одному из выбранных счетов уже прикреплен платеж. Для удаления сначала удалите прикрепленные платежи",
|
||||
"confirm_delete": "Восстановление данного счета будет невозможно | Восстановление данного счета будет невозможно",
|
||||
"created_message": "Счет-фактура успешно создан",
|
||||
"updated_message": "Счет-фактура успешно обновлен",
|
||||
"deleted_message": "Счет успешно удален | Счета успешно удалены",
|
||||
"marked_as_sent_message": "Счет помечен как успешно отправленный",
|
||||
"something_went_wrong": "что-то пошло не так",
|
||||
"invalid_due_amount_message": "Total Invoice amount cannot be less than total paid amount for this Invoice. Please update the invoice or delete the associated payments to continue.",
|
||||
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||
"invalid_due_amount_message": "Итоговая сумма счета не может быть меньше оплаченной суммы по данному счету. Пожалуйста, обновите счет или удалите связанные с ним платежи, чтобы продолжить.",
|
||||
"mark_as_default_invoice_template_description": "Если включено, выбранный шаблон будет автоматически выбираться для новых счетов."
|
||||
},
|
||||
"recurring_invoices": {
|
||||
"title": "Recurring Invoices",
|
||||
"invoices_list": "Recurring Invoices List",
|
||||
"days": "{days} Days",
|
||||
"months": "{months} Month",
|
||||
"years": "{years} Year",
|
||||
"all": "All",
|
||||
"paid": "Paid",
|
||||
"unpaid": "Unpaid",
|
||||
"viewed": "Viewed",
|
||||
"overdue": "Overdue",
|
||||
"active": "Active",
|
||||
"completed": "Completed",
|
||||
"customer": "CUSTOMER",
|
||||
"paid_status": "PAID STATUS",
|
||||
"days": "{days} Дней",
|
||||
"months": "{months} Месяц",
|
||||
"years": "{years} Год",
|
||||
"all": "Все",
|
||||
"paid": "Оплачено",
|
||||
"unpaid": "Не оплачено",
|
||||
"viewed": "Просмотрено",
|
||||
"overdue": "Просрочен",
|
||||
"active": "Активный",
|
||||
"completed": "Выполнен",
|
||||
"customer": "КЛИЕНТ",
|
||||
"paid_status": "СТАТУС ПЛАТЕЖА",
|
||||
"ref_no": "REF NO.",
|
||||
"number": "NUMBER",
|
||||
"amount_due": "AMOUNT DUE",
|
||||
"partially_paid": "Partially Paid",
|
||||
"total": "Total",
|
||||
"discount": "Discount",
|
||||
"sub_total": "Sub Total",
|
||||
"number": "НОМЕР",
|
||||
"amount_due": "К ОПЛАТЕ",
|
||||
"partially_paid": "Частично оплачен",
|
||||
"total": "Итого",
|
||||
"discount": "Скидка",
|
||||
"sub_total": "Промежуточный итог",
|
||||
"invoice": "Recurring Invoice | Recurring Invoices",
|
||||
"invoice_number": "Recurring Invoice Number",
|
||||
"next_invoice_date": "Next Invoice Date",
|
||||
"next_invoice_date": "Дата следующего счета",
|
||||
"ref_number": "Ref Number",
|
||||
"contact": "Contact",
|
||||
"add_item": "Add an Item",
|
||||
"date": "Date",
|
||||
"contact": "Контакты",
|
||||
"add_item": "Добавить элемент",
|
||||
"date": "Дата",
|
||||
"limit_by": "Limit by",
|
||||
"limit_date": "Limit Date",
|
||||
"limit_count": "Limit Count",
|
||||
"count": "Count",
|
||||
"status": "Status",
|
||||
"select_a_status": "Select a status",
|
||||
"working": "Working",
|
||||
"on_hold": "On Hold",
|
||||
"complete": "Completed",
|
||||
"add_tax": "Add Tax",
|
||||
"amount": "Amount",
|
||||
"action": "Action",
|
||||
"notes": "Notes",
|
||||
"view": "View",
|
||||
"basic_info": "Basic Info",
|
||||
"count": "Количество",
|
||||
"status": "Статус",
|
||||
"select_a_status": "Выбрать статус",
|
||||
"working": "В процессе",
|
||||
"on_hold": "На удержании",
|
||||
"complete": "Завершено",
|
||||
"add_tax": "Добавить налог",
|
||||
"amount": "Сумма",
|
||||
"action": "Действие",
|
||||
"notes": "Заметки",
|
||||
"view": "Просмотр",
|
||||
"basic_info": "Общая информация",
|
||||
"send_invoice": "Send Recurring Invoice",
|
||||
"auto_send": "Auto Send",
|
||||
"auto_send": "Автоотправка",
|
||||
"resend_invoice": "Resend Recurring Invoice",
|
||||
"invoice_template": "Recurring Invoice Template",
|
||||
"conversion_message": "Recurring Invoice cloned successful",
|
||||
"template": "Template",
|
||||
"mark_as_sent": "Mark as sent",
|
||||
"template": "Шаблон",
|
||||
"mark_as_sent": "Пометить как отправленное",
|
||||
"confirm_send_invoice": "This recurring invoice will be sent via email to the customer",
|
||||
"invoice_mark_as_sent": "This recurring invoice will be marked as sent",
|
||||
"confirm_send": "This recurring invoice will be sent via email to the customer",
|
||||
"starts_at": "Start Date",
|
||||
"due_date": "Invoice Due Date",
|
||||
"record_payment": "Record Payment",
|
||||
"add_new_invoice": "Add New Recurring Invoice",
|
||||
"starts_at": "Дата начала",
|
||||
"due_date": "Срок оплаты счёта",
|
||||
"record_payment": "Добавить платёж",
|
||||
"add_new_invoice": "Добавить новый повторяющийся счет",
|
||||
"update_expense": "Update Expense",
|
||||
"edit_invoice": "Edit Recurring Invoice",
|
||||
"new_invoice": "New Recurring Invoice",
|
||||
@ -526,14 +526,14 @@
|
||||
"cloned_successfully": "Recurring Invoice cloned successfully",
|
||||
"clone_invoice": "Clone Recurring Invoice",
|
||||
"confirm_clone": "This recurring invoice will be cloned into a new Recurring Invoice",
|
||||
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
||||
"add_customer_email": "Пожалуйста, добавьте адрес электронной почты для этого клиента, чтобы отправлять счета автоматически.",
|
||||
"item": {
|
||||
"title": "Item Title",
|
||||
"description": "Description",
|
||||
"quantity": "Quantity",
|
||||
"price": "Price",
|
||||
"discount": "Discount",
|
||||
"total": "Total",
|
||||
"title": "Название товара",
|
||||
"description": "Описание",
|
||||
"quantity": "Кол-во",
|
||||
"price": "Цена",
|
||||
"discount": "Скидка",
|
||||
"total": "Итого",
|
||||
"total_discount": "Total Discount",
|
||||
"sub_total": "Sub Total",
|
||||
"tax": "Tax",
|
||||
@ -547,22 +547,22 @@
|
||||
"minute": "Minute",
|
||||
"hour": "Hour",
|
||||
"day_month": "Day of month",
|
||||
"month": "Month",
|
||||
"day_week": "Day of week"
|
||||
"month": "Месяц",
|
||||
"day_week": "День недели"
|
||||
},
|
||||
"confirm_delete": "You will not be able to recover this Invoice | You will not be able to recover these Invoices",
|
||||
"created_message": "Recurring Invoice created successfully",
|
||||
"updated_message": "Recurring Invoice updated successfully",
|
||||
"deleted_message": "Recurring Invoice deleted successfully | Recurring Invoices deleted successfully",
|
||||
"marked_as_sent_message": "Recurring Invoice marked as sent successfully",
|
||||
"user_email_does_not_exist": "User email does not exist",
|
||||
"something_went_wrong": "something went wrong",
|
||||
"user_email_does_not_exist": "Адрес электронной почты пользователя не найден",
|
||||
"something_went_wrong": "что-то пошло не так",
|
||||
"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": {
|
||||
"title": "Платежи",
|
||||
"payments_list": "Список платежей",
|
||||
"record_payment": "Record Payment",
|
||||
"record_payment": "Добавить платёж",
|
||||
"customer": "Клиент",
|
||||
"date": "Дата",
|
||||
"amount": "Сумма",
|
||||
@ -603,7 +603,7 @@
|
||||
"select_a_customer": "Выберите клиента",
|
||||
"expense_title": "Заголовок",
|
||||
"customer": "Клиент",
|
||||
"currency": "Currency",
|
||||
"currency": "Валюта",
|
||||
"contact": "Контакт",
|
||||
"category": "Категория",
|
||||
"from_date": "От даты",
|
||||
@ -626,11 +626,11 @@
|
||||
"new_expense": "Новый расход",
|
||||
"expense": "Расход | Расходы",
|
||||
"no_expenses": "No expenses yet!",
|
||||
"list_of_expenses": "This section will contain the list of expenses.",
|
||||
"list_of_expenses": "В этом разделе будет содержаться список расходов.",
|
||||
"confirm_delete": "You will not be able to recover this Expense | You will not be able to recover these Expenses",
|
||||
"created_message": "Expense created successfully",
|
||||
"updated_message": "Expense updated successfully",
|
||||
"deleted_message": "Expense deleted successfully | Expenses deleted successfully",
|
||||
"created_message": "Расход создан успешно",
|
||||
"updated_message": "Расход успешно обновлен",
|
||||
"deleted_message": "Расход успешно удален | Расходы успешно удалены",
|
||||
"categories": {
|
||||
"categories_list": "Список категорий",
|
||||
"title": "Заголовок",
|
||||
@ -658,40 +658,40 @@
|
||||
"retype_password": "Повторите пароль"
|
||||
},
|
||||
"modules": {
|
||||
"buy_now": "Buy Now",
|
||||
"install": "Install",
|
||||
"price": "Price",
|
||||
"download_zip_file": "Download ZIP file",
|
||||
"unzipping_package": "Unzipping Package",
|
||||
"copying_files": "Copying Files",
|
||||
"deleting_files": "Deleting Unused files",
|
||||
"completing_installation": "Completing Installation",
|
||||
"update_failed": "Update Failed",
|
||||
"install_success": "Module has been installed successfully!",
|
||||
"customer_reviews": "Reviews",
|
||||
"license": "License",
|
||||
"faq": "FAQ",
|
||||
"monthly": "Monthly",
|
||||
"yearly": "Yearly",
|
||||
"updated": "Updated",
|
||||
"version": "Version",
|
||||
"disable": "Disable",
|
||||
"module_disabled": "Module Disabled",
|
||||
"enable": "Enable",
|
||||
"module_enabled": "Module Enabled",
|
||||
"update_to": "Update To",
|
||||
"module_updated": "Module Updated Successfully!",
|
||||
"title": "Modules",
|
||||
"module": "Module | Modules",
|
||||
"api_token": "API token",
|
||||
"invalid_api_token": "Invalid API Token.",
|
||||
"other_modules": "Other Modules",
|
||||
"view_all": "View All",
|
||||
"no_reviews_found": "There are no reviews for this module yet!",
|
||||
"module_not_purchased": "Module Not Purchased",
|
||||
"module_not_found": "Module Not Found",
|
||||
"buy_now": "Купить",
|
||||
"install": "Установить",
|
||||
"price": "Цена",
|
||||
"download_zip_file": "Скачать ZIP-файл",
|
||||
"unzipping_package": "Распаковка пакета",
|
||||
"copying_files": "Копирование файлов",
|
||||
"deleting_files": "Удаление неиспользуемых файлов",
|
||||
"completing_installation": "Завершение установки",
|
||||
"update_failed": "Не удалось обновить",
|
||||
"install_success": "Модуль успешно установлен!",
|
||||
"customer_reviews": "Отзывы",
|
||||
"license": "Лицензия",
|
||||
"faq": "Часто задаваемые вопросы",
|
||||
"monthly": "Ежемесячно",
|
||||
"yearly": "Ежегодно",
|
||||
"updated": "Обновлено",
|
||||
"version": "Версия",
|
||||
"disable": "Отключить",
|
||||
"module_disabled": "Модуль отключен",
|
||||
"enable": "Включить",
|
||||
"module_enabled": "Модуль включен",
|
||||
"update_to": "Обновить до",
|
||||
"module_updated": "Модуль успешно обновлен!",
|
||||
"title": "Модули",
|
||||
"module": "Модуль | Модули",
|
||||
"api_token": "API-токен",
|
||||
"invalid_api_token": "Неверный API-токен.",
|
||||
"other_modules": "Другие модули",
|
||||
"view_all": "Показать всё",
|
||||
"no_reviews_found": "Для данного модуля пока нет отзывов!",
|
||||
"module_not_purchased": "Модуль не приобретен",
|
||||
"module_not_found": "Модуль не найден",
|
||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||
"last_updated": "Last Updated On",
|
||||
"last_updated": "Последнее обновление",
|
||||
"connect_installation": "Connect your installation",
|
||||
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
||||
"view_module": "View Module",
|
||||
@ -728,7 +728,7 @@
|
||||
"updated_message": "Пользователь успешно обновлен",
|
||||
"deleted_message": "Пользователь успешно удален | Пользователи успешно удалены",
|
||||
"select_company_role": "Select Role for {company}",
|
||||
"companies": "Companies"
|
||||
"companies": "Компании"
|
||||
},
|
||||
"reports": {
|
||||
"title": "Отчёт",
|
||||
@ -872,13 +872,13 @@
|
||||
"address": "Адрес",
|
||||
"zip": "Индекс",
|
||||
"save": "Сохранить",
|
||||
"delete": "Delete",
|
||||
"delete": "Удалить",
|
||||
"updated_message": "Информация о компании успешно обновлена",
|
||||
"delete_company": "Delete Company",
|
||||
"delete_company": "Удалить компанию",
|
||||
"delete_company_description": "Once you delete your company, you will lose all the data and files associated with it permanently.",
|
||||
"are_you_absolutely_sure": "Are you absolutely sure?",
|
||||
"are_you_absolutely_sure": "Вы уверены?",
|
||||
"delete_company_modal_desc": "This action cannot be undone. This will permanently delete {company} and all of its associated data.",
|
||||
"delete_company_modal_label": "Please type {company} to confirm"
|
||||
"delete_company_modal_label": "Пожалуйста, введите {company} для подтверждения"
|
||||
},
|
||||
"custom_fields": {
|
||||
"title": "Пользовательские поля",
|
||||
@ -890,7 +890,7 @@
|
||||
"type": "Тип",
|
||||
"name": "Название",
|
||||
"slug": "Slug",
|
||||
"required": "Required",
|
||||
"required": "Обязательно для заполнения",
|
||||
"placeholder": "Placeholder",
|
||||
"help_text": "Справка",
|
||||
"default_value": "Default Value",
|
||||
@ -911,49 +911,49 @@
|
||||
"sort_in_alphabetical_order": "Sort in Alphabetical Order",
|
||||
"add_options_in_bulk": "Add options in bulk",
|
||||
"use_predefined_options": "Use Predefined Options",
|
||||
"select_custom_date": "Select Custom Date",
|
||||
"select_relative_date": "Select Relative Date",
|
||||
"ticked_by_default": "Ticked by default",
|
||||
"updated_message": "Custom Field updated successfully",
|
||||
"added_message": "Custom Field added successfully",
|
||||
"press_enter_to_add": "Press enter to add new option",
|
||||
"model_in_use": "Cannot update model for fields which are already in use.",
|
||||
"type_in_use": "Cannot update type for fields which are already in use."
|
||||
"select_custom_date": "Выберите произвольную дату",
|
||||
"select_relative_date": "Выберите относительную дату",
|
||||
"ticked_by_default": "Отмечен по умолчанию",
|
||||
"updated_message": "Пользовательское поле успешно обновлено",
|
||||
"added_message": "Пользовательское поле успешно добавлено",
|
||||
"press_enter_to_add": "Нажмите ввод для добавления новой опции",
|
||||
"model_in_use": "Невозможно обновить модель для полей, которые уже используются.",
|
||||
"type_in_use": "Невозможно обновить тип для полей, которые уже используются."
|
||||
},
|
||||
"customization": {
|
||||
"customization": "customization",
|
||||
"customization": "персонализация",
|
||||
"updated_message": "Информация о компании успешно обновлена",
|
||||
"save": "Сохранить",
|
||||
"insert_fields": "Insert Fields",
|
||||
"insert_fields": "Вставить поля",
|
||||
"learn_custom_format": "Learn how to use custom format",
|
||||
"add_new_component": "Add New Component",
|
||||
"component": "Component",
|
||||
"Parameter": "Parameter",
|
||||
"add_new_component": "Добавить компонент",
|
||||
"component": "Компонент",
|
||||
"Parameter": "Параметр",
|
||||
"series": "Series",
|
||||
"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": "Series Value",
|
||||
"delimiter": "Delimiter",
|
||||
"delimiter_description": "Single character for specifying the boundary between 2 separate components. By default its set to -",
|
||||
"delimiter_param_label": "Delimiter Value",
|
||||
"date_format": "Date Format",
|
||||
"delimiter": "Разделитель",
|
||||
"delimiter_description": "Символ для обозначения границы между двумя компонентами. По умолчанию имеет значение -",
|
||||
"delimiter_param_label": "Разделитель",
|
||||
"date_format": "Формат даты",
|
||||
"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": "Format",
|
||||
"sequence": "Sequence",
|
||||
"date_format_param_label": "Формат",
|
||||
"sequence": "Последовательность",
|
||||
"sequence_description": "Consecutive sequence of numbers across your company. You can specify the length on the given parameter.",
|
||||
"sequence_param_label": "Sequence Length",
|
||||
"sequence_param_label": "Длина последовательности",
|
||||
"customer_series": "Customer Series",
|
||||
"customer_series_description": "To set a different prefix/postfix for each customer.",
|
||||
"customer_series_description": "Установить отдельный префикс/постфикс для каждого клиента.",
|
||||
"customer_sequence": "Customer Sequence",
|
||||
"customer_sequence_description": "Consecutive sequence of numbers for each of your customer.",
|
||||
"customer_sequence_param_label": "Sequence Length",
|
||||
"random_sequence": "Random Sequence",
|
||||
"random_sequence_description": "Random alphanumeric string. You can specify the length on the given parameter.",
|
||||
"random_sequence_param_label": "Sequence Length",
|
||||
"customer_sequence_param_label": "Длина последовательности",
|
||||
"random_sequence": "Случайная последовательность",
|
||||
"random_sequence_description": "Произвольная буквенно-цифровая строка. Вы можете указать длину в качестве параметра.",
|
||||
"random_sequence_param_label": "Длина последовательности",
|
||||
"invoices": {
|
||||
"title": "Счет-фактуры",
|
||||
"invoice_number_format": "Invoice Number Format",
|
||||
"invoice_number_format": "Формат номера счета",
|
||||
"invoice_number_format_description": "Customize how your invoice number gets generated automatically when you create a new invoice.",
|
||||
"preview_invoice_number": "Preview Invoice Number",
|
||||
"preview_invoice_number": "Предосмотр номера счета",
|
||||
"due_date": "Due Date",
|
||||
"due_date_description": "Specify how due date is automatically set when you create an invoice.",
|
||||
"due_date_days": "Invoice Due after days",
|
||||
@ -969,7 +969,7 @@
|
||||
"invoice_email_attachment_setting_description": "Включите, если вы хотите отправлять счета-фактуры как вложение по электронной почте. Пожалуйста, обратите внимание, что кнопка «Просмотр счета» в письмах больше не будет отображаться, если включено.",
|
||||
"invoice_settings_updated": "Invoice Settings updated successfully",
|
||||
"retrospective_edits": "Retrospective Edits",
|
||||
"allow": "Allow",
|
||||
"allow": "Разрешить",
|
||||
"disable_on_invoice_partial_paid": "Disable after partial payment is recorded",
|
||||
"disable_on_invoice_paid": "Disable after full payment is recorded",
|
||||
"disable_on_invoice_sent": "Disable after invoice is sent",
|
||||
@ -1116,9 +1116,9 @@
|
||||
"currency_layer": "Currency Layer",
|
||||
"open_exchange_rate": "Open Exchange Rate",
|
||||
"currency_converter": "Currency Converter",
|
||||
"server": "Server",
|
||||
"url": "URL",
|
||||
"active": "Active",
|
||||
"server": "Сервер",
|
||||
"url": "URL-адрес",
|
||||
"active": "Активный",
|
||||
"currency_help_text": "This provider will only be used on above selected currencies",
|
||||
"currency_in_used": "The following currencies are already active on another provider. Please remove these currencies from selection to activate this provider again."
|
||||
},
|
||||
|
||||
1525
resources/scripts/locales/th.json
Normal file
1525
resources/scripts/locales/th.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -4,7 +4,7 @@
|
||||
"customers": "Müşteriler",
|
||||
"items": "Ürünler",
|
||||
"invoices": "Faturalar",
|
||||
"recurring-invoices": "Recurring Invoices",
|
||||
"recurring-invoices": "Tekrarlayan Faturalar",
|
||||
"expenses": "Harcamalar",
|
||||
"estimates": "Proformalar",
|
||||
"payments": "Ödemeler",
|
||||
@ -12,7 +12,7 @@
|
||||
"settings": "Ayarlar",
|
||||
"logout": "Çıkış yap",
|
||||
"users": "Kullanıcılar",
|
||||
"modules": "Modules"
|
||||
"modules": "Modüller"
|
||||
},
|
||||
"general": {
|
||||
"add_company": "Firma ekle",
|
||||
@ -29,9 +29,9 @@
|
||||
"to_date": "Bitiş tarihi",
|
||||
"from": "Gönderen",
|
||||
"to": "Alıcı",
|
||||
"ok": "Ok",
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
"ok": "Tamam",
|
||||
"yes": "Evet",
|
||||
"no": "Hayır",
|
||||
"sort_by": "Sıralama ölçütü",
|
||||
"ascending": "Artan",
|
||||
"descending": "Azalan",
|
||||
@ -39,7 +39,7 @@
|
||||
"body": "Gövde",
|
||||
"message": "Mesaj",
|
||||
"send": "Gönder",
|
||||
"preview": "Preview",
|
||||
"preview": "Ön İzleme",
|
||||
"go_back": "Geri dön",
|
||||
"back_to_login": "Giriş sayfasına dönülsün mü?",
|
||||
"home": "Ana sayfa",
|
||||
@ -65,7 +65,7 @@
|
||||
"sent": "Gönderildi",
|
||||
"all": "Tümü",
|
||||
"select_all": "Hepsini Seç",
|
||||
"select_template": "Select Template",
|
||||
"select_template": "Şablon Seçin",
|
||||
"choose_file": "Bir dosya seçmek için buraya tıklayın",
|
||||
"choose_template": "Bir şablon seçin",
|
||||
"choose": "Seç",
|
||||
@ -93,14 +93,14 @@
|
||||
"no_note_found": "Not Bulunamadı",
|
||||
"insert_note": "Not Ekle",
|
||||
"copied_pdf_url_clipboard": "PDF bağlantısı panoya kopyalandı!",
|
||||
"copied_url_clipboard": "Copied url to clipboard!",
|
||||
"docs": "Docs",
|
||||
"do_you_wish_to_continue": "Do you wish to continue?",
|
||||
"note": "Note",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"login_successfully": "Logged in successfully!",
|
||||
"logged_out_successfully": "Logged out successfully",
|
||||
"mark_as_default": "Mark as default"
|
||||
"copied_url_clipboard": "URL panoya kopyalandı!",
|
||||
"docs": "Belgeler",
|
||||
"do_you_wish_to_continue": "Devam etmek istiyor musunuz?",
|
||||
"note": "Not",
|
||||
"pay_invoice": "Fatura ödeme",
|
||||
"login_successfully": "Başarıyla giriş yapıldı!",
|
||||
"logged_out_successfully": "Başarıyla çıkış yapıldı",
|
||||
"mark_as_default": "Varsayılan olarak işaretleyin"
|
||||
},
|
||||
"dashboard": {
|
||||
"select_year": "Yılı seçin",
|
||||
@ -109,7 +109,7 @@
|
||||
"customers": "Müşteriler",
|
||||
"invoices": "Faturalar",
|
||||
"estimates": "Proformalar",
|
||||
"payments": "Payments"
|
||||
"payments": "Ödemeler"
|
||||
},
|
||||
"chart_info": {
|
||||
"total_sales": "Satışlar",
|
||||
@ -151,27 +151,27 @@
|
||||
"no_results_found": "Hiçbir sonuç bulunamadı"
|
||||
},
|
||||
"company_switcher": {
|
||||
"label": "SWITCH COMPANY",
|
||||
"no_results_found": "No Results Found",
|
||||
"add_new_company": "Add new company",
|
||||
"new_company": "New company",
|
||||
"created_message": "Company created successfully"
|
||||
"label": "ŞİRKETİ DEĞİŞTİR",
|
||||
"no_results_found": "Hiçbir sonuç bulunamadı",
|
||||
"add_new_company": "Yeni Firma Ekle",
|
||||
"new_company": "Yeni Şirket",
|
||||
"created_message": "Firma başarıyla oluşturuldu"
|
||||
},
|
||||
"dateRange": {
|
||||
"today": "Today",
|
||||
"this_week": "This Week",
|
||||
"this_month": "This Month",
|
||||
"this_quarter": "This Quarter",
|
||||
"this_year": "This Year",
|
||||
"previous_week": "Previous Week",
|
||||
"previous_month": "Previous Month",
|
||||
"previous_quarter": "Previous Quarter",
|
||||
"previous_year": "Previous Year",
|
||||
"custom": "Custom"
|
||||
"today": "Bugün",
|
||||
"this_week": "Bu Hafta",
|
||||
"this_month": "Bu Ay",
|
||||
"this_quarter": "Bu Çeyrek Yıl",
|
||||
"this_year": "Bu Yıl",
|
||||
"previous_week": "Önceki Hafta",
|
||||
"previous_month": "Önceki Ay",
|
||||
"previous_quarter": "Önceki Çeyrek Yıl",
|
||||
"previous_year": "Önceki Yıl",
|
||||
"custom": "Özel"
|
||||
},
|
||||
"customers": {
|
||||
"title": "Müşteriler",
|
||||
"prefix": "Prefix",
|
||||
"prefix": "Ön ek",
|
||||
"add_customer": "Müşteri ekle",
|
||||
"contacts_list": "Müşteri listesi",
|
||||
"name": "İsim",
|
||||
@ -186,9 +186,9 @@
|
||||
"phone": "Telefon",
|
||||
"website": "Web sitesi",
|
||||
"overview": "Özet",
|
||||
"invoice_prefix": "Invoice Prefix",
|
||||
"estimate_prefix": "Estimate Prefix",
|
||||
"payment_prefix": "Payment Prefix",
|
||||
"invoice_prefix": "Fatura Öneki",
|
||||
"estimate_prefix": "Proforma Öneki",
|
||||
"payment_prefix": "Ödeme öneki",
|
||||
"enable_portal": "Portalı etkinleştir",
|
||||
"country": "Ülke",
|
||||
"state": "İl",
|
||||
@ -197,7 +197,7 @@
|
||||
"added_on": "Eklenme tarihi",
|
||||
"action": "Eylem",
|
||||
"password": "Parola",
|
||||
"confirm_password": "Confirm Password",
|
||||
"confirm_password": "Parolayı Doğrula",
|
||||
"street_number": "Sokak ve numara",
|
||||
"primary_currency": "Ana para birimi",
|
||||
"description": "Açıklama",
|
||||
@ -208,10 +208,10 @@
|
||||
"new_customer": "Yeni müşteri",
|
||||
"edit_customer": "Müşteriyi düzenle",
|
||||
"basic_info": "Temel bilgiler",
|
||||
"portal_access": "Portal Access",
|
||||
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||
"portal_access_url": "Customer Portal Login URL",
|
||||
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||
"portal_access": "Portal Erişimi",
|
||||
"portal_access_text": "Bu müşterinin Müşteri Portalı'na giriş yapmasına izin vermek ister misiniz?",
|
||||
"portal_access_url": "Müşteri Portal Giriş URL'si",
|
||||
"portal_access_url_help": "Erişim sağlamak için lütfen yukarıda verilen URL'yi kopyalayıp müşterinize iletin.",
|
||||
"billing_address": "Fatura Adresi",
|
||||
"shipping_address": "Teslimat Adresi",
|
||||
"copy_billing_address": "Faturadan Kopyala",
|
||||
@ -231,9 +231,9 @@
|
||||
"confirm_delete": "Bu müşteri ve ilgili tüm Fatura, Proformalar ve ödemeleri geri getiremeyeceksiniz. | Bu müşteriler ve ilgili tüm Fatura, Proformalar ve ödemeleri geri getiremeyeceksiniz.",
|
||||
"created_message": "Müşteri başarıyla oluşturuldu",
|
||||
"updated_message": "Müşteri başarıyla güncellendi",
|
||||
"address_updated_message": "Address Information Updated succesfully",
|
||||
"address_updated_message": "Adres Bilgileri başarıyla güncellendi",
|
||||
"deleted_message": "Müşteri başarıyla silindi | Müşteriler başarıyla silindi",
|
||||
"edit_currency_not_allowed": "Cannot change currency once transactions created."
|
||||
"edit_currency_not_allowed": "İşlemler oluşturulduktan sonra para birimi değiştirilemez."
|
||||
},
|
||||
"items": {
|
||||
"title": "Öğeler",
|
||||
@ -265,8 +265,8 @@
|
||||
},
|
||||
"estimates": {
|
||||
"title": "Proformalar",
|
||||
"accept_estimate": "Accept Estimate",
|
||||
"reject_estimate": "Reject Estimate",
|
||||
"accept_estimate": "Proformayı Onayla",
|
||||
"reject_estimate": "Proformayı Reddet",
|
||||
"estimate": "Proforma | Proformalar",
|
||||
"estimates_list": "Proforma Listesi",
|
||||
"days": "{days} Günler",
|
||||
@ -318,10 +318,10 @@
|
||||
},
|
||||
"accepted": "Onaylandı",
|
||||
"rejected": "Reddedildi",
|
||||
"expired": "Expired",
|
||||
"expired": "Süresi dolmuş",
|
||||
"sent": "Gönderildi",
|
||||
"draft": "Taslak",
|
||||
"viewed": "Viewed",
|
||||
"viewed": "Görüldü",
|
||||
"declined": "Reddedildi",
|
||||
"new_estimate": "Yeni proforma",
|
||||
"add_new_estimate": "Yeni proforma ekle",
|
||||
@ -355,14 +355,14 @@
|
||||
"select_an_item": "Ürün seçmek için yazın ya da tıklayın",
|
||||
"type_item_description": "Ürün açıklaması ekleyin (isteğe bağlı)"
|
||||
},
|
||||
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||
"mark_as_default_estimate_template_description": "Etkinleştirilirse, seçilen şablon yeni proformalar için otomatik olarak seçilecektir."
|
||||
},
|
||||
"invoices": {
|
||||
"title": "Faturalar",
|
||||
"download": "Download",
|
||||
"pay_invoice": "Pay Invoice",
|
||||
"download": "İndir",
|
||||
"pay_invoice": "Fatura Ödeme",
|
||||
"invoices_list": "Fatura Listesi",
|
||||
"invoice_information": "Invoice Information",
|
||||
"invoice_information": "Fatura Bilgileri",
|
||||
"days": "{days} Günler",
|
||||
"months": "{months} Ay",
|
||||
"years": "{years} Yıl",
|
||||
@ -397,13 +397,13 @@
|
||||
"send_invoice": "Faturayı gönder",
|
||||
"resend_invoice": "Faturayı tekrar gönder",
|
||||
"invoice_template": "Fatura şablonu",
|
||||
"conversion_message": "Invoice cloned successful",
|
||||
"conversion_message": "Fatura başarıyla klonlandı",
|
||||
"template": "Şablon",
|
||||
"mark_as_sent": "Gönderildi olarak işaretle",
|
||||
"confirm_send_invoice": "Bu fatura müşteriye e-posta ile gönderilecek",
|
||||
"invoice_mark_as_sent": "Bu fatura gönderildi olarak işaretlenecek",
|
||||
"confirm_mark_as_accepted": "This invoice will be marked as Accepted",
|
||||
"confirm_mark_as_rejected": "This invoice will be marked as Rejected",
|
||||
"confirm_mark_as_accepted": "Bu fatura Kabul edildi olarak işaretlenecek",
|
||||
"confirm_mark_as_rejected": "Bu fatura Reddedildi olarak işaretlenecek",
|
||||
"confirm_send": "Bu fatura müşteriye e-posta ile gönderilecek",
|
||||
"invoice_date": "Fatura tarihi",
|
||||
"record_payment": "Ödeme ekle",
|
||||
@ -415,13 +415,13 @@
|
||||
"update_invoice": "Faturayı güncelle",
|
||||
"add_new_tax": "Yeni vergi ekle",
|
||||
"no_invoices": "Henüz fatura yok!",
|
||||
"mark_as_rejected": "Mark as rejected",
|
||||
"mark_as_accepted": "Mark as accepted",
|
||||
"mark_as_rejected": "Reddedildi olarak işaretle",
|
||||
"mark_as_accepted": "Kabul edildi olarak işaretle",
|
||||
"list_of_invoices": "Bu bölümde faturaların listesi bulunmaktadır.",
|
||||
"select_invoice": "Faturayı seç",
|
||||
"no_matching_invoices": "Eşleşen fatura yok!",
|
||||
"mark_as_sent_successfully": "Fatura başarıyla gönderildi olarak işaretlendi",
|
||||
"invoice_sent_successfully": "Invoice sent successfully",
|
||||
"invoice_sent_successfully": "Fatura başarıyla gönderildi",
|
||||
"cloned_successfully": "Fatura başarıyla klonlandı",
|
||||
"clone_invoice": "Faturayı klonla",
|
||||
"confirm_clone": "Bu fatura yeni bir fatura olarak klonlanacak",
|
||||
@ -447,40 +447,40 @@
|
||||
"marked_as_sent_message": "Fatura başarıyla gönderildi olarak işaretlendi",
|
||||
"something_went_wrong": "bir şeyler ters gitti",
|
||||
"invalid_due_amount_message": "Toplam Fatura bedeli bu fatura için olan toplam ödemeden az olamaz. Lütfen devam etmek için faturayı güncelleyin veya ilişkili ödemeyi silin.",
|
||||
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||
"mark_as_default_invoice_template_description": "Etkinleştirilirse, seçilen şablon yeni faturalar için otomatik olarak seçilecektir."
|
||||
},
|
||||
"recurring_invoices": {
|
||||
"title": "Recurring Invoices",
|
||||
"invoices_list": "Recurring Invoices List",
|
||||
"days": "{days} Days",
|
||||
"months": "{months} Month",
|
||||
"years": "{years} Year",
|
||||
"all": "All",
|
||||
"paid": "Paid",
|
||||
"unpaid": "Unpaid",
|
||||
"viewed": "Viewed",
|
||||
"overdue": "Overdue",
|
||||
"active": "Active",
|
||||
"completed": "Completed",
|
||||
"customer": "CUSTOMER",
|
||||
"paid_status": "PAID STATUS",
|
||||
"title": "Tekrarlayan Faturalar",
|
||||
"invoices_list": "Tekrarlayan Fatura Listesi",
|
||||
"days": "{days} Günler",
|
||||
"months": "{months} Ay",
|
||||
"years": "{years} Yıl",
|
||||
"all": "Tümü",
|
||||
"paid": "Ödendi",
|
||||
"unpaid": "Ödenmedi",
|
||||
"viewed": "Görüldü",
|
||||
"overdue": "Vadesi geçmiş",
|
||||
"active": "Aktif",
|
||||
"completed": "Tamamlandı",
|
||||
"customer": "MÜŞTERİ",
|
||||
"paid_status": "ÖDEME DURUMU",
|
||||
"ref_no": "REF NO.",
|
||||
"number": "NUMBER",
|
||||
"amount_due": "AMOUNT DUE",
|
||||
"partially_paid": "Partially Paid",
|
||||
"total": "Total",
|
||||
"discount": "Discount",
|
||||
"sub_total": "Sub Total",
|
||||
"invoice": "Recurring Invoice | Recurring Invoices",
|
||||
"invoice_number": "Recurring Invoice Number",
|
||||
"next_invoice_date": "Next Invoice Date",
|
||||
"ref_number": "Ref Number",
|
||||
"contact": "Contact",
|
||||
"add_item": "Add an Item",
|
||||
"date": "Date",
|
||||
"limit_by": "Limit by",
|
||||
"limit_date": "Limit Date",
|
||||
"limit_count": "Limit Count",
|
||||
"number": "SAYI",
|
||||
"amount_due": "ALACAK MİKTARI",
|
||||
"partially_paid": "Kısmen Ödendi",
|
||||
"total": "Toplam",
|
||||
"discount": "İskonto",
|
||||
"sub_total": "Ara Toplam",
|
||||
"invoice": "Yinelenen Fatura | Yinelenen Faturalar",
|
||||
"invoice_number": "Yinelenen Fatura Numarası",
|
||||
"next_invoice_date": "Sonraki Fatura Tarihi",
|
||||
"ref_number": "Ref. Numarası",
|
||||
"contact": "İletişim",
|
||||
"add_item": "Öğe ekle",
|
||||
"date": "Tarih",
|
||||
"limit_by": "Şuna göre sınırla",
|
||||
"limit_date": "Sınır Tarihi",
|
||||
"limit_count": "Sınır Sayısı",
|
||||
"count": "Count",
|
||||
"status": "Status",
|
||||
"select_a_status": "Select a status",
|
||||
@ -490,24 +490,24 @@
|
||||
"add_tax": "Add Tax",
|
||||
"amount": "Amount",
|
||||
"action": "Action",
|
||||
"notes": "Notes",
|
||||
"view": "View",
|
||||
"basic_info": "Basic Info",
|
||||
"send_invoice": "Send Recurring Invoice",
|
||||
"auto_send": "Auto Send",
|
||||
"resend_invoice": "Resend Recurring Invoice",
|
||||
"invoice_template": "Recurring Invoice Template",
|
||||
"conversion_message": "Recurring Invoice cloned successful",
|
||||
"template": "Template",
|
||||
"mark_as_sent": "Mark as sent",
|
||||
"confirm_send_invoice": "This recurring invoice will be sent via email to the customer",
|
||||
"invoice_mark_as_sent": "This recurring invoice will be marked as sent",
|
||||
"confirm_send": "This recurring invoice will be sent via email to the customer",
|
||||
"starts_at": "Start Date",
|
||||
"due_date": "Invoice Due Date",
|
||||
"record_payment": "Record Payment",
|
||||
"add_new_invoice": "Add New Recurring Invoice",
|
||||
"update_expense": "Update Expense",
|
||||
"notes": "Notlar",
|
||||
"view": "Görüntüle",
|
||||
"basic_info": "Temel Bilgiler",
|
||||
"send_invoice": "Yinelenen Fatura Gönder",
|
||||
"auto_send": "Otamatik Gönder",
|
||||
"resend_invoice": "Yinelenen Fatura Gönder",
|
||||
"invoice_template": "Yinelenen Fatura Şablonu",
|
||||
"conversion_message": "Yinelenen Fatura başarılı bir şekilde klonlandı",
|
||||
"template": "Şablon",
|
||||
"mark_as_sent": "Gönderildi olarak işaretle",
|
||||
"confirm_send_invoice": "Bu yineleyen fatura müşteriye e-posta ile gönderilecek",
|
||||
"invoice_mark_as_sent": "Bu yineleyen fatura gönderildi olarak işaretlenecek",
|
||||
"confirm_send": "Bu yinelenen fatura müşteriye e-posta yoluyla gönderilecektir",
|
||||
"starts_at": "Başlangıç Tarihi",
|
||||
"due_date": "Fatura Ödeme Tarihi",
|
||||
"record_payment": "Ödemeyi Kaydet",
|
||||
"add_new_invoice": "Yinelenen Yeni Fatura Oluştur",
|
||||
"update_expense": "Masrafı Güncelle",
|
||||
"edit_invoice": "Edit Recurring Invoice",
|
||||
"new_invoice": "New Recurring Invoice",
|
||||
"send_automatically": "Send Automatically",
|
||||
|
||||
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() }}">
|
||||
|
||||
<!-- 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 }}">
|
||||
@endforeach
|
||||
|
||||
@ -25,8 +25,8 @@
|
||||
</head>
|
||||
|
||||
<body
|
||||
class="h-full overflow-hidden bg-gray-100 font-base
|
||||
@if(isset($current_theme)) theme-{{ $current_theme }} @else theme-{{get_app_setting('admin_portal_theme') ?? 'crater'}} @endif ">
|
||||
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 ">
|
||||
|
||||
<!-- Module Scripts -->
|
||||
@foreach (\Crater\Services\Module\ModuleFacade::allScripts() as $name => $path)
|
||||
@ -38,6 +38,14 @@
|
||||
@endforeach
|
||||
|
||||
<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))
|
||||
|
||||
window.customer_logo = "/storage/{{$customer_logo}}"
|
||||
@ -57,12 +65,12 @@
|
||||
|
||||
window.login_page_description = "{{$login_page_description}}"
|
||||
|
||||
@endif
|
||||
@endif
|
||||
@if(isset($copyright_text))
|
||||
|
||||
window.copyright_text = "{{$copyright_text}}"
|
||||
|
||||
@endif
|
||||
@endif
|
||||
|
||||
window.Crater.start()
|
||||
</script>
|
||||
|
||||
@ -386,6 +386,10 @@
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@if (App::isLocale('th'))
|
||||
@include('app.pdf.locale.th')
|
||||
@endif
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@ -408,6 +408,10 @@
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@if (App::isLocale('th'))
|
||||
@include('app.pdf.locale.th')
|
||||
@endif
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@ -346,6 +346,10 @@
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@if (App::isLocale('th'))
|
||||
@include('app.pdf.locale.th')
|
||||
@endif
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@ -15,7 +15,6 @@
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
margin-top: 50px;
|
||||
|
||||
}
|
||||
|
||||
.text-center {
|
||||
@ -36,7 +35,6 @@
|
||||
left: 0px;
|
||||
width: 100%;
|
||||
margin-left: 0%;
|
||||
|
||||
}
|
||||
|
||||
.header-container {
|
||||
@ -52,12 +50,6 @@
|
||||
padding-bottom: 20px;
|
||||
text-transform: capitalize;
|
||||
color: #817AE3;
|
||||
|
||||
}
|
||||
|
||||
.header {
|
||||
font-size: 20px;
|
||||
color: rgba(0, 0, 0, 0.7);
|
||||
}
|
||||
|
||||
.content-wrapper {
|
||||
@ -335,6 +327,10 @@
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@if (App::isLocale('th'))
|
||||
@include('app.pdf.locale.th')
|
||||
@endif
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@ -377,6 +377,10 @@
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@if (App::isLocale('th'))
|
||||
@include('app.pdf.locale.th')
|
||||
@endif
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>@lang('pdf_invoice_label') - {{$invoice->invoice_number}}</title>
|
||||
<title>@lang('pdf_invoice_label') - {{ $invoice->invoice_number }}</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<style type="text/css">
|
||||
@ -187,7 +187,7 @@
|
||||
|
||||
|
||||
.total-display-table {
|
||||
border-top: none;
|
||||
border-top: none;
|
||||
page-break-inside: avoid;
|
||||
page-break-before: auto;
|
||||
page-break-after: auto;
|
||||
@ -304,7 +304,12 @@
|
||||
.pl-0 {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@if (App::isLocale('th'))
|
||||
@include('app.pdf.locale.th')
|
||||
@endif
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@ -312,10 +317,10 @@
|
||||
<table width="100%">
|
||||
<tr>
|
||||
<td width="50%" class="header-section-left">
|
||||
@if($logo)
|
||||
<img class="header-logo" style="height: 50px;" src="{{ $logo }}" alt="Company Logo">
|
||||
@if ($logo)
|
||||
<img class="header-logo" style="height: 50px;" src="{{ $logo }}" alt="Company Logo">
|
||||
@else
|
||||
<h1 class="header-logo"> {{$invoice->customer->company->name}} </h1>
|
||||
<h1 class="header-logo"> {{ $invoice->customer->company->name }} </h1>
|
||||
@endif
|
||||
</td>
|
||||
<td width="50%" class="text-right company-address-container company-address">
|
||||
@ -331,14 +336,14 @@
|
||||
<div class="main-content">
|
||||
<div class="customer-address-container">
|
||||
<div class="billing-address-container billing-address">
|
||||
@if($billing_address)
|
||||
@if ($billing_address)
|
||||
<b>@lang('pdf_bill_to')</b> <br>
|
||||
{!! $billing_address !!}
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div @if($billing_address !== '</br>') class="shipping-address-container shipping-address" @else class="shipping-address-container--left shipping-address" @endif>
|
||||
@if($shipping_address)
|
||||
<div @if ($billing_address !== '</br>') class="shipping-address-container shipping-address" @else class="shipping-address-container--left shipping-address" @endif>
|
||||
@if ($shipping_address)
|
||||
<b>@lang('pdf_ship_to')</b> <br>
|
||||
{!! $shipping_address !!}
|
||||
@endif
|
||||
@ -350,15 +355,15 @@
|
||||
<table>
|
||||
<tr>
|
||||
<td class="attribute-label">@lang('pdf_invoice_number')</td>
|
||||
<td class="attribute-value"> {{$invoice->invoice_number}}</td>
|
||||
<td class="attribute-value"> {{ $invoice->invoice_number }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="attribute-label">@lang('pdf_invoice_date')</td>
|
||||
<td class="attribute-value"> {{$invoice->formattedInvoiceDate}}</td>
|
||||
<td class="attribute-value"> {{ $invoice->formattedInvoiceDate }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="attribute-label">@lang('pdf_invoice_due_date')</td>
|
||||
<td class="attribute-value"> {{$invoice->formattedDueDate}}</td>
|
||||
<td class="attribute-value"> {{ $invoice->formattedDueDate }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
@ -368,7 +373,7 @@
|
||||
@include('app.pdf.invoice.partials.table')
|
||||
|
||||
<div class="notes">
|
||||
@if($notes)
|
||||
@if ($notes)
|
||||
<div class="notes-label">
|
||||
@lang('pdf_notes')
|
||||
</div>
|
||||
|
||||
34
resources/views/app/pdf/locale/th.blade.php
Normal file
34
resources/views/app/pdf/locale/th.blade.php
Normal file
@ -0,0 +1,34 @@
|
||||
<style type="text/css">
|
||||
@font-face {
|
||||
font-family: 'THSarabunNew';
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
src: url("{{ resource_path('static/fonts/THSarabunNew.ttf') }}") format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'THSarabunNew';
|
||||
font-style: normal;
|
||||
font-weight: bold;
|
||||
src: url("{{ resource_path('static/fonts/THSarabunNew-Bold.ttf') }}") format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'THSarabunNew';
|
||||
font-style: italic;
|
||||
font-weight: normal;
|
||||
src: url("{{ resource_path('static/fonts/THSarabunNew-Italic.ttf') }}") format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'THSarabunNew';
|
||||
font-style: italic;
|
||||
font-weight: bold;
|
||||
src: url("{{ resource_path('static/fonts/THSarabunNew-BoldItalic.ttf') }}") format('truetype');
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: "THSarabunNew", sans-serif !important;
|
||||
}
|
||||
|
||||
</style>
|
||||
@ -276,6 +276,10 @@
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@if (App::isLocale('th'))
|
||||
@include('app.pdf.locale.th')
|
||||
@endif
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<title>@lang('pdf_expense_report_label')</title>
|
||||
<style type="text/css">
|
||||
@ -11,7 +12,7 @@
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.sub-container{
|
||||
.sub-container {
|
||||
padding: 0px 20px;
|
||||
}
|
||||
|
||||
@ -133,7 +134,12 @@
|
||||
color: #5851D8;
|
||||
}
|
||||
</style>
|
||||
|
||||
@if (App::isLocale('th'))
|
||||
@include('app.pdf.locale.th')
|
||||
@endif
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="sub-container">
|
||||
<table class="report-header">
|
||||
@ -155,18 +161,18 @@
|
||||
<div class="expenses-table-container">
|
||||
<table class="expenses-table">
|
||||
@foreach ($expenseCategories as $expenseCategory)
|
||||
<tr>
|
||||
<td>
|
||||
<p class="expense-title">
|
||||
{{ $expenseCategory->category->name }}
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p class="expense-amount">
|
||||
{!! format_money_pdf($expenseCategory->total_amount) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p class="expense-title">
|
||||
{{ $expenseCategory->category->name }}
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p class="expense-amount">
|
||||
{!! format_money_pdf($expenseCategory->total_amount, $currency) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</table>
|
||||
</div>
|
||||
@ -175,7 +181,7 @@
|
||||
<table class="expense-total-table">
|
||||
<tr>
|
||||
<td class="expense-total-cell">
|
||||
<p class="expense-total">{!! format_money_pdf($totalExpense) !!}</p>
|
||||
<p class="expense-total">{!! format_money_pdf($totalExpense, $currency) !!}</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@ -185,9 +191,10 @@
|
||||
<p class="report-footer-label">@lang('pdf_total_expenses_label')</p>
|
||||
</td>
|
||||
<td>
|
||||
<p class="report-footer-value">{!! format_money_pdf($totalExpense) !!}</p>
|
||||
<p class="report-footer-value">{!! format_money_pdf($totalExpense, $currency) !!}</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
</html>
|
||||
@ -1,5 +1,6 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<title>@lang('pdf_profit_loss_label')</title>
|
||||
<style type="text/css">
|
||||
@ -11,7 +12,7 @@
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.sub-container{
|
||||
.sub-container {
|
||||
padding: 0px 20px;
|
||||
}
|
||||
|
||||
@ -158,7 +159,12 @@
|
||||
color: #5851D8;
|
||||
}
|
||||
</style>
|
||||
|
||||
@if (App::isLocale('th'))
|
||||
@include('app.pdf.locale.th')
|
||||
@endif
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="sub-container">
|
||||
<table class="report-header">
|
||||
@ -183,7 +189,7 @@
|
||||
<p class="income-title">@lang("pdf_income_label")</p>
|
||||
</td>
|
||||
<td>
|
||||
<p class="income-amount">{!! format_money_pdf($income) !!}</p>
|
||||
<p class="income-amount">{!! format_money_pdf($income, $currency) !!}</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@ -191,18 +197,18 @@
|
||||
<div class="expenses-table-container">
|
||||
<table class="expenses-table">
|
||||
@foreach ($expenseCategories as $expenseCategory)
|
||||
<tr>
|
||||
<td>
|
||||
<p class="expense-title">
|
||||
{{ $expenseCategory->category->name }}
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p class="expense-amount">
|
||||
{!! format_money_pdf($expenseCategory->total_amount) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p class="expense-title">
|
||||
{{ $expenseCategory->category->name }}
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p class="expense-amount">
|
||||
{!! format_money_pdf($expenseCategory->total_amount, $currency) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
|
||||
</table>
|
||||
@ -212,7 +218,7 @@
|
||||
<table class="expense-total-indicator-table">
|
||||
<tr>
|
||||
<td class="expense-total-cell">
|
||||
<p class="expense-total">{!! format_money_pdf($totalExpense) !!}</p>
|
||||
<p class="expense-total">{!! format_money_pdf($totalExpense, $currency) !!}</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@ -222,9 +228,10 @@
|
||||
<p class="report-footer-label">@lang("pdf_net_profit_label")</p>
|
||||
</td>
|
||||
<td>
|
||||
<p class="report-footer-value">{!! format_money_pdf(($income-$totalExpense)) !!}</p>
|
||||
<p class="report-footer-value">{!! format_money_pdf($income - $totalExpense, $currency) !!}</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
</html>
|
||||
@ -1,5 +1,6 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<title>@lang('pdf_sales_customers_label')</title>
|
||||
<style type="text/css">
|
||||
@ -11,7 +12,7 @@
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.sub-container{
|
||||
.sub-container {
|
||||
padding: 0px 20px;
|
||||
}
|
||||
|
||||
@ -132,11 +133,17 @@
|
||||
line-height: 21px;
|
||||
color: #5851D8;
|
||||
}
|
||||
|
||||
.text-center {
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
|
||||
@if (App::isLocale('th'))
|
||||
@include('app.pdf.locale.th')
|
||||
@endif
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="sub-container">
|
||||
<table class="report-header">
|
||||
@ -156,34 +163,34 @@
|
||||
</table>
|
||||
|
||||
@foreach ($customers as $customer)
|
||||
<p class="sales-customer-name">{{ $customer->name }}</p>
|
||||
<div class="sales-table-container">
|
||||
<table class="sales-table">
|
||||
@foreach ($customer->invoices as $invoice)
|
||||
<tr>
|
||||
<td>
|
||||
<p class="sales-information-text">
|
||||
{{ $invoice->formattedInvoiceDate }} ({{ $invoice->invoice_number }})
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p class="sales-amount">
|
||||
{!! format_money_pdf($invoice->base_total) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</table>
|
||||
</div>
|
||||
<table class="sales-total-indicator-table">
|
||||
<p class="sales-customer-name">{{ $customer->name }}</p>
|
||||
<div class="sales-table-container">
|
||||
<table class="sales-table">
|
||||
@foreach ($customer->invoices as $invoice)
|
||||
<tr>
|
||||
<td class="sales-total-cell">
|
||||
<p class="sales-total-amount">
|
||||
{!! format_money_pdf($customer->totalAmount) !!}
|
||||
<td>
|
||||
<p class="sales-information-text">
|
||||
{{ $invoice->formattedInvoiceDate }} ({{ $invoice->invoice_number }})
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p class="sales-amount">
|
||||
{!! format_money_pdf($invoice->base_total, $currency) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</table>
|
||||
</div>
|
||||
<table class="sales-total-indicator-table">
|
||||
<tr>
|
||||
<td class="sales-total-cell">
|
||||
<p class="sales-total-amount">
|
||||
{!! format_money_pdf($customer->totalAmount, $currency) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
@ -195,10 +202,11 @@
|
||||
</td>
|
||||
<td>
|
||||
<p class="report-footer-value">
|
||||
{!! format_money_pdf($totalAmount) !!}
|
||||
{!! format_money_pdf($totalAmount, $currency) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
</html>
|
||||
@ -1,17 +1,18 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<title>@lang('pdf_sales_items_label')</title>
|
||||
<style type="text/css">
|
||||
body {
|
||||
font-family: "DejaVu Sans";
|
||||
}
|
||||
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.sub-container{
|
||||
.sub-container {
|
||||
padding: 0px 20px;
|
||||
}
|
||||
|
||||
@ -132,11 +133,17 @@
|
||||
line-height: 21px;
|
||||
color: #5851D8;
|
||||
}
|
||||
|
||||
.text-center {
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
|
||||
@if (App::isLocale('th'))
|
||||
@include('app.pdf.locale.th')
|
||||
@endif
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="sub-container">
|
||||
<table class="report-header">
|
||||
@ -154,36 +161,36 @@
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
<p class="sales-items-title">@lang('pdf_items_label')</p>
|
||||
@foreach ($items as $item)
|
||||
<div class="items-table-container">
|
||||
<table class="items-table">
|
||||
<tr>
|
||||
<td>
|
||||
<p class="item-title">
|
||||
{{ $item->name }}
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p class="item-sales-amount">
|
||||
{!! format_money_pdf($item->total_amount) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
@endforeach
|
||||
|
||||
<table class="sales-total-indicator-table">
|
||||
<div class="items-table-container">
|
||||
<table class="items-table">
|
||||
<tr>
|
||||
<td class="sales-total-cell">
|
||||
<p class="sales-total-amount">
|
||||
{!! format_money_pdf($totalAmount) !!}
|
||||
<td>
|
||||
<p class="item-title">
|
||||
{{ $item->name }}
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p class="item-sales-amount">
|
||||
{!! format_money_pdf($item->total_amount, $currency) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
@endforeach
|
||||
|
||||
<table class="sales-total-indicator-table">
|
||||
<tr>
|
||||
<td class="sales-total-cell">
|
||||
<p class="sales-total-amount">
|
||||
{!! format_money_pdf($totalAmount, $currency) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
@ -194,10 +201,11 @@
|
||||
</td>
|
||||
<td>
|
||||
<p class="report-footer-value">
|
||||
{!! format_money_pdf($totalAmount) !!}
|
||||
{!! format_money_pdf($totalAmount, $currency) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
</html>
|
||||
@ -1,5 +1,6 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<title>@lang('pdf_tax_summery_label')</title>
|
||||
<style type="text/css">
|
||||
@ -11,7 +12,7 @@
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.sub-container{
|
||||
.sub-container {
|
||||
padding: 0px 20px;
|
||||
}
|
||||
|
||||
@ -134,7 +135,12 @@
|
||||
color: #5851D8;
|
||||
}
|
||||
</style>
|
||||
|
||||
@if (App::isLocale('th'))
|
||||
@include('app.pdf.locale.th')
|
||||
@endif
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="sub-container">
|
||||
<table class="report-header">
|
||||
@ -160,18 +166,18 @@
|
||||
<div class="tax-table-container">
|
||||
<table class="tax-table">
|
||||
@foreach ($taxTypes as $tax)
|
||||
<tr>
|
||||
<td>
|
||||
<p class="tax-title">
|
||||
{{ $tax->taxType->name }}
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p class="tax-amount">
|
||||
{!! format_money_pdf($tax->total_tax_amount) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p class="tax-title">
|
||||
{{ $tax->taxType->name }}
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p class="tax-amount">
|
||||
{!! format_money_pdf($tax->total_tax_amount, $currency) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
|
||||
</table>
|
||||
@ -182,7 +188,7 @@
|
||||
<tr>
|
||||
<td class="tax-total-cell">
|
||||
<p class="tax-total">
|
||||
{!! format_money_pdf($totalTaxAmount) !!}
|
||||
{!! format_money_pdf($totalTaxAmount, $currency) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
@ -194,10 +200,11 @@
|
||||
</td>
|
||||
<td>
|
||||
<p class="report-footer-value">
|
||||
{!! format_money_pdf($totalTaxAmount) !!}
|
||||
{!! format_money_pdf($totalTaxAmount, $currency) !!}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
</html>
|
||||
0
storage/fonts/.gitkeep
Normal file
0
storage/fonts/.gitkeep
Normal file
@ -19,6 +19,7 @@ module.exports = {
|
||||
'./resources/scripts/**/*.js',
|
||||
'./resources/scripts/**/*.vue',
|
||||
],
|
||||
darkMode: 'class',
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
|
||||
@ -415,32 +415,31 @@ test('update estimate with EUR currency', function () {
|
||||
|
||||
$response = putJson('api/v1/estimates/'.$estimate->id, $estimate2);
|
||||
|
||||
$this->assertDatabaseHas('estimates', [
|
||||
'id' => $estimate['id'],
|
||||
'template_name' => $estimate2['template_name'],
|
||||
'estimate_number' => $estimate2['estimate_number'],
|
||||
'discount_type' => $estimate2['discount_type'],
|
||||
'discount_val' => $estimate2['discount_val'],
|
||||
'sub_total' => $estimate2['sub_total'],
|
||||
'discount' => $estimate2['discount'],
|
||||
'customer_id' => $estimate2['customer_id'],
|
||||
'total' => $estimate2['total'],
|
||||
'tax' => $estimate2['tax'],
|
||||
'exchange_rate' => $estimate2['exchange_rate'],
|
||||
'base_discount_val' => $estimate2['base_discount_val'],
|
||||
'base_sub_total' => $estimate2['base_sub_total'],
|
||||
'base_total' => $estimate2['base_total'],
|
||||
'base_tax' => $estimate2['base_tax'],
|
||||
]);
|
||||
$estimate_assert = collect($estimate2)
|
||||
->only([
|
||||
'id',
|
||||
'template_name',
|
||||
'estimate_number',
|
||||
'discount_type',
|
||||
'discount_val',
|
||||
'sub_total',
|
||||
'discount',
|
||||
'customer_id',
|
||||
'total',
|
||||
'tax'
|
||||
])
|
||||
->toArray();
|
||||
|
||||
$this->assertDatabaseHas('estimate_items', [
|
||||
'estimate_id' => $estimate2['items'][0]['estimate_id'],
|
||||
'exchange_rate' => $estimate2['items'][0]['exchange_rate'],
|
||||
'base_price' => $estimate2['items'][0]['base_price'],
|
||||
'base_discount_val' => $estimate2['items'][0]['base_discount_val'],
|
||||
'base_tax' => $estimate2['items'][0]['base_tax'],
|
||||
'base_total' => $estimate2['items'][0]['base_total'],
|
||||
]);
|
||||
$this->assertDatabaseHas('estimates', $estimate_assert);
|
||||
|
||||
$estimate_item_assert = collect($estimate2['items'][0])
|
||||
->only([
|
||||
'estimate_id',
|
||||
'amount'
|
||||
])
|
||||
->toArray();
|
||||
|
||||
$this->assertDatabaseHas('estimate_items', $estimate_item_assert);
|
||||
|
||||
$response->assertStatus(200);
|
||||
});
|
||||
|
||||
@ -37,13 +37,15 @@ test('create expense', function () {
|
||||
|
||||
postJson('api/v1/expenses', $expense)->assertStatus(201);
|
||||
|
||||
$this->assertDatabaseHas('expenses', [
|
||||
'notes' => $expense['notes'],
|
||||
'expense_category_id' => $expense['expense_category_id'],
|
||||
'amount' => $expense['amount'],
|
||||
'exchange_rate' => $expense['exchange_rate'],
|
||||
'base_amount' => $expense['base_amount'],
|
||||
]);
|
||||
$expense = collect($expense)
|
||||
->only([
|
||||
'notes',
|
||||
'expense_category_id',
|
||||
'amount'
|
||||
])
|
||||
->toArray();
|
||||
|
||||
$this->assertDatabaseHas('expenses', $expense);
|
||||
});
|
||||
|
||||
test('store validates using a form request', function () {
|
||||
@ -146,11 +148,13 @@ test('update expense with EUR currency', function () {
|
||||
|
||||
putJson('api/v1/expenses/'.$expense->id, $expense2)->assertOk();
|
||||
|
||||
$this->assertDatabaseHas('expenses', [
|
||||
'id' => $expense->id,
|
||||
'expense_category_id' => $expense2['expense_category_id'],
|
||||
'amount' => $expense2['amount'],
|
||||
'exchange_rate' => $expense2['exchange_rate'],
|
||||
'base_amount' => $expense2['base_amount'],
|
||||
]);
|
||||
$expense2 = collect($expense2)
|
||||
->only([
|
||||
'id',
|
||||
'expense_category_id',
|
||||
'amount'
|
||||
])
|
||||
->toArray();
|
||||
|
||||
$this->assertDatabaseHas('expenses', $expense2);
|
||||
});
|
||||
|
||||
@ -9,7 +9,6 @@ use Crater\Models\Tax;
|
||||
use Crater\Models\User;
|
||||
use Illuminate\Support\Facades\Artisan;
|
||||
use Laravel\Sanctum\Sanctum;
|
||||
|
||||
use function Pest\Laravel\getJson;
|
||||
use function Pest\Laravel\postJson;
|
||||
use function Pest\Laravel\putJson;
|
||||
@ -431,31 +430,36 @@ test('update invoice with EUR currency', function () {
|
||||
|
||||
putJson('api/v1/invoices/'.$invoice->id, $invoice2)->assertOk();
|
||||
|
||||
$this->assertDatabaseHas('invoices', [
|
||||
'id' => $invoice['id'],
|
||||
'invoice_number' => $invoice2['invoice_number'],
|
||||
'sub_total' => $invoice2['sub_total'],
|
||||
'total' => $invoice2['total'],
|
||||
'tax' => $invoice2['tax'],
|
||||
'discount' => $invoice2['discount'],
|
||||
'customer_id' => $invoice2['customer_id'],
|
||||
'template_name' => $invoice2['template_name'],
|
||||
'exchange_rate' => $invoice2['exchange_rate'],
|
||||
'base_total' => $invoice2['base_total'],
|
||||
]);
|
||||
$invoice_assert = collect($invoice2)
|
||||
->only([
|
||||
'invoice_number',
|
||||
'template_name',
|
||||
'sub_total',
|
||||
'total',
|
||||
'tax',
|
||||
'discount',
|
||||
'customer_id',
|
||||
])
|
||||
->toArray();
|
||||
|
||||
$this->assertDatabaseHas('invoice_items', [
|
||||
'invoice_id' => $invoice2['items'][0]['invoice_id'],
|
||||
'item_id' => $invoice2['items'][0]['item_id'],
|
||||
'name' => $invoice2['items'][0]['name'],
|
||||
'exchange_rate' => $invoice2['items'][0]['exchange_rate'],
|
||||
'base_price' => $invoice2['items'][0]['base_price'],
|
||||
'base_total' => $invoice2['items'][0]['base_total'],
|
||||
]);
|
||||
$this->assertDatabaseHas('invoices', $invoice_assert);
|
||||
|
||||
$this->assertDatabaseHas('taxes', [
|
||||
'amount' => $invoice2['taxes'][0]['amount'],
|
||||
'name' => $invoice2['taxes'][0]['name'],
|
||||
'base_amount' => $invoice2['taxes'][0]['base_amount'],
|
||||
]);
|
||||
$invoice_item_assert = collect($invoice2['items'][0])
|
||||
->only([
|
||||
'invoice_id',
|
||||
'item_id',
|
||||
'name',
|
||||
])
|
||||
->toArray();
|
||||
|
||||
$this->assertDatabaseHas('invoice_items', $invoice_item_assert);
|
||||
|
||||
$invoice_tax_assert = collect($invoice2['taxes'][0])
|
||||
->only([
|
||||
'name',
|
||||
'amount'
|
||||
])
|
||||
->toArray();
|
||||
|
||||
$this->assertDatabaseHas('taxes', $invoice_tax_assert);
|
||||
});
|
||||
|
||||
40
uffizzi/.env.example
Normal file
40
uffizzi/.env.example
Normal file
@ -0,0 +1,40 @@
|
||||
APP_ENV=production
|
||||
APP_KEY=base64:kgk/4DW1vEVy7aEvet5FPp5un6PIGe/so8H0mvoUtW0=
|
||||
APP_DEBUG=true
|
||||
APP_LOG_LEVEL=debug
|
||||
APP_URL=http://crater.test
|
||||
|
||||
DB_CONNECTION=mysql
|
||||
DB_HOST=127.0.0.1
|
||||
DB_PORT=3306
|
||||
DB_DATABASE=crater
|
||||
DB_USERNAME=crater
|
||||
DB_PASSWORD=crater
|
||||
|
||||
BROADCAST_DRIVER=log
|
||||
CACHE_DRIVER=file
|
||||
QUEUE_DRIVER=sync
|
||||
SESSION_DRIVER=cookie
|
||||
SESSION_LIFETIME=1440
|
||||
|
||||
REDIS_HOST=127.0.0.1
|
||||
REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
|
||||
MAIL_DRIVER=smtp
|
||||
MAIL_HOST=
|
||||
MAIL_PORT=
|
||||
MAIL_USERNAME=
|
||||
MAIL_PASSWORD=
|
||||
MAIL_ENCRYPTION=
|
||||
|
||||
PUSHER_APP_ID=
|
||||
PUSHER_KEY=
|
||||
PUSHER_SECRET=
|
||||
|
||||
SANCTUM_STATEFUL_DOMAINS=crater.test
|
||||
SESSION_DOMAIN=crater.test
|
||||
|
||||
TRUSTED_PROXIES="*"
|
||||
|
||||
CRON_JOB_AUTH_TOKEN=""
|
||||
48
uffizzi/Dockerfile
Normal file
48
uffizzi/Dockerfile
Normal file
@ -0,0 +1,48 @@
|
||||
FROM php:8.1-fpm
|
||||
|
||||
# Install system dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
git \
|
||||
curl \
|
||||
libpng-dev \
|
||||
libonig-dev \
|
||||
libxml2-dev \
|
||||
zip \
|
||||
unzip \
|
||||
libzip-dev \
|
||||
libmagickwand-dev \
|
||||
mariadb-client
|
||||
|
||||
# Clear cache
|
||||
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN pecl install imagick \
|
||||
&& docker-php-ext-enable imagick
|
||||
|
||||
# Install PHP extensions
|
||||
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl bcmath gd
|
||||
|
||||
# Get latest Composer
|
||||
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
|
||||
|
||||
# Create system user to run Composer and Artisan Commands
|
||||
RUN useradd -G www-data,root -u 1000 -d /home/crater-user crater-user
|
||||
RUN mkdir -p /home/crater-user/.composer && \
|
||||
chown -R crater-user:crater-user /home/crater-user
|
||||
|
||||
# Mounted volumes
|
||||
COPY ./ /var/www
|
||||
COPY ./docker-compose/php/uploads.ini /usr/local/etc/php/conf.d/uploads.ini
|
||||
COPY ./uffizzi/.env.example /var/www/.env
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /var/www
|
||||
|
||||
RUN chown -R crater-user:crater-user ./
|
||||
RUN chmod -R 775 composer.json composer.lock \
|
||||
composer.lock storage/framework/ \
|
||||
storage/logs/ bootstrap/cache/ /home/crater-user/.composer
|
||||
RUN chown -R $(whoami):$(whoami) /var/log/
|
||||
RUN chmod -R 775 /var/log
|
||||
|
||||
USER crater-user
|
||||
68
uffizzi/crond/Dockerfile
Normal file
68
uffizzi/crond/Dockerfile
Normal file
@ -0,0 +1,68 @@
|
||||
FROM php:8.1-fpm as build
|
||||
|
||||
# Install system dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
git \
|
||||
curl \
|
||||
libpng-dev \
|
||||
libonig-dev \
|
||||
libxml2-dev \
|
||||
zip \
|
||||
unzip \
|
||||
libzip-dev \
|
||||
libmagickwand-dev \
|
||||
mariadb-client
|
||||
|
||||
# Clear cache
|
||||
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN pecl install imagick \
|
||||
&& docker-php-ext-enable imagick
|
||||
|
||||
# Install PHP extensions
|
||||
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl bcmath gd
|
||||
|
||||
# Get latest Composer
|
||||
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
|
||||
|
||||
# Create system user to run Composer and Artisan Commands
|
||||
RUN useradd -G www-data,root -u 1000 -d /home/crater-user crater-user
|
||||
RUN mkdir -p /home/crater-user/.composer && \
|
||||
chown -R crater-user:crater-user /home/crater-user
|
||||
|
||||
# Mounted volumes
|
||||
COPY ./ /var/www
|
||||
COPY ./docker-compose/php/uploads.ini /usr/local/etc/php/conf.d/uploads.ini
|
||||
COPY ./uffizzi/.env.example /var/www/.env
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /var/www
|
||||
|
||||
RUN chown -R crater-user:crater-user ./
|
||||
RUN chmod -R 775 composer.json composer.lock \
|
||||
composer.lock storage/framework/ \
|
||||
storage/logs/ bootstrap/cache/ /home/crater-user/.composer
|
||||
|
||||
RUN composer config --no-plugins allow-plugins.pestphp/pest-plugin true && \
|
||||
composer install --no-interaction --prefer-dist --optimize-autoloader && \
|
||||
php artisan storage:link || true && \
|
||||
php artisan key:generate
|
||||
|
||||
FROM php:8.0-fpm-alpine
|
||||
|
||||
RUN apk add --no-cache \
|
||||
php8-bcmath
|
||||
|
||||
RUN docker-php-ext-install pdo pdo_mysql bcmath
|
||||
|
||||
COPY docker-compose/crontab /etc/crontabs/root
|
||||
|
||||
# Mounted volumes
|
||||
COPY --from=build /var/www /var/www
|
||||
|
||||
RUN chown -R $(whoami):$(whoami) /var/www/
|
||||
RUN chmod -R 775 /var/www/
|
||||
RUN chown -R $(whoami):$(whoami) /var/log/
|
||||
RUN chmod -R 775 /var/log/
|
||||
|
||||
CMD ["crond", "-f"]
|
||||
58
uffizzi/docker-compose.uffizzi.yml
Normal file
58
uffizzi/docker-compose.uffizzi.yml
Normal file
@ -0,0 +1,58 @@
|
||||
version: '3'
|
||||
|
||||
x-uffizzi:
|
||||
ingress:
|
||||
service: nginx
|
||||
port: 80
|
||||
|
||||
services:
|
||||
app:
|
||||
image: "${APP_IMAGE}"
|
||||
restart: unless-stopped
|
||||
working_dir: /var/www/
|
||||
command: ["-c","
|
||||
composer config --no-plugins allow-plugins.pestphp/pest-plugin true &&
|
||||
composer install --no-interaction --prefer-dist --optimize-autoloader &&
|
||||
php artisan storage:link || true &&
|
||||
php artisan key:generate --force &&
|
||||
php-fpm",
|
||||
]
|
||||
entrypoint: /bin/sh
|
||||
depends_on:
|
||||
- db
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 1000m
|
||||
|
||||
db:
|
||||
image: mariadb
|
||||
restart: always
|
||||
environment:
|
||||
MYSQL_USER: crater
|
||||
MYSQL_PASSWORD: crater
|
||||
MYSQL_DATABASE: crater
|
||||
MYSQL_ROOT_PASSWORD: crater
|
||||
ports:
|
||||
- '33006:3306'
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 500m
|
||||
|
||||
nginx:
|
||||
image: "${NGINX_IMAGE}"
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 80:80
|
||||
depends_on:
|
||||
- app
|
||||
resources:
|
||||
limits:
|
||||
memory: 500m
|
||||
|
||||
cron:
|
||||
image: "${CROND_IMAGE}"
|
||||
restart: always
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user