mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-28 12:11:08 -04:00
Compare commits
1 Commits
dark-calen
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
| 7b5cd56d8c |
162
.github/workflows/uffizzi-build.yml
vendored
162
.github/workflows/uffizzi-build.yml
vendored
@ -1,162 +0,0 @@
|
|||||||
name: Build PR Image
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
types: [opened,synchronize,reopened,closed]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
|
|
||||||
build-application:
|
|
||||||
name: Build and Push `application`
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
|
|
||||||
outputs:
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout git repo
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
- name: Generate UUID image name
|
|
||||||
id: uuid
|
|
||||||
run: echo "UUID_TAG_APP=$(uuidgen)" >> $GITHUB_ENV
|
|
||||||
- name: Docker metadata
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v3
|
|
||||||
with:
|
|
||||||
images: registry.uffizzi.com/${{ env.UUID_TAG_APP }}
|
|
||||||
tags: type=raw,value=60d
|
|
||||||
- name: Build and Push Image to registry.uffizzi.com ephemeral registry
|
|
||||||
uses: docker/build-push-action@v2
|
|
||||||
with:
|
|
||||||
push: true
|
|
||||||
context: ./
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
||||||
file: ./uffizzi/Dockerfile
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
|
|
||||||
build-nginx:
|
|
||||||
name: Build and Push `nginx`
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
|
|
||||||
outputs:
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout git repo
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
- name: Generate UUID image name
|
|
||||||
id: uuid
|
|
||||||
run: echo "UUID_TAG_NGINX=$(uuidgen)" >> $GITHUB_ENV
|
|
||||||
- name: Docker metadata
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v3
|
|
||||||
with:
|
|
||||||
images: registry.uffizzi.com/${{ env.UUID_TAG_NGINX }}
|
|
||||||
tags: type=raw,value=60d
|
|
||||||
- name: Build and Push Image to Uffizzi ephemeral registry
|
|
||||||
uses: docker/build-push-action@v2
|
|
||||||
with:
|
|
||||||
push: true
|
|
||||||
context: ./
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
||||||
file: ./uffizzi/nginx/Dockerfile
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
|
|
||||||
build-crond:
|
|
||||||
name: Build and Push `crond`
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
|
|
||||||
outputs:
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout git repo
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
- name: Generate UUID image name
|
|
||||||
id: uuid
|
|
||||||
run: echo "UUID_TAG_CROND=$(uuidgen)" >> $GITHUB_ENV
|
|
||||||
- name: Docker metadata
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v3
|
|
||||||
with:
|
|
||||||
images: registry.uffizzi.com/${{ env.UUID_TAG_CROND }}
|
|
||||||
tags: type=raw,value=60d
|
|
||||||
- name: Build and Push Image to registry.uffizzi.com ephemeral registry
|
|
||||||
uses: docker/build-push-action@v2
|
|
||||||
with:
|
|
||||||
push: true
|
|
||||||
context: ./
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
||||||
file: ./uffizzi/crond/Dockerfile
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
render-compose-file:
|
|
||||||
name: Render Docker Compose File
|
|
||||||
# Pass output of this workflow to another triggered by `workflow_run` event.
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
compose-file-cache-key: ${{ steps.hash.outputs.hash }}
|
|
||||||
needs:
|
|
||||||
- build-application
|
|
||||||
- build-nginx
|
|
||||||
- build-crond
|
|
||||||
steps:
|
|
||||||
- name: Checkout git repo
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Render Compose File
|
|
||||||
run: |
|
|
||||||
APP_IMAGE=$(echo ${{ needs.build-application.outputs.tags }})
|
|
||||||
export APP_IMAGE
|
|
||||||
NGINX_IMAGE=$(echo ${{ needs.build-nginx.outputs.tags }})
|
|
||||||
export NGINX_IMAGE
|
|
||||||
CROND_IMAGE=$(echo ${{ needs.build-crond.outputs.tags }})
|
|
||||||
export CROND_IMAGE
|
|
||||||
# Render simple template from environment variables.
|
|
||||||
envsubst < ./uffizzi/docker-compose.uffizzi.yml > docker-compose.rendered.yml
|
|
||||||
cat docker-compose.rendered.yml
|
|
||||||
- name: Upload Rendered Compose File as Artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: preview-spec
|
|
||||||
path: docker-compose.rendered.yml
|
|
||||||
retention-days: 2
|
|
||||||
- name: Serialize PR Event to File
|
|
||||||
run: |
|
|
||||||
cat << EOF > event.json
|
|
||||||
${{ toJSON(github.event) }}
|
|
||||||
|
|
||||||
EOF
|
|
||||||
- name: Upload PR Event as Artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: preview-spec
|
|
||||||
path: event.json
|
|
||||||
retention-days: 2
|
|
||||||
|
|
||||||
delete-preview:
|
|
||||||
name: Call for Preview Deletion
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.event.action == 'closed' }}
|
|
||||||
steps:
|
|
||||||
# If this PR is closing, we will not render a compose file nor pass it to the next workflow.
|
|
||||||
- name: Serialize PR Event to File
|
|
||||||
run: echo '${{ toJSON(github.event) }}' > event.json
|
|
||||||
- name: Upload PR Event as Artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: preview-spec
|
|
||||||
path: event.json
|
|
||||||
retention-days: 2
|
|
||||||
|
|
||||||
84
.github/workflows/uffizzi-preview.yml
vendored
84
.github/workflows/uffizzi-preview.yml
vendored
@ -1,84 +0,0 @@
|
|||||||
name: Deploy Uffizzi Preview
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_run:
|
|
||||||
workflows:
|
|
||||||
- "Build PR Image"
|
|
||||||
types:
|
|
||||||
- completed
|
|
||||||
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
cache-compose-file:
|
|
||||||
name: Cache Compose File
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
compose-file-cache-key: ${{ env.COMPOSE_FILE_HASH }}
|
|
||||||
pr-number: ${{ env.PR_NUMBER }}
|
|
||||||
steps:
|
|
||||||
- name: 'Download artifacts'
|
|
||||||
# Fetch output (zip archive) from the workflow run that triggered this workflow.
|
|
||||||
uses: actions/github-script@v6
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
run_id: context.payload.workflow_run.id,
|
|
||||||
});
|
|
||||||
let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
|
|
||||||
return artifact.name == "preview-spec"
|
|
||||||
})[0];
|
|
||||||
let download = await github.rest.actions.downloadArtifact({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
artifact_id: matchArtifact.id,
|
|
||||||
archive_format: 'zip',
|
|
||||||
});
|
|
||||||
let fs = require('fs');
|
|
||||||
fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/preview-spec.zip`, Buffer.from(download.data));
|
|
||||||
- name: 'Unzip artifact'
|
|
||||||
run: unzip preview-spec.zip
|
|
||||||
- name: Read Event into ENV
|
|
||||||
run: |
|
|
||||||
echo 'EVENT_JSON<<EOF' >> $GITHUB_ENV
|
|
||||||
cat event.json >> $GITHUB_ENV
|
|
||||||
echo 'EOF' >> $GITHUB_ENV
|
|
||||||
- name: Hash Rendered Compose File
|
|
||||||
id: hash
|
|
||||||
# If the previous workflow was triggered by a PR close event, we will not have a compose file artifact.
|
|
||||||
if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }}
|
|
||||||
run: echo "COMPOSE_FILE_HASH=$(md5sum docker-compose.rendered.yml | awk '{ print $1 }')" >> $GITHUB_ENV
|
|
||||||
- name: Cache Rendered Compose File
|
|
||||||
if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }}
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: docker-compose.rendered.yml
|
|
||||||
key: ${{ env.COMPOSE_FILE_HASH }}
|
|
||||||
|
|
||||||
- name: Read PR Number From Event Object
|
|
||||||
id: pr
|
|
||||||
run: echo "PR_NUMBER=${{ fromJSON(env.EVENT_JSON).number }}" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: DEBUG - Print Job Outputs
|
|
||||||
if: ${{ runner.debug }}
|
|
||||||
run: |
|
|
||||||
echo "PR number: ${{ env.PR_NUMBER }}"
|
|
||||||
echo "Compose file hash: ${{ env.COMPOSE_FILE_HASH }}"
|
|
||||||
cat event.json
|
|
||||||
deploy-uffizzi-preview:
|
|
||||||
name: Use Remote Workflow to Preview on Uffizzi
|
|
||||||
needs:
|
|
||||||
- cache-compose-file
|
|
||||||
uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2.6.1
|
|
||||||
with:
|
|
||||||
# If this workflow was triggered by a PR close event, cache-key will be an empty string
|
|
||||||
# and this reusable workflow will delete the preview deployment.
|
|
||||||
compose-file-cache-key: ${{ needs.cache-compose-file.outputs.compose-file-cache-key }}
|
|
||||||
compose-file-cache-path: docker-compose.rendered.yml
|
|
||||||
server: https://app.uffizzi.com/
|
|
||||||
pr-number: ${{ needs.cache-compose-file.outputs.pr-number }}
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
pull-requests: write
|
|
||||||
id-token: write
|
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -16,4 +16,3 @@ Homestead.yaml
|
|||||||
.gitkeep
|
.gitkeep
|
||||||
/public/docs
|
/public/docs
|
||||||
/.scribe
|
/.scribe
|
||||||
!storage/fonts/.gitkeep
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
FROM php:8.1-fpm
|
FROM php:7.4-fpm
|
||||||
|
|
||||||
# Arguments defined in docker-compose.yml
|
# Arguments defined in docker-compose.yml
|
||||||
ARG user
|
ARG user
|
||||||
|
|||||||
@ -103,7 +103,6 @@ class CustomerStatsController extends Controller
|
|||||||
)
|
)
|
||||||
->whereCompany()
|
->whereCompany()
|
||||||
->whereCustomer($customer->id)
|
->whereCustomer($customer->id)
|
||||||
->where('status', '<>', Invoice::STATUS_DRAFT)
|
|
||||||
->sum('total');
|
->sum('total');
|
||||||
$totalReceipts = Payment::whereBetween(
|
$totalReceipts = Payment::whereBetween(
|
||||||
'payment_date',
|
'payment_date',
|
||||||
|
|||||||
@ -104,7 +104,6 @@ class DashboardController extends Controller
|
|||||||
'invoice_date',
|
'invoice_date',
|
||||||
[$startDate->format('Y-m-d'), $start->format('Y-m-d')]
|
[$startDate->format('Y-m-d'), $start->format('Y-m-d')]
|
||||||
)
|
)
|
||||||
->where('status', '<>', Invoice::STATUS_DRAFT)
|
|
||||||
->whereCompany()
|
->whereCompany()
|
||||||
->sum('base_total');
|
->sum('base_total');
|
||||||
|
|
||||||
@ -142,7 +141,6 @@ class DashboardController extends Controller
|
|||||||
$recent_due_invoices = Invoice::with('customer')
|
$recent_due_invoices = Invoice::with('customer')
|
||||||
->whereCompany()
|
->whereCompany()
|
||||||
->where('base_due_amount', '>', 0)
|
->where('base_due_amount', '>', 0)
|
||||||
->where('status', '<>', Invoice::STATUS_DRAFT)
|
|
||||||
->take(5)
|
->take(5)
|
||||||
->latest()
|
->latest()
|
||||||
->get();
|
->get();
|
||||||
|
|||||||
@ -24,7 +24,6 @@ class InvoicesController extends Controller
|
|||||||
$limit = $request->has('limit') ? $request->limit : 10;
|
$limit = $request->has('limit') ? $request->limit : 10;
|
||||||
|
|
||||||
$invoices = Invoice::whereCompany()
|
$invoices = Invoice::whereCompany()
|
||||||
->whereTabFilters($request->tab_status)
|
|
||||||
->join('customers', 'customers.id', '=', 'invoices.customer_id')
|
->join('customers', 'customers.id', '=', 'invoices.customer_id')
|
||||||
->applyFilters($request->all())
|
->applyFilters($request->all())
|
||||||
->select('invoices.*', 'customers.name')
|
->select('invoices.*', 'customers.name')
|
||||||
|
|||||||
@ -2,25 +2,24 @@
|
|||||||
|
|
||||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||||
|
|
||||||
use PDF;
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use Crater\Http\Controllers\Controller;
|
||||||
use Crater\Models\Company;
|
use Crater\Models\Company;
|
||||||
use Crater\Models\Currency;
|
use Crater\Models\CompanySetting;
|
||||||
use Crater\Models\Customer;
|
use Crater\Models\Customer;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Crater\Models\CompanySetting;
|
|
||||||
use Illuminate\Support\Facades\App;
|
use Illuminate\Support\Facades\App;
|
||||||
use Crater\Http\Controllers\Controller;
|
use PDF;
|
||||||
|
|
||||||
class CustomerSalesReportController extends Controller
|
class CustomerSalesReportController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Handle the incoming request.
|
* Handle the incoming request.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @param string $hash
|
* @param string $hash
|
||||||
* @return \Illuminate\Http\JsonResponse
|
* @return \Illuminate\Http\JsonResponse
|
||||||
*/
|
*/
|
||||||
public function __invoke(Request $request, $hash)
|
public function __invoke(Request $request, $hash)
|
||||||
{
|
{
|
||||||
$company = Company::where('unique_hash', $hash)->first();
|
$company = Company::where('unique_hash', $hash)->first();
|
||||||
@ -57,7 +56,6 @@ class CustomerSalesReportController extends Controller
|
|||||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
|
||||||
|
|
||||||
$colors = [
|
$colors = [
|
||||||
'primary_text_color',
|
'primary_text_color',
|
||||||
@ -82,7 +80,6 @@ class CustomerSalesReportController extends Controller
|
|||||||
'company' => $company,
|
'company' => $company,
|
||||||
'from_date' => $from_date,
|
'from_date' => $from_date,
|
||||||
'to_date' => $to_date,
|
'to_date' => $to_date,
|
||||||
'currency' => $currency,
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$pdf = PDF::loadView('app.pdf.reports.sales-customers');
|
$pdf = PDF::loadView('app.pdf.reports.sales-customers');
|
||||||
|
|||||||
@ -2,25 +2,24 @@
|
|||||||
|
|
||||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||||
|
|
||||||
use PDF;
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Crater\Models\Company;
|
|
||||||
use Crater\Models\Expense;
|
|
||||||
use Crater\Models\Currency;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Crater\Models\CompanySetting;
|
|
||||||
use Illuminate\Support\Facades\App;
|
|
||||||
use Crater\Http\Controllers\Controller;
|
use Crater\Http\Controllers\Controller;
|
||||||
|
use Crater\Models\Company;
|
||||||
|
use Crater\Models\CompanySetting;
|
||||||
|
use Crater\Models\Expense;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\App;
|
||||||
|
use PDF;
|
||||||
|
|
||||||
class ExpensesReportController extends Controller
|
class ExpensesReportController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Handle the incoming request.
|
* Handle the incoming request.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @param string $hash
|
* @param string $hash
|
||||||
* @return \Illuminate\Http\JsonResponse
|
* @return \Illuminate\Http\JsonResponse
|
||||||
*/
|
*/
|
||||||
public function __invoke(Request $request, $hash)
|
public function __invoke(Request $request, $hash)
|
||||||
{
|
{
|
||||||
$company = Company::where('unique_hash', $hash)->first();
|
$company = Company::where('unique_hash', $hash)->first();
|
||||||
@ -44,7 +43,6 @@ class ExpensesReportController extends Controller
|
|||||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
|
||||||
|
|
||||||
$colors = [
|
$colors = [
|
||||||
'primary_text_color',
|
'primary_text_color',
|
||||||
@ -68,7 +66,6 @@ class ExpensesReportController extends Controller
|
|||||||
'company' => $company,
|
'company' => $company,
|
||||||
'from_date' => $from_date,
|
'from_date' => $from_date,
|
||||||
'to_date' => $to_date,
|
'to_date' => $to_date,
|
||||||
'currency' => $currency,
|
|
||||||
]);
|
]);
|
||||||
$pdf = PDF::loadView('app.pdf.reports.expenses');
|
$pdf = PDF::loadView('app.pdf.reports.expenses');
|
||||||
|
|
||||||
|
|||||||
@ -2,25 +2,24 @@
|
|||||||
|
|
||||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||||
|
|
||||||
use PDF;
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Crater\Models\Company;
|
|
||||||
use Crater\Models\Currency;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Crater\Models\InvoiceItem;
|
|
||||||
use Crater\Models\CompanySetting;
|
|
||||||
use Illuminate\Support\Facades\App;
|
|
||||||
use Crater\Http\Controllers\Controller;
|
use Crater\Http\Controllers\Controller;
|
||||||
|
use Crater\Models\Company;
|
||||||
|
use Crater\Models\CompanySetting;
|
||||||
|
use Crater\Models\InvoiceItem;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\App;
|
||||||
|
use PDF;
|
||||||
|
|
||||||
class ItemSalesReportController extends Controller
|
class ItemSalesReportController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Handle the incoming request.
|
* Handle the incoming request.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @param string $hash
|
* @param string $hash
|
||||||
* @return \Illuminate\Http\JsonResponse
|
* @return \Illuminate\Http\JsonResponse
|
||||||
*/
|
*/
|
||||||
public function __invoke(Request $request, $hash)
|
public function __invoke(Request $request, $hash)
|
||||||
{
|
{
|
||||||
$company = Company::where('unique_hash', $hash)->first();
|
$company = Company::where('unique_hash', $hash)->first();
|
||||||
@ -44,7 +43,6 @@ class ItemSalesReportController extends Controller
|
|||||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
|
||||||
|
|
||||||
$colors = [
|
$colors = [
|
||||||
'primary_text_color',
|
'primary_text_color',
|
||||||
@ -68,7 +66,6 @@ class ItemSalesReportController extends Controller
|
|||||||
'company' => $company,
|
'company' => $company,
|
||||||
'from_date' => $from_date,
|
'from_date' => $from_date,
|
||||||
'to_date' => $to_date,
|
'to_date' => $to_date,
|
||||||
'currency' => $currency,
|
|
||||||
]);
|
]);
|
||||||
$pdf = PDF::loadView('app.pdf.reports.sales-items');
|
$pdf = PDF::loadView('app.pdf.reports.sales-items');
|
||||||
|
|
||||||
|
|||||||
@ -2,26 +2,25 @@
|
|||||||
|
|
||||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||||
|
|
||||||
use PDF;
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use Crater\Http\Controllers\Controller;
|
||||||
use Crater\Models\Company;
|
use Crater\Models\Company;
|
||||||
|
use Crater\Models\CompanySetting;
|
||||||
use Crater\Models\Expense;
|
use Crater\Models\Expense;
|
||||||
use Crater\Models\Payment;
|
use Crater\Models\Payment;
|
||||||
use Crater\Models\Currency;
|
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Crater\Models\CompanySetting;
|
|
||||||
use Illuminate\Support\Facades\App;
|
use Illuminate\Support\Facades\App;
|
||||||
use Crater\Http\Controllers\Controller;
|
use PDF;
|
||||||
|
|
||||||
class ProfitLossReportController extends Controller
|
class ProfitLossReportController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Handle the incoming request.
|
* Handle the incoming request.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @param string $hash
|
* @param string $hash
|
||||||
* @return \Illuminate\Http\JsonResponse
|
* @return \Illuminate\Http\JsonResponse
|
||||||
*/
|
*/
|
||||||
public function __invoke(Request $request, $hash)
|
public function __invoke(Request $request, $hash)
|
||||||
{
|
{
|
||||||
$company = Company::where('unique_hash', $hash)->first();
|
$company = Company::where('unique_hash', $hash)->first();
|
||||||
@ -50,8 +49,6 @@ class ProfitLossReportController extends Controller
|
|||||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
|
||||||
|
|
||||||
|
|
||||||
$colors = [
|
$colors = [
|
||||||
'primary_text_color',
|
'primary_text_color',
|
||||||
@ -77,7 +74,6 @@ class ProfitLossReportController extends Controller
|
|||||||
'company' => $company,
|
'company' => $company,
|
||||||
'from_date' => $from_date,
|
'from_date' => $from_date,
|
||||||
'to_date' => $to_date,
|
'to_date' => $to_date,
|
||||||
'currency' => $currency,
|
|
||||||
]);
|
]);
|
||||||
$pdf = PDF::loadView('app.pdf.reports.profit-loss');
|
$pdf = PDF::loadView('app.pdf.reports.profit-loss');
|
||||||
|
|
||||||
|
|||||||
@ -2,25 +2,24 @@
|
|||||||
|
|
||||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||||
|
|
||||||
use PDF;
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Crater\Models\Tax;
|
|
||||||
use Crater\Models\Company;
|
|
||||||
use Crater\Models\Currency;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Crater\Models\CompanySetting;
|
|
||||||
use Illuminate\Support\Facades\App;
|
|
||||||
use Crater\Http\Controllers\Controller;
|
use Crater\Http\Controllers\Controller;
|
||||||
|
use Crater\Models\Company;
|
||||||
|
use Crater\Models\CompanySetting;
|
||||||
|
use Crater\Models\Tax;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\App;
|
||||||
|
use PDF;
|
||||||
|
|
||||||
class TaxSummaryReportController extends Controller
|
class TaxSummaryReportController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Handle the incoming request.
|
* Handle the incoming request.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @param string $hash
|
* @param string $hash
|
||||||
* @return \Illuminate\Http\JsonResponse
|
* @return \Illuminate\Http\JsonResponse
|
||||||
*/
|
*/
|
||||||
public function __invoke(Request $request, $hash)
|
public function __invoke(Request $request, $hash)
|
||||||
{
|
{
|
||||||
$company = Company::where('unique_hash', $hash)->first();
|
$company = Company::where('unique_hash', $hash)->first();
|
||||||
@ -45,8 +44,6 @@ class TaxSummaryReportController extends Controller
|
|||||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
|
||||||
|
|
||||||
|
|
||||||
$colors = [
|
$colors = [
|
||||||
'primary_text_color',
|
'primary_text_color',
|
||||||
@ -71,7 +68,6 @@ class TaxSummaryReportController extends Controller
|
|||||||
'company' => $company,
|
'company' => $company,
|
||||||
'from_date' => $from_date,
|
'from_date' => $from_date,
|
||||||
'to_date' => $to_date,
|
'to_date' => $to_date,
|
||||||
'currency' => $currency,
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$pdf = PDF::loadView('app.pdf.reports.tax-summary');
|
$pdf = PDF::loadView('app.pdf.reports.tax-summary');
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
namespace Crater\Http\Requests;
|
namespace Crater\Http\Requests;
|
||||||
|
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
use Illuminate\Validation\Rule;
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
class CompaniesRequest extends FormRequest
|
class CompaniesRequest extends FormRequest
|
||||||
@ -33,10 +34,6 @@ class CompaniesRequest extends FormRequest
|
|||||||
'currency' => [
|
'currency' => [
|
||||||
'required'
|
'required'
|
||||||
],
|
],
|
||||||
'slug' => [
|
|
||||||
'required',
|
|
||||||
Rule::unique('companies')
|
|
||||||
],
|
|
||||||
'address.name' => [
|
'address.name' => [
|
||||||
'nullable',
|
'nullable',
|
||||||
],
|
],
|
||||||
@ -71,11 +68,11 @@ class CompaniesRequest extends FormRequest
|
|||||||
{
|
{
|
||||||
return collect($this->validated())
|
return collect($this->validated())
|
||||||
->only([
|
->only([
|
||||||
'name',
|
'name'
|
||||||
'slug'
|
|
||||||
])
|
])
|
||||||
->merge([
|
->merge([
|
||||||
'owner_id' => $this->user()->id
|
'owner_id' => $this->user()->id,
|
||||||
|
'slug' => Str::slug($this->name)
|
||||||
])
|
])
|
||||||
->toArray();
|
->toArray();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,8 +30,7 @@ class CompanyRequest extends FormRequest
|
|||||||
Rule::unique('companies')->ignore($this->header('company'), 'id'),
|
Rule::unique('companies')->ignore($this->header('company'), 'id'),
|
||||||
],
|
],
|
||||||
'slug' => [
|
'slug' => [
|
||||||
'required',
|
'nullable'
|
||||||
Rule::unique('companies')->ignore($this->header('company'), 'id'),
|
|
||||||
],
|
],
|
||||||
'address.country_id' => [
|
'address.country_id' => [
|
||||||
'required',
|
'required',
|
||||||
|
|||||||
@ -23,7 +23,7 @@ class EstimateResource extends JsonResource
|
|||||||
'reference_number' => $this->reference_number,
|
'reference_number' => $this->reference_number,
|
||||||
'tax_per_item' => $this->tax_per_item,
|
'tax_per_item' => $this->tax_per_item,
|
||||||
'discount_per_item' => $this->discount_per_item,
|
'discount_per_item' => $this->discount_per_item,
|
||||||
'notes' => $this->notes,
|
'notes' => $this->getNotes(),
|
||||||
'discount' => $this->discount,
|
'discount' => $this->discount,
|
||||||
'discount_type' => $this->discount_type,
|
'discount_type' => $this->discount_type,
|
||||||
'discount_val' => $this->discount_val,
|
'discount_val' => $this->discount_val,
|
||||||
|
|||||||
@ -18,7 +18,7 @@ class PaymentResource extends JsonResource
|
|||||||
'id' => $this->id,
|
'id' => $this->id,
|
||||||
'payment_number' => $this->payment_number,
|
'payment_number' => $this->payment_number,
|
||||||
'payment_date' => $this->payment_date,
|
'payment_date' => $this->payment_date,
|
||||||
'notes' => $this->notes,
|
'notes' => $this->getNotes(),
|
||||||
'amount' => $this->amount,
|
'amount' => $this->amount,
|
||||||
'unique_hash' => $this->unique_hash,
|
'unique_hash' => $this->unique_hash,
|
||||||
'invoice_id' => $this->invoice_id,
|
'invoice_id' => $this->invoice_id,
|
||||||
|
|||||||
@ -217,7 +217,7 @@ class Company extends Model implements HasMedia
|
|||||||
'estimate_billing_address_format' => $billingAddressFormat,
|
'estimate_billing_address_format' => $billingAddressFormat,
|
||||||
'payment_company_address_format' => $companyAddressFormat,
|
'payment_company_address_format' => $companyAddressFormat,
|
||||||
'payment_from_customer_address_format' => $paymentFromCustomerAddress,
|
'payment_from_customer_address_format' => $paymentFromCustomerAddress,
|
||||||
'currency' => request()->currency ?? 1,
|
'currency' => request()->currency ?? 13,
|
||||||
'time_zone' => 'Asia/Kolkata',
|
'time_zone' => 'Asia/Kolkata',
|
||||||
'language' => 'en',
|
'language' => 'en',
|
||||||
'fiscal_year' => '1-12',
|
'fiscal_year' => '1-12',
|
||||||
|
|||||||
@ -483,8 +483,7 @@ class Estimate extends Model implements HasMedia
|
|||||||
'{ESTIMATE_DATE}' => $this->formattedEstimateDate,
|
'{ESTIMATE_DATE}' => $this->formattedEstimateDate,
|
||||||
'{ESTIMATE_EXPIRY_DATE}' => $this->formattedExpiryDate,
|
'{ESTIMATE_EXPIRY_DATE}' => $this->formattedExpiryDate,
|
||||||
'{ESTIMATE_NUMBER}' => $this->estimate_number,
|
'{ESTIMATE_NUMBER}' => $this->estimate_number,
|
||||||
'{PDF_LINK}' => $this->estimatePdfUrl,
|
'{ESTIMATE_REF_NUMBER}' => $this->reference_number,
|
||||||
'{TOTAL_AMOUNT}' => format_money_pdf($this->total, $this->customer->currency)
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -240,7 +240,7 @@ class Expense extends Model implements HasMedia
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($request->hasFile('attachment_receipt')) {
|
if ($request->hasFile('attachment_receipt')) {
|
||||||
$expense->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts', 'local');
|
$expense->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($request->customFields) {
|
if ($request->customFields) {
|
||||||
@ -262,12 +262,12 @@ class Expense extends Model implements HasMedia
|
|||||||
ExchangeRateLog::addExchangeRateLog($this);
|
ExchangeRateLog::addExchangeRateLog($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($request->is_attachment_receipt_removed) && $request->is_attachment_receipt_removed == "true") {
|
if (isset($request->is_attachment_receipt_removed) && (bool) $request->is_attachment_receipt_removed) {
|
||||||
$this->clearMediaCollection('receipts');
|
$this->clearMediaCollection('receipts');
|
||||||
}
|
}
|
||||||
if ($request->hasFile('attachment_receipt')) {
|
if ($request->hasFile('attachment_receipt')) {
|
||||||
$this->clearMediaCollection('receipts');
|
$this->clearMediaCollection('receipts');
|
||||||
$this->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts', 'local');
|
$this->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($request->customFields) {
|
if ($request->customFields) {
|
||||||
|
|||||||
@ -187,6 +187,16 @@ class Invoice extends Model implements HasMedia
|
|||||||
return Carbon::parse($this->invoice_date)->format($dateFormat);
|
return Carbon::parse($this->invoice_date)->format($dateFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function scopeWhereStatus($query, $status)
|
||||||
|
{
|
||||||
|
return $query->where('invoices.status', $status);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeWherePaidStatus($query, $status)
|
||||||
|
{
|
||||||
|
return $query->where('invoices.paid_status', $status);
|
||||||
|
}
|
||||||
|
|
||||||
public function scopeWhereDueStatus($query, $status)
|
public function scopeWhereDueStatus($query, $status)
|
||||||
{
|
{
|
||||||
return $query->whereIn('invoices.paid_status', [
|
return $query->whereIn('invoices.paid_status', [
|
||||||
@ -224,40 +234,6 @@ class Invoice extends Model implements HasMedia
|
|||||||
$query->orderBy($orderByField, $orderBy);
|
$query->orderBy($orderByField, $orderBy);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function scopeWhereStatus($query, $status)
|
|
||||||
{
|
|
||||||
return $query->where('invoices.status', $status);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function scopeWherePaidStatus($query, $status)
|
|
||||||
{
|
|
||||||
return $query->where('invoices.paid_status', $status);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function scopeWhereTabFilters($query, $status)
|
|
||||||
{
|
|
||||||
if ($status == "DRAFT") {
|
|
||||||
return $query->where('invoices.status', $status);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($status == "SENT") {
|
|
||||||
return $query->whereIn('invoices.status', [
|
|
||||||
self::STATUS_SENT,
|
|
||||||
self::STATUS_VIEWED,
|
|
||||||
self::STATUS_COMPLETED
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($status == 'DUE') {
|
|
||||||
return $query->whereIn('invoices.paid_status', [
|
|
||||||
self::STATUS_UNPAID,
|
|
||||||
self::STATUS_PARTIALLY_PAID,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function scopeApplyFilters($query, array $filters)
|
public function scopeApplyFilters($query, array $filters)
|
||||||
{
|
{
|
||||||
$filters = collect($filters);
|
$filters = collect($filters);
|
||||||
@ -273,11 +249,17 @@ class Invoice extends Model implements HasMedia
|
|||||||
$filters->get('status') == self::STATUS_PAID
|
$filters->get('status') == self::STATUS_PAID
|
||||||
) {
|
) {
|
||||||
$query->wherePaidStatus($filters->get('status'));
|
$query->wherePaidStatus($filters->get('status'));
|
||||||
|
} elseif ($filters->get('status') == 'DUE') {
|
||||||
|
$query->whereDueStatus($filters->get('status'));
|
||||||
} else {
|
} else {
|
||||||
$query->whereStatus($filters->get('status'));
|
$query->whereStatus($filters->get('status'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($filters->get('paid_status')) {
|
||||||
|
$query->wherePaidStatus($filters->get('status'));
|
||||||
|
}
|
||||||
|
|
||||||
if ($filters->get('invoice_id')) {
|
if ($filters->get('invoice_id')) {
|
||||||
$query->whereInvoice($filters->get('invoice_id'));
|
$query->whereInvoice($filters->get('invoice_id'));
|
||||||
}
|
}
|
||||||
@ -461,8 +443,7 @@ class Invoice extends Model implements HasMedia
|
|||||||
$data['invoice'] = $this->toArray();
|
$data['invoice'] = $this->toArray();
|
||||||
$data['customer'] = $this->customer->toArray();
|
$data['customer'] = $this->customer->toArray();
|
||||||
$data['company'] = Company::find($this->company_id);
|
$data['company'] = Company::find($this->company_id);
|
||||||
$data['subject'] = $this->getEmailString($data['subject']);
|
$data['body'] = $this->getEmailBody($data['body']);
|
||||||
$data['body'] = $this->getEmailString($data['body']);
|
|
||||||
$data['attach']['data'] = ($this->getEmailAttachmentSetting()) ? $this->getPDFData() : null;
|
$data['attach']['data'] = ($this->getEmailAttachmentSetting()) ? $this->getPDFData() : null;
|
||||||
|
|
||||||
return $data;
|
return $data;
|
||||||
@ -654,7 +635,7 @@ class Invoice extends Model implements HasMedia
|
|||||||
return $this->getFormattedString($this->notes);
|
return $this->getFormattedString($this->notes);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getEmailString($body)
|
public function getEmailBody($body)
|
||||||
{
|
{
|
||||||
$values = array_merge($this->getFieldsArray(), $this->getExtraFields());
|
$values = array_merge($this->getFieldsArray(), $this->getExtraFields());
|
||||||
|
|
||||||
@ -669,9 +650,7 @@ class Invoice extends Model implements HasMedia
|
|||||||
'{INVOICE_DATE}' => $this->formattedInvoiceDate,
|
'{INVOICE_DATE}' => $this->formattedInvoiceDate,
|
||||||
'{INVOICE_DUE_DATE}' => $this->formattedDueDate,
|
'{INVOICE_DUE_DATE}' => $this->formattedDueDate,
|
||||||
'{INVOICE_NUMBER}' => $this->invoice_number,
|
'{INVOICE_NUMBER}' => $this->invoice_number,
|
||||||
'{PDF_LINK}' => $this->invoicePdfUrl,
|
'{INVOICE_REF_NUMBER}' => $this->reference_number,
|
||||||
'{DUE_AMOUNT}' => format_money_pdf($this->due_amount, $this->customer->currency),
|
|
||||||
'{TOTAL_AMOUNT}' => format_money_pdf($this->total, $this->customer->currency)
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -435,8 +435,7 @@ class Payment extends Model implements HasMedia
|
|||||||
'{PAYMENT_DATE}' => $this->formattedPaymentDate,
|
'{PAYMENT_DATE}' => $this->formattedPaymentDate,
|
||||||
'{PAYMENT_MODE}' => $this->paymentMethod ? $this->paymentMethod->name : null,
|
'{PAYMENT_MODE}' => $this->paymentMethod ? $this->paymentMethod->name : null,
|
||||||
'{PAYMENT_NUMBER}' => $this->payment_number,
|
'{PAYMENT_NUMBER}' => $this->payment_number,
|
||||||
'{PDF_LINK}' => $this->paymentPdfUrl,
|
'{PAYMENT_AMOUNT}' => $this->reference_number,
|
||||||
'{PAYMENT_AMOUNT}' => format_money_pdf($this->amount, $this->customer->currency)
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -38,15 +38,15 @@
|
|||||||
"barryvdh/laravel-ide-helper": "^2.6",
|
"barryvdh/laravel-ide-helper": "^2.6",
|
||||||
"beyondcode/laravel-dump-server": "^1.0",
|
"beyondcode/laravel-dump-server": "^1.0",
|
||||||
"facade/ignition": "^2.3.6",
|
"facade/ignition": "^2.3.6",
|
||||||
"friendsofphp/php-cs-fixer": "^3.8",
|
"friendsofphp/php-cs-fixer": "^3.0",
|
||||||
"fakerphp/faker": "^1.9.1",
|
"fzaninotto/faker": "^1.9.1",
|
||||||
"mockery/mockery": "^1.3.1",
|
"mockery/mockery": "^1.3.1",
|
||||||
"nunomaduro/collision": "^5.0",
|
"nunomaduro/collision": "^5.0",
|
||||||
"pestphp/pest": "^1.0",
|
"pestphp/pest": "^1.0",
|
||||||
"pestphp/pest-plugin-faker": "^1.0",
|
"pestphp/pest-plugin-faker": "^1.0",
|
||||||
"pestphp/pest-plugin-laravel": "^1.0",
|
"pestphp/pest-plugin-laravel": "^1.0",
|
||||||
"pestphp/pest-plugin-parallel": "^0.2.1",
|
"pestphp/pest-plugin-parallel": "^0.2.1",
|
||||||
"phpunit/phpunit": "^9.3"
|
"phpunit/phpunit": "^9.0"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
@ -81,14 +81,11 @@
|
|||||||
"config": {
|
"config": {
|
||||||
"optimize-autoloader": true,
|
"optimize-autoloader": true,
|
||||||
"preferred-install": "dist",
|
"preferred-install": "dist",
|
||||||
"sort-packages": true,
|
"sort-packages": true
|
||||||
"allow-plugins": {
|
|
||||||
"pestphp/pest-plugin": true
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"extra": {
|
"extra": {
|
||||||
"laravel": {
|
"laravel": {
|
||||||
"dont-discover": []
|
"dont-discover": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
2361
composer.lock
generated
2361
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -71,7 +71,6 @@ return [
|
|||||||
["code" => "cs", "name" => "Czech"],
|
["code" => "cs", "name" => "Czech"],
|
||||||
["code" => "el", "name" => "Greek"],
|
["code" => "el", "name" => "Greek"],
|
||||||
["code" => "hr", "name" => "Crotian"],
|
["code" => "hr", "name" => "Crotian"],
|
||||||
["code" => "th", "name" => "ไทย"],
|
|
||||||
],
|
],
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@ -170,7 +170,7 @@ class CountriesTableSeeder extends Seeder
|
|||||||
['id' => 152,'code' => 'NR','name' => "Nauru",'phonecode' => 674],
|
['id' => 152,'code' => 'NR','name' => "Nauru",'phonecode' => 674],
|
||||||
['id' => 153,'code' => 'NP','name' => "Nepal",'phonecode' => 977],
|
['id' => 153,'code' => 'NP','name' => "Nepal",'phonecode' => 977],
|
||||||
['id' => 154,'code' => 'AN','name' => "Netherlands Antilles",'phonecode' => 599],
|
['id' => 154,'code' => 'AN','name' => "Netherlands Antilles",'phonecode' => 599],
|
||||||
['id' => 155,'code' => 'NL','name' => "Netherlands",'phonecode' => 31],
|
['id' => 155,'code' => 'NL','name' => "Netherlands The",'phonecode' => 31],
|
||||||
['id' => 156,'code' => 'NC','name' => "New Caledonia",'phonecode' => 687],
|
['id' => 156,'code' => 'NC','name' => "New Caledonia",'phonecode' => 687],
|
||||||
['id' => 157,'code' => 'NZ','name' => "New Zealand",'phonecode' => 64],
|
['id' => 157,'code' => 'NZ','name' => "New Zealand",'phonecode' => 64],
|
||||||
['id' => 158,'code' => 'NI','name' => "Nicaragua",'phonecode' => 505],
|
['id' => 158,'code' => 'NI','name' => "Nicaragua",'phonecode' => 505],
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
FROM php:8.0-fpm-alpine
|
FROM php:7.4-fpm-alpine
|
||||||
|
|
||||||
RUN apk add --no-cache \
|
RUN apk add --no-cache \
|
||||||
php8-bcmath
|
php7-bcmath
|
||||||
|
|
||||||
RUN docker-php-ext-install pdo pdo_mysql bcmath
|
RUN docker-php-ext-install pdo pdo_mysql bcmath
|
||||||
|
|
||||||
|
|||||||
475
package-lock.json
generated
475
package-lock.json
generated
@ -214,6 +214,23 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz",
|
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz",
|
||||||
"integrity": "sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ=="
|
"integrity": "sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ=="
|
||||||
},
|
},
|
||||||
|
"@rvxlab/tailwind-plugin-ios-full-height": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rvxlab/tailwind-plugin-ios-full-height/-/tailwind-plugin-ios-full-height-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-jPIxXn0raN/YTk8nXesqM+JbS2WWd5XaUk/MbaAgVDDPyYtsPfeN3B26xIhSa2oE2+JB66tegPUMSOmixzroXg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"@stripe/stripe-js": {
|
||||||
|
"version": "1.26.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.26.0.tgz",
|
||||||
|
"integrity": "sha512-4R1vC75yKaCVFARW3bhelf9+dKt4NP4iZY/sIjGK7AAMBVvZ47eG74NvsAIUdUnhOXSWFMjdFWqv+etk5BDW4g=="
|
||||||
|
},
|
||||||
|
"@tailwindcss/aspect-ratio": {
|
||||||
|
"version": "0.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/aspect-ratio/-/aspect-ratio-0.4.0.tgz",
|
||||||
|
"integrity": "sha512-WJu0I4PpqNPuutpaA9zDUq2JXR+lorZ7PbLcKNLmb6GL9/HLfC7w3CRsMhJF4BbYd/lkY6CfXOvkYpuGnZfkpQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@tailwindcss/forms": {
|
"@tailwindcss/forms": {
|
||||||
"version": "0.4.0",
|
"version": "0.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.4.0.tgz",
|
||||||
@ -223,6 +240,22 @@
|
|||||||
"mini-svg-data-uri": "^1.2.3"
|
"mini-svg-data-uri": "^1.2.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@tailwindcss/line-clamp": {
|
||||||
|
"version": "0.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.3.1.tgz",
|
||||||
|
"integrity": "sha512-pNr0T8LAc3TUx/gxCfQZRe9NB2dPEo/cedPHzUGIPxqDMhgjwNm6jYxww4W5l0zAsAddxr+XfZcqttGiFDgrGg=="
|
||||||
|
},
|
||||||
|
"@tailwindcss/typography": {
|
||||||
|
"version": "0.5.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.2.tgz",
|
||||||
|
"integrity": "sha512-coq8DBABRPFcVhVIk6IbKyyHUt7YTEC/C992tatFB+yEx5WGBQrCgsSFjxHUr8AWXphWckadVJbominEduYBqw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"lodash.castarray": "^4.4.0",
|
||||||
|
"lodash.isplainobject": "^4.0.6",
|
||||||
|
"lodash.merge": "^4.6.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@tiptap/core": {
|
"@tiptap/core": {
|
||||||
"version": "2.0.0-beta.99",
|
"version": "2.0.0-beta.99",
|
||||||
"resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.0.0-beta.99.tgz",
|
"resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.0.0-beta.99.tgz",
|
||||||
@ -386,6 +419,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.0.0-beta.13.tgz",
|
"resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.0.0-beta.13.tgz",
|
||||||
"integrity": "sha512-0EtAwuRldCAoFaL/iXgkRepEeOd55rPg5N4FQUN1xTwZT7PDofukP0DG/2jff/Uj17x4uTaJAa9qlFWuNnDvjw=="
|
"integrity": "sha512-0EtAwuRldCAoFaL/iXgkRepEeOd55rPg5N4FQUN1xTwZT7PDofukP0DG/2jff/Uj17x4uTaJAa9qlFWuNnDvjw=="
|
||||||
},
|
},
|
||||||
|
"@tiptap/extension-text-align": {
|
||||||
|
"version": "2.0.0-beta.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.0.0-beta.29.tgz",
|
||||||
|
"integrity": "sha512-FNGpl0tVtgG7AK9kVWF/+CGYHta05NpoME4/j6+vhNlZLBNXRA+AKg7W5T8UxmtaC9yGoJsBs2X8M9eCxWVaEQ=="
|
||||||
|
},
|
||||||
"@tiptap/starter-kit": {
|
"@tiptap/starter-kit": {
|
||||||
"version": "2.0.0-beta.97",
|
"version": "2.0.0-beta.97",
|
||||||
"resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.0.0-beta.97.tgz",
|
"resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.0.0-beta.97.tgz",
|
||||||
@ -537,6 +575,12 @@
|
|||||||
"@types/prosemirror-transform": "*"
|
"@types/prosemirror-transform": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@vitejs/plugin-vue": {
|
||||||
|
"version": "1.10.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-1.10.2.tgz",
|
||||||
|
"integrity": "sha512-/QJ0Z9qfhAFtKRY+r57ziY4BSbGUTGsPRMpB/Ron3QPwBZM4OZAZHdTa4a8PafCwU5DTatXG8TMDoP8z+oDqJw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@vue/compiler-core": {
|
"@vue/compiler-core": {
|
||||||
"version": "3.2.4",
|
"version": "3.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.4.tgz",
|
||||||
@ -558,6 +602,70 @@
|
|||||||
"@vue/shared": "3.2.4"
|
"@vue/shared": "3.2.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@vue/compiler-sfc": {
|
||||||
|
"version": "3.2.31",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz",
|
||||||
|
"integrity": "sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/parser": "^7.16.4",
|
||||||
|
"@vue/compiler-core": "3.2.31",
|
||||||
|
"@vue/compiler-dom": "3.2.31",
|
||||||
|
"@vue/compiler-ssr": "3.2.31",
|
||||||
|
"@vue/reactivity-transform": "3.2.31",
|
||||||
|
"@vue/shared": "3.2.31",
|
||||||
|
"estree-walker": "^2.0.2",
|
||||||
|
"magic-string": "^0.25.7",
|
||||||
|
"postcss": "^8.1.10",
|
||||||
|
"source-map": "^0.6.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/parser": {
|
||||||
|
"version": "7.17.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz",
|
||||||
|
"integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"@vue/compiler-core": {
|
||||||
|
"version": "3.2.31",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.31.tgz",
|
||||||
|
"integrity": "sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/parser": "^7.16.4",
|
||||||
|
"@vue/shared": "3.2.31",
|
||||||
|
"estree-walker": "^2.0.2",
|
||||||
|
"source-map": "^0.6.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@vue/compiler-dom": {
|
||||||
|
"version": "3.2.31",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz",
|
||||||
|
"integrity": "sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@vue/compiler-core": "3.2.31",
|
||||||
|
"@vue/shared": "3.2.31"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@vue/compiler-ssr": {
|
||||||
|
"version": "3.2.31",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.31.tgz",
|
||||||
|
"integrity": "sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@vue/compiler-dom": "3.2.31",
|
||||||
|
"@vue/shared": "3.2.31"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@vue/shared": {
|
||||||
|
"version": "3.2.31",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.31.tgz",
|
||||||
|
"integrity": "sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"@vue/compiler-ssr": {
|
"@vue/compiler-ssr": {
|
||||||
"version": "3.2.19",
|
"version": "3.2.19",
|
||||||
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.19.tgz",
|
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.19.tgz",
|
||||||
@ -607,6 +715,45 @@
|
|||||||
"@vue/shared": "3.2.4"
|
"@vue/shared": "3.2.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@vue/reactivity-transform": {
|
||||||
|
"version": "3.2.31",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.31.tgz",
|
||||||
|
"integrity": "sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/parser": "^7.16.4",
|
||||||
|
"@vue/compiler-core": "3.2.31",
|
||||||
|
"@vue/shared": "3.2.31",
|
||||||
|
"estree-walker": "^2.0.2",
|
||||||
|
"magic-string": "^0.25.7"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/parser": {
|
||||||
|
"version": "7.17.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz",
|
||||||
|
"integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"@vue/compiler-core": {
|
||||||
|
"version": "3.2.31",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.31.tgz",
|
||||||
|
"integrity": "sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/parser": "^7.16.4",
|
||||||
|
"@vue/shared": "3.2.31",
|
||||||
|
"estree-walker": "^2.0.2",
|
||||||
|
"source-map": "^0.6.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@vue/shared": {
|
||||||
|
"version": "3.2.31",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.31.tgz",
|
||||||
|
"integrity": "sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"@vue/ref-transform": {
|
"@vue/ref-transform": {
|
||||||
"version": "3.2.19",
|
"version": "3.2.19",
|
||||||
"resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.19.tgz",
|
"resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.19.tgz",
|
||||||
@ -677,6 +824,44 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.4.tgz",
|
||||||
"integrity": "sha512-j2j1MRmjalVKr3YBTxl/BClSIc8UQ8NnPpLYclxerK65JIowI4O7n8O8lElveEtEoHxy1d7BelPUDI0Q4bumqg=="
|
"integrity": "sha512-j2j1MRmjalVKr3YBTxl/BClSIc8UQ8NnPpLYclxerK65JIowI4O7n8O8lElveEtEoHxy1d7BelPUDI0Q4bumqg=="
|
||||||
},
|
},
|
||||||
|
"@vuelidate/components": {
|
||||||
|
"version": "1.1.20",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vuelidate/components/-/components-1.1.20.tgz",
|
||||||
|
"integrity": "sha512-25CLW+LM6LKKy3XMCD8L2VfaMB0rUHqXq3VtoCdsPWZyU5gw2PqZ763O4aJrDZzovK/1cWf9QTRzvspkIcQyxQ==",
|
||||||
|
"requires": {
|
||||||
|
"@vuelidate/core": "^2.0.0-alpha.40"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@vuelidate/core": {
|
||||||
|
"version": "2.0.0-alpha.40",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vuelidate/core/-/core-2.0.0-alpha.40.tgz",
|
||||||
|
"integrity": "sha512-f4Uo0yV2BHDi5+MXWDXRcqBv0u1Cqc/RudJLGqke3wLnIcH2r8sXEqRyuVoaN2KEPqbZiTFw/Uo50wx1J+ZDFQ==",
|
||||||
|
"requires": {
|
||||||
|
"vue-demi": "^0.12.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"vue-demi": {
|
||||||
|
"version": "0.12.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.5.tgz",
|
||||||
|
"integrity": "sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@vuelidate/validators": {
|
||||||
|
"version": "2.0.0-alpha.28",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vuelidate/validators/-/validators-2.0.0-alpha.28.tgz",
|
||||||
|
"integrity": "sha512-FLI4D6SfYas5gkRxc2Q8RU1Jv3mhO2wdNgYpnOEWdKB2S6vhy8ABFMXiyr4P764xY9zBmNg6OwceRfq8vYy6vA==",
|
||||||
|
"requires": {
|
||||||
|
"vue-demi": "^0.12.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"vue-demi": {
|
||||||
|
"version": "0.12.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.5.tgz",
|
||||||
|
"integrity": "sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"@vueuse/core": {
|
"@vueuse/core": {
|
||||||
"version": "6.0.0",
|
"version": "6.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-6.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-6.0.0.tgz",
|
||||||
@ -1240,6 +1425,174 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"esbuild": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-SQS8cO8xFEqevYlrHt6exIhK853Me4nZ4aMW6ieysInLa0FMAL+AKs87HYNRtR2YWRcEIqoXAHh+Ytt5/66qpg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"esbuild-android-64": "0.14.29",
|
||||||
|
"esbuild-android-arm64": "0.14.29",
|
||||||
|
"esbuild-darwin-64": "0.14.29",
|
||||||
|
"esbuild-darwin-arm64": "0.14.29",
|
||||||
|
"esbuild-freebsd-64": "0.14.29",
|
||||||
|
"esbuild-freebsd-arm64": "0.14.29",
|
||||||
|
"esbuild-linux-32": "0.14.29",
|
||||||
|
"esbuild-linux-64": "0.14.29",
|
||||||
|
"esbuild-linux-arm": "0.14.29",
|
||||||
|
"esbuild-linux-arm64": "0.14.29",
|
||||||
|
"esbuild-linux-mips64le": "0.14.29",
|
||||||
|
"esbuild-linux-ppc64le": "0.14.29",
|
||||||
|
"esbuild-linux-riscv64": "0.14.29",
|
||||||
|
"esbuild-linux-s390x": "0.14.29",
|
||||||
|
"esbuild-netbsd-64": "0.14.29",
|
||||||
|
"esbuild-openbsd-64": "0.14.29",
|
||||||
|
"esbuild-sunos-64": "0.14.29",
|
||||||
|
"esbuild-windows-32": "0.14.29",
|
||||||
|
"esbuild-windows-64": "0.14.29",
|
||||||
|
"esbuild-windows-arm64": "0.14.29"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"esbuild-android-64": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-tJuaN33SVZyiHxRaVTo1pwW+rn3qetJX/SRuc/83rrKYtyZG0XfsQ1ao1nEudIt9w37ZSNXR236xEfm2C43sbw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-android-arm64": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-D74dCv6yYnMTlofVy1JKiLM5JdVSQd60/rQfJSDP9qvRAI0laPXIG/IXY1RG6jobmFMUfL38PbFnCqyI/6fPXg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-darwin-64": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-+CJaRvfTkzs9t+CjGa0Oa28WoXa7EeLutQhxus+fFcu0MHhsBhlmeWHac3Cc/Sf/xPi1b2ccDFfzGYJCfV0RrA==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-darwin-arm64": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-5Wgz/+zK+8X2ZW7vIbwoZ613Vfr4A8HmIs1XdzRmdC1kG0n5EG5fvKk/jUxhNlrYPx1gSY7XadQ3l4xAManPSw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-freebsd-64": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-VTfS7Bm9QA12JK1YXF8+WyYOfvD7WMpbArtDj6bGJ5Sy5xp01c/q70Arkn596aGcGj0TvQRplaaCIrfBG1Wdtg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-freebsd-arm64": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-WP5L4ejwLWWvd3Fo2J5mlXvG3zQHaw5N1KxFGnUc4+2ZFZknP0ST63i0IQhpJLgEJwnQpXv2uZlU1iWZjFqEIg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-32": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-4myeOvFmQBWdI2U1dEBe2DCSpaZyjdQtmjUY11Zu2eQg4ynqLb8Y5mNjNU9UN063aVsCYYfbs8jbken/PjyidA==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-64": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-iaEuLhssReAKE7HMwxwFJFn7D/EXEs43fFy5CJeA4DGmU6JHh0qVJD2p/UP46DvUXLRKXsXw0i+kv5TdJ1w5pg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-arm": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-OXa9D9QL1hwrAnYYAHt/cXAuSCmoSqYfTW/0CEY0LgJNyTxJKtqc5mlwjAZAvgyjmha0auS/sQ0bXfGf2wAokQ==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-arm64": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-KYf7s8wDfUy+kjKymW3twyGT14OABjGHRkm9gPJ0z4BuvqljfOOUbq9qT3JYFnZJHOgkr29atT//hcdD0Pi7Mw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-mips64le": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-05jPtWQMsZ1aMGfHOvnR5KrTvigPbU35BtuItSSWLI2sJu5VrM8Pr9Owym4wPvA4153DFcOJ1EPN/2ujcDt54g==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-ppc64le": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-FYhBqn4Ir9xG+f6B5VIQVbRuM4S6qwy29dDNYFPoxLRnwTEKToIYIUESN1qHyUmIbfO0YB4phG2JDV2JDN9Kgw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-riscv64": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-eqZMqPehkb4nZcffnuOpXJQdGURGd6GXQ4ZsDHSWyIUaA+V4FpMBe+5zMPtXRD2N4BtyzVvnBko6K8IWWr36ew==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-s390x": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-o7EYajF1rC/4ho7kpSG3gENVx0o2SsHm7cJ5fvewWB/TEczWU7teDgusGSujxCYcMottE3zqa423VTglNTYhjg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-netbsd-64": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-/esN6tb6OBSot6+JxgeOZeBk6P8V/WdR3GKBFeFpSqhgw4wx7xWUqPrdx4XNpBVO7X4Ipw9SAqgBrWHlXfddww==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-openbsd-64": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-jUTdDzhEKrD0pLpjmk0UxwlfNJNg/D50vdwhrVcW/D26Vg0hVbthMfb19PJMatzclbK7cmgk1Nu0eNS+abzoHw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-sunos-64": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-EfhQN/XO+TBHTbkxwsxwA7EfiTHFe+MNDfxcf0nj97moCppD9JHPq48MLtOaDcuvrTYOcrMdJVeqmmeQ7doTcg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-windows-32": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-uoyb0YAJ6uWH4PYuYjfGNjvgLlb5t6b3zIaGmpWPOjgpr1Nb3SJtQiK4YCPGhONgfg2v6DcJgSbOteuKXhwqAw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-windows-64": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-X9cW/Wl95QjsH8WUyr3NqbmfdU72jCp71cH3pwPvI4CgBM2IeOUDdbt6oIGljPu2bf5eGDIo8K3Y3vvXCCTd8A==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-windows-arm64": {
|
||||||
|
"version": "0.14.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.29.tgz",
|
||||||
|
"integrity": "sha512-+O/PI+68fbUZPpl3eXhqGHTGK7DjLcexNnyJqtLZXOFwoAjaXlS5UBCvVcR3o2va+AqZTj8o6URaz8D2K+yfQQ==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
"escalade": {
|
"escalade": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
|
||||||
@ -1947,12 +2300,24 @@
|
|||||||
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
|
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
|
||||||
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
|
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
|
||||||
},
|
},
|
||||||
|
"lodash.castarray": {
|
||||||
|
"version": "4.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
|
||||||
|
"integrity": "sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"lodash.clonedeep": {
|
"lodash.clonedeep": {
|
||||||
"version": "4.5.0",
|
"version": "4.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
|
||||||
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
|
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"lodash.isplainobject": {
|
||||||
|
"version": "4.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
|
||||||
|
"integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"lodash.merge": {
|
"lodash.merge": {
|
||||||
"version": "4.6.2",
|
"version": "4.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
|
||||||
@ -2050,9 +2415,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"nanoid": {
|
"nanoid": {
|
||||||
"version": "3.1.30",
|
"version": "3.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
|
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz",
|
||||||
"integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ=="
|
"integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA=="
|
||||||
},
|
},
|
||||||
"natural-compare": {
|
"natural-compare": {
|
||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
@ -2205,6 +2570,22 @@
|
|||||||
"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
|
"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"pinia": {
|
||||||
|
"version": "2.0.13",
|
||||||
|
"resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.13.tgz",
|
||||||
|
"integrity": "sha512-B7rSqm1xNpwcPMnqns8/gVBfbbi7lWTByzS6aPZ4JOXSJD4Y531rZHDCoYWBwLyHY/8hWnXljgiXp6rRyrofcw==",
|
||||||
|
"requires": {
|
||||||
|
"@vue/devtools-api": "^6.1.4",
|
||||||
|
"vue-demi": "*"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@vue/devtools-api": {
|
||||||
|
"version": "6.1.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.1.4.tgz",
|
||||||
|
"integrity": "sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"postcss": {
|
"postcss": {
|
||||||
"version": "8.4.5",
|
"version": "8.4.5",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
|
||||||
@ -2508,6 +2889,15 @@
|
|||||||
"glob": "^7.1.3"
|
"glob": "^7.1.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"rollup": {
|
||||||
|
"version": "2.70.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz",
|
||||||
|
"integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"fsevents": "~2.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"rope-sequence": {
|
"rope-sequence": {
|
||||||
"version": "1.3.2",
|
"version": "1.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.2.tgz",
|
||||||
@ -2668,6 +3058,12 @@
|
|||||||
"has-flag": "^3.0.0"
|
"has-flag": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"supports-preserve-symlinks-flag": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"version": "6.7.2",
|
"version": "6.7.2",
|
||||||
"resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz",
|
||||||
@ -2934,12 +3330,80 @@
|
|||||||
"resolved": "https://registry.npmjs.org/v-money3/-/v-money3-3.16.1.tgz",
|
"resolved": "https://registry.npmjs.org/v-money3/-/v-money3-3.16.1.tgz",
|
||||||
"integrity": "sha512-U0GjmdybvEwfxCpZiTUbKugSglJbX6wxlyMeg0YJdLTAKlnjMRDph3hpNJlTlg5Gs8MQRpDVdaLysBjV749HLg=="
|
"integrity": "sha512-U0GjmdybvEwfxCpZiTUbKugSglJbX6wxlyMeg0YJdLTAKlnjMRDph3hpNJlTlg5Gs8MQRpDVdaLysBjV749HLg=="
|
||||||
},
|
},
|
||||||
|
"v-tooltip": {
|
||||||
|
"version": "4.0.0-beta.17",
|
||||||
|
"resolved": "https://registry.npmjs.org/v-tooltip/-/v-tooltip-4.0.0-beta.17.tgz",
|
||||||
|
"integrity": "sha512-d7v/6KEXQOtcj3NT3Z1LpbDv8SBh8JgbsD+3s/zGIGCxiXC2SoVW6wGV4X0MlCo97PiosibcSe+VKbFiy4AKnQ==",
|
||||||
|
"requires": {
|
||||||
|
"@popperjs/core": "^2.11.0",
|
||||||
|
"vue-resize": "^2.0.0-alpha.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@popperjs/core": {
|
||||||
|
"version": "2.11.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.4.tgz",
|
||||||
|
"integrity": "sha512-q/ytXxO5NKvyT37pmisQAItCFqA7FD/vNb8dgaJy3/630Fsc+Mz9/9f2SziBoIZ30TJooXyTwZmhi1zjXmObYg=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"v8-compile-cache": {
|
"v8-compile-cache": {
|
||||||
"version": "2.3.0",
|
"version": "2.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
|
||||||
"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
|
"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"vite": {
|
||||||
|
"version": "2.9.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/vite/-/vite-2.9.1.tgz",
|
||||||
|
"integrity": "sha512-vSlsSdOYGcYEJfkQ/NeLXgnRv5zZfpAsdztkIrs7AZHV8RCMZQkwjo4DS5BnrYTqoWqLoUe1Cah4aVO4oNNqCQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"esbuild": "^0.14.27",
|
||||||
|
"fsevents": "~2.3.2",
|
||||||
|
"postcss": "^8.4.12",
|
||||||
|
"resolve": "^1.22.0",
|
||||||
|
"rollup": "^2.59.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"is-core-module": {
|
||||||
|
"version": "2.8.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
|
||||||
|
"integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"has": "^1.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"postcss": {
|
||||||
|
"version": "8.4.12",
|
||||||
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz",
|
||||||
|
"integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"nanoid": "^3.3.1",
|
||||||
|
"picocolors": "^1.0.0",
|
||||||
|
"source-map-js": "^1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resolve": {
|
||||||
|
"version": "1.22.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
|
||||||
|
"integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"is-core-module": "^2.8.1",
|
||||||
|
"path-parse": "^1.0.7",
|
||||||
|
"supports-preserve-symlinks-flag": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"source-map-js": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"vue": {
|
"vue": {
|
||||||
"version": "3.2.4",
|
"version": "3.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/vue/-/vue-3.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/vue/-/vue-3.2.4.tgz",
|
||||||
@ -3002,6 +3466,11 @@
|
|||||||
"@vue/devtools-api": "^6.0.0-beta.7"
|
"@vue/devtools-api": "^6.0.0-beta.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"vue-resize": {
|
||||||
|
"version": "2.0.0-alpha.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-2.0.0-alpha.1.tgz",
|
||||||
|
"integrity": "sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg=="
|
||||||
|
},
|
||||||
"vue-router": {
|
"vue-router": {
|
||||||
"version": "4.0.11",
|
"version": "4.0.11",
|
||||||
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.11.tgz",
|
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.11.tgz",
|
||||||
|
|||||||
@ -27,7 +27,7 @@
|
|||||||
"vite": "^2.6.1"
|
"vite": "^2.6.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@headlessui/vue": "^1.5.0",
|
"@headlessui/vue": "^1.4.0",
|
||||||
"@heroicons/vue": "^1.0.1",
|
"@heroicons/vue": "^1.0.1",
|
||||||
"@popperjs/core": "^2.9.2",
|
"@popperjs/core": "^2.9.2",
|
||||||
"@stripe/stripe-js": "^1.21.2",
|
"@stripe/stripe-js": "^1.21.2",
|
||||||
@ -48,8 +48,7 @@
|
|||||||
"mini-svg-data-uri": "^1.3.3",
|
"mini-svg-data-uri": "^1.3.3",
|
||||||
"moment": "^2.29.1",
|
"moment": "^2.29.1",
|
||||||
"pinia": "^2.0.4",
|
"pinia": "^2.0.4",
|
||||||
"v-calendar": "3.0.0-alpha.8",
|
"v-money3": "^3.13.5",
|
||||||
"v-money3": "3.16.1",
|
|
||||||
"v-tooltip": "^4.0.0-alpha.1",
|
"v-tooltip": "^4.0.0-alpha.1",
|
||||||
"vue": "^3.2.0-beta.5",
|
"vue": "^3.2.0-beta.5",
|
||||||
"vue-flatpickr-component": "^9.0.3",
|
"vue-flatpickr-component": "^9.0.3",
|
||||||
|
|||||||
@ -64,7 +64,7 @@ function mergeExistingValues() {
|
|||||||
if (props.isEdit) {
|
if (props.isEdit) {
|
||||||
props.store[props.storeProp].fields.forEach((field) => {
|
props.store[props.storeProp].fields.forEach((field) => {
|
||||||
const existingIndex = props.store[props.storeProp].customFields.findIndex(
|
const existingIndex = props.store[props.storeProp].customFields.findIndex(
|
||||||
(f) => f.id == field.custom_field_id
|
(f) => f.id === field.custom_field_id
|
||||||
)
|
)
|
||||||
|
|
||||||
if (existingIndex > -1) {
|
if (existingIndex > -1) {
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import { computed } from 'vue'
|
|||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
modelValue: {
|
modelValue: {
|
||||||
type: String,
|
type: String,
|
||||||
default: moment().format('YYYY-MM-DD HH:mm'),
|
default: moment().format('YYYY-MM-DD hh:MM'),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -17,7 +17,18 @@
|
|||||||
<td class="px-5 py-4 text-left align-top">
|
<td class="px-5 py-4 text-left align-top">
|
||||||
<div class="flex justify-start">
|
<div class="flex justify-start">
|
||||||
<div
|
<div
|
||||||
class="flex items-center justify-center w-5 h-5 mt-2 mr-2 text-gray-300 cursor-move handle"
|
class="
|
||||||
|
flex
|
||||||
|
items-center
|
||||||
|
justify-center
|
||||||
|
w-5
|
||||||
|
h-5
|
||||||
|
mt-2
|
||||||
|
text-gray-300
|
||||||
|
cursor-move
|
||||||
|
handle
|
||||||
|
mr-2
|
||||||
|
"
|
||||||
>
|
>
|
||||||
<DragIcon />
|
<DragIcon />
|
||||||
</div>
|
</div>
|
||||||
@ -97,7 +108,7 @@
|
|||||||
|
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="ChevronDownIcon"
|
name="ChevronDownIcon"
|
||||||
class="w-4 h-4 ml-1 text-gray-500"
|
class="w-4 h-4 text-gray-500 ml-1"
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
@ -144,7 +155,7 @@
|
|||||||
<BaseContentPlaceholders v-if="loading">
|
<BaseContentPlaceholders v-if="loading">
|
||||||
<BaseContentPlaceholdersText
|
<BaseContentPlaceholdersText
|
||||||
:lines="1"
|
:lines="1"
|
||||||
class="w-24 h-8 border rounded-md"
|
class="w-24 h-8 rounded-md border"
|
||||||
/>
|
/>
|
||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
|
|
||||||
@ -164,7 +175,6 @@
|
|||||||
:ability="abilities.CREATE_INVOICE"
|
:ability="abilities.CREATE_INVOICE"
|
||||||
:store="store"
|
:store="store"
|
||||||
:store-prop="storeProp"
|
:store-prop="storeProp"
|
||||||
:discount="discount"
|
|
||||||
@update="updateTax"
|
@update="updateTax"
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@ -30,13 +30,24 @@
|
|||||||
<template v-if="userStore.hasAbilities(ability)" #action>
|
<template v-if="userStore.hasAbilities(ability)" #action>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="flex items-center justify-center w-full px-2 py-2 bg-gray-200 border-none outline-none cursor-pointer "
|
class="
|
||||||
|
flex
|
||||||
|
items-center
|
||||||
|
justify-center
|
||||||
|
w-full
|
||||||
|
px-2
|
||||||
|
cursor-pointer
|
||||||
|
py-2
|
||||||
|
bg-gray-200
|
||||||
|
border-none
|
||||||
|
outline-none
|
||||||
|
"
|
||||||
@click="openTaxModal"
|
@click="openTaxModal"
|
||||||
>
|
>
|
||||||
<BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" />
|
<BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" />
|
||||||
|
|
||||||
<label
|
<label
|
||||||
class="ml-2 text-sm leading-none cursor-pointer text-primary-400"
|
class="ml-2 text-sm leading-none text-primary-400 cursor-pointer"
|
||||||
>{{ $t('invoices.add_new_tax') }}</label
|
>{{ $t('invoices.add_new_tax') }}</label
|
||||||
>
|
>
|
||||||
</button>
|
</button>
|
||||||
@ -104,10 +115,6 @@ const props = defineProps({
|
|||||||
type: Number,
|
type: Number,
|
||||||
default: 0,
|
default: 0,
|
||||||
},
|
},
|
||||||
discountedTotal: {
|
|
||||||
type: Number,
|
|
||||||
default: 0,
|
|
||||||
},
|
|
||||||
currency: {
|
currency: {
|
||||||
type: [Object, String],
|
type: [Object, String],
|
||||||
required: true,
|
required: true,
|
||||||
@ -146,19 +153,19 @@ const filteredTypes = computed(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const taxAmount = computed(() => {
|
const taxAmount = computed(() => {
|
||||||
if (localTax.compound_tax && props.discountedTotal) {
|
if (localTax.compound_tax && props.total) {
|
||||||
return ((props.discountedTotal + props.totalTax) * localTax.percent) / 100
|
return ((props.total + props.totalTax) * localTax.percent) / 100
|
||||||
}
|
}
|
||||||
|
|
||||||
if (props.discountedTotal && localTax.percent) {
|
if (props.total && localTax.percent) {
|
||||||
return (props.discountedTotal * localTax.percent) / 100
|
return (props.total * localTax.percent) / 100
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
})
|
})
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => props.discountedTotal,
|
() => props.total,
|
||||||
() => {
|
() => {
|
||||||
updateRowTax()
|
updateRowTax()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,7 +29,14 @@
|
|||||||
|
|
||||||
<label
|
<label
|
||||||
v-else
|
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
|
<BaseFormatMoney
|
||||||
:amount="store.getSubTotal"
|
:amount="store.getSubTotal"
|
||||||
@ -59,7 +66,14 @@
|
|||||||
|
|
||||||
<label
|
<label
|
||||||
v-else-if="store[storeProp].tax_per_item === 'YES'"
|
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" />
|
<BaseFormatMoney :amount="tax.amount" :currency="defaultCurrency" />
|
||||||
</label>
|
</label>
|
||||||
@ -84,7 +98,7 @@
|
|||||||
<BaseContentPlaceholders v-if="isLoading">
|
<BaseContentPlaceholders v-if="isLoading">
|
||||||
<BaseContentPlaceholdersText
|
<BaseContentPlaceholdersText
|
||||||
:lines="1"
|
:lines="1"
|
||||||
class="w-24 h-8 border rounded-md"
|
class="w-24 h-8 rounded-md border"
|
||||||
/>
|
/>
|
||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
<div v-else class="flex" style="width: 140px" role="group">
|
<div v-else class="flex" style="width: 140px" role="group">
|
||||||
@ -100,7 +114,7 @@
|
|||||||
<BaseDropdown position="bottom-end">
|
<BaseDropdown position="bottom-end">
|
||||||
<template #activator>
|
<template #activator>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="p-2 rounded-none rounded-tr-md rounded-br-md"
|
class="rounded-tr-md rounded-br-md p-2 rounded-none"
|
||||||
type="button"
|
type="button"
|
||||||
variant="white"
|
variant="white"
|
||||||
>
|
>
|
||||||
@ -113,7 +127,7 @@
|
|||||||
|
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="ChevronDownIcon"
|
name="ChevronDownIcon"
|
||||||
class="w-4 h-4 ml-1 text-gray-500"
|
class="w-4 h-4 text-gray-500 ml-1"
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
@ -166,7 +180,15 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<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">
|
<BaseContentPlaceholders v-if="isLoading">
|
||||||
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
||||||
@ -182,7 +204,14 @@
|
|||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
<label
|
<label
|
||||||
v-else
|
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" />
|
<BaseFormatMoney :amount="store.getTotal" :currency="defaultCurrency" />
|
||||||
</label>
|
</label>
|
||||||
@ -305,7 +334,6 @@ function selectPercentage() {
|
|||||||
|
|
||||||
function onSelectTax(selectedTax) {
|
function onSelectTax(selectedTax) {
|
||||||
let amount = 0
|
let amount = 0
|
||||||
|
|
||||||
if (selectedTax.compound_tax && props.store.getSubtotalWithDiscount) {
|
if (selectedTax.compound_tax && props.store.getSubtotalWithDiscount) {
|
||||||
amount = Math.round(
|
amount = Math.round(
|
||||||
((props.store.getSubtotalWithDiscount + props.store.getTotalSimpleTax) *
|
((props.store.getSubtotalWithDiscount + props.store.getTotalSimpleTax) *
|
||||||
|
|||||||
@ -48,24 +48,6 @@
|
|||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
|
||||||
<BaseInputGroup
|
|
||||||
:label="$tc('settings.company_info.company_slug')"
|
|
||||||
:help-text="$t('settings.company_info.company_slug_help_text')"
|
|
||||||
:error="
|
|
||||||
v$.newCompanyForm.slug.$error &&
|
|
||||||
v$.newCompanyForm.slug.$errors[0].$message
|
|
||||||
"
|
|
||||||
:content-loading="isFetchingInitialData"
|
|
||||||
required
|
|
||||||
>
|
|
||||||
<BaseInput
|
|
||||||
v-model="newCompanyForm.slug"
|
|
||||||
:invalid="v$.newCompanyForm.slug.$error"
|
|
||||||
:content-loading="isFetchingInitialData"
|
|
||||||
@input="v$.newCompanyForm.slug.$touch()"
|
|
||||||
/>
|
|
||||||
</BaseInputGroup>
|
|
||||||
|
|
||||||
<BaseInputGroup
|
<BaseInputGroup
|
||||||
:content-loading="isFetchingInitialData"
|
:content-loading="isFetchingInitialData"
|
||||||
:label="$tc('settings.company_info.country')"
|
:label="$tc('settings.company_info.country')"
|
||||||
@ -148,7 +130,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { useModalStore } from '@/scripts/stores/modal'
|
import { useModalStore } from '@/scripts/stores/modal'
|
||||||
import { computed, onMounted, ref, reactive, watch } from 'vue'
|
import { computed, onMounted, ref, reactive } from 'vue'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
import { required, minLength, helpers } from '@vuelidate/validators'
|
import { required, minLength, helpers } from '@vuelidate/validators'
|
||||||
import { useVuelidate } from '@vuelidate/core'
|
import { useVuelidate } from '@vuelidate/core'
|
||||||
@ -170,7 +152,6 @@ let companyLogoName = ref(null)
|
|||||||
|
|
||||||
const newCompanyForm = reactive({
|
const newCompanyForm = reactive({
|
||||||
name: null,
|
name: null,
|
||||||
slug: null,
|
|
||||||
currency: '',
|
currency: '',
|
||||||
address: {
|
address: {
|
||||||
country_id: null,
|
country_id: null,
|
||||||
@ -181,9 +162,6 @@ const modalActive = computed(() => {
|
|||||||
return modalStore.active && modalStore.componentName === 'CompanyModal'
|
return modalStore.active && modalStore.componentName === 'CompanyModal'
|
||||||
})
|
})
|
||||||
|
|
||||||
const slugValidator = (value) => {
|
|
||||||
return value == slugify(value)
|
|
||||||
}
|
|
||||||
const rules = {
|
const rules = {
|
||||||
newCompanyForm: {
|
newCompanyForm: {
|
||||||
name: {
|
name: {
|
||||||
@ -193,17 +171,6 @@ const rules = {
|
|||||||
minLength(3)
|
minLength(3)
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
slug: {
|
|
||||||
required: helpers.withMessage(t('validation.required'), required),
|
|
||||||
minLength: helpers.withMessage(
|
|
||||||
t('validation.name_min_length', { count: 3 }),
|
|
||||||
minLength(3)
|
|
||||||
),
|
|
||||||
slugValidator: helpers.withMessage(
|
|
||||||
t('validation.invalid_slug'),
|
|
||||||
slugValidator
|
|
||||||
),
|
|
||||||
},
|
|
||||||
address: {
|
address: {
|
||||||
country_id: {
|
country_id: {
|
||||||
required: helpers.withMessage(t('validation.required'), required),
|
required: helpers.withMessage(t('validation.required'), required),
|
||||||
@ -276,7 +243,6 @@ async function submitCompanyData() {
|
|||||||
|
|
||||||
function resetNewCompanyForm() {
|
function resetNewCompanyForm() {
|
||||||
newCompanyForm.name = ''
|
newCompanyForm.name = ''
|
||||||
newCompanyForm.slug = ''
|
|
||||||
newCompanyForm.currency = ''
|
newCompanyForm.currency = ''
|
||||||
newCompanyForm.address.country_id = ''
|
newCompanyForm.address.country_id = ''
|
||||||
|
|
||||||
@ -291,24 +257,4 @@ function closeCompanyModal() {
|
|||||||
v$.value.$reset()
|
v$.value.$reset()
|
||||||
}, 300)
|
}, 300)
|
||||||
}
|
}
|
||||||
|
|
||||||
// watcher for if change company name then auto fill company slug value
|
|
||||||
watch(
|
|
||||||
() => newCompanyForm.name,
|
|
||||||
(currentValue) => {
|
|
||||||
newCompanyForm.slug = slugify(currentValue)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
function slugify(string) {
|
|
||||||
return string
|
|
||||||
.toString()
|
|
||||||
.trim()
|
|
||||||
.toLowerCase()
|
|
||||||
.replace(/\s+/g, '-')
|
|
||||||
.replace(/[^\w\-]+/g, '')
|
|
||||||
.replace(/\-\-+/g, '-')
|
|
||||||
.replace(/^-+/, '')
|
|
||||||
.replace(/-+$/, '')
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -15,13 +15,6 @@
|
|||||||
bg-gradient-to-r
|
bg-gradient-to-r
|
||||||
from-primary-500
|
from-primary-500
|
||||||
to-primary-400
|
to-primary-400
|
||||||
dark:from-gray-700/70 dark:to-gray-800/70
|
|
||||||
bg-primary-500
|
|
||||||
dark:bg-transparent
|
|
||||||
dark:backdrop-blur-xl
|
|
||||||
dark:shadow-glass
|
|
||||||
dark:border
|
|
||||||
dark:border-white/10
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<router-link
|
<router-link
|
||||||
@ -60,7 +53,6 @@
|
|||||||
cursor-pointer
|
cursor-pointer
|
||||||
md:hidden md:ml-0
|
md:hidden md:ml-0
|
||||||
hover:bg-gray-100
|
hover:bg-gray-100
|
||||||
dark:bg-gray-800 dark:border-gray-500 dark:border
|
|
||||||
"
|
"
|
||||||
@click.prevent="onToggle"
|
@click.prevent="onToggle"
|
||||||
>
|
>
|
||||||
@ -151,7 +143,7 @@
|
|||||||
<template #activator>
|
<template #activator>
|
||||||
<img
|
<img
|
||||||
:src="previewAvatar"
|
:src="previewAvatar"
|
||||||
class="block w-8 h-8 rounded md:h-9 md:w-9 object-cover"
|
class="block w-8 h-8 rounded md:h-9 md:w-9"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@ -15,9 +15,7 @@
|
|||||||
leave-from="opacity-100"
|
leave-from="opacity-100"
|
||||||
leave-to="opacity-0"
|
leave-to="opacity-0"
|
||||||
>
|
>
|
||||||
<DialogOverlay
|
<DialogOverlay class="fixed inset-0 bg-gray-600 bg-opacity-75" />
|
||||||
class="fixed inset-0 bg-gray-600 bg-opacity-75 dark:bg-gray-900/90"
|
|
||||||
/>
|
|
||||||
</TransitionChild>
|
</TransitionChild>
|
||||||
|
|
||||||
<TransitionChild
|
<TransitionChild
|
||||||
@ -29,9 +27,7 @@
|
|||||||
leave-from="translate-x-0"
|
leave-from="translate-x-0"
|
||||||
leave-to="-translate-x-full"
|
leave-to="-translate-x-full"
|
||||||
>
|
>
|
||||||
<div
|
<div class="relative flex flex-col flex-1 w-full max-w-xs bg-white">
|
||||||
class="relative flex flex-col flex-1 w-full max-w-xs bg-white dark:bg-gray-800"
|
|
||||||
>
|
|
||||||
<TransitionChild
|
<TransitionChild
|
||||||
as="template"
|
as="template"
|
||||||
enter="ease-in-out duration-300"
|
enter="ease-in-out duration-300"
|
||||||
@ -44,17 +40,18 @@
|
|||||||
<div class="absolute top-0 right-0 pt-2 -mr-12">
|
<div class="absolute top-0 right-0 pt-2 -mr-12">
|
||||||
<button
|
<button
|
||||||
class="
|
class="
|
||||||
flex
|
flex
|
||||||
items-center
|
items-center
|
||||||
justify-center
|
justify-center
|
||||||
w-10
|
w-10
|
||||||
h-10
|
h-10
|
||||||
ml-1
|
ml-1
|
||||||
rounded-full
|
rounded-full
|
||||||
focus:outline-none
|
focus:outline-none
|
||||||
focus:ring-2
|
focus:ring-2
|
||||||
focus:ring-inset
|
focus:ring-inset
|
||||||
focus:ring-white"
|
focus:ring-white
|
||||||
|
"
|
||||||
@click="globalStore.setSidebarVisibility(false)"
|
@click="globalStore.setSidebarVisibility(false)"
|
||||||
>
|
>
|
||||||
<span class="sr-only">Close sidebar</span>
|
<span class="sr-only">Close sidebar</span>
|
||||||
@ -85,8 +82,8 @@
|
|||||||
:to="item.link"
|
:to="item.link"
|
||||||
:class="[
|
:class="[
|
||||||
hasActiveUrl(item.link)
|
hasActiveUrl(item.link)
|
||||||
? 'text-primary-500 border-primary-500 bg-gray-100 dark:shadow-glass dark:backdrop-blur-xl dark:hover:bg-gray-700 dark:bg-gray-700/50 dark:text-primary-400 dark:font-medium'
|
? 'text-primary-500 border-primary-500 bg-gray-100 '
|
||||||
: 'text-black dark:text-gray-300',
|
: 'text-black',
|
||||||
'cursor-pointer px-0 pl-4 py-3 border-transparent flex items-center border-l-4 border-solid text-sm not-italic font-medium',
|
'cursor-pointer px-0 pl-4 py-3 border-transparent flex items-center border-l-4 border-solid text-sm not-italic font-medium',
|
||||||
]"
|
]"
|
||||||
@click="globalStore.setSidebarVisibility(false)"
|
@click="globalStore.setSidebarVisibility(false)"
|
||||||
@ -103,10 +100,6 @@
|
|||||||
/>
|
/>
|
||||||
{{ $t(item.title) }}
|
{{ $t(item.title) }}
|
||||||
</router-link>
|
</router-link>
|
||||||
<LightDarkSwitch
|
|
||||||
:show-label="false"
|
|
||||||
class="absolute right-6 top-6 !w-auto"
|
|
||||||
/>
|
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -120,16 +113,17 @@
|
|||||||
<!-- DESKTOP MENU -->
|
<!-- DESKTOP MENU -->
|
||||||
<div
|
<div
|
||||||
class="
|
class="
|
||||||
hidden
|
hidden
|
||||||
w-56
|
w-56
|
||||||
h-screen
|
h-screen
|
||||||
bg-white
|
pb-32
|
||||||
border-r border-gray-200 border-solid
|
overflow-y-auto
|
||||||
xl:w-64
|
bg-white
|
||||||
md:fixed md:flex md:flex-col md:inset-y-0
|
border-r border-gray-200 border-solid
|
||||||
pt-16
|
xl:w-64
|
||||||
dark:border-gray-800
|
md:fixed md:flex md:flex-col md:inset-y-0
|
||||||
dark:bg-gray-800/80"
|
pt-16
|
||||||
|
"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
v-for="menu in globalStore.menuGroups"
|
v-for="menu in globalStore.menuGroups"
|
||||||
@ -142,8 +136,8 @@
|
|||||||
:to="item.link"
|
:to="item.link"
|
||||||
:class="[
|
:class="[
|
||||||
hasActiveUrl(item.link)
|
hasActiveUrl(item.link)
|
||||||
? 'text-primary-500 border-primary-500 bg-gray-100 dark:border-primary-400 dark:shadow-glass dark:backdrop-blur-xl dark:hover:bg-gray-700 dark:bg-gray-700/50 dark:text-primary-400 dark:font-medium'
|
? 'text-primary-500 border-primary-500 bg-gray-100 '
|
||||||
: 'text-black dark:hover:bg-transparent dark:hover:text-white dark:text-gray-300',
|
: 'text-black',
|
||||||
'cursor-pointer px-0 pl-6 hover:bg-gray-50 py-3 group flex items-center border-l-4 border-solid border-transparent text-sm not-italic font-medium',
|
'cursor-pointer px-0 pl-6 hover:bg-gray-50 py-3 group flex items-center border-l-4 border-solid border-transparent text-sm not-italic font-medium',
|
||||||
]"
|
]"
|
||||||
>
|
>
|
||||||
@ -151,8 +145,8 @@
|
|||||||
:name="item.icon"
|
:name="item.icon"
|
||||||
:class="[
|
:class="[
|
||||||
hasActiveUrl(item.link)
|
hasActiveUrl(item.link)
|
||||||
? 'text-primary-500 group-hover:text-primary-500 dark:text-primary-400 dark:group-hover:text-primary-500 '
|
? 'text-primary-500 group-hover:text-primary-500 '
|
||||||
: 'text-gray-400 group-hover:text-black dark:text-gray-400 dark:group-hover:text-white',
|
: 'text-gray-400 group-hover:text-black',
|
||||||
'mr-4 shrink-0 h-5 w-5 ',
|
'mr-4 shrink-0 h-5 w-5 ',
|
||||||
]"
|
]"
|
||||||
/>
|
/>
|
||||||
@ -160,9 +154,6 @@
|
|||||||
{{ $t(item.title) }}
|
{{ $t(item.title) }}
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
<LightDarkSwitch
|
|
||||||
class="absolute bottom-0 py-4 border-t border-gray-200 dark:border-gray-700"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -178,7 +169,6 @@ import {
|
|||||||
|
|
||||||
import { useRoute } from 'vue-router'
|
import { useRoute } from 'vue-router'
|
||||||
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
||||||
import LightDarkSwitch from '@/scripts/components/LightDarkSwitcher.vue'
|
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const globalStore = useGlobalStore()
|
const globalStore = useGlobalStore()
|
||||||
|
|||||||
@ -184,20 +184,6 @@ export const useCompanyStore = (useWindow = false) => {
|
|||||||
setDefaultCurrency(data) {
|
setDefaultCurrency(data) {
|
||||||
this.defaultCurrency = data.currency
|
this.defaultCurrency = data.currency
|
||||||
},
|
},
|
||||||
|
|
||||||
checkCompanyHasCurrencyTransactions() {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
axios
|
|
||||||
.get(`/api/v1/company/has-transactions`)
|
|
||||||
.then((response) => {
|
|
||||||
resolve(response)
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
handleError(err)
|
|
||||||
reject(err)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
})()
|
})()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,7 +34,6 @@ export const useGlobalStore = (useWindow = false) => {
|
|||||||
isAppLoaded: false,
|
isAppLoaded: false,
|
||||||
isSidebarOpen: false,
|
isSidebarOpen: false,
|
||||||
areCurrenciesLoading: false,
|
areCurrenciesLoading: false,
|
||||||
isDarkModeOn: false,
|
|
||||||
|
|
||||||
downloadReport: null,
|
downloadReport: null,
|
||||||
}),
|
}),
|
||||||
@ -71,8 +70,8 @@ export const useGlobalStore = (useWindow = false) => {
|
|||||||
moduleStore.apiToken = response.data.global_settings.api_token
|
moduleStore.apiToken = response.data.global_settings.api_token
|
||||||
moduleStore.enableModules = response.data.modules
|
moduleStore.enableModules = response.data.modules
|
||||||
|
|
||||||
// company store
|
// company store
|
||||||
companyStore.companies = response.data.companies
|
companyStore.companies = response.data.companies
|
||||||
companyStore.selectedCompany = response.data.current_company
|
companyStore.selectedCompany = response.data.current_company
|
||||||
companyStore.setSelectedCompany(response.data.current_company)
|
companyStore.setSelectedCompany(response.data.current_company)
|
||||||
companyStore.selectedCompanySettings =
|
companyStore.selectedCompanySettings =
|
||||||
|
|||||||
@ -32,8 +32,6 @@
|
|||||||
:content-loading="isLoading"
|
:content-loading="isLoading"
|
||||||
:calendar-button="true"
|
:calendar-button="true"
|
||||||
calendar-button-icon="calendar"
|
calendar-button-icon="calendar"
|
||||||
:show-extra-options="true"
|
|
||||||
:source-date="estimateStore.newEstimate.estimate_date"
|
|
||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
|
||||||
|
|||||||
@ -34,24 +34,6 @@
|
|||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
|
||||||
<BaseInputGroup
|
|
||||||
:label="$tc('wizard.company_slug')"
|
|
||||||
:help-text="$t('wizard.company_slug_help_text')"
|
|
||||||
:error="
|
|
||||||
v$.companyForm.slug.$error &&
|
|
||||||
v$.companyForm.slug.$errors[0].$message
|
|
||||||
"
|
|
||||||
required
|
|
||||||
>
|
|
||||||
<BaseInput
|
|
||||||
v-model="companyForm.slug"
|
|
||||||
:invalid="v$.companyForm.slug.$error"
|
|
||||||
type="text"
|
|
||||||
name="slug"
|
|
||||||
@input="v$.companyForm.slug.$touch()"
|
|
||||||
/>
|
|
||||||
</BaseInputGroup>
|
|
||||||
|
|
||||||
<BaseInputGroup
|
<BaseInputGroup
|
||||||
:label="$t('wizard.country')"
|
:label="$t('wizard.country')"
|
||||||
:error="
|
:error="
|
||||||
@ -75,7 +57,9 @@
|
|||||||
track-by="name"
|
track-by="name"
|
||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid grid-cols-1 gap-4 mb-4 md:grid-cols-2 md:mb-6">
|
||||||
<BaseInputGroup :label="$t('wizard.state')">
|
<BaseInputGroup :label="$t('wizard.state')">
|
||||||
<BaseInput
|
<BaseInput
|
||||||
v-model="companyForm.address.state"
|
v-model="companyForm.address.state"
|
||||||
@ -160,9 +144,9 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, onMounted, reactive, watch } from 'vue'
|
import { ref, computed, onMounted, reactive } from 'vue'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
import { required, minLength, maxLength, helpers } from '@vuelidate/validators'
|
import { required, maxLength, helpers } from '@vuelidate/validators'
|
||||||
import { useVuelidate } from '@vuelidate/core'
|
import { useVuelidate } from '@vuelidate/core'
|
||||||
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
||||||
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
||||||
@ -178,7 +162,6 @@ let logoFileName = ref(null)
|
|||||||
|
|
||||||
const companyForm = reactive({
|
const companyForm = reactive({
|
||||||
name: null,
|
name: null,
|
||||||
slug: null,
|
|
||||||
address: {
|
address: {
|
||||||
address_street_1: '',
|
address_street_1: '',
|
||||||
address_street_2: '',
|
address_street_2: '',
|
||||||
@ -205,28 +188,10 @@ onMounted(async () => {
|
|||||||
})?.id
|
})?.id
|
||||||
})
|
})
|
||||||
|
|
||||||
const slugValidator = (value) => {
|
|
||||||
return value == slugify(value)
|
|
||||||
}
|
|
||||||
const rules = {
|
const rules = {
|
||||||
companyForm: {
|
companyForm: {
|
||||||
name: {
|
name: {
|
||||||
required: helpers.withMessage(t('validation.required'), required),
|
required: helpers.withMessage(t('validation.required'), required),
|
||||||
minLength: helpers.withMessage(
|
|
||||||
t('validation.name_min_length', { count: 3 }),
|
|
||||||
minLength(3)
|
|
||||||
),
|
|
||||||
},
|
|
||||||
slug: {
|
|
||||||
required: helpers.withMessage(t('validation.required'), required),
|
|
||||||
minLength: helpers.withMessage(
|
|
||||||
t('validation.name_min_length', { count: 3 }),
|
|
||||||
minLength(3)
|
|
||||||
),
|
|
||||||
slugValidator: helpers.withMessage(
|
|
||||||
t('validation.invalid_slug'),
|
|
||||||
slugValidator
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
address: {
|
address: {
|
||||||
country_id: {
|
country_id: {
|
||||||
@ -284,24 +249,4 @@ async function next() {
|
|||||||
emit('next', 7)
|
emit('next', 7)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// watcher for if change company name then auto fill company slug value
|
|
||||||
watch(
|
|
||||||
() => companyForm.name,
|
|
||||||
(currentValue) => {
|
|
||||||
companyForm.slug = slugify(currentValue)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
function slugify(string) {
|
|
||||||
return string
|
|
||||||
.toString()
|
|
||||||
.trim()
|
|
||||||
.toLowerCase()
|
|
||||||
.replace(/\s+/g, '-')
|
|
||||||
.replace(/[^\w\-]+/g, '')
|
|
||||||
.replace(/\-\-+/g, '-')
|
|
||||||
.replace(/^-+/, '')
|
|
||||||
.replace(/-+$/, '')
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -56,7 +56,7 @@
|
|||||||
<BaseMultiselect
|
<BaseMultiselect
|
||||||
v-model="filters.status"
|
v-model="filters.status"
|
||||||
:groups="true"
|
:groups="true"
|
||||||
:options="invoiceStatus"
|
:options="status"
|
||||||
searchable
|
searchable
|
||||||
:placeholder="$t('general.select_a_status')"
|
:placeholder="$t('general.select_a_status')"
|
||||||
@update:modelValue="setActiveTab"
|
@update:modelValue="setActiveTab"
|
||||||
@ -130,27 +130,11 @@
|
|||||||
"
|
"
|
||||||
>
|
>
|
||||||
<!-- Tabs -->
|
<!-- Tabs -->
|
||||||
<BaseTabGroup
|
<BaseTabGroup class="-mb-5" @change="setStatusFilter">
|
||||||
class="-mb-5"
|
<BaseTab :title="$t('general.all')" filter="" />
|
||||||
:selected-index="selectedIndex"
|
<BaseTab :title="$t('general.draft')" filter="DRAFT" />
|
||||||
@change="changeTabStatus"
|
<BaseTab :title="$t('general.sent')" filter="SENT" />
|
||||||
>
|
<BaseTab :title="$t('general.due')" filter="DUE" />
|
||||||
<BaseTab
|
|
||||||
:title="invoiceTabStatus[0].title"
|
|
||||||
:tab-status="invoiceTabStatus[0].value"
|
|
||||||
/>
|
|
||||||
<BaseTab
|
|
||||||
:title="invoiceTabStatus[1].title"
|
|
||||||
:tab-status="invoiceTabStatus[1].value"
|
|
||||||
/>
|
|
||||||
<BaseTab
|
|
||||||
:title="invoiceTabStatus[2].title"
|
|
||||||
:tab-status="invoiceTabStatus[2].value"
|
|
||||||
/>
|
|
||||||
<BaseTab
|
|
||||||
:title="invoiceTabStatus[3].title"
|
|
||||||
:tab-status="invoiceTabStatus[3].value"
|
|
||||||
/>
|
|
||||||
</BaseTabGroup>
|
</BaseTabGroup>
|
||||||
|
|
||||||
<BaseDropdown
|
<BaseDropdown
|
||||||
@ -305,10 +289,10 @@ const utils = inject('$utils')
|
|||||||
const table = ref(null)
|
const table = ref(null)
|
||||||
const showFilters = ref(false)
|
const showFilters = ref(false)
|
||||||
|
|
||||||
const invoiceStatus = ref([
|
const status = ref([
|
||||||
{
|
{
|
||||||
label: 'Status',
|
label: 'Status',
|
||||||
options: ['DRAFT', 'SENT', 'VIEWED', 'COMPLETED'],
|
options: ['DRAFT', 'DUE', 'SENT', 'VIEWED', 'COMPLETED'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Paid Status',
|
label: 'Paid Status',
|
||||||
@ -316,29 +300,10 @@ const invoiceStatus = ref([
|
|||||||
},
|
},
|
||||||
,
|
,
|
||||||
])
|
])
|
||||||
|
|
||||||
const invoiceTabStatus = {
|
|
||||||
0: {
|
|
||||||
title: t('general.all'),
|
|
||||||
value: '',
|
|
||||||
},
|
|
||||||
1: {
|
|
||||||
title: t('general.draft'),
|
|
||||||
value: 'DRAFT',
|
|
||||||
},
|
|
||||||
2: {
|
|
||||||
title: t('general.sent'),
|
|
||||||
value: 'SENT',
|
|
||||||
},
|
|
||||||
3: {
|
|
||||||
title: t('general.due'),
|
|
||||||
value: 'DUE',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
const isRequestOngoing = ref(true)
|
const isRequestOngoing = ref(true)
|
||||||
|
const activeTab = ref('general.draft')
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
const selectedIndex = ref(0)
|
|
||||||
|
|
||||||
let filters = reactive({
|
let filters = reactive({
|
||||||
customer_id: '',
|
customer_id: '',
|
||||||
@ -346,7 +311,6 @@ let filters = reactive({
|
|||||||
from_date: '',
|
from_date: '',
|
||||||
to_date: '',
|
to_date: '',
|
||||||
invoice_number: '',
|
invoice_number: '',
|
||||||
tab_status: '',
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const showEmptyScreen = computed(
|
const showEmptyScreen = computed(
|
||||||
@ -437,7 +401,6 @@ async function fetchData({ page, filter, sort }) {
|
|||||||
from_date: filters.from_date,
|
from_date: filters.from_date,
|
||||||
to_date: filters.to_date,
|
to_date: filters.to_date,
|
||||||
invoice_number: filters.invoice_number,
|
invoice_number: filters.invoice_number,
|
||||||
tab_status: filters.tab_status,
|
|
||||||
orderByField: sort.fieldName || 'created_at',
|
orderByField: sort.fieldName || 'created_at',
|
||||||
orderBy: sort.order || 'desc',
|
orderBy: sort.order || 'desc',
|
||||||
page,
|
page,
|
||||||
@ -460,9 +423,29 @@ async function fetchData({ page, filter, sort }) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function changeTabStatus(val, index) {
|
function setStatusFilter(val) {
|
||||||
filters.tab_status = val['tab-status']
|
if (activeTab.value == val.title) {
|
||||||
selectedIndex.value = index
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
activeTab.value = val.title
|
||||||
|
|
||||||
|
switch (val.title) {
|
||||||
|
case t('general.draft'):
|
||||||
|
filters.status = 'DRAFT'
|
||||||
|
break
|
||||||
|
case t('general.sent'):
|
||||||
|
filters.status = 'SENT'
|
||||||
|
break
|
||||||
|
|
||||||
|
case t('general.due'):
|
||||||
|
filters.status = 'DUE'
|
||||||
|
break
|
||||||
|
|
||||||
|
default:
|
||||||
|
filters.status = ''
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setFilters() {
|
function setFilters() {
|
||||||
@ -480,6 +463,8 @@ function clearFilter() {
|
|||||||
filters.from_date = ''
|
filters.from_date = ''
|
||||||
filters.to_date = ''
|
filters.to_date = ''
|
||||||
filters.invoice_number = ''
|
filters.invoice_number = ''
|
||||||
|
|
||||||
|
activeTab.value = t('general.all')
|
||||||
}
|
}
|
||||||
|
|
||||||
async function removeMultipleInvoices() {
|
async function removeMultipleInvoices() {
|
||||||
@ -520,21 +505,39 @@ function toggleFilter() {
|
|||||||
function setActiveTab(val) {
|
function setActiveTab(val) {
|
||||||
switch (val) {
|
switch (val) {
|
||||||
case 'DRAFT':
|
case 'DRAFT':
|
||||||
selectedIndex.value = 1
|
activeTab.value = t('general.draft')
|
||||||
|
break
|
||||||
|
case 'SENT':
|
||||||
|
activeTab.value = t('general.sent')
|
||||||
|
break
|
||||||
|
|
||||||
|
case 'DUE':
|
||||||
|
activeTab.value = t('general.due')
|
||||||
break
|
break
|
||||||
|
|
||||||
case 'SENT':
|
|
||||||
case 'VIEWED':
|
|
||||||
case 'COMPLETED':
|
case 'COMPLETED':
|
||||||
|
activeTab.value = t('invoices.completed')
|
||||||
|
break
|
||||||
|
|
||||||
case 'PAID':
|
case 'PAID':
|
||||||
selectedIndex.value = 2
|
activeTab.value = t('invoices.paid')
|
||||||
break
|
break
|
||||||
|
|
||||||
case 'UNPAID':
|
case 'UNPAID':
|
||||||
|
activeTab.value = t('invoices.unpaid')
|
||||||
|
break
|
||||||
|
|
||||||
case 'PARTIALLY_PAID':
|
case 'PARTIALLY_PAID':
|
||||||
selectedIndex.value = 3
|
activeTab.value = t('invoices.partially_paid')
|
||||||
|
break
|
||||||
|
|
||||||
|
case 'VIEWED':
|
||||||
|
activeTab.value = t('invoices.viewed')
|
||||||
|
break
|
||||||
|
|
||||||
|
default:
|
||||||
|
activeTab.value = t('general.all')
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
filters.tab_status = invoiceTabStatus[selectedIndex.value].value
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -32,8 +32,6 @@
|
|||||||
:content-loading="isLoading"
|
:content-loading="isLoading"
|
||||||
:calendar-button="true"
|
:calendar-button="true"
|
||||||
calendar-button-icon="calendar"
|
calendar-button-icon="calendar"
|
||||||
:show-extra-options="true"
|
|
||||||
:source-date="invoiceStore.newInvoice.invoice_date"
|
|
||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
|
||||||
|
|||||||
@ -54,6 +54,8 @@
|
|||||||
label="name"
|
label="name"
|
||||||
:options="itemStore.itemUnits"
|
:options="itemStore.itemUnits"
|
||||||
value-prop="id"
|
value-prop="id"
|
||||||
|
:can-deselect="false"
|
||||||
|
:can-clear="false"
|
||||||
:placeholder="$t('items.select_a_unit')"
|
:placeholder="$t('items.select_a_unit')"
|
||||||
searchable
|
searchable
|
||||||
track-by="name"
|
track-by="name"
|
||||||
|
|||||||
@ -82,9 +82,9 @@
|
|||||||
required
|
required
|
||||||
>
|
>
|
||||||
<BaseCustomerSelectInput
|
<BaseCustomerSelectInput
|
||||||
v-if="!isLoadingContent"
|
|
||||||
v-model="paymentStore.currentPayment.customer_id"
|
v-model="paymentStore.currentPayment.customer_id"
|
||||||
:content-loading="isLoadingContent"
|
:content-loading="isLoadingContent"
|
||||||
|
v-if="!isLoadingContent"
|
||||||
:invalid="v$.currentPayment.customer_id.$error"
|
:invalid="v$.currentPayment.customer_id.$error"
|
||||||
:placeholder="$t('customers.select_a_customer')"
|
:placeholder="$t('customers.select_a_customer')"
|
||||||
show-action
|
show-action
|
||||||
@ -423,7 +423,7 @@ function onCustomerChange(customer_id) {
|
|||||||
if (customer_id) {
|
if (customer_id) {
|
||||||
let data = {
|
let data = {
|
||||||
customer_id: customer_id,
|
customer_id: customer_id,
|
||||||
tab_status: 'DUE',
|
status: 'DUE',
|
||||||
limit: 'all',
|
limit: 'all',
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -446,11 +446,7 @@ function onCustomerChange(customer_id) {
|
|||||||
paymentStore.currentPayment.selectedCustomer = res2.data.data
|
paymentStore.currentPayment.selectedCustomer = res2.data.data
|
||||||
paymentStore.currentPayment.customer = res2.data.data
|
paymentStore.currentPayment.customer = res2.data.data
|
||||||
paymentStore.currentPayment.currency = res2.data.data.currency
|
paymentStore.currentPayment.currency = res2.data.data.currency
|
||||||
if (
|
if(isEdit.value && !customerStore.editCustomer && paymentStore.currentPayment.customer_id) {
|
||||||
isEdit.value &&
|
|
||||||
!customerStore.editCustomer &&
|
|
||||||
paymentStore.currentPayment.customer_id
|
|
||||||
) {
|
|
||||||
customerStore.editCustomer = res2.data.data
|
customerStore.editCustomer = res2.data.data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,19 +28,6 @@
|
|||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
|
||||||
<BaseInputGroup
|
|
||||||
:label="$tc('settings.company_info.company_slug')"
|
|
||||||
:help-text="$t('settings.company_info.company_slug_help_text')"
|
|
||||||
:error="v$.slug.$error && v$.slug.$errors[0].$message"
|
|
||||||
required
|
|
||||||
>
|
|
||||||
<BaseInput
|
|
||||||
v-model="companyForm.slug"
|
|
||||||
:invalid="v$.slug.$error"
|
|
||||||
@blur="v$.slug.$touch()"
|
|
||||||
/>
|
|
||||||
</BaseInputGroup>
|
|
||||||
|
|
||||||
<BaseInputGroup :label="$tc('settings.company_info.phone')">
|
<BaseInputGroup :label="$tc('settings.company_info.phone')">
|
||||||
<BaseInput v-model="companyForm.address.phone" />
|
<BaseInput v-model="companyForm.address.phone" />
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
@ -173,7 +160,6 @@ let isSaving = ref(false)
|
|||||||
|
|
||||||
const companyForm = reactive({
|
const companyForm = reactive({
|
||||||
name: null,
|
name: null,
|
||||||
slug: null,
|
|
||||||
logo: null,
|
logo: null,
|
||||||
address: {
|
address: {
|
||||||
address_street_1: '',
|
address_street_1: '',
|
||||||
@ -207,14 +193,7 @@ const rules = computed(() => {
|
|||||||
name: {
|
name: {
|
||||||
required: helpers.withMessage(t('validation.required'), required),
|
required: helpers.withMessage(t('validation.required'), required),
|
||||||
minLength: helpers.withMessage(
|
minLength: helpers.withMessage(
|
||||||
t('validation.name_min_length', { count: 3 }),
|
t('validation.name_min_length'),
|
||||||
minLength(3)
|
|
||||||
),
|
|
||||||
},
|
|
||||||
slug: {
|
|
||||||
required: helpers.withMessage(t('validation.required'), required),
|
|
||||||
minLength: helpers.withMessage(
|
|
||||||
t('validation.name_min_length', { count: 3 }),
|
|
||||||
minLength(3)
|
minLength(3)
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|||||||
@ -8,11 +8,7 @@
|
|||||||
<BaseInputGroup
|
<BaseInputGroup
|
||||||
:content-loading="isFetchingInitialData"
|
:content-loading="isFetchingInitialData"
|
||||||
:label="$tc('settings.preferences.currency')"
|
:label="$tc('settings.preferences.currency')"
|
||||||
:help-text="
|
:help-text="$t('settings.preferences.company_currency_unchangeable')"
|
||||||
isCurrencyDisabled
|
|
||||||
? $t('settings.preferences.company_currency_unchangeable')
|
|
||||||
: ''
|
|
||||||
"
|
|
||||||
:error="v$.currency.$error && v$.currency.$errors[0].$message"
|
:error="v$.currency.$error && v$.currency.$errors[0].$message"
|
||||||
required
|
required
|
||||||
>
|
>
|
||||||
@ -25,7 +21,7 @@
|
|||||||
:searchable="true"
|
:searchable="true"
|
||||||
track-by="name"
|
track-by="name"
|
||||||
:invalid="v$.currency.$error"
|
:invalid="v$.currency.$error"
|
||||||
:disabled="isCurrencyDisabled"
|
disabled
|
||||||
class="w-full"
|
class="w-full"
|
||||||
>
|
>
|
||||||
</BaseMultiselect>
|
</BaseMultiselect>
|
||||||
@ -191,7 +187,6 @@ const { t, tm } = useI18n()
|
|||||||
let isSaving = ref(false)
|
let isSaving = ref(false)
|
||||||
let isDataSaving = ref(false)
|
let isDataSaving = ref(false)
|
||||||
let isFetchingInitialData = ref(false)
|
let isFetchingInitialData = ref(false)
|
||||||
let isCurrencyDisabled = ref(true)
|
|
||||||
|
|
||||||
const settingsForm = reactive({ ...companyStore.selectedCompanySettings })
|
const settingsForm = reactive({ ...companyStore.selectedCompanySettings })
|
||||||
|
|
||||||
@ -287,14 +282,10 @@ setInitialData()
|
|||||||
async function setInitialData() {
|
async function setInitialData() {
|
||||||
isFetchingInitialData.value = true
|
isFetchingInitialData.value = true
|
||||||
Promise.all([
|
Promise.all([
|
||||||
companyStore.checkCompanyHasCurrencyTransactions(),
|
|
||||||
globalStore.fetchCurrencies(),
|
globalStore.fetchCurrencies(),
|
||||||
globalStore.fetchDateFormats(),
|
globalStore.fetchDateFormats(),
|
||||||
globalStore.fetchTimeZones(),
|
globalStore.fetchTimeZones(),
|
||||||
]).then(([res1]) => {
|
]).then(([res1]) => {
|
||||||
if (res1.data?.has_transactions == false) {
|
|
||||||
isCurrencyDisabled.value = false
|
|
||||||
}
|
|
||||||
isFetchingInitialData.value = false
|
isFetchingInitialData.value = false
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,101 +0,0 @@
|
|||||||
<!-- This example requires Tailwind CSS v2.0+ -->
|
|
||||||
<script lang="ts" setup>
|
|
||||||
import { Switch, SwitchGroup, SwitchLabel } from '@headlessui/vue'
|
|
||||||
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
|
||||||
import { computed, ref } from 'vue'
|
|
||||||
defineProps({
|
|
||||||
showLabel: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
vertical: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const globalStore = useGlobalStore()
|
|
||||||
|
|
||||||
const enabled = ref(
|
|
||||||
localStorage.getItem('theme') === 'dark' ||
|
|
||||||
document.documentElement.classList.contains('dark')
|
|
||||||
)
|
|
||||||
|
|
||||||
globalStore.isDarkModeOn = enabled
|
|
||||||
|
|
||||||
function onChange(val) {
|
|
||||||
if (val) {
|
|
||||||
localStorage.theme = 'dark'
|
|
||||||
document.documentElement.classList.add('dark')
|
|
||||||
document.documentElement.style.setProperty('color-scheme', 'dark')
|
|
||||||
globalStore.isDarkModeOn = true
|
|
||||||
} else {
|
|
||||||
localStorage.theme = 'light'
|
|
||||||
document.documentElement.classList.remove('dark')
|
|
||||||
document.documentElement.style.setProperty('color-scheme', 'light')
|
|
||||||
globalStore.isDarkModeOn = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="w-full flex justify-center">
|
|
||||||
<SwitchGroup
|
|
||||||
as="div"
|
|
||||||
class="flex items-center"
|
|
||||||
:class="vertical ? 'flex-col justify-center' : 'flex-row'"
|
|
||||||
>
|
|
||||||
<Switch
|
|
||||||
v-model="enabled"
|
|
||||||
class="relative inline-flex flex-shrink-0 h-6 w-11 border-2 border-transparent rounded-full cursor-pointer transition-colors ease-in-out duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 dark:ring-offset-gray-700"
|
|
||||||
:class="[enabled ? 'bg-primary-600' : 'bg-gray-200']"
|
|
||||||
@update:modelValue="onChange"
|
|
||||||
>
|
|
||||||
<span class="sr-only">Use setting</span>
|
|
||||||
<span
|
|
||||||
class="pointer-events-none relative inline-block h-5 w-5 rounded-full bg-white shadow transform ring-0 transition ease-in-out duration-200"
|
|
||||||
:class="[enabled ? 'translate-x-5' : 'translate-x-0']"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
class="absolute inset-0 h-full w-full flex items-center justify-center transition-opacity"
|
|
||||||
:class="[
|
|
||||||
enabled
|
|
||||||
? 'opacity-0 ease-out duration-100'
|
|
||||||
: 'opacity-100 ease-in duration-200',
|
|
||||||
]"
|
|
||||||
aria-hidden="true"
|
|
||||||
>
|
|
||||||
<BaseIcon class="h-3 w-3 text-yellow-500" name="SunIcon" />
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
class="absolute inset-0 h-full w-full flex items-center justify-center transition-opacity"
|
|
||||||
:class="[
|
|
||||||
enabled
|
|
||||||
? 'opacity-100 ease-in duration-200'
|
|
||||||
: 'opacity-0 ease-out duration-100',
|
|
||||||
]"
|
|
||||||
aria-hidden="true"
|
|
||||||
>
|
|
||||||
<BaseIcon class="h-3 w-3 text-primary-500" name="MoonIcon" />
|
|
||||||
</span>
|
|
||||||
</span>
|
|
||||||
</Switch>
|
|
||||||
<SwitchLabel
|
|
||||||
v-if="showLabel"
|
|
||||||
as="span"
|
|
||||||
class="cursor-pointer"
|
|
||||||
:class="vertical ? 'px-1 text-center mt-2' : 'ml-3'"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
v-if="enabled"
|
|
||||||
class="text-sm font-medium text-gray-500 dark:text-gray-400"
|
|
||||||
>
|
|
||||||
Dark Mode
|
|
||||||
</span>
|
|
||||||
<span v-else class="text-sm font-medium text-gray-500">
|
|
||||||
Light Mode
|
|
||||||
</span>
|
|
||||||
</SwitchLabel>
|
|
||||||
</SwitchGroup>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
@ -126,7 +126,7 @@ onMounted(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const value = computed({
|
const value = computed({
|
||||||
get: () => (props.modelValue ? props.modelValue : ''),
|
get: () => props.modelValue,
|
||||||
set: (value) => {
|
set: (value) => {
|
||||||
emit('update:modelValue', value)
|
emit('update:modelValue', value)
|
||||||
},
|
},
|
||||||
@ -195,9 +195,7 @@ async function getFields() {
|
|||||||
{ label: 'Date', value: 'INVOICE_DATE' },
|
{ label: 'Date', value: 'INVOICE_DATE' },
|
||||||
{ label: 'Due Date', value: 'INVOICE_DUE_DATE' },
|
{ label: 'Due Date', value: 'INVOICE_DUE_DATE' },
|
||||||
{ label: 'Number', value: 'INVOICE_NUMBER' },
|
{ label: 'Number', value: 'INVOICE_NUMBER' },
|
||||||
{ label: 'PDF Link', value: 'PDF_LINK' },
|
{ label: 'Ref Number', value: 'INVOICE_REF_NUMBER' },
|
||||||
{ label: 'Due Amount', value: 'DUE_AMOUNT' },
|
|
||||||
{ label: 'Total Amount', value: 'TOTAL_AMOUNT' },
|
|
||||||
...invoiceFields.value.map((i) => ({
|
...invoiceFields.value.map((i) => ({
|
||||||
label: i.label,
|
label: i.label,
|
||||||
value: i.slug,
|
value: i.slug,
|
||||||
@ -213,8 +211,7 @@ async function getFields() {
|
|||||||
{ label: 'Date', value: 'ESTIMATE_DATE' },
|
{ label: 'Date', value: 'ESTIMATE_DATE' },
|
||||||
{ label: 'Expiry Date', value: 'ESTIMATE_EXPIRY_DATE' },
|
{ label: 'Expiry Date', value: 'ESTIMATE_EXPIRY_DATE' },
|
||||||
{ label: 'Number', value: 'ESTIMATE_NUMBER' },
|
{ label: 'Number', value: 'ESTIMATE_NUMBER' },
|
||||||
{ label: 'PDF Link', value: 'PDF_LINK' },
|
{ label: 'Ref Number', value: 'ESTIMATE_REF_NUMBER' },
|
||||||
{ label: 'Total Amount', value: 'TOTAL_AMOUNT' },
|
|
||||||
...estimateFields.value.map((i) => ({
|
...estimateFields.value.map((i) => ({
|
||||||
label: i.label,
|
label: i.label,
|
||||||
value: i.slug,
|
value: i.slug,
|
||||||
@ -231,7 +228,6 @@ async function getFields() {
|
|||||||
{ label: 'Number', value: 'PAYMENT_NUMBER' },
|
{ label: 'Number', value: 'PAYMENT_NUMBER' },
|
||||||
{ label: 'Mode', value: 'PAYMENT_MODE' },
|
{ label: 'Mode', value: 'PAYMENT_MODE' },
|
||||||
{ label: 'Amount', value: 'PAYMENT_AMOUNT' },
|
{ label: 'Amount', value: 'PAYMENT_AMOUNT' },
|
||||||
{ label: 'PDF Link', value: 'PDF_LINK' },
|
|
||||||
...paymentFields.value.map((i) => ({
|
...paymentFields.value.map((i) => ({
|
||||||
label: i.label,
|
label: i.label,
|
||||||
value: i.slug,
|
value: i.slug,
|
||||||
|
|||||||
@ -7,108 +7,52 @@
|
|||||||
/>
|
/>
|
||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
|
|
||||||
<div v-else :class="computedContainerClass">
|
<div v-else :class="computedContainerClass" class="relative flex flex-row">
|
||||||
<date-picker
|
<svg
|
||||||
ref="vCalendar"
|
v-if="showCalendarIcon && !hasIconSlot"
|
||||||
v-model="date"
|
viewBox="0 0 20 20"
|
||||||
:mode="mode"
|
fill="currentColor"
|
||||||
:is24hr="time24hr"
|
class="
|
||||||
class="w-full"
|
absolute
|
||||||
color="indigo"
|
w-4
|
||||||
:input-debounce="500"
|
h-4
|
||||||
:update-on-input="false"
|
mx-2
|
||||||
:is-range="false"
|
my-2.5
|
||||||
trim-weeks
|
text-sm
|
||||||
:is-required="isRequired"
|
not-italic
|
||||||
:popover="{
|
font-black
|
||||||
visibility: disabled ? 'hidden' : 'focus',
|
text-gray-400
|
||||||
showDelay: 0,
|
cursor-pointer
|
||||||
hideDelay: 1,
|
"
|
||||||
}"
|
@click="onClickDp"
|
||||||
:attributes="attrs"
|
|
||||||
:model-config="config"
|
|
||||||
:masks="masks"
|
|
||||||
:locale="global.locale"
|
|
||||||
>
|
>
|
||||||
<template
|
<path
|
||||||
#default="{ inputValue, inputEvents, togglePopover, hidePopover }"
|
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"
|
||||||
<!-- calendar icon -->
|
clip-rule="evenodd"
|
||||||
<svg
|
></path>
|
||||||
v-if="showCalendarIcon && !hasIconSlot"
|
</svg>
|
||||||
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" />
|
<slot v-if="showCalendarIcon && hasIconSlot" name="icon" />
|
||||||
|
|
||||||
<input
|
<FlatPickr
|
||||||
:value="inputValue"
|
ref="dp"
|
||||||
:class="[defaultInputClass, inputInvalidClass, inputDisabledClass]"
|
v-model="date"
|
||||||
readonly
|
v-bind="$attrs"
|
||||||
v-on="inputEvents"
|
:disabled="disabled"
|
||||||
@blur="hidePopover()"
|
:config="config"
|
||||||
/>
|
:class="[defaultInputClass, inputInvalidClass, inputDisabledClass]"
|
||||||
</template>
|
/>
|
||||||
|
|
||||||
<template v-if="showExtraOptions" #footer>
|
|
||||||
<div
|
|
||||||
class="bg-gray-100 grid grid-cols-3 gap-2 p-2 border-t rounded-b-lg"
|
|
||||||
>
|
|
||||||
<button type="button" class="extra-button" @click="moveToDate(sourceDate)">
|
|
||||||
{{ global.t('date_picker.same_day') }}
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button type="button" class="extra-button" @click="withInDays(7)">
|
|
||||||
{{ global.t('date_picker.within_7_days') }}
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button type="button" class="extra-button" @click="withInDays(15)">
|
|
||||||
{{ global.t('date_picker.within_15_days') }}
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button type="button" class="extra-button" @click="withInDays(30)">
|
|
||||||
{{ global.t('date_picker.within_30_days') }}
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button type="button" class="extra-button" @click="withInDays(45)">
|
|
||||||
{{ global.t('date_picker.within_45_days') }}
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button type="button" class="extra-button" @click="withInDays(60)">
|
|
||||||
{{ global.t('date_picker.within_60_days') }}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</date-picker>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script type="text/babel" setup>
|
<script type="text/babel" setup>
|
||||||
import { Calendar, DatePicker } from 'v-calendar'
|
import FlatPickr from 'vue-flatpickr-component'
|
||||||
import 'v-calendar/dist/style.css'
|
import 'flatpickr/dist/flatpickr.css'
|
||||||
import { computed, reactive, watch, ref, useSlots } from 'vue'
|
import { computed, reactive, watch, ref, useSlots } from 'vue'
|
||||||
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
||||||
import moment from 'moment'
|
|
||||||
|
const dp = ref(null)
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
modelValue: {
|
modelValue: {
|
||||||
@ -146,31 +90,36 @@ const props = defineProps({
|
|||||||
defaultInputClass: {
|
defaultInputClass: {
|
||||||
type: String,
|
type: String,
|
||||||
default:
|
default:
|
||||||
'border-2 dark:bg-gray-700 dark:border-gray-600 dark:text-white font-base pl-8 py-2 outline-none focus:ring-primary-400 focus:outline-none focus:border-primary-400 block w-full sm:text-sm border-gray-200 rounded-md text-black',
|
'font-base pl-8 py-2 outline-none focus:ring-primary-400 focus:outline-none focus:border-primary-400 block w-full sm:text-sm border-gray-200 rounded-md text-black',
|
||||||
},
|
},
|
||||||
time24hr: {
|
time24hr: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
isRequired: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
showExtraOptions: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
sourceDate: {
|
|
||||||
type: [String, Date],
|
|
||||||
default: () => new Date(),
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const emit = defineEmits(['update:modelValue'])
|
const emit = defineEmits(['update:modelValue'])
|
||||||
|
|
||||||
const slots = useSlots()
|
const slots = useSlots()
|
||||||
|
|
||||||
const companyStore = useCompanyStore()
|
const companyStore = useCompanyStore()
|
||||||
const { global } = window.i18n
|
|
||||||
const vCalendar = ref(null)
|
let config = reactive({
|
||||||
|
altInput: true,
|
||||||
|
enableTime: props.enableTime,
|
||||||
|
time_24hr: props.time24hr,
|
||||||
|
})
|
||||||
|
|
||||||
|
const date = computed({
|
||||||
|
get: () => props.modelValue,
|
||||||
|
set: (value) => {
|
||||||
|
emit('update:modelValue', value)
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const carbonFormat = computed(() => {
|
||||||
|
return companyStore.selectedCompanySettings?.carbon_date_format
|
||||||
|
})
|
||||||
|
|
||||||
const hasIconSlot = computed(() => {
|
const hasIconSlot = computed(() => {
|
||||||
return !!slots.icon
|
return !!slots.icon
|
||||||
@ -186,6 +135,7 @@ const inputInvalidClass = computed(() => {
|
|||||||
if (props.invalid) {
|
if (props.invalid) {
|
||||||
return 'border-red-400 ring-red-400 focus:ring-red-400 focus:border-red-400'
|
return 'border-red-400 ring-red-400 focus:ring-red-400 focus:border-red-400'
|
||||||
}
|
}
|
||||||
|
|
||||||
return ''
|
return ''
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -193,97 +143,35 @@ const inputDisabledClass = computed(() => {
|
|||||||
if (props.disabled) {
|
if (props.disabled) {
|
||||||
return 'border border-solid rounded-md outline-none input-field box-border-2 base-date-picker-input placeholder-gray-400 bg-gray-200 text-gray-600 border-gray-200'
|
return 'border border-solid rounded-md outline-none input-field box-border-2 base-date-picker-input placeholder-gray-400 bg-gray-200 text-gray-600 border-gray-200'
|
||||||
}
|
}
|
||||||
|
|
||||||
return ''
|
return ''
|
||||||
})
|
})
|
||||||
|
|
||||||
// to convert YYYY-MM-DD | YYYY-MM-DD HH:mm format
|
function onClickDp(params) {
|
||||||
function convertYMDFormat(date) {
|
dp.value.fp.open()
|
||||||
let format = props.enableTime ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD'
|
|
||||||
return date ? moment(date).format(format) : date
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const date = computed({
|
|
||||||
get: () => props.modelValue,
|
|
||||||
set: (value) => {
|
|
||||||
emit('update:modelValue', value)
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const mode = computed(() => {
|
|
||||||
return props.enableTime ? 'dateTime' : 'date'
|
|
||||||
})
|
|
||||||
|
|
||||||
const config = reactive({
|
|
||||||
type: 'string',
|
|
||||||
mask: 'YYYY-MM-DD', // Uses 'iso' if missing
|
|
||||||
//timeAdjust: '00:00:00',
|
|
||||||
})
|
|
||||||
|
|
||||||
const masks = reactive({
|
|
||||||
input: null,
|
|
||||||
inputDateTime: null,
|
|
||||||
inputDateTime24hr: null,
|
|
||||||
})
|
|
||||||
|
|
||||||
const attrs = reactive([
|
|
||||||
{
|
|
||||||
dates: new Date(),
|
|
||||||
highlight: {
|
|
||||||
fillMode: 'outline',
|
|
||||||
},
|
|
||||||
/* popover: {
|
|
||||||
label: 'Today Date',
|
|
||||||
visibility: 'hover',
|
|
||||||
}, */
|
|
||||||
},
|
|
||||||
])
|
|
||||||
|
|
||||||
const carbonFormat = computed(() => {
|
|
||||||
return companyStore.selectedCompanySettings?.moment_date_format
|
|
||||||
})
|
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => carbonFormat,
|
() => props.enableTime,
|
||||||
() => {
|
(val) => {
|
||||||
if (!props.enableTime) {
|
if (props.enableTime) {
|
||||||
masks.input = carbonFormat.value ? carbonFormat.value : 'DD MMM YYYY'
|
config.enableTime = props.enableTime
|
||||||
config.mask = 'YYYY-MM-DD'
|
|
||||||
} else {
|
|
||||||
let timeFormat = 'HH:mm'
|
|
||||||
if (props.time24hr) {
|
|
||||||
masks.inputDateTime24hr = carbonFormat.value
|
|
||||||
? `${carbonFormat.value} ${timeFormat}`
|
|
||||||
: `DD MMM YYYY ${timeFormat}`
|
|
||||||
} else {
|
|
||||||
masks.inputDateTime = carbonFormat.value
|
|
||||||
? `${carbonFormat.value} ${timeFormat}`
|
|
||||||
: `DD MMM YYYY ${timeFormat}`
|
|
||||||
}
|
|
||||||
config.mask = `YYYY-MM-DD ${timeFormat}`
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ immediate: true }
|
{ immediate: true }
|
||||||
)
|
)
|
||||||
|
|
||||||
async function moveToDate(_date) {
|
watch(
|
||||||
const calendar = vCalendar.value
|
() => carbonFormat,
|
||||||
_date = _date ? _date : convertYMDFormat(new Date())
|
() => {
|
||||||
date.value = _date
|
if (!props.enableTime) {
|
||||||
// await calendar.move(_date)
|
config.altFormat = carbonFormat.value ? carbonFormat.value : 'd M Y'
|
||||||
calendar.hidePopover()
|
} else {
|
||||||
}
|
config.altFormat = carbonFormat.value
|
||||||
|
? `${carbonFormat.value} H:i `
|
||||||
async function withInDays(noOfDays) {
|
: 'd M Y H:i'
|
||||||
if (!noOfDays) return false
|
}
|
||||||
|
},
|
||||||
let newDate = moment(props.sourceDate).add(noOfDays, 'days').toDate()
|
{ immediate: true }
|
||||||
newDate = convertYMDFormat(newDate)
|
)
|
||||||
moveToDate(newDate)
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.extra-button {
|
|
||||||
@apply bg-primary-500 text-white text-sm font-semibold px-2 py-1 rounded hover:bg-primary-700;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|||||||
@ -1,10 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<TabGroup
|
<TabGroup :default-index="defaultIndex" @change="onChange">
|
||||||
:selected-index="selectedIndex"
|
|
||||||
:default-index="defaultIndex"
|
|
||||||
@change="onChange"
|
|
||||||
>
|
|
||||||
<TabList
|
<TabList
|
||||||
:class="[
|
:class="[
|
||||||
'flex border-b border-grey-light',
|
'flex border-b border-grey-light',
|
||||||
@ -58,10 +54,6 @@ const props = defineProps({
|
|||||||
type: Number,
|
type: Number,
|
||||||
default: 0,
|
default: 0,
|
||||||
},
|
},
|
||||||
selectedIndex: {
|
|
||||||
type: Number,
|
|
||||||
default: 0,
|
|
||||||
},
|
|
||||||
filter: {
|
filter: {
|
||||||
type: String,
|
type: String,
|
||||||
default: null,
|
default: null,
|
||||||
@ -75,6 +67,6 @@ const slots = useSlots()
|
|||||||
const tabs = computed(() => slots.default().map((tab) => tab.props))
|
const tabs = computed(() => slots.default().map((tab) => tab.props))
|
||||||
|
|
||||||
function onChange(d) {
|
function onChange(d) {
|
||||||
emit('change', tabs.value[d], d)
|
emit('change', tabs.value[d])
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -7,12 +7,12 @@ export function usePopper(options) {
|
|||||||
let popper = ref(null)
|
let popper = ref(null)
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
watchEffect((onInvalidate) => {
|
watchEffect(onInvalidate => {
|
||||||
if (!container.value) return
|
if (!container.value) return
|
||||||
if (!activator.value) return
|
if (!activator.value) return
|
||||||
|
|
||||||
let containerEl = container.value.el || container.value
|
let containerEl = container.value.el || container.value
|
||||||
let activatorEl = activator.value.$el || activator.value
|
let activatorEl = activator.value.el || activator.value
|
||||||
|
|
||||||
if (!(activatorEl instanceof HTMLElement)) return
|
if (!(activatorEl instanceof HTMLElement)) return
|
||||||
if (!(containerEl instanceof HTMLElement)) return
|
if (!(containerEl instanceof HTMLElement)) return
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
"settings": "Nastavení",
|
"settings": "Nastavení",
|
||||||
"logout": "Odhlásit se",
|
"logout": "Odhlásit se",
|
||||||
"users": "Uživatelé",
|
"users": "Uživatelé",
|
||||||
"modules": "Moduly"
|
"modules": "Modules"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add_company": "Přidat firmu",
|
"add_company": "Přidat firmu",
|
||||||
@ -93,14 +93,14 @@
|
|||||||
"no_note_found": "Nebyly nalezeny žádné poznámky",
|
"no_note_found": "Nebyly nalezeny žádné poznámky",
|
||||||
"insert_note": "Vložit poznámku",
|
"insert_note": "Vložit poznámku",
|
||||||
"copied_pdf_url_clipboard": "Adresa PDF zkopírována do schránky!",
|
"copied_pdf_url_clipboard": "Adresa PDF zkopírována do schránky!",
|
||||||
"copied_url_clipboard": "Zkopírováno do schránky!",
|
"copied_url_clipboard": "Copied url to clipboard!",
|
||||||
"docs": "Dokumentace",
|
"docs": "Dokumentace",
|
||||||
"do_you_wish_to_continue": "Přejete si pokračovat?",
|
"do_you_wish_to_continue": "Přejete si pokračovat?",
|
||||||
"note": "Poznámka",
|
"note": "Poznámka",
|
||||||
"pay_invoice": "Zaplatit fakturu",
|
"pay_invoice": "Pay Invoice",
|
||||||
"login_successfully": "Přihlášení proběhlo úspěšně!",
|
"login_successfully": "Logged in successfully!",
|
||||||
"logged_out_successfully": "Odhlášení proběhlo úspěšně",
|
"logged_out_successfully": "Logged out successfully",
|
||||||
"mark_as_default": "Označit jako výchozí"
|
"mark_as_default": "Mark as default"
|
||||||
},
|
},
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"select_year": "Vybrat rok",
|
"select_year": "Vybrat rok",
|
||||||
@ -108,8 +108,8 @@
|
|||||||
"due_amount": "Částka k zaplacení",
|
"due_amount": "Částka k zaplacení",
|
||||||
"customers": "Zákazníci",
|
"customers": "Zákazníci",
|
||||||
"invoices": "Faktury",
|
"invoices": "Faktury",
|
||||||
"estimates": "Nabídky",
|
"estimates": "Odhady",
|
||||||
"payments": "Platby"
|
"payments": "Payments"
|
||||||
},
|
},
|
||||||
"chart_info": {
|
"chart_info": {
|
||||||
"total_sales": "Slevy",
|
"total_sales": "Slevy",
|
||||||
@ -187,7 +187,7 @@
|
|||||||
"website": "Webová stránka",
|
"website": "Webová stránka",
|
||||||
"overview": "Přehled",
|
"overview": "Přehled",
|
||||||
"invoice_prefix": "Prefix pro faktury",
|
"invoice_prefix": "Prefix pro faktury",
|
||||||
"estimate_prefix": "Prefix pro nabídky",
|
"estimate_prefix": "Prefix pro odhady",
|
||||||
"payment_prefix": "Prefix pro platby",
|
"payment_prefix": "Prefix pro platby",
|
||||||
"enable_portal": "Povolit portál",
|
"enable_portal": "Povolit portál",
|
||||||
"country": "Země",
|
"country": "Země",
|
||||||
@ -208,10 +208,10 @@
|
|||||||
"new_customer": "Nový zákazník",
|
"new_customer": "Nový zákazník",
|
||||||
"edit_customer": "Upravit zákazníka",
|
"edit_customer": "Upravit zákazníka",
|
||||||
"basic_info": "Základní informace",
|
"basic_info": "Základní informace",
|
||||||
"portal_access": "Přístup do portálu",
|
"portal_access": "Portal Access",
|
||||||
"portal_access_text": "Chcete povolit tomuto zákazníkovi možnost přihlásit se na zákaznický portál?",
|
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||||
"portal_access_url": "URL pro přihlášení do zákaznického portálu",
|
"portal_access_url": "Customer Portal Login URL",
|
||||||
"portal_access_url_help": "Zkopírujte a pošlete výše uvedenou adresu URL vašemu zákazníkovi pro poskytnutí přístupu.",
|
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||||
"billing_address": "Fakturační adresa",
|
"billing_address": "Fakturační adresa",
|
||||||
"shipping_address": "Doručovací adresa",
|
"shipping_address": "Doručovací adresa",
|
||||||
"copy_billing_address": "Zkopírovat z fakturace",
|
"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.",
|
"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",
|
"created_message": "Zákazník úspěšně vytvořen",
|
||||||
"updated_message": "Zákazník úspěšně upraven",
|
"updated_message": "Zákazník úspěšně upraven",
|
||||||
"address_updated_message": "Adresa úspěšně aktualizována",
|
"address_updated_message": "Address Information Updated succesfully",
|
||||||
"deleted_message": "Zákazník úspěšně smazán | Zákazníci úspěšně smazáni",
|
"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."
|
"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"
|
"deleted_message": "Položka byla úspěšně odstraněna | Položky byly úspěšně odstraněny"
|
||||||
},
|
},
|
||||||
"estimates": {
|
"estimates": {
|
||||||
"title": "Nabídky",
|
"title": "Odhady",
|
||||||
"accept_estimate": "Přijmout nabídku",
|
"accept_estimate": "Accept Estimate",
|
||||||
"reject_estimate": "Odmítnout nabídku",
|
"reject_estimate": "Reject Estimate",
|
||||||
"estimate": "Nabídka | Nabídky",
|
"estimate": "Odhad | Odhady",
|
||||||
"estimates_list": "Seznam nabídek",
|
"estimates_list": "Seznam odhadů",
|
||||||
"days": "{days} dní",
|
"days": "{days} dní",
|
||||||
"months": "{months} měsíc",
|
"months": "{months} měsíc",
|
||||||
"years": "{years} rok",
|
"years": "{years} rok",
|
||||||
@ -283,7 +283,7 @@
|
|||||||
"total": "Celkem",
|
"total": "Celkem",
|
||||||
"discount": "Sleva",
|
"discount": "Sleva",
|
||||||
"sub_total": "Mezisoučet",
|
"sub_total": "Mezisoučet",
|
||||||
"estimate_number": "Číslo nabídky",
|
"estimate_number": "Odhadované číslo",
|
||||||
"ref_number": "Referenční číslo",
|
"ref_number": "Referenční číslo",
|
||||||
"contact": "Kontakt",
|
"contact": "Kontakt",
|
||||||
"add_item": "Přidat položku",
|
"add_item": "Přidat položku",
|
||||||
@ -299,11 +299,11 @@
|
|||||||
"estimate_template": "Šablona",
|
"estimate_template": "Šablona",
|
||||||
"convert_to_invoice": "Převést na fakturu",
|
"convert_to_invoice": "Převést na fakturu",
|
||||||
"mark_as_sent": "Označit jako odeslané",
|
"mark_as_sent": "Označit jako odeslané",
|
||||||
"send_estimate": "Odeslat nabídku",
|
"send_estimate": "Odeslat odhad",
|
||||||
"resend_estimate": "Znovu odeslat nabídku",
|
"resend_estimate": "Znovu odeslat odhad",
|
||||||
"record_payment": "Zaznamenat platbu",
|
"record_payment": "Zaznamenat platbu",
|
||||||
"add_estimate": "Přidat nabídku",
|
"add_estimate": "Přidat odhad",
|
||||||
"save_estimate": "Uložit nabídku",
|
"save_estimate": "Uložit odhad",
|
||||||
"confirm_conversion": "Tento odhad bude použit k vytvoření nové faktury.",
|
"confirm_conversion": "Tento odhad bude použit k vytvoření nové faktury.",
|
||||||
"conversion_message": "Faktura byla úspěšně vytvořena",
|
"conversion_message": "Faktura byla úspěšně vytvořena",
|
||||||
"confirm_send_estimate": "Tento odhad bude zaslán e-mailem zákazníkovi",
|
"confirm_send_estimate": "Tento odhad bude zaslán e-mailem zákazníkovi",
|
||||||
@ -318,10 +318,10 @@
|
|||||||
},
|
},
|
||||||
"accepted": "Přijato",
|
"accepted": "Přijato",
|
||||||
"rejected": "Odmítnuto",
|
"rejected": "Odmítnuto",
|
||||||
"expired": "Vypršela platnost",
|
"expired": "Expired",
|
||||||
"sent": "Odesláno",
|
"sent": "Odesláno",
|
||||||
"draft": "Koncept",
|
"draft": "Koncept",
|
||||||
"viewed": "Zobrazené",
|
"viewed": "Viewed",
|
||||||
"declined": "Odmítnuto",
|
"declined": "Odmítnuto",
|
||||||
"new_estimate": "Nový odhad",
|
"new_estimate": "Nový odhad",
|
||||||
"add_new_estimate": "Přidat 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",
|
"select_an_item": "Pište nebo klikněte pro výběr položky",
|
||||||
"type_item_description": "Zadejte popis položky (volitelné)"
|
"type_item_description": "Zadejte popis položky (volitelné)"
|
||||||
},
|
},
|
||||||
"mark_as_default_estimate_template_description": "Je-li povoleno, bude vybraná šablona automaticky vybrána pro nové nabídky."
|
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||||
},
|
},
|
||||||
"invoices": {
|
"invoices": {
|
||||||
"title": "Faktury",
|
"title": "Faktury",
|
||||||
"download": "Stáhnout",
|
"download": "Download",
|
||||||
"pay_invoice": "Zaplatit fakturu",
|
"pay_invoice": "Pay Invoice",
|
||||||
"invoices_list": "Seznam faktur",
|
"invoices_list": "Seznam faktur",
|
||||||
"invoice_information": "Informace o faktuře",
|
"invoice_information": "Invoice Information",
|
||||||
"days": "{days} dní",
|
"days": "{days} dní",
|
||||||
"months": "{months} měsíc",
|
"months": "{months} měsíc",
|
||||||
"years": "{years} rok",
|
"years": "{years} rok",
|
||||||
@ -447,7 +447,7 @@
|
|||||||
"marked_as_sent_message": "Faktura označena jako úspěšně odeslaná",
|
"marked_as_sent_message": "Faktura označena jako úspěšně odeslaná",
|
||||||
"something_went_wrong": "něco se nezdařilo",
|
"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.",
|
"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": "Je-li povoleno, bude vybraná šablona automaticky vybrána pro nové faktury."
|
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||||
},
|
},
|
||||||
"recurring_invoices": {
|
"recurring_invoices": {
|
||||||
"title": "Opakující se faktury",
|
"title": "Opakující se faktury",
|
||||||
@ -526,7 +526,7 @@
|
|||||||
"cloned_successfully": "Opakující se faktura úspěšně naklonována",
|
"cloned_successfully": "Opakující se faktura úspěšně naklonována",
|
||||||
"clone_invoice": "Naklonovat opakující se fakturu",
|
"clone_invoice": "Naklonovat opakující se fakturu",
|
||||||
"confirm_clone": "Tato opakující se faktura bude naklonována do nové opakující se faktury",
|
"confirm_clone": "Tato opakující se faktura bude naklonována do nové opakující se faktury",
|
||||||
"add_customer_email": "Pro automatické odesílání faktur prosím přidejte e-mailovou adresu tohoto zákazníka.",
|
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
||||||
"item": {
|
"item": {
|
||||||
"title": "Název položky",
|
"title": "Název položky",
|
||||||
"description": "Popis",
|
"description": "Popis",
|
||||||
@ -658,49 +658,49 @@
|
|||||||
"retype_password": "Zadejte heslo znovu"
|
"retype_password": "Zadejte heslo znovu"
|
||||||
},
|
},
|
||||||
"modules": {
|
"modules": {
|
||||||
"buy_now": "Koupit",
|
"buy_now": "Buy Now",
|
||||||
"install": "Instalovat",
|
"install": "Install",
|
||||||
"price": "Cena",
|
"price": "Price",
|
||||||
"download_zip_file": "Stáhnout soubor ZIP",
|
"download_zip_file": "Download ZIP file",
|
||||||
"unzipping_package": "Rozbalování balíku",
|
"unzipping_package": "Unzipping Package",
|
||||||
"copying_files": "Kopírování souborů",
|
"copying_files": "Copying Files",
|
||||||
"deleting_files": "Odstraňování nepoužitých souborů",
|
"deleting_files": "Deleting Unused files",
|
||||||
"completing_installation": "Dokončování instalace",
|
"completing_installation": "Completing Installation",
|
||||||
"update_failed": "Aktualizace se nezdařila",
|
"update_failed": "Update Failed",
|
||||||
"install_success": "Modul byl úspěšně nainstalován!",
|
"install_success": "Module has been installed successfully!",
|
||||||
"customer_reviews": "Recenze",
|
"customer_reviews": "Reviews",
|
||||||
"license": "Licence",
|
"license": "License",
|
||||||
"faq": "Často kladené dotazy (FAQ)",
|
"faq": "FAQ",
|
||||||
"monthly": "Měsíčně",
|
"monthly": "Monthly",
|
||||||
"yearly": "Ročně",
|
"yearly": "Yearly",
|
||||||
"updated": "Aktualizováno",
|
"updated": "Updated",
|
||||||
"version": "Verze",
|
"version": "Version",
|
||||||
"disable": "Zakázat",
|
"disable": "Disable",
|
||||||
"module_disabled": "Modul zakázán",
|
"module_disabled": "Module Disabled",
|
||||||
"enable": "Povolit",
|
"enable": "Enable",
|
||||||
"module_enabled": "Modul povolen",
|
"module_enabled": "Module Enabled",
|
||||||
"update_to": "Aktualizovat na",
|
"update_to": "Update To",
|
||||||
"module_updated": "Modul byl úspěšně aktualizován!",
|
"module_updated": "Module Updated Successfully!",
|
||||||
"title": "Moduly",
|
"title": "Modules",
|
||||||
"module": "Modul | Moduly",
|
"module": "Module | Modules",
|
||||||
"api_token": "API token",
|
"api_token": "API token",
|
||||||
"invalid_api_token": "Neplatný API token.",
|
"invalid_api_token": "Invalid API Token.",
|
||||||
"other_modules": "Další moduly",
|
"other_modules": "Other Modules",
|
||||||
"view_all": "Zobrazit vše",
|
"view_all": "View All",
|
||||||
"no_reviews_found": "Pro tento modul zatím neexistují žádné recenze!",
|
"no_reviews_found": "There are no reviews for this module yet!",
|
||||||
"module_not_purchased": "Modul není zakoupený",
|
"module_not_purchased": "Module Not Purchased",
|
||||||
"module_not_found": "Modul nebyl nalezen",
|
"module_not_found": "Module Not Found",
|
||||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||||
"last_updated": "Naposledy aktualizováno",
|
"last_updated": "Last Updated On",
|
||||||
"connect_installation": "Připojte vaši instalaci",
|
"connect_installation": "Connect your installation",
|
||||||
"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í.",
|
"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": "Zobrazit modul",
|
"view_module": "View Module",
|
||||||
"update_available": "Je k dispozici aktualizace",
|
"update_available": "Update Available",
|
||||||
"purchased": "Zakoupeno",
|
"purchased": "Purchased",
|
||||||
"installed": "Nainstalováno",
|
"installed": "Installed",
|
||||||
"no_modules_installed": "Nejsou nainstalovány žádné moduly!",
|
"no_modules_installed": "No Modules Installed Yet!",
|
||||||
"disable_warning": "Všechna nastavení pro tuto konkrétní položku budou vrácena zpět.",
|
"disable_warning": "All the settings for this particular will be reverted.",
|
||||||
"what_you_get": "Co získáte"
|
"what_you_get": "What you get"
|
||||||
},
|
},
|
||||||
"users": {
|
"users": {
|
||||||
"title": "Uživatelé",
|
"title": "Uživatelé",
|
||||||
@ -731,7 +731,7 @@
|
|||||||
"companies": "Společnosti"
|
"companies": "Společnosti"
|
||||||
},
|
},
|
||||||
"reports": {
|
"reports": {
|
||||||
"title": "Hlášení",
|
"title": "Report",
|
||||||
"from_date": "Datum od",
|
"from_date": "Datum od",
|
||||||
"to_date": "Do data",
|
"to_date": "Do data",
|
||||||
"status": "Stav",
|
"status": "Stav",
|
||||||
@ -739,8 +739,8 @@
|
|||||||
"unpaid": "Nezaplaceno",
|
"unpaid": "Nezaplaceno",
|
||||||
"download_pdf": "Stáhnout PDF",
|
"download_pdf": "Stáhnout PDF",
|
||||||
"view_pdf": "Zobrazit PDF",
|
"view_pdf": "Zobrazit PDF",
|
||||||
"update_report": "Upravit hlášení",
|
"update_report": "Upravit report",
|
||||||
"report": "Hlášení | Hlášení",
|
"report": "Report | Reporty",
|
||||||
"profit_loss": {
|
"profit_loss": {
|
||||||
"profit_loss": "Zisk a ztráta",
|
"profit_loss": "Zisk a ztráta",
|
||||||
"to_date": "Do data",
|
"to_date": "Do data",
|
||||||
@ -752,7 +752,7 @@
|
|||||||
"date_range": "Vybrat časový rozsah",
|
"date_range": "Vybrat časový rozsah",
|
||||||
"to_date": "Do data",
|
"to_date": "Do data",
|
||||||
"from_date": "Od data",
|
"from_date": "Od data",
|
||||||
"report_type": "Typ hlášení"
|
"report_type": "Typ reportu"
|
||||||
},
|
},
|
||||||
"taxes": {
|
"taxes": {
|
||||||
"taxes": "Daně",
|
"taxes": "Daně",
|
||||||
@ -807,10 +807,10 @@
|
|||||||
"payment_modes": "Způsoby plateb",
|
"payment_modes": "Způsoby plateb",
|
||||||
"notes": "Poznámky",
|
"notes": "Poznámky",
|
||||||
"exchange_rate": "Směnný kurz",
|
"exchange_rate": "Směnný kurz",
|
||||||
"address_information": "Adresa"
|
"address_information": "Address Information"
|
||||||
},
|
},
|
||||||
"address_information": {
|
"address_information": {
|
||||||
"section_description": " Adresu můžete aktualizovat pomocí formuláře níže."
|
"section_description": " You can update Your Address information using form below."
|
||||||
},
|
},
|
||||||
"title": "Nastavení",
|
"title": "Nastavení",
|
||||||
"setting": "Nastavení | Nastavení",
|
"setting": "Nastavení | Nastavení",
|
||||||
@ -1114,7 +1114,7 @@
|
|||||||
"exchange_help_text": "Zadejte směnný kurz pro převod z {currency} do {baseCurrency}",
|
"exchange_help_text": "Zadejte směnný kurz pro převod z {currency} do {baseCurrency}",
|
||||||
"currency_freak": "Currency Freak",
|
"currency_freak": "Currency Freak",
|
||||||
"currency_layer": "Currency Layer",
|
"currency_layer": "Currency Layer",
|
||||||
"open_exchange_rate": "Otevřít směnný kurz",
|
"open_exchange_rate": "Open Exchange Rate",
|
||||||
"currency_converter": "Převodník měn",
|
"currency_converter": "Převodník měn",
|
||||||
"server": "Server",
|
"server": "Server",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
@ -1150,8 +1150,8 @@
|
|||||||
"payment_mode_added": "Platební metoda přidána",
|
"payment_mode_added": "Platební metoda přidána",
|
||||||
"payment_mode_updated": "Platební metoda upravena",
|
"payment_mode_updated": "Platební metoda upravena",
|
||||||
"payment_mode_confirm_delete": "Nebudete moci obnovit tuto platební metodu",
|
"payment_mode_confirm_delete": "Nebudete moci obnovit tuto platební metodu",
|
||||||
"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.",
|
"payments_attached": "This payment method is already attached to payments. Please delete the attached payments to proceed with deletion.",
|
||||||
"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.",
|
"expenses_attached": "This payment method is already attached to expenses. Please delete the attached expenses to proceed with deletion.",
|
||||||
"deleted_message": "Platební metoda byla úspěšně odstraněna"
|
"deleted_message": "Platební metoda byla úspěšně odstraněna"
|
||||||
},
|
},
|
||||||
"expense_category": {
|
"expense_category": {
|
||||||
@ -1178,8 +1178,8 @@
|
|||||||
"discount_setting": "Nastavení slev",
|
"discount_setting": "Nastavení slev",
|
||||||
"discount_per_item": "Sleva za položku ",
|
"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.",
|
"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": "Automaticky zrušit platnost veřejných odkazů",
|
"expire_public_links": "Automatically Expire Public Links",
|
||||||
"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í.",
|
"expire_setting_description": "Specify whether you would like to expire all the links sent by application to view invoices, estimates & payments, etc after a specified duration.",
|
||||||
"save": "Uložit",
|
"save": "Uložit",
|
||||||
"preference": "Předvolba | Předvolby",
|
"preference": "Předvolba | Předvolby",
|
||||||
"general_settings": "Výchozí předvolby systému.",
|
"general_settings": "Výchozí předvolby systému.",
|
||||||
@ -1301,16 +1301,16 @@
|
|||||||
"invalid_disk_credentials": "Nesprávné přihlašovací údaje pro vybraný disk"
|
"invalid_disk_credentials": "Nesprávné přihlašovací údaje pro vybraný disk"
|
||||||
},
|
},
|
||||||
"taxations": {
|
"taxations": {
|
||||||
"add_billing_address": "Zadejte fakturační adresu",
|
"add_billing_address": "Enter Billing Address",
|
||||||
"add_shipping_address": "Zadejte doručovací adresu",
|
"add_shipping_address": "Enter Shipping Address",
|
||||||
"add_company_address": "Zadejte adresu firmy",
|
"add_company_address": "Enter Company Address",
|
||||||
"modal_description": "Níže uvedené informace jsou vyžadovány pro načtení daně z prodeje.",
|
"modal_description": "The information below is required in order to fetch sales tax.",
|
||||||
"add_address": "Přidat adresu pro načtení daně z prodeje.",
|
"add_address": "Add Address for fetching sales tax.",
|
||||||
"address_placeholder": "Například: Moje Ulice 123",
|
"address_placeholder": "Example: 123, My Street",
|
||||||
"city_placeholder": "Například: Praha",
|
"city_placeholder": "Example: Los Angeles",
|
||||||
"state_placeholder": "Například: CZ",
|
"state_placeholder": "Example: CA",
|
||||||
"zip_placeholder": "Například: 90024",
|
"zip_placeholder": "Example: 90024",
|
||||||
"invalid_address": "Zadejte prosím platnou adresu."
|
"invalid_address": "Please provide valid address details."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"wizard": {
|
"wizard": {
|
||||||
@ -1470,17 +1470,17 @@
|
|||||||
"not_allowed": "Není povoleno",
|
"not_allowed": "Není povoleno",
|
||||||
"login_invalid_credentials": "Tyto údaje neodpovídají našim záznamům.",
|
"login_invalid_credentials": "Tyto údaje neodpovídají našim záznamům.",
|
||||||
"enter_valid_cron_format": "Zadejte platný formát cronu",
|
"enter_valid_cron_format": "Zadejte platný formát cronu",
|
||||||
"email_could_not_be_sent": "E-mail nemohl být odeslán na tuto e-mailovou adresu.",
|
"email_could_not_be_sent": "Email could not be sent to this email address.",
|
||||||
"invalid_address": "Zadejte prosím platnou adresu.",
|
"invalid_address": "Please enter a valid address.",
|
||||||
"invalid_key": "Zadejte prosím platný klíč.",
|
"invalid_key": "Please enter valid key.",
|
||||||
"invalid_state": "Zadejte prosím platný název státu.",
|
"invalid_state": "Please enter a valid state.",
|
||||||
"invalid_city": "Zadejte prosím platný název města.",
|
"invalid_city": "Please enter a valid city.",
|
||||||
"invalid_postal_code": "Zadejte prosím platné PSČ.",
|
"invalid_postal_code": "Please enter a valid zip.",
|
||||||
"invalid_format": "Zadejte prosím data v platném formátu.",
|
"invalid_format": "Please enter valid query string format.",
|
||||||
"api_error": "Server neodpovídá.",
|
"api_error": "Server not responding.",
|
||||||
"feature_not_enabled": "Funkce není zapnuta.",
|
"feature_not_enabled": "Feature not enabled.",
|
||||||
"request_limit_met": "Limit požadavků API překročen.",
|
"request_limit_met": "Api request limit exceeded.",
|
||||||
"address_incomplete": "Neúplná adresa"
|
"address_incomplete": "Incomplete Address"
|
||||||
},
|
},
|
||||||
"pdf_estimate_label": "Odhad",
|
"pdf_estimate_label": "Odhad",
|
||||||
"pdf_estimate_number": "Číslo odhadu",
|
"pdf_estimate_number": "Číslo odhadu",
|
||||||
@ -1504,18 +1504,18 @@
|
|||||||
"pdf_payment_number": "Číslo platby",
|
"pdf_payment_number": "Číslo platby",
|
||||||
"pdf_payment_mode": "Platební metoda",
|
"pdf_payment_mode": "Platební metoda",
|
||||||
"pdf_payment_amount_received_label": "Obdržená částka",
|
"pdf_payment_amount_received_label": "Obdržená částka",
|
||||||
"pdf_expense_report_label": "HLÁŠENÍ VÝDAJŮ",
|
"pdf_expense_report_label": "REPORT VÝDAJŮ",
|
||||||
"pdf_total_expenses_label": "VÝDAJE CELKEM",
|
"pdf_total_expenses_label": "VÝDAJE CELKEM",
|
||||||
"pdf_profit_loss_label": "HLÁŠENÍ ZISKU A ZTRÁT",
|
"pdf_profit_loss_label": "REPORT ZISKU A ZTRÁT",
|
||||||
"pdf_sales_customers_label": "Hlášení o zákaznících prodeje",
|
"pdf_sales_customers_label": "Report o zákaznících prodeje",
|
||||||
"pdf_sales_items_label": "Hlášení o položkách prodeje",
|
"pdf_sales_items_label": "Report o položkách prodeje",
|
||||||
"pdf_tax_summery_label": "Hlášení o daních",
|
"pdf_tax_summery_label": "Report o shrnutí daní",
|
||||||
"pdf_income_label": "PŘÍJEM",
|
"pdf_income_label": "PŘÍJEM",
|
||||||
"pdf_net_profit_label": "ČISTÝ ZISK",
|
"pdf_net_profit_label": "ČISTÝ ZISK",
|
||||||
"pdf_customer_sales_report": "Hlášení o prodeji: Podle zákazníka",
|
"pdf_customer_sales_report": "Report o prodeji: Podle zákazníka",
|
||||||
"pdf_total_sales_label": "PRODEJE CELKEM",
|
"pdf_total_sales_label": "PRODEJE CELKEM",
|
||||||
"pdf_item_sales_label": "Hlášení o prodeji: Podle položky",
|
"pdf_item_sales_label": "Report o prodeji: Podle položky",
|
||||||
"pdf_tax_report_label": "DAŇOVÉ HLÁŠENÍ",
|
"pdf_tax_report_label": "DAŇOVÝ REPORT",
|
||||||
"pdf_total_tax_label": "DANĚ CELKEM",
|
"pdf_total_tax_label": "DANĚ CELKEM",
|
||||||
"pdf_tax_types_label": "Typy daní",
|
"pdf_tax_types_label": "Typy daní",
|
||||||
"pdf_expenses_label": "Výdaje",
|
"pdf_expenses_label": "Výdaje",
|
||||||
|
|||||||
@ -526,7 +526,7 @@
|
|||||||
"cloned_successfully": "Serienrechnung erfolgreich kopiert",
|
"cloned_successfully": "Serienrechnung erfolgreich kopiert",
|
||||||
"clone_invoice": "Serienrechnung kopieren",
|
"clone_invoice": "Serienrechnung kopieren",
|
||||||
"confirm_clone": "Diese Serienrechnung wird in eine neue Serienrechnung kopiert",
|
"confirm_clone": "Diese Serienrechnung wird in eine neue Serienrechnung kopiert",
|
||||||
"add_customer_email": "Bitte fügen Sie eine E-Mail-Adresse für diesen Kunden hinzu, um Rechnungen automatisch zu senden.",
|
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
||||||
"item": {
|
"item": {
|
||||||
"title": "Titel des Artikels",
|
"title": "Titel des Artikels",
|
||||||
"description": "Beschreibung",
|
"description": "Beschreibung",
|
||||||
@ -682,25 +682,25 @@
|
|||||||
"update_to": "Update auf",
|
"update_to": "Update auf",
|
||||||
"module_updated": "Modul erfolgreich aktualisiert!",
|
"module_updated": "Modul erfolgreich aktualisiert!",
|
||||||
"title": "Module",
|
"title": "Module",
|
||||||
"module": "Modul | Module",
|
"module": "Module | Modules",
|
||||||
"api_token": "API Schlüssel",
|
"api_token": "API Schlüssel",
|
||||||
"invalid_api_token": "Ungültiger API-Schlüssel.",
|
"invalid_api_token": "Invalid API Token.",
|
||||||
"other_modules": "Weitere Module",
|
"other_modules": "Weitere Module",
|
||||||
"view_all": "Alle Anzeigen",
|
"view_all": "Alle Anzeigen",
|
||||||
"no_reviews_found": "Für dieses Modul gibt es noch keine Bewertungen!",
|
"no_reviews_found": "There are no reviews for this module yet!",
|
||||||
"module_not_purchased": "Module Not Purchased",
|
"module_not_purchased": "Module Not Purchased",
|
||||||
"module_not_found": "Modul nicht gefunden",
|
"module_not_found": "Module Not Found",
|
||||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||||
"last_updated": "Zuletzt aktualisiert am",
|
"last_updated": "Zuletzt aktualisiert am",
|
||||||
"connect_installation": "Installation verbinden",
|
"connect_installation": "Installation verbinden",
|
||||||
"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.",
|
"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": "Modul anzeigen",
|
"view_module": "Modul anzeigen",
|
||||||
"update_available": "Aktualisierung verfügbar",
|
"update_available": "Aktualisierung verfügbar",
|
||||||
"purchased": "Gekauft",
|
"purchased": "Gekauft",
|
||||||
"installed": "Installiert",
|
"installed": "Installiert",
|
||||||
"no_modules_installed": "Noch keine Module installiert!",
|
"no_modules_installed": "Noch keine Module installiert!",
|
||||||
"disable_warning": "Alle Einstellungen für diesen speziellen Wert werden zurückgesetzt.",
|
"disable_warning": "All the settings for this particular will be reverted.",
|
||||||
"what_you_get": "Was Sie erhalten"
|
"what_you_get": "What you get"
|
||||||
},
|
},
|
||||||
"users": {
|
"users": {
|
||||||
"title": "Benutzer",
|
"title": "Benutzer",
|
||||||
@ -1304,8 +1304,8 @@
|
|||||||
"add_billing_address": "Rechnungsadresse eingeben",
|
"add_billing_address": "Rechnungsadresse eingeben",
|
||||||
"add_shipping_address": "Lieferadresse eingeben",
|
"add_shipping_address": "Lieferadresse eingeben",
|
||||||
"add_company_address": "Firmenadresse eingeben",
|
"add_company_address": "Firmenadresse eingeben",
|
||||||
"modal_description": "Die untenstehenden Informationen sind erforderlich, um die Steuer berücksichtigen zu können.",
|
"modal_description": "The information below is required in order to fetch sales tax.",
|
||||||
"add_address": "Fügen Sie eine Adresse hinzu, um die Steuer abrufen zu können.",
|
"add_address": "Add Address for fetching sales tax.",
|
||||||
"address_placeholder": "Beispiel: 123, meine Straße",
|
"address_placeholder": "Beispiel: 123, meine Straße",
|
||||||
"city_placeholder": "Beispiel: Los Angeles",
|
"city_placeholder": "Beispiel: Los Angeles",
|
||||||
"state_placeholder": "Beispiel: CA",
|
"state_placeholder": "Beispiel: CA",
|
||||||
@ -1471,21 +1471,21 @@
|
|||||||
"login_invalid_credentials": "Diese Anmeldeinformationen stimmen nicht mit unseren Aufzeichnungen überein.",
|
"login_invalid_credentials": "Diese Anmeldeinformationen stimmen nicht mit unseren Aufzeichnungen überein.",
|
||||||
"enter_valid_cron_format": "Bitte geben Sie ein gültiges Cron-Format ein",
|
"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.",
|
"email_could_not_be_sent": "Die E-Mail konnte nicht an diese Adresse gesendet werden.",
|
||||||
"invalid_address": "Bitte geben Sie eine gültige Adresse ein.",
|
"invalid_address": "Please enter a valid address.",
|
||||||
"invalid_key": "Bitte geben Sie einen gültigen Schlüssel ein.",
|
"invalid_key": "Please enter valid key.",
|
||||||
"invalid_state": "Bitte geben Sie ein gültiges Bundesland ein.",
|
"invalid_state": "Please enter a valid state.",
|
||||||
"invalid_city": "Bitte geben Sie eine gültige Stadt an.",
|
"invalid_city": "Please enter a valid city.",
|
||||||
"invalid_postal_code": "Bitte geben Sie eine gültige PLZ an.",
|
"invalid_postal_code": "Please enter a valid zip.",
|
||||||
"invalid_format": "Bitte geben Sie ein gültiges Abfrageformat ein.",
|
"invalid_format": "Please enter valid query string format.",
|
||||||
"api_error": "Der Server antwortet nicht.",
|
"api_error": "Der Server antwortet nicht.",
|
||||||
"feature_not_enabled": "Funktion nicht aktiviert.",
|
"feature_not_enabled": "Funktion nicht aktiviert.",
|
||||||
"request_limit_met": "Api Anfragelimit überschritten.",
|
"request_limit_met": "Api request limit exceeded.",
|
||||||
"address_incomplete": "Unvollständige Adresse"
|
"address_incomplete": "Unvollständige Adresse"
|
||||||
},
|
},
|
||||||
"pdf_estimate_label": "Angebot",
|
"pdf_estimate_label": "Angebot",
|
||||||
"pdf_estimate_number": "Angebotsnummer",
|
"pdf_estimate_number": "Angebotsnummer",
|
||||||
"pdf_estimate_date": "Angebotsdatum",
|
"pdf_estimate_date": "Angebotsdatum",
|
||||||
"pdf_estimate_expire_date": "Gültig bis",
|
"pdf_estimate_expire_date": "Ablaufdatum",
|
||||||
"pdf_invoice_label": "Rechnung",
|
"pdf_invoice_label": "Rechnung",
|
||||||
"pdf_invoice_number": "Rechnungsnummer",
|
"pdf_invoice_number": "Rechnungsnummer",
|
||||||
"pdf_invoice_date": "Rechnungsdatum",
|
"pdf_invoice_date": "Rechnungsdatum",
|
||||||
@ -1519,8 +1519,8 @@
|
|||||||
"pdf_total_tax_label": "Gesamte Umsatzsteuer",
|
"pdf_total_tax_label": "Gesamte Umsatzsteuer",
|
||||||
"pdf_tax_types_label": "Steuersätze",
|
"pdf_tax_types_label": "Steuersätze",
|
||||||
"pdf_expenses_label": "Ausgaben",
|
"pdf_expenses_label": "Ausgaben",
|
||||||
"pdf_bill_to": "Rechnungsanschrift",
|
"pdf_bill_to": "Rechnungsempfänger:",
|
||||||
"pdf_ship_to": "Lieferanschrift",
|
"pdf_ship_to": "Versand an:",
|
||||||
"pdf_received_from": "Erhalten von:",
|
"pdf_received_from": "Erhalten von:",
|
||||||
"pdf_tax_label": "Steuer"
|
"pdf_tax_label": "Steuer"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,13 +6,13 @@
|
|||||||
"invoices": "Τιμολόγια",
|
"invoices": "Τιμολόγια",
|
||||||
"recurring-invoices": "Επαναλαμβανόμενα τιμολόγια",
|
"recurring-invoices": "Επαναλαμβανόμενα τιμολόγια",
|
||||||
"expenses": "Έξοδα",
|
"expenses": "Έξοδα",
|
||||||
"estimates": "Προσφορές",
|
"estimates": "Εκτιμήσεις",
|
||||||
"payments": "Πληρωμές",
|
"payments": "Πληρωμές",
|
||||||
"reports": "Αναφορές",
|
"reports": "Αναφορές",
|
||||||
"settings": "Ρυθμίσεις",
|
"settings": "Ρυθμίσεις",
|
||||||
"logout": "Αποσύνδεση",
|
"logout": "Αποσύνδεση",
|
||||||
"users": "Χρήστες",
|
"users": "Χρήστες",
|
||||||
"modules": "Πρόσθετα"
|
"modules": "Modules"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add_company": "Προσθήκη Εταιρείας",
|
"add_company": "Προσθήκη Εταιρείας",
|
||||||
@ -93,14 +93,14 @@
|
|||||||
"no_note_found": "Δεν Βρέθηκε Σημείωση",
|
"no_note_found": "Δεν Βρέθηκε Σημείωση",
|
||||||
"insert_note": "Εισαγωγή Σημείωσης",
|
"insert_note": "Εισαγωγή Σημείωσης",
|
||||||
"copied_pdf_url_clipboard": "Αντιγράφηκε το url του PDF στo πρόχειρο!",
|
"copied_pdf_url_clipboard": "Αντιγράφηκε το url του PDF στo πρόχειρο!",
|
||||||
"copied_url_clipboard": "Ο σύνδεσμος αντιγράφηκε στο πρόχειρο!",
|
"copied_url_clipboard": "Copied url to clipboard!",
|
||||||
"docs": "Έγγραφα",
|
"docs": "Έγγραφα",
|
||||||
"do_you_wish_to_continue": "Θέλετε να συνεχίσετε;",
|
"do_you_wish_to_continue": "Θέλετε να συνεχίσετε;",
|
||||||
"note": "Σημείωση",
|
"note": "Σημείωση",
|
||||||
"pay_invoice": "Πληρωμή τιμολογίου",
|
"pay_invoice": "Pay Invoice",
|
||||||
"login_successfully": "Η είσοδος ήταν επιτυχής!",
|
"login_successfully": "Logged in successfully!",
|
||||||
"logged_out_successfully": "Η έξοδος ήταν επιτυχής",
|
"logged_out_successfully": "Logged out successfully",
|
||||||
"mark_as_default": "Σημείωση ως προεπιλογή"
|
"mark_as_default": "Mark as default"
|
||||||
},
|
},
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"select_year": "Επιλογή έτους",
|
"select_year": "Επιλογή έτους",
|
||||||
@ -108,8 +108,8 @@
|
|||||||
"due_amount": "Οφειλόμενο Ποσό",
|
"due_amount": "Οφειλόμενο Ποσό",
|
||||||
"customers": "Πελάτες",
|
"customers": "Πελάτες",
|
||||||
"invoices": "Τιμολόγια",
|
"invoices": "Τιμολόγια",
|
||||||
"estimates": "Προσφορές",
|
"estimates": "Εκτιμήσεις",
|
||||||
"payments": "Πληρωμές"
|
"payments": "Payments"
|
||||||
},
|
},
|
||||||
"chart_info": {
|
"chart_info": {
|
||||||
"total_sales": "Πωλήσεις",
|
"total_sales": "Πωλήσεις",
|
||||||
@ -130,7 +130,7 @@
|
|||||||
"view_all": "Προβολή Όλων"
|
"view_all": "Προβολή Όλων"
|
||||||
},
|
},
|
||||||
"recent_estimate_card": {
|
"recent_estimate_card": {
|
||||||
"title": "Πρόσφατες προσφορές",
|
"title": "Πρόσφατες Εκτιμήσεις",
|
||||||
"date": "Ημερομηνία",
|
"date": "Ημερομηνία",
|
||||||
"customer": "Πελάτης",
|
"customer": "Πελάτης",
|
||||||
"amount_due": "Οφειλόμενο Ποσό",
|
"amount_due": "Οφειλόμενο Ποσό",
|
||||||
@ -264,18 +264,18 @@
|
|||||||
"deleted_message": "Ο υπολογισμός διαγράφηκε επιτυχώς"
|
"deleted_message": "Ο υπολογισμός διαγράφηκε επιτυχώς"
|
||||||
},
|
},
|
||||||
"estimates": {
|
"estimates": {
|
||||||
"title": "Προσφορές",
|
"title": "Εκτιμήσεις",
|
||||||
"accept_estimate": "Accept Estimate",
|
"accept_estimate": "Accept Estimate",
|
||||||
"reject_estimate": "Reject Estimate",
|
"reject_estimate": "Reject Estimate",
|
||||||
"estimate": "Προσφορά | Προσφορές",
|
"estimate": "Εκτίμηση | Εκτιμήσεις",
|
||||||
"estimates_list": "Λίστα προσφορών",
|
"estimates_list": "Λίστα Εκτιμήσεων",
|
||||||
"days": "{days} Ημέρες",
|
"days": "{days} Ημέρες",
|
||||||
"months": "{months} Μήνας",
|
"months": "{months} Μήνας",
|
||||||
"years": "{years} Έτος",
|
"years": "{years} Έτος",
|
||||||
"all": "Όλα",
|
"all": "Όλα",
|
||||||
"paid": "Εξοφλημένο",
|
"paid": "Εξοφλημένο",
|
||||||
"unpaid": "Ανεξόφλητο",
|
"unpaid": "Ανεξόφλητο",
|
||||||
"customer": "Πελάτης",
|
"customer": "ΤΕΛΩΝΕΙΑΚΗ",
|
||||||
"ref_no": "REF NO.",
|
"ref_no": "REF NO.",
|
||||||
"number": "ΑΡΙΘΜΟΣ",
|
"number": "ΑΡΙΘΜΟΣ",
|
||||||
"amount_due": "ΠΟΣΟ ΠΡΟΣ ΠΛΗΡΩΜΗ",
|
"amount_due": "ΠΟΣΟ ΠΡΟΣ ΠΛΗΡΩΜΗ",
|
||||||
@ -300,7 +300,7 @@
|
|||||||
"convert_to_invoice": "Μετατράπηκε σε Τιμολόγιο",
|
"convert_to_invoice": "Μετατράπηκε σε Τιμολόγιο",
|
||||||
"mark_as_sent": "Σήμανση ως απεσταλμένου",
|
"mark_as_sent": "Σήμανση ως απεσταλμένου",
|
||||||
"send_estimate": "Νέα Εκτίμηση",
|
"send_estimate": "Νέα Εκτίμηση",
|
||||||
"resend_estimate": "Πρόσφατες προσφορές",
|
"resend_estimate": "Πρόσφατες Εκτιμήσεις",
|
||||||
"record_payment": "Καταγραφή Πληρωμής",
|
"record_payment": "Καταγραφή Πληρωμής",
|
||||||
"add_estimate": "Νέα Εκτίμηση",
|
"add_estimate": "Νέα Εκτίμηση",
|
||||||
"save_estimate": "Νέα Εκτίμηση",
|
"save_estimate": "Νέα Εκτίμηση",
|
||||||
@ -310,7 +310,7 @@
|
|||||||
"confirm_mark_as_sent": "Η εκτίμηση αυτή θα επισημανθεί ως εστάλη",
|
"confirm_mark_as_sent": "Η εκτίμηση αυτή θα επισημανθεί ως εστάλη",
|
||||||
"confirm_mark_as_accepted": "Αυτό το τιμολόγιο θα επισημανθεί ως Απορριπτόμενο",
|
"confirm_mark_as_accepted": "Αυτό το τιμολόγιο θα επισημανθεί ως Απορριπτόμενο",
|
||||||
"confirm_mark_as_rejected": "Αυτό το τιμολόγιο θα επισημανθεί ως Απορριπτόμενο",
|
"confirm_mark_as_rejected": "Αυτό το τιμολόγιο θα επισημανθεί ως Απορριπτόμενο",
|
||||||
"no_matching_estimates": "Δεν υπάρχουν αντίστοιχες προσφορές!",
|
"no_matching_estimates": "Δεν υπάρχουν αντίστοιχες εκτιμήσεις!",
|
||||||
"mark_as_sent_successfully": "Το τιμολόγιο επισημάνθηκε ως απεσταλμένο επιτυχώς",
|
"mark_as_sent_successfully": "Το τιμολόγιο επισημάνθηκε ως απεσταλμένο επιτυχώς",
|
||||||
"send_estimate_successfully": "Το τιμολόγιο εστάλη επιτυχώς",
|
"send_estimate_successfully": "Το τιμολόγιο εστάλη επιτυχώς",
|
||||||
"errors": {
|
"errors": {
|
||||||
@ -328,9 +328,9 @@
|
|||||||
"update_Estimate": "Ενημέρωση εκτίμησης",
|
"update_Estimate": "Ενημέρωση εκτίμησης",
|
||||||
"edit_estimate": "Επεξεργασία Εκτίμησης",
|
"edit_estimate": "Επεξεργασία Εκτίμησης",
|
||||||
"items": "στοιχεία",
|
"items": "στοιχεία",
|
||||||
"Estimate": "Προσφορά | Προσφορές",
|
"Estimate": "Εκτίμηση | Εκτιμήσεις",
|
||||||
"add_new_tax": "Προσθήκη Νέου Φόρου",
|
"add_new_tax": "Προσθήκη Νέου Φόρου",
|
||||||
"no_estimates": "Δεν υπάρχουν προσφορές ακόμα!",
|
"no_estimates": "Δεν υπάρχουν εκτιμήσεις ακόμα!",
|
||||||
"list_of_estimates": "Αυτή η ενότητα θα περιέχει τη λίστα των στοιχείων.",
|
"list_of_estimates": "Αυτή η ενότητα θα περιέχει τη λίστα των στοιχείων.",
|
||||||
"mark_as_rejected": "Σήμανση ως απορρίφθηκε",
|
"mark_as_rejected": "Σήμανση ως απορρίφθηκε",
|
||||||
"mark_as_accepted": "Σήμανση ως αποδεκτό",
|
"mark_as_accepted": "Σήμανση ως αποδεκτό",
|
||||||
@ -372,7 +372,7 @@
|
|||||||
"viewed": "Προβλήθηκαν",
|
"viewed": "Προβλήθηκαν",
|
||||||
"overdue": "Εκπρόθεσμα",
|
"overdue": "Εκπρόθεσμα",
|
||||||
"completed": "Ολοκληρώθηκε",
|
"completed": "Ολοκληρώθηκε",
|
||||||
"customer": "Πελάτης",
|
"customer": "ΤΕΛΩΝΕΙΑΚΗ",
|
||||||
"paid_status": "ΚΑΤΑΣΤΑΣΗ ΠΛΗΡΩΜΗΣ",
|
"paid_status": "ΚΑΤΑΣΤΑΣΗ ΠΛΗΡΩΜΗΣ",
|
||||||
"ref_no": "REF NO.",
|
"ref_no": "REF NO.",
|
||||||
"number": "ΑΡΙΘΜΟΣ",
|
"number": "ΑΡΙΘΜΟΣ",
|
||||||
@ -462,7 +462,7 @@
|
|||||||
"overdue": "Εκπρόθεσμα",
|
"overdue": "Εκπρόθεσμα",
|
||||||
"active": "Ενεργή",
|
"active": "Ενεργή",
|
||||||
"completed": "Ολοκληρώθηκε",
|
"completed": "Ολοκληρώθηκε",
|
||||||
"customer": "Πελάτης",
|
"customer": "ΤΕΛΩΝΕΙΑΚΗ",
|
||||||
"paid_status": "ΚΑΤΑΣΤΑΣΗ ΠΛΗΡΩΜΗΣ",
|
"paid_status": "ΚΑΤΑΣΤΑΣΗ ΠΛΗΡΩΜΗΣ",
|
||||||
"ref_no": "REF NO.",
|
"ref_no": "REF NO.",
|
||||||
"number": "ΑΡΙΘΜΟΣ",
|
"number": "ΑΡΙΘΜΟΣ",
|
||||||
@ -681,7 +681,7 @@
|
|||||||
"module_enabled": "Module Enabled",
|
"module_enabled": "Module Enabled",
|
||||||
"update_to": "Update To",
|
"update_to": "Update To",
|
||||||
"module_updated": "Module Updated Successfully!",
|
"module_updated": "Module Updated Successfully!",
|
||||||
"title": "Πρόσθετα",
|
"title": "Modules",
|
||||||
"module": "Module | Modules",
|
"module": "Module | Modules",
|
||||||
"api_token": "API token",
|
"api_token": "API token",
|
||||||
"invalid_api_token": "Invalid API Token.",
|
"invalid_api_token": "Invalid API Token.",
|
||||||
@ -692,13 +692,13 @@
|
|||||||
"module_not_found": "Module Not Found",
|
"module_not_found": "Module Not Found",
|
||||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||||
"last_updated": "Last Updated On",
|
"last_updated": "Last Updated On",
|
||||||
"connect_installation": "Σύνδεση της εγκατάστασης σας",
|
"connect_installation": "Connect your installation",
|
||||||
"api_token_description": "Συνδεθείτε στο {url} και συνδέστε αυτήν την εγκατάσταση εισάγοντας το API Token. Τα πρόσθετα που αγοράσατε θα εμφανιστούν εδώ μετά την ολοκλήρωση της σύνδεσης.",
|
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
||||||
"view_module": "Δείτε το πρόσθετο",
|
"view_module": "View Module",
|
||||||
"update_available": "Διαθέσιμη ανανέωση",
|
"update_available": "Update Available",
|
||||||
"purchased": "Purchased",
|
"purchased": "Purchased",
|
||||||
"installed": "Εγκαταστάθηκε",
|
"installed": "Installed",
|
||||||
"no_modules_installed": "Δεν υπάρχουν ακόμα εγκατεστημένα πρόσθετα!",
|
"no_modules_installed": "No Modules Installed Yet!",
|
||||||
"disable_warning": "All the settings for this particular will be reverted.",
|
"disable_warning": "All the settings for this particular will be reverted.",
|
||||||
"what_you_get": "What you get"
|
"what_you_get": "What you get"
|
||||||
},
|
},
|
||||||
@ -815,7 +815,7 @@
|
|||||||
"title": "Ρυθμίσεις",
|
"title": "Ρυθμίσεις",
|
||||||
"setting": "Ρύθμιση Ρυθμίσεων",
|
"setting": "Ρύθμιση Ρυθμίσεων",
|
||||||
"general": "General",
|
"general": "General",
|
||||||
"language": "Γλώσσα",
|
"language": "Language",
|
||||||
"primary_currency": "Κύριο Νόμισμα",
|
"primary_currency": "Κύριο Νόμισμα",
|
||||||
"timezone": "Ζώνη Ώρας",
|
"timezone": "Ζώνη Ώρας",
|
||||||
"date_format": "Μορφή Ημερομηνίας",
|
"date_format": "Μορφή Ημερομηνίας",
|
||||||
|
|||||||
@ -863,8 +863,6 @@
|
|||||||
"company_info": {
|
"company_info": {
|
||||||
"company_info": "Company info",
|
"company_info": "Company info",
|
||||||
"company_name": "Company Name",
|
"company_name": "Company Name",
|
||||||
"company_slug": "Company Slug",
|
|
||||||
"company_slug_help_text": "A unique URL friendly name for your company (It will appear on Customer Portal URL)",
|
|
||||||
"company_logo": "Company Logo",
|
"company_logo": "Company Logo",
|
||||||
"section_description": "Information about your company that will be displayed on invoices, estimates and other documents created by Crater.",
|
"section_description": "Information about your company that will be displayed on invoices, estimates and other documents created by Crater.",
|
||||||
"phone": "Phone",
|
"phone": "Phone",
|
||||||
@ -1326,8 +1324,6 @@
|
|||||||
"company_info": "Company Information",
|
"company_info": "Company Information",
|
||||||
"company_info_desc": "This information will be displayed on invoices. Note that you can edit this later on settings page.",
|
"company_info_desc": "This information will be displayed on invoices. Note that you can edit this later on settings page.",
|
||||||
"company_name": "Company Name",
|
"company_name": "Company Name",
|
||||||
"company_slug": "Company Slug",
|
|
||||||
"company_slug_help_text": "A unique URL friendly name for your company (It will appear on Customer Portal URL)",
|
|
||||||
"company_logo": "Company Logo",
|
"company_logo": "Company Logo",
|
||||||
"logo_preview": "Logo Preview",
|
"logo_preview": "Logo Preview",
|
||||||
"preferences": "Company Preferences",
|
"preferences": "Company Preferences",
|
||||||
@ -1458,8 +1454,7 @@
|
|||||||
"at_least_one_ability": "Please select atleast one Permission.",
|
"at_least_one_ability": "Please select atleast one Permission.",
|
||||||
"valid_driver_key": "Please enter a valid {driver} key.",
|
"valid_driver_key": "Please enter a valid {driver} key.",
|
||||||
"valid_exchange_rate": "Please enter a valid exchange rate.",
|
"valid_exchange_rate": "Please enter a valid exchange rate.",
|
||||||
"company_name_not_same": "Company name must match with given name.",
|
"company_name_not_same": "Company name must match with given name."
|
||||||
"invalid_slug": "Invalid Slug"
|
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"starter_plan": "This feature is available on Starter plan and onwards!",
|
"starter_plan": "This feature is available on Starter plan and onwards!",
|
||||||
@ -1490,7 +1485,7 @@
|
|||||||
"pdf_estimate_label": "Estimate",
|
"pdf_estimate_label": "Estimate",
|
||||||
"pdf_estimate_number": "Estimate Number",
|
"pdf_estimate_number": "Estimate Number",
|
||||||
"pdf_estimate_date": "Estimate Date",
|
"pdf_estimate_date": "Estimate Date",
|
||||||
"pdf_estimate_expire_date": "Expiry Date",
|
"pdf_estimate_expire_date": "Expiry date",
|
||||||
"pdf_invoice_label": "Invoice",
|
"pdf_invoice_label": "Invoice",
|
||||||
"pdf_invoice_number": "Invoice Number",
|
"pdf_invoice_number": "Invoice Number",
|
||||||
"pdf_invoice_date": "Invoice Date",
|
"pdf_invoice_date": "Invoice Date",
|
||||||
@ -1527,13 +1522,5 @@
|
|||||||
"pdf_bill_to": "Bill to,",
|
"pdf_bill_to": "Bill to,",
|
||||||
"pdf_ship_to": "Ship to,",
|
"pdf_ship_to": "Ship to,",
|
||||||
"pdf_received_from": "Received from:",
|
"pdf_received_from": "Received from:",
|
||||||
"pdf_tax_label": "Tax",
|
"pdf_tax_label": "Tax"
|
||||||
"date_picker": {
|
|
||||||
"same_day": "Same Day",
|
|
||||||
"within_7_days": "Within 7 Days",
|
|
||||||
"within_15_days": "Within 15 Days",
|
|
||||||
"within_30_days": "Within 30 Days",
|
|
||||||
"within_45_days": "Within 45 Days",
|
|
||||||
"within_60_days": "Within 60 Days"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
"settings": "Ajustes",
|
"settings": "Ajustes",
|
||||||
"logout": "Cerrar sesión",
|
"logout": "Cerrar sesión",
|
||||||
"users": "Usuarios",
|
"users": "Usuarios",
|
||||||
"modules": "Módulos"
|
"modules": "Modules"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add_company": "Añadir empresa",
|
"add_company": "Añadir empresa",
|
||||||
@ -49,7 +49,7 @@
|
|||||||
"view": "Ver",
|
"view": "Ver",
|
||||||
"add_new_item": "Agregar ítem nuevo",
|
"add_new_item": "Agregar ítem nuevo",
|
||||||
"clear_all": "Limpiar todo",
|
"clear_all": "Limpiar todo",
|
||||||
"showing": "Mostrar",
|
"showing": "Mostrando",
|
||||||
"of": "de",
|
"of": "de",
|
||||||
"actions": "Acciones",
|
"actions": "Acciones",
|
||||||
"subtotal": "SUBTOTAL",
|
"subtotal": "SUBTOTAL",
|
||||||
@ -93,14 +93,14 @@
|
|||||||
"no_note_found": "No se encontró ninguna nota",
|
"no_note_found": "No se encontró ninguna nota",
|
||||||
"insert_note": "Insertar una nota",
|
"insert_note": "Insertar una nota",
|
||||||
"copied_pdf_url_clipboard": "Copiar Url al portapapeles",
|
"copied_pdf_url_clipboard": "Copiar Url al portapapeles",
|
||||||
"copied_url_clipboard": "¡URL copiada al portapapeles!",
|
"copied_url_clipboard": "Copied url to clipboard!",
|
||||||
"docs": "Documentación",
|
"docs": "Documentación",
|
||||||
"do_you_wish_to_continue": "¿Deseas continuar?",
|
"do_you_wish_to_continue": "¿Deseas continuar?",
|
||||||
"note": "Nota",
|
"note": "Nota",
|
||||||
"pay_invoice": "Pagar factura",
|
"pay_invoice": "Pagar factura",
|
||||||
"login_successfully": "Logeado Satisfactoriamente!",
|
"login_successfully": "Logeado Satisfactoriamente!",
|
||||||
"logged_out_successfully": "Logeado Satisfactoriamente",
|
"logged_out_successfully": "Logeado Satisfactoriamente",
|
||||||
"mark_as_default": "Marcar como predeterminado"
|
"mark_as_default": "Mark as default"
|
||||||
},
|
},
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"select_year": "Seleccionar año",
|
"select_year": "Seleccionar año",
|
||||||
@ -109,7 +109,7 @@
|
|||||||
"customers": "Clientes",
|
"customers": "Clientes",
|
||||||
"invoices": "Facturas",
|
"invoices": "Facturas",
|
||||||
"estimates": "Presupuestos",
|
"estimates": "Presupuestos",
|
||||||
"payments": "Ver Medios de Pago"
|
"payments": "Payments"
|
||||||
},
|
},
|
||||||
"chart_info": {
|
"chart_info": {
|
||||||
"total_sales": "Ventas",
|
"total_sales": "Ventas",
|
||||||
@ -208,10 +208,10 @@
|
|||||||
"new_customer": "Nuevo cliente",
|
"new_customer": "Nuevo cliente",
|
||||||
"edit_customer": "Editar cliente",
|
"edit_customer": "Editar cliente",
|
||||||
"basic_info": "Información básica",
|
"basic_info": "Información básica",
|
||||||
"portal_access": "Acceso al portal",
|
"portal_access": "Portal Access",
|
||||||
"portal_access_text": "¿Le gustaría permitir que este cliente inicie sesión en el Portal del Cliente?",
|
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||||
"portal_access_url": "Portal URL 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.",
|
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||||
"billing_address": "Dirección de Facturación",
|
"billing_address": "Dirección de Facturación",
|
||||||
"shipping_address": "Dirección de Envío",
|
"shipping_address": "Dirección de Envío",
|
||||||
"copy_billing_address": "Copia de facturación",
|
"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.",
|
"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",
|
"created_message": "Cliente creado con éxito",
|
||||||
"updated_message": "Cliente actualizado con éxito",
|
"updated_message": "Cliente actualizado con éxito",
|
||||||
"address_updated_message": "Información del domicilio actualizado correctamente",
|
"address_updated_message": "Address Information Updated succesfully",
|
||||||
"deleted_message": "Cliente eliminado correctamente | Clientes eliminados exitosamente",
|
"deleted_message": "Cliente eliminado correctamente | Clientes eliminados exitosamente",
|
||||||
"edit_currency_not_allowed": "No se puede cambiar la divisa una vez creadas las transacciones."
|
"edit_currency_not_allowed": "No se puede cambiar la divisa una vez creadas las transacciones."
|
||||||
},
|
},
|
||||||
@ -265,8 +265,8 @@
|
|||||||
},
|
},
|
||||||
"estimates": {
|
"estimates": {
|
||||||
"title": "Presupuestos",
|
"title": "Presupuestos",
|
||||||
"accept_estimate": "Aceptar cotización",
|
"accept_estimate": "Accept Estimate",
|
||||||
"reject_estimate": "Rechazar cotización",
|
"reject_estimate": "Reject Estimate",
|
||||||
"estimate": "Presupuesto | Presupuestos",
|
"estimate": "Presupuesto | Presupuestos",
|
||||||
"estimates_list": "Lista de presupuestos",
|
"estimates_list": "Lista de presupuestos",
|
||||||
"days": "{días} Días",
|
"days": "{días} Días",
|
||||||
@ -318,10 +318,10 @@
|
|||||||
},
|
},
|
||||||
"accepted": "Aceptado",
|
"accepted": "Aceptado",
|
||||||
"rejected": "Rechazado",
|
"rejected": "Rechazado",
|
||||||
"expired": "Caducado",
|
"expired": "Expired",
|
||||||
"sent": "Enviado",
|
"sent": "Enviado",
|
||||||
"draft": "Borrador",
|
"draft": "Borrador",
|
||||||
"viewed": "Visto",
|
"viewed": "Viewed",
|
||||||
"declined": "Rechazado",
|
"declined": "Rechazado",
|
||||||
"new_estimate": "Nuevo presupuesto",
|
"new_estimate": "Nuevo presupuesto",
|
||||||
"add_new_estimate": "Añadir nuevo presupuesto",
|
"add_new_estimate": "Añadir nuevo presupuesto",
|
||||||
@ -355,14 +355,14 @@
|
|||||||
"select_an_item": "Escriba o haga clic para seleccionar un elemento",
|
"select_an_item": "Escriba o haga clic para seleccionar un elemento",
|
||||||
"type_item_description": "Descripción del tipo de elemento(opcional)"
|
"type_item_description": "Descripción del tipo de elemento(opcional)"
|
||||||
},
|
},
|
||||||
"mark_as_default_estimate_template_description": "Si se activa, esta plantilla se selccionará automáticamente para nuevos presupuestos. "
|
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||||
},
|
},
|
||||||
"invoices": {
|
"invoices": {
|
||||||
"title": "Facturas",
|
"title": "Facturas",
|
||||||
"download": "Descargar",
|
"download": "Download",
|
||||||
"pay_invoice": "Pagar factura",
|
"pay_invoice": "Pay Invoice",
|
||||||
"invoices_list": "Lista de facturas",
|
"invoices_list": "Lista de facturas",
|
||||||
"invoice_information": "Información de la factura",
|
"invoice_information": "Invoice Information",
|
||||||
"days": "{días} Días",
|
"days": "{días} Días",
|
||||||
"months": "{meses} Mes",
|
"months": "{meses} Mes",
|
||||||
"years": "{años} Año",
|
"years": "{años} Año",
|
||||||
@ -447,7 +447,7 @@
|
|||||||
"marked_as_sent_message": "Factura marcada como enviada con éxito",
|
"marked_as_sent_message": "Factura marcada como enviada con éxito",
|
||||||
"something_went_wrong": "Algo fue mal",
|
"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.",
|
"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": "Si se activa, esta plantilla se seleccionará automáticamente para nuevas facturas. "
|
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||||
},
|
},
|
||||||
"recurring_invoices": {
|
"recurring_invoices": {
|
||||||
"title": "Facturas recurrentes",
|
"title": "Facturas recurrentes",
|
||||||
@ -526,7 +526,7 @@
|
|||||||
"cloned_successfully": "Factura recurrente clonada con éxito",
|
"cloned_successfully": "Factura recurrente clonada con éxito",
|
||||||
"clone_invoice": "Clonar factura recurrente",
|
"clone_invoice": "Clonar factura recurrente",
|
||||||
"confirm_clone": "Esta factura recurrente será clonada en una nueva factura recurrente",
|
"confirm_clone": "Esta factura recurrente será clonada en una nueva factura recurrente",
|
||||||
"add_customer_email": "Por favor, agregue una dirección de correo electrónico para que este cliente envíe las facturas automáticamente.",
|
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
||||||
"item": {
|
"item": {
|
||||||
"title": "Título del artículo",
|
"title": "Título del artículo",
|
||||||
"description": "Descripción",
|
"description": "Descripción",
|
||||||
@ -658,49 +658,49 @@
|
|||||||
"retype_password": "Reescriba la contraseña"
|
"retype_password": "Reescriba la contraseña"
|
||||||
},
|
},
|
||||||
"modules": {
|
"modules": {
|
||||||
"buy_now": "Comprar ahora",
|
"buy_now": "Buy Now",
|
||||||
"install": "Instalar",
|
"install": "Install",
|
||||||
"price": "Precio",
|
"price": "Price",
|
||||||
"download_zip_file": "Descargar archivo ZIP",
|
"download_zip_file": "Download ZIP file",
|
||||||
"unzipping_package": "Descomprimir paquete",
|
"unzipping_package": "Unzipping Package",
|
||||||
"copying_files": "Copiando archivos",
|
"copying_files": "Copying Files",
|
||||||
"deleting_files": "Eliminando archivos no usados",
|
"deleting_files": "Deleting Unused files",
|
||||||
"completing_installation": "Completando la instalación",
|
"completing_installation": "Completing Installation",
|
||||||
"update_failed": "Falló la actualización",
|
"update_failed": "Update Failed",
|
||||||
"install_success": "¡El módulo se ha instalado correctamente!",
|
"install_success": "Module has been installed successfully!",
|
||||||
"customer_reviews": "Reseñas",
|
"customer_reviews": "Reviews",
|
||||||
"license": "Licencia",
|
"license": "License",
|
||||||
"faq": "Preguntas Frecuentes (FAQ)",
|
"faq": "FAQ",
|
||||||
"monthly": "Mensual",
|
"monthly": "Monthly",
|
||||||
"yearly": "Anual",
|
"yearly": "Yearly",
|
||||||
"updated": "Actualizado",
|
"updated": "Updated",
|
||||||
"version": "Versión",
|
"version": "Version",
|
||||||
"disable": "Deshabilitar",
|
"disable": "Disable",
|
||||||
"module_disabled": "Módulo desactivado",
|
"module_disabled": "Module Disabled",
|
||||||
"enable": "Habilitar",
|
"enable": "Enable",
|
||||||
"module_enabled": "Módulo habilitado",
|
"module_enabled": "Module Enabled",
|
||||||
"update_to": "Actualizar a",
|
"update_to": "Update To",
|
||||||
"module_updated": "¡Módulo actualizado correctamente!",
|
"module_updated": "Module Updated Successfully!",
|
||||||
"title": "Módulos",
|
"title": "Modules",
|
||||||
"module": "Módulo | Módulos",
|
"module": "Module | Modules",
|
||||||
"api_token": "API token",
|
"api_token": "API token",
|
||||||
"invalid_api_token": "API Token inválido.",
|
"invalid_api_token": "Invalid API Token.",
|
||||||
"other_modules": "Otros módulos",
|
"other_modules": "Other Modules",
|
||||||
"view_all": "Ver todo",
|
"view_all": "View All",
|
||||||
"no_reviews_found": "¡Este módulo aún no tiene reseñas!",
|
"no_reviews_found": "There are no reviews for this module yet!",
|
||||||
"module_not_purchased": "Módulo no comprado",
|
"module_not_purchased": "Module Not Purchased",
|
||||||
"module_not_found": "Módulo no encontrado",
|
"module_not_found": "Module Not Found",
|
||||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||||
"last_updated": "Actualizado",
|
"last_updated": "Last Updated On",
|
||||||
"connect_installation": "Conecte su instalación",
|
"connect_installation": "Connect your installation",
|
||||||
"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.",
|
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
||||||
"view_module": "Ver módulo",
|
"view_module": "View Module",
|
||||||
"update_available": "Actualización disponible",
|
"update_available": "Update Available",
|
||||||
"purchased": "Comprado",
|
"purchased": "Purchased",
|
||||||
"installed": "Instalado",
|
"installed": "Installed",
|
||||||
"no_modules_installed": "¡No hay módulos instalados todavía!",
|
"no_modules_installed": "No Modules Installed Yet!",
|
||||||
"disable_warning": "Se revertirán todos los ajustes para este particular.",
|
"disable_warning": "All the settings for this particular will be reverted.",
|
||||||
"what_you_get": "Beneficios que obtiene"
|
"what_you_get": "What you get"
|
||||||
},
|
},
|
||||||
"users": {
|
"users": {
|
||||||
"title": "Usuarios",
|
"title": "Usuarios",
|
||||||
@ -807,10 +807,10 @@
|
|||||||
"payment_modes": "Formas de pago",
|
"payment_modes": "Formas de pago",
|
||||||
"notes": "Notas",
|
"notes": "Notas",
|
||||||
"exchange_rate": "Tasa de cambio",
|
"exchange_rate": "Tasa de cambio",
|
||||||
"address_information": "Información de dirección"
|
"address_information": "Address Information"
|
||||||
},
|
},
|
||||||
"address_information": {
|
"address_information": {
|
||||||
"section_description": "Puede actualizar la información de su dirección utilizando el siguiente formulario."
|
"section_description": " You can update Your Address information using form below."
|
||||||
},
|
},
|
||||||
"title": "Configuraciones",
|
"title": "Configuraciones",
|
||||||
"setting": "Configuraciones | Configuraciones",
|
"setting": "Configuraciones | Configuraciones",
|
||||||
@ -1112,9 +1112,9 @@
|
|||||||
"error": " No puede eliminar el controlador activo",
|
"error": " No puede eliminar el controlador activo",
|
||||||
"default_currency_error": "Esta moneda ya se usa en uno de los proveedores activos",
|
"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}",
|
"exchange_help_text": "Ingrese el tipo de cambio para convertir de {currency} a {baseCurrency}",
|
||||||
"currency_freak": "Moneda",
|
"currency_freak": "Currency Freak",
|
||||||
"currency_layer": "Capa de moneda",
|
"currency_layer": "Currency Layer",
|
||||||
"open_exchange_rate": "Tasa de cambio",
|
"open_exchange_rate": "Open Exchange Rate",
|
||||||
"currency_converter": "Conversor de moneda",
|
"currency_converter": "Conversor de moneda",
|
||||||
"server": "Servidor",
|
"server": "Servidor",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
@ -1150,8 +1150,8 @@
|
|||||||
"payment_mode_added": "Forma de pago añadida",
|
"payment_mode_added": "Forma de pago añadida",
|
||||||
"payment_mode_updated": "Forma de pago actualizada",
|
"payment_mode_updated": "Forma de pago actualizada",
|
||||||
"payment_mode_confirm_delete": "No podrás recuperar este Modo de Pago",
|
"payment_mode_confirm_delete": "No podrás recuperar este Modo de Pago",
|
||||||
"payments_attached": "Esta forma de pago ya está vinculada a los pagos. Por favor, elimine los pagos adjuntos para proceder con la eliminación.",
|
"payments_attached": "This payment method is already attached to payments. Please delete the attached payments to proceed with deletion.",
|
||||||
"expenses_attached": "Esta forma de pago ya está adjunta a los gastos. Por favor, elimine los gastos adjuntos para proceder con la eliminación.",
|
"expenses_attached": "This payment method is already attached to expenses. Please delete the attached expenses to proceed with deletion.",
|
||||||
"deleted_message": "Método de pago eliminado correctamente"
|
"deleted_message": "Método de pago eliminado correctamente"
|
||||||
},
|
},
|
||||||
"expense_category": {
|
"expense_category": {
|
||||||
@ -1178,8 +1178,8 @@
|
|||||||
"discount_setting": "Ajuste de descuento",
|
"discount_setting": "Ajuste de descuento",
|
||||||
"discount_per_item": "Descuento por artículo",
|
"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.",
|
"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": "Expirar automáticamente enlaces públicos",
|
"expire_public_links": "Automatically Expire Public Links",
|
||||||
"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.",
|
"expire_setting_description": "Specify whether you would like to expire all the links sent by application to view invoices, estimates & payments, etc after a specified duration.",
|
||||||
"save": "Guardar",
|
"save": "Guardar",
|
||||||
"preference": "Preferencia | Preferencias",
|
"preference": "Preferencia | Preferencias",
|
||||||
"general_settings": "Preferencias predeterminadas para el sistema.",
|
"general_settings": "Preferencias predeterminadas para el sistema.",
|
||||||
@ -1301,16 +1301,16 @@
|
|||||||
"invalid_disk_credentials": "Credencial no válida del disco seleccionado"
|
"invalid_disk_credentials": "Credencial no válida del disco seleccionado"
|
||||||
},
|
},
|
||||||
"taxations": {
|
"taxations": {
|
||||||
"add_billing_address": "Introduzca su dirección de facturación",
|
"add_billing_address": "Enter Billing Address",
|
||||||
"add_shipping_address": "Introduzca la dirección de envío",
|
"add_shipping_address": "Enter Shipping Address",
|
||||||
"add_company_address": "Introduzca la dirección de la empresa",
|
"add_company_address": "Enter Company Address",
|
||||||
"modal_description": "La siguiente información es requerida para obtener el impuesto de venta.",
|
"modal_description": "The information below is required in order to fetch sales tax.",
|
||||||
"add_address": "Añadir dirección para obtener impuestos de venta.",
|
"add_address": "Add Address for fetching sales tax.",
|
||||||
"address_placeholder": "Ejemplo: 123, Mi Calle",
|
"address_placeholder": "Example: 123, My Street",
|
||||||
"city_placeholder": "Ejemplo: Los Angeles",
|
"city_placeholder": "Example: Los Angeles",
|
||||||
"state_placeholder": "Ejemplo: CA",
|
"state_placeholder": "Example: CA",
|
||||||
"zip_placeholder": "Ejemplo: 90024",
|
"zip_placeholder": "Example: 90024",
|
||||||
"invalid_address": "Proporciona una dirección válida."
|
"invalid_address": "Please provide valid address details."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"wizard": {
|
"wizard": {
|
||||||
@ -1470,17 +1470,17 @@
|
|||||||
"not_allowed": "No permitido",
|
"not_allowed": "No permitido",
|
||||||
"login_invalid_credentials": "Estas credenciales no coinciden con nuestros registros.",
|
"login_invalid_credentials": "Estas credenciales no coinciden con nuestros registros.",
|
||||||
"enter_valid_cron_format": "Por favor, introduzca un formato cron válido",
|
"enter_valid_cron_format": "Por favor, introduzca un formato cron válido",
|
||||||
"email_could_not_be_sent": "No se pudo enviar el correo a esta dirección de correo electrónico.",
|
"email_could_not_be_sent": "Email could not be sent to this email address.",
|
||||||
"invalid_address": "Por favor, introduzca una dirección válida.",
|
"invalid_address": "Please enter a valid address.",
|
||||||
"invalid_key": "Por favor, introduzca una clave válida.",
|
"invalid_key": "Please enter valid key.",
|
||||||
"invalid_state": "Por favor, introduzca un estado válido.",
|
"invalid_state": "Please enter a valid state.",
|
||||||
"invalid_city": "Por favor, introduzca una ciudad válida.",
|
"invalid_city": "Please enter a valid city.",
|
||||||
"invalid_postal_code": "Por favor, introduzca un código postal válido.",
|
"invalid_postal_code": "Please enter a valid zip.",
|
||||||
"invalid_format": "Por favor, introduzca un formato de consulta válido.",
|
"invalid_format": "Please enter valid query string format.",
|
||||||
"api_error": "El servidor no responde.",
|
"api_error": "Server not responding.",
|
||||||
"feature_not_enabled": "Característica no habilitada.",
|
"feature_not_enabled": "Feature not enabled.",
|
||||||
"request_limit_met": "Ha alcanzado el límite de solicitudes.",
|
"request_limit_met": "Api request limit exceeded.",
|
||||||
"address_incomplete": "Dirección incompleta"
|
"address_incomplete": "Incomplete Address"
|
||||||
},
|
},
|
||||||
"pdf_estimate_label": "Presupuestar",
|
"pdf_estimate_label": "Presupuestar",
|
||||||
"pdf_estimate_number": "Número de Presupuesto",
|
"pdf_estimate_number": "Número de Presupuesto",
|
||||||
|
|||||||
@ -77,7 +77,7 @@
|
|||||||
"list_is_empty": "La liste est vide.",
|
"list_is_empty": "La liste est vide.",
|
||||||
"no_tax_found": "Aucune taxe trouvée !",
|
"no_tax_found": "Aucune taxe trouvée !",
|
||||||
"four_zero_four": "404",
|
"four_zero_four": "404",
|
||||||
"you_got_lost": "Oups! Vous vous êtes perdus!",
|
"you_got_lost": "Oups ! Vous vous êtes perdus !",
|
||||||
"go_home": "Retour au tableau de bord",
|
"go_home": "Retour au tableau de bord",
|
||||||
"test_mail_conf": "Envoyer un email de test",
|
"test_mail_conf": "Envoyer un email de test",
|
||||||
"send_mail_successfully": "Email envoyé",
|
"send_mail_successfully": "Email envoyé",
|
||||||
@ -93,14 +93,14 @@
|
|||||||
"no_note_found": "Aucune note de bas de page trouvée",
|
"no_note_found": "Aucune note de bas de page trouvée",
|
||||||
"insert_note": "Insérer une note",
|
"insert_note": "Insérer une note",
|
||||||
"copied_pdf_url_clipboard": "L'adresse du PDF a été copiée.",
|
"copied_pdf_url_clipboard": "L'adresse du PDF a été copiée.",
|
||||||
"copied_url_clipboard": "URL copiée vers le presse-papier!",
|
"copied_url_clipboard": "URL copiée vers le presse-papier !",
|
||||||
"docs": "Documents",
|
"docs": "Documents",
|
||||||
"do_you_wish_to_continue": "Voulez-vous continuer ?",
|
"do_you_wish_to_continue": "Voulez-vous continuer ?",
|
||||||
"note": "Note de bas de page",
|
"note": "Note de bas de page",
|
||||||
"pay_invoice": "Payer facture",
|
"pay_invoice": "Payer facture",
|
||||||
"login_successfully": "Identifié avec succès!",
|
"login_successfully": "Identifié avec succès !",
|
||||||
"logged_out_successfully": "Déconnecté avec succès",
|
"logged_out_successfully": "Déconnecté avec succès",
|
||||||
"mark_as_default": "Marquer par défaut"
|
"mark_as_default": "Définir par défaut"
|
||||||
},
|
},
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"select_year": "Sélectionnez l'année",
|
"select_year": "Sélectionnez l'année",
|
||||||
@ -211,7 +211,7 @@
|
|||||||
"portal_access": "Accès Portail",
|
"portal_access": "Accès Portail",
|
||||||
"portal_access_text": "Souhaitez vous autoriser ce client à se connecter au Portail Client ?",
|
"portal_access_text": "Souhaitez vous autoriser ce client à se connecter au Portail Client ?",
|
||||||
"portal_access_url": "URL de connexion Portail Client",
|
"portal_access_url": "URL de connexion Portail Client",
|
||||||
"portal_access_url_help": "Veuillez copiez et envoyez le lien ci-dessus au client pour lui fournir l'accès au portail.",
|
"portal_access_url_help": "Veuillez copier et envoyer le lien ci-dessus au client pour lui fournir l'accès au portail.",
|
||||||
"billing_address": "Adresse de facturation",
|
"billing_address": "Adresse de facturation",
|
||||||
"shipping_address": "Adresse de livraison",
|
"shipping_address": "Adresse de livraison",
|
||||||
"copy_billing_address": "Copier depuis l'adresse de facturation",
|
"copy_billing_address": "Copier depuis l'adresse de facturation",
|
||||||
@ -321,7 +321,7 @@
|
|||||||
"expired": "Expiré",
|
"expired": "Expiré",
|
||||||
"sent": "Envoyé",
|
"sent": "Envoyé",
|
||||||
"draft": "Brouillon",
|
"draft": "Brouillon",
|
||||||
"viewed": "Consultée",
|
"viewed": "Vu",
|
||||||
"declined": "Refusé",
|
"declined": "Refusé",
|
||||||
"new_estimate": "Nouveau devis",
|
"new_estimate": "Nouveau devis",
|
||||||
"add_new_estimate": "Nouveau devis",
|
"add_new_estimate": "Nouveau devis",
|
||||||
@ -355,7 +355,7 @@
|
|||||||
"select_an_item": "Sélectionnez un article",
|
"select_an_item": "Sélectionnez un article",
|
||||||
"type_item_description": "Taper la description de l'article (facultatif)"
|
"type_item_description": "Taper la description de l'article (facultatif)"
|
||||||
},
|
},
|
||||||
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
"mark_as_default_estimate_template_description": "Si activé, le modèle sélectionné sera automatiquement utilisé pour les nouveaux devis."
|
||||||
},
|
},
|
||||||
"invoices": {
|
"invoices": {
|
||||||
"title": "Factures",
|
"title": "Factures",
|
||||||
@ -447,7 +447,7 @@
|
|||||||
"marked_as_sent_message": "Facture supprimée | Factures supprimées",
|
"marked_as_sent_message": "Facture supprimée | Factures supprimées",
|
||||||
"something_went_wrong": "quelque chose a mal tourné",
|
"something_went_wrong": "quelque chose a mal tourné",
|
||||||
"invalid_due_amount_message": "Le paiement entré est supérieur au montant total dû pour cette facture. Veuillez vérifier et réessayer.",
|
"invalid_due_amount_message": "Le paiement entré est supérieur au montant total dû pour cette facture. Veuillez vérifier et réessayer.",
|
||||||
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
"mark_as_default_invoice_template_description": "Si activé, le modèle sélectionné sera automatiquement utilisé pour les nouvelles factures."
|
||||||
},
|
},
|
||||||
"recurring_invoices": {
|
"recurring_invoices": {
|
||||||
"title": "Factures récurrentes",
|
"title": "Factures récurrentes",
|
||||||
@ -526,7 +526,7 @@
|
|||||||
"cloned_successfully": "Facture récurrente clonée",
|
"cloned_successfully": "Facture récurrente clonée",
|
||||||
"clone_invoice": "Dupliquer",
|
"clone_invoice": "Dupliquer",
|
||||||
"confirm_clone": "Cette facture récurrente sera clonée dans une nouvelle facture récurrente",
|
"confirm_clone": "Cette facture récurrente sera clonée dans une nouvelle facture récurrente",
|
||||||
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
"add_customer_email": "Merci d'ajouter un email à ce client pour envoyer les factures automatiquement.",
|
||||||
"item": {
|
"item": {
|
||||||
"title": "Nom",
|
"title": "Nom",
|
||||||
"description": "Description",
|
"description": "Description",
|
||||||
@ -660,47 +660,47 @@
|
|||||||
"modules": {
|
"modules": {
|
||||||
"buy_now": "Acheter maintenant",
|
"buy_now": "Acheter maintenant",
|
||||||
"install": "Installer",
|
"install": "Installer",
|
||||||
"price": "Prix",
|
"price": "Prox",
|
||||||
"download_zip_file": "Télécharger le fichier ZIP",
|
"download_zip_file": "Télécharger le fichier ZIP",
|
||||||
"unzipping_package": "Décompresser le fichier",
|
"unzipping_package": "Dézip du paquet en cours",
|
||||||
"copying_files": "Copie de fichiers en cours",
|
"copying_files": "Copie des fichiers en cours",
|
||||||
"deleting_files": "Supprimer les fichiers inutilisés",
|
"deleting_files": "Suppression des fichiers inutilisés",
|
||||||
"completing_installation": "Terminer l'installation",
|
"completing_installation": "Finalisation de l'installation",
|
||||||
"update_failed": "Échec de la mise à jour",
|
"update_failed": "Mise à jour échouée",
|
||||||
"install_success": "Votre module a été correctement installé !",
|
"install_success": "Le module a été installé avec succès !",
|
||||||
"customer_reviews": "Évaluations",
|
"customer_reviews": "Avis",
|
||||||
"license": "License",
|
"license": "Licence",
|
||||||
"faq": "FAQ",
|
"faq": "FAQ",
|
||||||
"monthly": "Mensuel",
|
"monthly": "Mensuel",
|
||||||
"yearly": "Annuel",
|
"yearly": "Annuel",
|
||||||
"updated": "Mis à jour",
|
"updated": "Mise à jour",
|
||||||
"version": "Version",
|
"version": "Version",
|
||||||
"disable": "Désactiver",
|
"disable": "Désactivé",
|
||||||
"module_disabled": "Module désactivé",
|
"module_disabled": "Module désactivé",
|
||||||
"enable": "Activer",
|
"enable": "Activé",
|
||||||
"module_enabled": "Module activé",
|
"module_enabled": "Module activé",
|
||||||
"update_to": "Mise à jour vers",
|
"update_to": "Mettre à jour vers",
|
||||||
"module_updated": "Le module a bien été mis à jour !",
|
"module_updated": "Module mis à jour avec succès !",
|
||||||
"title": "Modules",
|
"title": "Modules",
|
||||||
"module": "Module | Modules",
|
"module": "Module | Modules",
|
||||||
"api_token": "Jeton API",
|
"api_token": "Jeton API",
|
||||||
"invalid_api_token": "Jeton API invalide.",
|
"invalid_api_token": "Jeton API invalide.",
|
||||||
"other_modules": "Autres modules",
|
"other_modules": "Autres modules",
|
||||||
"view_all": "Tout afficher",
|
"view_all": "Voir tout",
|
||||||
"no_reviews_found": "Il n'y a pas encore d'avis pour ce module !",
|
"no_reviews_found": "Il n'y a pas encore d'avis pour ce module !",
|
||||||
"module_not_purchased": "Module non acheté",
|
"module_not_purchased": "Module non acheté",
|
||||||
"module_not_found": "Module non trouvé",
|
"module_not_found": "Module introuvable",
|
||||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
"version_not_supported": "La version de ce module n'est pas supportée par la version en cours de Crater",
|
||||||
"last_updated": "Mis à jour le",
|
"last_updated": "Dernière mise à jour le",
|
||||||
"connect_installation": "Connectez votre installation",
|
"connect_installation": "Connecter 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.",
|
"api_token_description": "Authentifiez-vous sur {url} et connectez votre installation en entrant votre jeton API. Vos modules achetés apparaîtront ici une fois la connection établie.",
|
||||||
"view_module": "Afficher le module",
|
"view_module": "Voir le module",
|
||||||
"update_available": "Mise à jour disponible",
|
"update_available": "Mise à jour disponible",
|
||||||
"purchased": "Acheté",
|
"purchased": "Acheté",
|
||||||
"installed": "Installé",
|
"installed": "Installé",
|
||||||
"no_modules_installed": "Aucun module installé !",
|
"no_modules_installed": "Aucun module actuellement installé !",
|
||||||
"disable_warning": "Tous les paramètres de ce module seront réinitialisés.",
|
"disable_warning": "Tous les paramètres pour celui-ci seront annulés.",
|
||||||
"what_you_get": "Ce que vous obtenez"
|
"what_you_get": "Ce que vous avez"
|
||||||
},
|
},
|
||||||
"users": {
|
"users": {
|
||||||
"title": "Utilisateurs",
|
"title": "Utilisateurs",
|
||||||
@ -807,7 +807,7 @@
|
|||||||
"payment_modes": "Modes de paiement",
|
"payment_modes": "Modes de paiement",
|
||||||
"notes": "Notes de bas de page",
|
"notes": "Notes de bas de page",
|
||||||
"exchange_rate": "Taux de change",
|
"exchange_rate": "Taux de change",
|
||||||
"address_information": "Information d'adresse"
|
"address_information": "Informations d'adresse"
|
||||||
},
|
},
|
||||||
"address_information": {
|
"address_information": {
|
||||||
"section_description": " Vous pouvez mettre à jour vos informations d'adresse via le formulaire ci dessous."
|
"section_description": " Vous pouvez mettre à jour vos informations d'adresse via le formulaire ci dessous."
|
||||||
@ -842,7 +842,7 @@
|
|||||||
"port": "Port",
|
"port": "Port",
|
||||||
"driver": "Fournisseur",
|
"driver": "Fournisseur",
|
||||||
"secret": "Secret",
|
"secret": "Secret",
|
||||||
"mailgun_secret": "Secret Mailgun",
|
"mailgun_secret": "Mailgun Secret",
|
||||||
"mailgun_domain": "Domaine",
|
"mailgun_domain": "Domaine",
|
||||||
"mailgun_endpoint": "Mailgun Endpoint",
|
"mailgun_endpoint": "Mailgun Endpoint",
|
||||||
"ses_secret": "SES Secret",
|
"ses_secret": "SES Secret",
|
||||||
@ -922,7 +922,7 @@
|
|||||||
},
|
},
|
||||||
"customization": {
|
"customization": {
|
||||||
"customization": "Personnalisation",
|
"customization": "Personnalisation",
|
||||||
"updated_message": "Informations la société mises à jour",
|
"updated_message": "Informations de la société mises à jour",
|
||||||
"save": "Enregistrer",
|
"save": "Enregistrer",
|
||||||
"insert_fields": "Insérer des champs",
|
"insert_fields": "Insérer des champs",
|
||||||
"learn_custom_format": "Apprenez à utiliser le format personnalisé",
|
"learn_custom_format": "Apprenez à utiliser le format personnalisé",
|
||||||
@ -1150,8 +1150,8 @@
|
|||||||
"payment_mode_added": "Mode de paiement ajouté",
|
"payment_mode_added": "Mode de paiement ajouté",
|
||||||
"payment_mode_updated": "Mode de paiement mis à jour",
|
"payment_mode_updated": "Mode de paiement mis à jour",
|
||||||
"payment_mode_confirm_delete": "Vous ne pourrez pas récupérer ce mode de paiement",
|
"payment_mode_confirm_delete": "Vous ne pourrez pas récupérer ce mode de paiement",
|
||||||
"payments_attached": "This payment method is already attached to payments. Please delete the attached payments to proceed with deletion.",
|
"payments_attached": "Cette méthode de paiement est déjà utilisée pour les paiements. Merci de supprimer les paiements associés pour finaliser la suppression.",
|
||||||
"expenses_attached": "This payment method is already attached to expenses. Please delete the attached expenses to proceed with deletion.",
|
"expenses_attached": "Cette méthode de paiement est déjà utilisée pour les dépenses. Merci de supprimer les dépenses associées pour finaliser la suppression.",
|
||||||
"deleted_message": "Mode de paiement supprimé"
|
"deleted_message": "Mode de paiement supprimé"
|
||||||
},
|
},
|
||||||
"expense_category": {
|
"expense_category": {
|
||||||
@ -1210,9 +1210,9 @@
|
|||||||
"latest_message": "Bravo, vous êtes à jour.",
|
"latest_message": "Bravo, vous êtes à jour.",
|
||||||
"current_version": "Version actuelle",
|
"current_version": "Version actuelle",
|
||||||
"download_zip_file": "Télécharger le fichier ZIP",
|
"download_zip_file": "Télécharger le fichier ZIP",
|
||||||
"unzipping_package": "Dézipper le package",
|
"unzipping_package": "Dézip du paquet en cours",
|
||||||
"copying_files": "Copie de fichiers en cours",
|
"copying_files": "Copie des fichiers en cours",
|
||||||
"deleting_files": "Supprimer les fichiers inutilisés",
|
"deleting_files": "Suppression des fichiers inutilisés",
|
||||||
"running_migrations": "Migrations en cours",
|
"running_migrations": "Migrations en cours",
|
||||||
"finishing_update": "Finalisation de la mise à jour",
|
"finishing_update": "Finalisation de la mise à jour",
|
||||||
"update_failed": "Échec de la mise à jour",
|
"update_failed": "Échec de la mise à jour",
|
||||||
|
|||||||
@ -186,9 +186,9 @@
|
|||||||
"phone": "फ़ोन",
|
"phone": "फ़ोन",
|
||||||
"website": "वेबसाइट",
|
"website": "वेबसाइट",
|
||||||
"overview": "अवलोकन",
|
"overview": "अवलोकन",
|
||||||
"invoice_prefix": "बिल उपसर्ग",
|
"invoice_prefix": "Invoice Prefix",
|
||||||
"estimate_prefix": "अनुमान उपसर्ग",
|
"estimate_prefix": "Estimate Prefix",
|
||||||
"payment_prefix": "भुगतान उपसर्ग",
|
"payment_prefix": "Payment Prefix",
|
||||||
"enable_portal": "पोर्टल सक्षम करें",
|
"enable_portal": "पोर्टल सक्षम करें",
|
||||||
"country": "देश",
|
"country": "देश",
|
||||||
"state": "राज्य",
|
"state": "राज्य",
|
||||||
@ -397,13 +397,13 @@
|
|||||||
"send_invoice": "चालान भेजें",
|
"send_invoice": "चालान भेजें",
|
||||||
"resend_invoice": "चालान फिर से भेजें",
|
"resend_invoice": "चालान फिर से भेजें",
|
||||||
"invoice_template": "चालान टेम्पलेट",
|
"invoice_template": "चालान टेम्पलेट",
|
||||||
"conversion_message": "बिल क्लोन सफल",
|
"conversion_message": "Invoice cloned successful",
|
||||||
"template": "टेम्प्लेट",
|
"template": "टेम्प्लेट",
|
||||||
"mark_as_sent": "भेजे गए के रूप में चिह्नित करें",
|
"mark_as_sent": "भेजे गए के रूप में चिह्नित करें",
|
||||||
"confirm_send_invoice": "यह चालान ग्राहक को ईमेल के माध्यम से भेजा जाएगा",
|
"confirm_send_invoice": "यह चालान ग्राहक को ईमेल के माध्यम से भेजा जाएगा",
|
||||||
"invoice_mark_as_sent": "यह चालान भेजा के रूप में चिह्नित किया जाएगा",
|
"invoice_mark_as_sent": "यह चालान भेजा के रूप में चिह्नित किया जाएगा",
|
||||||
"confirm_mark_as_accepted": "इस बिल को स्वीकृत के रूप में चिह्नित किया जाएगा",
|
"confirm_mark_as_accepted": "This invoice will be marked as Accepted",
|
||||||
"confirm_mark_as_rejected": "इस बिल को अस्वीकृत के रूप में चिह्नित किया जाएगा",
|
"confirm_mark_as_rejected": "This invoice will be marked as Rejected",
|
||||||
"confirm_send": "यह चालान ग्राहक को ईमेल के माध्यम से भेजा जाएगा",
|
"confirm_send": "यह चालान ग्राहक को ईमेल के माध्यम से भेजा जाएगा",
|
||||||
"invoice_date": "चालान की तारीख",
|
"invoice_date": "चालान की तारीख",
|
||||||
"record_payment": "रिकॉर्ड भुगतान",
|
"record_payment": "रिकॉर्ड भुगतान",
|
||||||
@ -415,13 +415,13 @@
|
|||||||
"update_invoice": "चालान संपादित करें",
|
"update_invoice": "चालान संपादित करें",
|
||||||
"add_new_tax": "नया टैक्स जोड़ें",
|
"add_new_tax": "नया टैक्स जोड़ें",
|
||||||
"no_invoices": "अभी तक कोई चालान नहीं!",
|
"no_invoices": "अभी तक कोई चालान नहीं!",
|
||||||
"mark_as_rejected": "अस्वीकृत के रूप में चिह्नित करें",
|
"mark_as_rejected": "Mark as rejected",
|
||||||
"mark_as_accepted": "स्वीकृत के रूप में चिह्नित करें",
|
"mark_as_accepted": "Mark as accepted",
|
||||||
"list_of_invoices": "इस खंड में वस्तुओं की सूची होगी।",
|
"list_of_invoices": "इस खंड में वस्तुओं की सूची होगी।",
|
||||||
"select_invoice": "चालान का चयन करें",
|
"select_invoice": "चालान का चयन करें",
|
||||||
"no_matching_invoices": "कोई मेल खाने वाले ग्राहक नहीं हैं!",
|
"no_matching_invoices": "कोई मेल खाने वाले ग्राहक नहीं हैं!",
|
||||||
"mark_as_sent_successfully": "चालान को सफलतापूर्वक भेजा गया के रूप में चिह्नित किया गया",
|
"mark_as_sent_successfully": "चालान को सफलतापूर्वक भेजा गया के रूप में चिह्नित किया गया",
|
||||||
"invoice_sent_successfully": "चालान सफलतापूर्वक भेजा गया",
|
"invoice_sent_successfully": "Invoice sent successfully",
|
||||||
"cloned_successfully": "चालान सफलतापूर्वक क्लोन किया गया",
|
"cloned_successfully": "चालान सफलतापूर्वक क्लोन किया गया",
|
||||||
"clone_invoice": "क्लोन चालान",
|
"clone_invoice": "क्लोन चालान",
|
||||||
"confirm_clone": "यह चालान एक नए चालान में क्लोन किया जाएगा",
|
"confirm_clone": "यह चालान एक नए चालान में क्लोन किया जाएगा",
|
||||||
@ -447,47 +447,47 @@
|
|||||||
"marked_as_sent_message": "अनुमान को सफलतापूर्वक भेजा गया के रूप में चिह्नित किया गया",
|
"marked_as_sent_message": "अनुमान को सफलतापूर्वक भेजा गया के रूप में चिह्नित किया गया",
|
||||||
"something_went_wrong": "कुछ गलत हो गया",
|
"something_went_wrong": "कुछ गलत हो गया",
|
||||||
"invalid_due_amount_message": "कुल चालान राशि इस चालान के लिए कुल भुगतान की गई राशि से कम नहीं हो सकती है। जारी रखने के लिए कृपया इनवॉइस अपडेट करें या संबद्ध भुगतानों को हटा दें।",
|
"invalid_due_amount_message": "कुल चालान राशि इस चालान के लिए कुल भुगतान की गई राशि से कम नहीं हो सकती है। जारी रखने के लिए कृपया इनवॉइस अपडेट करें या संबद्ध भुगतानों को हटा दें।",
|
||||||
"mark_as_default_invoice_template_description": "यदि सक्षम किया गया है, तो चयनित टेम्पलेट स्वचालित रूप से नए चालानों के लिए चयनित हो जाएगा।"
|
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||||
},
|
},
|
||||||
"recurring_invoices": {
|
"recurring_invoices": {
|
||||||
"title": "आवर्ती बिल",
|
"title": "Recurring Invoices",
|
||||||
"invoices_list": "आवर्ती बिल सूची",
|
"invoices_list": "Recurring Invoices List",
|
||||||
"days": "{days} दिन",
|
"days": "{days} Days",
|
||||||
"months": "{months} महीना",
|
"months": "{months} Month",
|
||||||
"years": "{years} वर्ष",
|
"years": "{years} Year",
|
||||||
"all": "सभी",
|
"all": "All",
|
||||||
"paid": "भुगतान किया गया",
|
"paid": "Paid",
|
||||||
"unpaid": "अवैतनिक",
|
"unpaid": "Unpaid",
|
||||||
"viewed": "देखा गया",
|
"viewed": "Viewed",
|
||||||
"overdue": "अतिदेय",
|
"overdue": "Overdue",
|
||||||
"active": "सक्रिय",
|
"active": "Active",
|
||||||
"completed": "पूर्ण",
|
"completed": "Completed",
|
||||||
"customer": "ग्राहक",
|
"customer": "CUSTOMER",
|
||||||
"paid_status": "भुगतान की स्थिति",
|
"paid_status": "PAID STATUS",
|
||||||
"ref_no": "प्रसंग संख्या",
|
"ref_no": "REF NO.",
|
||||||
"number": "संख्या",
|
"number": "NUMBER",
|
||||||
"amount_due": "देय राशि",
|
"amount_due": "AMOUNT DUE",
|
||||||
"partially_paid": "आंशिक रूप से भुगतान किया",
|
"partially_paid": "Partially Paid",
|
||||||
"total": "संपूर्ण",
|
"total": "Total",
|
||||||
"discount": "छूट",
|
"discount": "Discount",
|
||||||
"sub_total": "उप-योग",
|
"sub_total": "Sub Total",
|
||||||
"invoice": "आवर्ती बिल",
|
"invoice": "Recurring Invoice | Recurring Invoices",
|
||||||
"invoice_number": "आवर्ती बिल संख्या",
|
"invoice_number": "Recurring Invoice Number",
|
||||||
"next_invoice_date": "अगली बिल तिथि",
|
"next_invoice_date": "Next Invoice Date",
|
||||||
"ref_number": "संदर्भ संख्या",
|
"ref_number": "Ref Number",
|
||||||
"contact": "संपर्क",
|
"contact": "Contact",
|
||||||
"add_item": "आइटम जोड़ें",
|
"add_item": "Add an Item",
|
||||||
"date": "दिनांक",
|
"date": "Date",
|
||||||
"limit_by": "द्वारा सीमित करें",
|
"limit_by": "Limit by",
|
||||||
"limit_date": "सीमा तिथि",
|
"limit_date": "Limit Date",
|
||||||
"limit_count": "सीमा गिनती",
|
"limit_count": "Limit Count",
|
||||||
"count": "गिनती",
|
"count": "Count",
|
||||||
"status": "स्थिति",
|
"status": "Status",
|
||||||
"select_a_status": "स्टेटस चुनें",
|
"select_a_status": "Select a status",
|
||||||
"working": "काम कर रहा है",
|
"working": "Working",
|
||||||
"on_hold": "रुका हुआ है",
|
"on_hold": "On Hold",
|
||||||
"complete": "पूर्ण",
|
"complete": "Completed",
|
||||||
"add_tax": "कर जोड़ें",
|
"add_tax": "Add Tax",
|
||||||
"amount": "मात्रा",
|
"amount": "मात्रा",
|
||||||
"action": "कार्य",
|
"action": "कार्य",
|
||||||
"notes": "नोट्स",
|
"notes": "नोट्स",
|
||||||
@ -505,8 +505,8 @@
|
|||||||
"confirm_send": "यह आवर्ती चालान ग्राहक को ईमेल के माध्यम से भेजा जाएगा",
|
"confirm_send": "यह आवर्ती चालान ग्राहक को ईमेल के माध्यम से भेजा जाएगा",
|
||||||
"starts_at": "आरंभ करने की तिथि",
|
"starts_at": "आरंभ करने की तिथि",
|
||||||
"due_date": "बिल की देय तिथि",
|
"due_date": "बिल की देय तिथि",
|
||||||
"record_payment": "भुगतान रिकॉर्ड करें",
|
"record_payment": "Record Payment",
|
||||||
"add_new_invoice": "आवर्ती बिल फिर से भेजें",
|
"add_new_invoice": "Add New Recurring Invoice",
|
||||||
"update_expense": "Update Expense",
|
"update_expense": "Update Expense",
|
||||||
"edit_invoice": "Edit Recurring Invoice",
|
"edit_invoice": "Edit Recurring Invoice",
|
||||||
"new_invoice": "New Recurring Invoice",
|
"new_invoice": "New Recurring Invoice",
|
||||||
@ -659,46 +659,46 @@
|
|||||||
},
|
},
|
||||||
"modules": {
|
"modules": {
|
||||||
"buy_now": "Buy Now",
|
"buy_now": "Buy Now",
|
||||||
"install": "इंस्टॉल",
|
"install": "Install",
|
||||||
"price": "मूल्य",
|
"price": "Price",
|
||||||
"download_zip_file": "ज़िप डाउनलोड करे",
|
"download_zip_file": "Download ZIP file",
|
||||||
"unzipping_package": "पैकेज खोल रहा है",
|
"unzipping_package": "Unzipping Package",
|
||||||
"copying_files": "फ़ाइलें कॉपी हो रही है",
|
"copying_files": "Copying Files",
|
||||||
"deleting_files": "अप्रयुक्त फाइलों को हटाना",
|
"deleting_files": "Deleting Unused files",
|
||||||
"completing_installation": "स्थापना पूर्ण करना",
|
"completing_installation": "Completing Installation",
|
||||||
"update_failed": "अद्यतनीकरण असफल रहा",
|
"update_failed": "Update Failed",
|
||||||
"install_success": "मॉड्यूल सफलतापूर्वक स्थापित किया गया है!",
|
"install_success": "Module has been installed successfully!",
|
||||||
"customer_reviews": "समीक्षा",
|
"customer_reviews": "Reviews",
|
||||||
"license": "लाइसेन्स",
|
"license": "License",
|
||||||
"faq": "हमेशा पूछे जाने वाले प्रश्न",
|
"faq": "FAQ",
|
||||||
"monthly": "महीने के",
|
"monthly": "Monthly",
|
||||||
"yearly": "हर वर्ष",
|
"yearly": "Yearly",
|
||||||
"updated": "अपडेट किया गया",
|
"updated": "Updated",
|
||||||
"version": "वर्ज़न",
|
"version": "Version",
|
||||||
"disable": "अक्षम करें",
|
"disable": "Disable",
|
||||||
"module_disabled": "मॉड्यूल अक्षम",
|
"module_disabled": "Module Disabled",
|
||||||
"enable": "सक्षम",
|
"enable": "Enable",
|
||||||
"module_enabled": "मॉड्यूल सक्षम",
|
"module_enabled": "Module Enabled",
|
||||||
"update_to": "अपडेट करें",
|
"update_to": "Update To",
|
||||||
"module_updated": "मॉड्यूल सफलतापूर्वक अपडेट किया गया!",
|
"module_updated": "Module Updated Successfully!",
|
||||||
"title": "मॉड्यूल",
|
"title": "Modules",
|
||||||
"module": "मॉड्यूल | मॉड्यूल",
|
"module": "Module | Modules",
|
||||||
"api_token": "एपीआई टोकन",
|
"api_token": "API token",
|
||||||
"invalid_api_token": "अमान्य एपीआई टोकन।",
|
"invalid_api_token": "Invalid API Token.",
|
||||||
"other_modules": "अन्य मॉड्यूल",
|
"other_modules": "Other Modules",
|
||||||
"view_all": "सभी को देखें",
|
"view_all": "View All",
|
||||||
"no_reviews_found": "इस मॉड्युल के लिए अभी तक वहां कोई समीक्षा नहीं है!",
|
"no_reviews_found": "There are no reviews for this module yet!",
|
||||||
"module_not_purchased": "मॉड्यूल खरीदा नहीं गया",
|
"module_not_purchased": "Module Not Purchased",
|
||||||
"module_not_found": "मॉड्यूल नहीं मिला",
|
"module_not_found": "Module Not Found",
|
||||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||||
"last_updated": "अंतिम बार अद्यतन किया गया",
|
"last_updated": "Last Updated On",
|
||||||
"connect_installation": "अपनी स्थापना कनेक्ट करें",
|
"connect_installation": "Connect your installation",
|
||||||
"api_token_description": "{url} में लॉग इन करें और API टोकन दर्ज करके इस इंस्टॉलेशन को कनेक्ट करें। कनेक्शन स्थापित होने के बाद आपके खरीदे गए मॉड्यूल यहां दिखाई देंगे।",
|
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
||||||
"view_module": "मॉड्यूल देखें",
|
"view_module": "View Module",
|
||||||
"update_available": "उपलब्ध अद्यतन",
|
"update_available": "Update Available",
|
||||||
"purchased": "खरीदी",
|
"purchased": "Purchased",
|
||||||
"installed": "इंस्टॉल हुआ।",
|
"installed": "Installed",
|
||||||
"no_modules_installed": "अभी तक कोई मॉड्यूल स्थापित नहीं है!",
|
"no_modules_installed": "No Modules Installed Yet!",
|
||||||
"disable_warning": "All the settings for this particular will be reverted.",
|
"disable_warning": "All the settings for this particular will be reverted.",
|
||||||
"what_you_get": "What you get"
|
"what_you_get": "What you get"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -93,14 +93,14 @@
|
|||||||
"no_note_found": "Tidak ada catatan yang ditemukan",
|
"no_note_found": "Tidak ada catatan yang ditemukan",
|
||||||
"insert_note": "Sisipkan Catatan",
|
"insert_note": "Sisipkan Catatan",
|
||||||
"copied_pdf_url_clipboard": "URL file PDF disalin ke clipboard!",
|
"copied_pdf_url_clipboard": "URL file PDF disalin ke clipboard!",
|
||||||
"copied_url_clipboard": "Disalin ke clipboard!",
|
"copied_url_clipboard": "Copied url to clipboard!",
|
||||||
"docs": "Dokumen",
|
"docs": "Dokumen",
|
||||||
"do_you_wish_to_continue": "Apakah anda ingin melanjutkan?",
|
"do_you_wish_to_continue": "Apakah anda ingin melanjutkan?",
|
||||||
"note": "Catatan",
|
"note": "Catatan",
|
||||||
"pay_invoice": "Bayar tagihan",
|
"pay_invoice": "Pay Invoice",
|
||||||
"login_successfully": "Login berhasil!",
|
"login_successfully": "Logged in successfully!",
|
||||||
"logged_out_successfully": "Berhasil keluar",
|
"logged_out_successfully": "Logged out successfully",
|
||||||
"mark_as_default": "Tandai sebagai default"
|
"mark_as_default": "Mark as default"
|
||||||
},
|
},
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"select_year": "Pilih tahun",
|
"select_year": "Pilih tahun",
|
||||||
@ -109,7 +109,7 @@
|
|||||||
"customers": "Pelanggan",
|
"customers": "Pelanggan",
|
||||||
"invoices": "Faktur",
|
"invoices": "Faktur",
|
||||||
"estimates": "Perkiraan",
|
"estimates": "Perkiraan",
|
||||||
"payments": "Pembayaran"
|
"payments": "Payments"
|
||||||
},
|
},
|
||||||
"chart_info": {
|
"chart_info": {
|
||||||
"total_sales": "Penjualan",
|
"total_sales": "Penjualan",
|
||||||
@ -208,10 +208,10 @@
|
|||||||
"new_customer": "Pelanggan Baru",
|
"new_customer": "Pelanggan Baru",
|
||||||
"edit_customer": "Ubah Pelanggan",
|
"edit_customer": "Ubah Pelanggan",
|
||||||
"basic_info": "Info dasar",
|
"basic_info": "Info dasar",
|
||||||
"portal_access": "Akses Portal",
|
"portal_access": "Portal Access",
|
||||||
"portal_access_text": "Apakah Anda ingin mengizinkan pelanggan ini untuk masuk ke Portal Pelanggan?",
|
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||||
"portal_access_url": "URL Masuk Portal Pelanggan",
|
"portal_access_url": "Customer Portal Login URL",
|
||||||
"portal_access_url_help": "Harap salin & teruskan URL yang diberikan di atas kepada pelanggan Anda untuk memberikan akses.",
|
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||||
"billing_address": "Alamat Tagihan",
|
"billing_address": "Alamat Tagihan",
|
||||||
"shipping_address": "Alamat Pengiriman",
|
"shipping_address": "Alamat Pengiriman",
|
||||||
"copy_billing_address": "Menyalin dari Tagihan",
|
"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.",
|
"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",
|
"created_message": "Pelanggan berhasil dibuat",
|
||||||
"updated_message": "Pelanggan berhasil diperbarui",
|
"updated_message": "Pelanggan berhasil diperbarui",
|
||||||
"address_updated_message": "Informasi Alamat Berhasil Diperbarui",
|
"address_updated_message": "Address Information Updated succesfully",
|
||||||
"deleted_message": "Pelanggan berhasil dihapus",
|
"deleted_message": "Pelanggan berhasil dihapus",
|
||||||
"edit_currency_not_allowed": "Ketika transaksi telah dibuat, mata uang tidak dapat dirubah."
|
"edit_currency_not_allowed": "Ketika transaksi telah dibuat, mata uang tidak dapat dirubah."
|
||||||
},
|
},
|
||||||
@ -265,8 +265,8 @@
|
|||||||
},
|
},
|
||||||
"estimates": {
|
"estimates": {
|
||||||
"title": "Perkiraan",
|
"title": "Perkiraan",
|
||||||
"accept_estimate": "Perkiraan",
|
"accept_estimate": "Accept Estimate",
|
||||||
"reject_estimate": "Tolak Perkiraan",
|
"reject_estimate": "Reject Estimate",
|
||||||
"estimate": "Estimasi",
|
"estimate": "Estimasi",
|
||||||
"estimates_list": "Daftar Penawaran",
|
"estimates_list": "Daftar Penawaran",
|
||||||
"days": "{days} Hari",
|
"days": "{days} Hari",
|
||||||
@ -276,7 +276,7 @@
|
|||||||
"paid": "Lunas",
|
"paid": "Lunas",
|
||||||
"unpaid": "Belum lunas",
|
"unpaid": "Belum lunas",
|
||||||
"customer": "PELANGGAN",
|
"customer": "PELANGGAN",
|
||||||
"ref_no": "NO. REF.",
|
"ref_no": "REF NO.",
|
||||||
"number": "NOMOR",
|
"number": "NOMOR",
|
||||||
"amount_due": "Jumlah yang harus dibayar",
|
"amount_due": "Jumlah yang harus dibayar",
|
||||||
"partially_paid": "Pembayaran Sebagian",
|
"partially_paid": "Pembayaran Sebagian",
|
||||||
@ -318,10 +318,10 @@
|
|||||||
},
|
},
|
||||||
"accepted": "Diterima",
|
"accepted": "Diterima",
|
||||||
"rejected": "Ditolak",
|
"rejected": "Ditolak",
|
||||||
"expired": "Kadaluarsa",
|
"expired": "Expired",
|
||||||
"sent": "Terkirim",
|
"sent": "Terkirim",
|
||||||
"draft": "Draf",
|
"draft": "Draf",
|
||||||
"viewed": "Dilihat",
|
"viewed": "Viewed",
|
||||||
"declined": "Ditolak",
|
"declined": "Ditolak",
|
||||||
"new_estimate": "Penawaran Baru",
|
"new_estimate": "Penawaran Baru",
|
||||||
"add_new_estimate": "Tambah Penawaran Baru",
|
"add_new_estimate": "Tambah Penawaran Baru",
|
||||||
@ -355,14 +355,14 @@
|
|||||||
"select_an_item": "Ketik atau klik untuk memilih",
|
"select_an_item": "Ketik atau klik untuk memilih",
|
||||||
"type_item_description": "Ketik Deskripsi Item (opsional)"
|
"type_item_description": "Ketik Deskripsi Item (opsional)"
|
||||||
},
|
},
|
||||||
"mark_as_default_estimate_template_description": "Jika diaktifkan, template terpilih akan secara otomatis digunakan saat pembuatan estimate baru."
|
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||||
},
|
},
|
||||||
"invoices": {
|
"invoices": {
|
||||||
"title": "Faktur",
|
"title": "Faktur",
|
||||||
"download": "Unduh",
|
"download": "Download",
|
||||||
"pay_invoice": "Bayar tagihan",
|
"pay_invoice": "Pay Invoice",
|
||||||
"invoices_list": "Daftar Faktur",
|
"invoices_list": "Daftar Faktur",
|
||||||
"invoice_information": "Informasi tagihan",
|
"invoice_information": "Invoice Information",
|
||||||
"days": "{days} Hari",
|
"days": "{days} Hari",
|
||||||
"months": "{months} Bulan",
|
"months": "{months} Bulan",
|
||||||
"years": "{years} Tahun",
|
"years": "{years} Tahun",
|
||||||
@ -374,7 +374,7 @@
|
|||||||
"completed": "Selesai",
|
"completed": "Selesai",
|
||||||
"customer": "PELANGGAN",
|
"customer": "PELANGGAN",
|
||||||
"paid_status": "STATUS PEMBAYARAN",
|
"paid_status": "STATUS PEMBAYARAN",
|
||||||
"ref_no": "NO. REF.",
|
"ref_no": "REF NO.",
|
||||||
"number": "NOMOR",
|
"number": "NOMOR",
|
||||||
"amount_due": "Jumlah yang harus dibayar",
|
"amount_due": "Jumlah yang harus dibayar",
|
||||||
"partially_paid": "Pembayaran Sebagian",
|
"partially_paid": "Pembayaran Sebagian",
|
||||||
@ -439,19 +439,19 @@
|
|||||||
"select_an_item": "Ketik atau klik untuk memilih",
|
"select_an_item": "Ketik atau klik untuk memilih",
|
||||||
"type_item_description": "Ketik Deskripsi Item (opsional)"
|
"type_item_description": "Ketik Deskripsi Item (opsional)"
|
||||||
},
|
},
|
||||||
"payment_attached_message": "Salah satu faktur yang dipilih sudah memiliki pembayaran yang menyertainya. Pastikan untuk menghapus pembayaran terlampir terlebih dahulu untuk melanjutkan penghapusan",
|
"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": "Anda tidak akan dapat memulihkan Faktur ini | Anda tidak akan dapat memulihkan Faktur ini",
|
"confirm_delete": "You will not be able to recover this Invoice | You will not be able to recover these Invoices",
|
||||||
"created_message": "Faktur berhasil dibuat",
|
"created_message": "Invoice created successfully",
|
||||||
"updated_message": "Faktur berhasil diperbarui",
|
"updated_message": "Invoice updated successfully",
|
||||||
"deleted_message": "Faktur berhasil dihapus | Faktur berhasil dihapus",
|
"deleted_message": "Invoice deleted successfully | Invoices deleted successfully",
|
||||||
"marked_as_sent_message": "Tandai Faktur sudah dikirim",
|
"marked_as_sent_message": "Invoice marked as sent successfully",
|
||||||
"something_went_wrong": "terjadi kesalahan",
|
"something_went_wrong": "something went wrong",
|
||||||
"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.",
|
"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": "Jika diaktifkan, template terpilih akan secara otomatis digunakan saat pembuatan estimate baru."
|
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||||
},
|
},
|
||||||
"recurring_invoices": {
|
"recurring_invoices": {
|
||||||
"title": "Tagihan-Tagihan Berulang",
|
"title": "Recurring Invoices",
|
||||||
"invoices_list": "Daftar Faktur Berulang",
|
"invoices_list": "Recurring Invoices List",
|
||||||
"days": "{days} Hari",
|
"days": "{days} Hari",
|
||||||
"months": "{months} Bulan",
|
"months": "{months} Bulan",
|
||||||
"years": "{years} Tahun",
|
"years": "{years} Tahun",
|
||||||
@ -459,61 +459,61 @@
|
|||||||
"paid": "Lunas",
|
"paid": "Lunas",
|
||||||
"unpaid": "Belum lunas",
|
"unpaid": "Belum lunas",
|
||||||
"viewed": "Dilihat",
|
"viewed": "Dilihat",
|
||||||
"overdue": "Lewat jatuh tempo",
|
"overdue": "Overdue",
|
||||||
"active": "Aktif",
|
"active": "Aktif",
|
||||||
"completed": "Selesai",
|
"completed": "Selesai",
|
||||||
"customer": "PELANGGAN",
|
"customer": "PELANGGAN",
|
||||||
"paid_status": "STATUS PEMBAYARAN",
|
"paid_status": "PAID STATUS",
|
||||||
"ref_no": "NO. REF.",
|
"ref_no": "REF NO.",
|
||||||
"number": "NOMOR",
|
"number": "NOMOR",
|
||||||
"amount_due": "Jumlah yang harus dibayar",
|
"amount_due": "AMOUNT DUE",
|
||||||
"partially_paid": "Angsuran",
|
"partially_paid": "Partially Paid",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"discount": "Diskon",
|
"discount": "Diskon",
|
||||||
"sub_total": "Sub Total",
|
"sub_total": "Sub Total",
|
||||||
"invoice": "Faktur Berulang | Faktur Berulang",
|
"invoice": "Recurring Invoice | Recurring Invoices",
|
||||||
"invoice_number": "Nomor Faktur Berulang",
|
"invoice_number": "Recurring Invoice Number",
|
||||||
"next_invoice_date": "Tanggal Faktur Berikutnya",
|
"next_invoice_date": "Next Invoice Date",
|
||||||
"ref_number": "Nomor Referensi",
|
"ref_number": "Ref Number",
|
||||||
"contact": "Kontak",
|
"contact": "Kontak",
|
||||||
"add_item": "Tambah Barang",
|
"add_item": "Tambah Barang",
|
||||||
"date": "Tanggal",
|
"date": "Tanggal",
|
||||||
"limit_by": "Batasi oleh",
|
"limit_by": "Limit by",
|
||||||
"limit_date": "Batas Tanggal",
|
"limit_date": "Limit Date",
|
||||||
"limit_count": "Batas Jumlah",
|
"limit_count": "Limit Count",
|
||||||
"count": "Hitung",
|
"count": "Count",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"select_a_status": "Pilih status",
|
"select_a_status": "Pilih status",
|
||||||
"working": "Sedang mengerjakan",
|
"working": "Working",
|
||||||
"on_hold": "Ditangguhkan",
|
"on_hold": "On Hold",
|
||||||
"complete": "Selesai",
|
"complete": "Selesai",
|
||||||
"add_tax": "Tambah Pajak",
|
"add_tax": "Tambah Pajak",
|
||||||
"amount": "Jumlah",
|
"amount": "Jumlah",
|
||||||
"action": "Aksi",
|
"action": "Aksi",
|
||||||
"notes": "Catatan",
|
"notes": "Catatan",
|
||||||
"view": "Tampilan",
|
"view": "View",
|
||||||
"basic_info": "Informasi dasar",
|
"basic_info": "Basic Info",
|
||||||
"send_invoice": "Kirim Ulang Faktur Berulang",
|
"send_invoice": "Send Recurring Invoice",
|
||||||
"auto_send": "Kirim Otomatis",
|
"auto_send": "Auto Send",
|
||||||
"resend_invoice": "Kirim Ulang Faktur Berulang",
|
"resend_invoice": "Resend Recurring Invoice",
|
||||||
"invoice_template": "Nomor Faktur Berulang",
|
"invoice_template": "Recurring Invoice Template",
|
||||||
"conversion_message": "Faktur Berulang berhasil dikloning",
|
"conversion_message": "Recurring Invoice cloned successful",
|
||||||
"template": "Template",
|
"template": "Template",
|
||||||
"mark_as_sent": "Tandai sebagai terkirim",
|
"mark_as_sent": "Mark as sent",
|
||||||
"confirm_send_invoice": "Faktur berulang ini akan dikirim melalui email ke pelanggan",
|
"confirm_send_invoice": "This recurring invoice will be sent via email to the customer",
|
||||||
"invoice_mark_as_sent": "Faktur berulang ini akan ditandai sebagai terkirim",
|
"invoice_mark_as_sent": "This recurring invoice will be marked as sent",
|
||||||
"confirm_send": "Faktur berulang ini akan dikirim melalui email ke pelanggan",
|
"confirm_send": "This recurring invoice will be sent via email to the customer",
|
||||||
"starts_at": "Tanggal Mulai",
|
"starts_at": "Tanggal Mulai",
|
||||||
"due_date": "Tanggal Jatuh Tempo Faktur",
|
"due_date": "Invoice Due Date",
|
||||||
"record_payment": "Rekam Pembayaran",
|
"record_payment": "Record Payment",
|
||||||
"add_new_invoice": "Tambahkan Faktur Berulang Baru",
|
"add_new_invoice": "Add New Recurring Invoice",
|
||||||
"update_expense": "Perbarui Biaya",
|
"update_expense": "Update Expense",
|
||||||
"edit_invoice": "Edit Recurring Invoice",
|
"edit_invoice": "Edit Recurring Invoice",
|
||||||
"new_invoice": "New Recurring Invoice",
|
"new_invoice": "New Recurring Invoice",
|
||||||
"send_automatically": "Send Automatically",
|
"send_automatically": "Send Automatically",
|
||||||
"send_automatically_desc": "Enable this, if you would like to send the invoice automatically to the customer when its created.",
|
"send_automatically_desc": "Enable this, if you would like to send the invoice automatically to the customer when its created.",
|
||||||
"save_invoice": "Save Recurring Invoice",
|
"save_invoice": "Save Recurring Invoice",
|
||||||
"update_invoice": "Perbarui Faktur Berulang",
|
"update_invoice": "Update Recurring Invoice",
|
||||||
"add_new_tax": "Tambah Pajak Baru",
|
"add_new_tax": "Tambah Pajak Baru",
|
||||||
"no_invoices": "Belum ada Faktur Berulang!",
|
"no_invoices": "Belum ada Faktur Berulang!",
|
||||||
"mark_as_rejected": "Ditandai telah ditolak",
|
"mark_as_rejected": "Ditandai telah ditolak",
|
||||||
@ -526,7 +526,7 @@
|
|||||||
"cloned_successfully": "Faktur Berulang berhasil digandakan",
|
"cloned_successfully": "Faktur Berulang berhasil digandakan",
|
||||||
"clone_invoice": "Gandakan Faktur Berulang",
|
"clone_invoice": "Gandakan Faktur Berulang",
|
||||||
"confirm_clone": "Faktur Berulang ini akan digandakan menjadi Faktur Berulang yang baru",
|
"confirm_clone": "Faktur Berulang ini akan digandakan menjadi Faktur Berulang yang baru",
|
||||||
"add_customer_email": "Tambahkan alamat email pelanggan untuk mengirimkan tagihan secara otomatis.",
|
"add_customer_email": "Please add an email address for this customer to send invoices automatically.",
|
||||||
"item": {
|
"item": {
|
||||||
"title": "Judul item",
|
"title": "Judul item",
|
||||||
"description": "Deskripsi",
|
"description": "Deskripsi",
|
||||||
@ -550,19 +550,19 @@
|
|||||||
"month": "Bulan",
|
"month": "Bulan",
|
||||||
"day_week": "Hari dalam minggu"
|
"day_week": "Hari dalam minggu"
|
||||||
},
|
},
|
||||||
"confirm_delete": "Anda tidak akan dapat memulihkan Faktur ini | Anda tidak akan dapat memulihkan Faktur ini",
|
"confirm_delete": "You will not be able to recover this Invoice | You will not be able to recover these Invoices",
|
||||||
"created_message": "Faktur Berulang berhasil dibuat",
|
"created_message": "Recurring Invoice created successfully",
|
||||||
"updated_message": "Faktur Berulang berhasil diperbaharui",
|
"updated_message": "Recurring Invoice updated successfully",
|
||||||
"deleted_message": "Faktur Berulang berhasil dihapus | Faktur Berulang berhasil dihapus",
|
"deleted_message": "Recurring Invoice deleted successfully | Recurring Invoices deleted successfully",
|
||||||
"marked_as_sent_message": "Tandai Faktur Berulang sudah dikirim",
|
"marked_as_sent_message": "Recurring Invoice marked as sent successfully",
|
||||||
"user_email_does_not_exist": "Email pengguna tidak ada",
|
"user_email_does_not_exist": "User email does not exist",
|
||||||
"something_went_wrong": "terjadi kesalahan",
|
"something_went_wrong": "something went wrong",
|
||||||
"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."
|
"invalid_due_amount_message": "Total Recurring Invoice amount cannot be less than total paid amount for this Recurring Invoice. Please update the invoice or delete the associated payments to continue."
|
||||||
},
|
},
|
||||||
"payments": {
|
"payments": {
|
||||||
"title": "Pembayaran",
|
"title": "Pembayaran",
|
||||||
"payments_list": "Daftar Pembayaran",
|
"payments_list": "Daftar Pembayaran",
|
||||||
"record_payment": "Rekam Pembayaran",
|
"record_payment": "Record Payment",
|
||||||
"customer": "Pelanggan",
|
"customer": "Pelanggan",
|
||||||
"date": "Tanggal",
|
"date": "Tanggal",
|
||||||
"amount": "Jumlah",
|
"amount": "Jumlah",
|
||||||
@ -573,29 +573,29 @@
|
|||||||
"note": "Catatan",
|
"note": "Catatan",
|
||||||
"add_payment": "Tambah Pembayaran",
|
"add_payment": "Tambah Pembayaran",
|
||||||
"new_payment": "Pembayaran Baru",
|
"new_payment": "Pembayaran Baru",
|
||||||
"edit_payment": "Edit Pembayaran",
|
"edit_payment": "Edit Payment",
|
||||||
"view_payment": "Lihat Pembayaran",
|
"view_payment": "View Payment",
|
||||||
"add_new_payment": "Tambahkan Pembayaran Baru",
|
"add_new_payment": "Add New Payment",
|
||||||
"send_payment_receipt": "Kirim Tanda Terima Pembayaran",
|
"send_payment_receipt": "Send Payment Receipt",
|
||||||
"send_payment": "Kirim Pembayaran",
|
"send_payment": "Send Payment",
|
||||||
"save_payment": "Simpan Pembayaran",
|
"save_payment": "Save Payment",
|
||||||
"update_payment": "Perbaharui Pembayaran",
|
"update_payment": "Update Payment",
|
||||||
"payment": "Pembayaran",
|
"payment": "Pembayaran",
|
||||||
"no_payments": "Belum ada pembayaran!",
|
"no_payments": "No payments yet!",
|
||||||
"not_selected": "Tidak dipilih",
|
"not_selected": "Tidak dipilih",
|
||||||
"no_invoice": "Tidak ada faktur",
|
"no_invoice": "Tidak ada faktur",
|
||||||
"no_matching_payments": "Tidak ada pembayaran yang cocok!",
|
"no_matching_payments": "There are no matching payments!",
|
||||||
"list_of_payments": "Bagian ini akan berisi daftar pembayaran.",
|
"list_of_payments": "This section will contain the list of payments.",
|
||||||
"select_payment_mode": "Pilih mode pembayaran",
|
"select_payment_mode": "Select payment mode",
|
||||||
"confirm_mark_as_sent": "Penawaran ini akan ditandai telah dikirim",
|
"confirm_mark_as_sent": "This estimate will be marked as sent",
|
||||||
"confirm_send_payment": "Pembayaran ini akan dikirim melalui email ke pelanggan",
|
"confirm_send_payment": "This payment will be sent via email to the customer",
|
||||||
"send_payment_successfully": "Pembayaran berhasil dikirim",
|
"send_payment_successfully": "Payment sent successfully",
|
||||||
"something_went_wrong": "terjadi kesalahan",
|
"something_went_wrong": "something went wrong",
|
||||||
"confirm_delete": "Anda tidak akan dapat memulihkan Pembayaran ini | Anda tidak akan dapat memulihkan Pembayaran ini",
|
"confirm_delete": "You will not be able to recover this Payment | You will not be able to recover these Payments",
|
||||||
"created_message": "Pembayaran berhasil dibuat",
|
"created_message": "Payment created successfully",
|
||||||
"updated_message": "Pembayaran berhasil diperbaharui",
|
"updated_message": "Payment updated successfully",
|
||||||
"deleted_message": "Pembayaran berhasil dihapus | Pembayaran berhasil dihapus",
|
"deleted_message": "Payment deleted successfully | Payments deleted successfully",
|
||||||
"invalid_amount_message": "Jumlah pembayaran tidak valid"
|
"invalid_amount_message": "Payment amount is invalid"
|
||||||
},
|
},
|
||||||
"expenses": {
|
"expenses": {
|
||||||
"title": "Pengeluaran",
|
"title": "Pengeluaran",
|
||||||
@ -610,29 +610,29 @@
|
|||||||
"to_date": "Sampai Tanggal",
|
"to_date": "Sampai Tanggal",
|
||||||
"expense_date": "Tanggal",
|
"expense_date": "Tanggal",
|
||||||
"description": "Deskripsi",
|
"description": "Deskripsi",
|
||||||
"receipt": "Tanda Terima",
|
"receipt": "Receipt",
|
||||||
"amount": "Jumlah",
|
"amount": "Jumlah",
|
||||||
"action": "Aksi",
|
"action": "Aksi",
|
||||||
"not_selected": "Tidak dipilih",
|
"not_selected": "Tidak dipilih",
|
||||||
"note": "Catatan",
|
"note": "Catatan",
|
||||||
"category_id": "Id kategori",
|
"category_id": "Category Id",
|
||||||
"date": "Tanggal",
|
"date": "Tanggal",
|
||||||
"add_expense": "Tambahkan pengeluaran",
|
"add_expense": "Add Expense",
|
||||||
"add_new_expense": "Tambah Pengeluaran Baru",
|
"add_new_expense": "Add New Expense",
|
||||||
"save_expense": "Simpan Pengeluaran",
|
"save_expense": "Save Expense",
|
||||||
"update_expense": "Edit Pengeluaran",
|
"update_expense": "Update Expense",
|
||||||
"download_receipt": "Unduh Tanda Terima",
|
"download_receipt": "Download Receipt",
|
||||||
"edit_expense": "Edit Pengeluaran",
|
"edit_expense": "Edit Expense",
|
||||||
"new_expense": "Pengeluaran Baru",
|
"new_expense": "New Expense",
|
||||||
"expense": "Biaya | Pengeluaran",
|
"expense": "Expense | Expenses",
|
||||||
"no_expenses": "Belum ada pengeluaran!",
|
"no_expenses": "No expenses yet!",
|
||||||
"list_of_expenses": "Bagian ini akan berisi daftar pengeluaran.",
|
"list_of_expenses": "This section will contain the list of expenses.",
|
||||||
"confirm_delete": "Anda tidak akan dapat memulihkan Pengeluaran ini | Anda tidak akan dapat memulihkan Pengeluaran ini",
|
"confirm_delete": "You will not be able to recover this Expense | You will not be able to recover these Expenses",
|
||||||
"created_message": "Pengeluaran berhasil dibuat",
|
"created_message": "Expense created successfully",
|
||||||
"updated_message": "Pengeluaran berhasil diperbaharui",
|
"updated_message": "Expense updated successfully",
|
||||||
"deleted_message": "Pengeluaran berhasil dihapus | Pengeluaran berhasil dihapus",
|
"deleted_message": "Expense deleted successfully | Expenses deleted successfully",
|
||||||
"categories": {
|
"categories": {
|
||||||
"categories_list": "Daftar Kategori",
|
"categories_list": "Categories List",
|
||||||
"title": "Title",
|
"title": "Title",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"description": "Description",
|
"description": "Description",
|
||||||
@ -694,65 +694,65 @@
|
|||||||
"last_updated": "Last Updated On",
|
"last_updated": "Last Updated On",
|
||||||
"connect_installation": "Connect your installation",
|
"connect_installation": "Connect your installation",
|
||||||
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
||||||
"view_module": "Lihat Module",
|
"view_module": "View Module",
|
||||||
"update_available": "Pembaruan Tersedia",
|
"update_available": "Update Available",
|
||||||
"purchased": "Pembelian",
|
"purchased": "Purchased",
|
||||||
"installed": "Terinstal",
|
"installed": "Installed",
|
||||||
"no_modules_installed": "Belum Ada Modul yang Terpasang!",
|
"no_modules_installed": "No Modules Installed Yet!",
|
||||||
"disable_warning": "Semua pengaturan untuk saat ini akan dikembalikan.",
|
"disable_warning": "All the settings for this particular will be reverted.",
|
||||||
"what_you_get": "Apa yang bisa Anda dapatkan"
|
"what_you_get": "What you get"
|
||||||
},
|
},
|
||||||
"users": {
|
"users": {
|
||||||
"title": "Pengguna",
|
"title": "Users",
|
||||||
"users_list": "Daftar Pengguna",
|
"users_list": "Users List",
|
||||||
"name": "Nama",
|
"name": "Name",
|
||||||
"description": "Deskripsi",
|
"description": "Description",
|
||||||
"added_on": "Ditambahkan Pada",
|
"added_on": "Added On",
|
||||||
"date_of_creation": "Tanggal pembuatan",
|
"date_of_creation": "Date Of Creation",
|
||||||
"action": "Aksi",
|
"action": "Action",
|
||||||
"add_user": "Tambah Pengguna",
|
"add_user": "Add User",
|
||||||
"save_user": "Simpan Pengguna",
|
"save_user": "Save User",
|
||||||
"update_user": "Edit Pengguna",
|
"update_user": "Update User",
|
||||||
"user": "Pengguna | Pengguna",
|
"user": "User | Users",
|
||||||
"add_new_user": "Tambahkan pengguna baru",
|
"add_new_user": "Add New User",
|
||||||
"new_user": "Pengguna baru",
|
"new_user": "New User",
|
||||||
"edit_user": "Edit Pengguna",
|
"edit_user": "Edit User",
|
||||||
"no_users": "Belum ada pengguna!",
|
"no_users": "No users yet!",
|
||||||
"list_of_users": "Bagian ini akan berisi daftar pengguna.",
|
"list_of_users": "This section will contain the list of users.",
|
||||||
"email": "Email",
|
"email": "Email",
|
||||||
"phone": "Telepon",
|
"phone": "Telepon",
|
||||||
"password": "Kata Sandi",
|
"password": "Kata Sandi",
|
||||||
"user_attached_message": "Tidak dapat menghapus item yang sudah digunakan",
|
"user_attached_message": "Cannot delete an item which is already in use",
|
||||||
"confirm_delete": "Anda tidak akan dapat memulihkan Pengguna ini | Anda tidak akan dapat memulihkan Pengguna ini",
|
"confirm_delete": "You will not be able to recover this User | You will not be able to recover these Users",
|
||||||
"created_message": "Pengguna berhasil dibuat",
|
"created_message": "User created successfully",
|
||||||
"updated_message": "Pengguna berhasil diedit",
|
"updated_message": "User updated successfully",
|
||||||
"deleted_message": "Pengguna berhasil dihapus | Pengguna berhasil dihapus",
|
"deleted_message": "User deleted successfully | Users deleted successfully",
|
||||||
"select_company_role": "Pilih Peran untuk {company}",
|
"select_company_role": "Select Role for {company}",
|
||||||
"companies": "Perusahaan"
|
"companies": "Companies"
|
||||||
},
|
},
|
||||||
"reports": {
|
"reports": {
|
||||||
"title": "Laporan",
|
"title": "Report",
|
||||||
"from_date": "Dari tanggal",
|
"from_date": "From Date",
|
||||||
"to_date": "Sampai tanggal",
|
"to_date": "To Date",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"paid": "Lunas",
|
"paid": "Paid",
|
||||||
"unpaid": "Belum dibayar",
|
"unpaid": "Unpaid",
|
||||||
"download_pdf": "Download PDF",
|
"download_pdf": "Download PDF",
|
||||||
"view_pdf": "Lihat PDF",
|
"view_pdf": "View PDF",
|
||||||
"update_report": "Update Laporan",
|
"update_report": "Update Report",
|
||||||
"report": "Laporan | Laporan",
|
"report": "Report | Reports",
|
||||||
"profit_loss": {
|
"profit_loss": {
|
||||||
"profit_loss": "Laba rugi",
|
"profit_loss": "Profit & Loss",
|
||||||
"to_date": "Sampai tanggal",
|
"to_date": "To Date",
|
||||||
"from_date": "Dari tanggal",
|
"from_date": "From Date",
|
||||||
"date_range": "Pilih Rentang Tanggal"
|
"date_range": "Select Date Range"
|
||||||
},
|
},
|
||||||
"sales": {
|
"sales": {
|
||||||
"sales": "Penjualan",
|
"sales": "Sales",
|
||||||
"date_range": "Pilih Rentang Tanggal",
|
"date_range": "Select Date Range",
|
||||||
"to_date": "Sampai tanggal",
|
"to_date": "To Date",
|
||||||
"from_date": "Dari tanggal",
|
"from_date": "From Date",
|
||||||
"report_type": "Jenis laporan"
|
"report_type": "Report Type"
|
||||||
},
|
},
|
||||||
"taxes": {
|
"taxes": {
|
||||||
"taxes": "Taxes",
|
"taxes": "Taxes",
|
||||||
|
|||||||
@ -17,7 +17,6 @@ import sk from './sk.json'
|
|||||||
import vi from './vi.json'
|
import vi from './vi.json'
|
||||||
import el from './el.json'
|
import el from './el.json'
|
||||||
import hr from './hr.json'
|
import hr from './hr.json'
|
||||||
import th from './th.json'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
cs,
|
cs,
|
||||||
@ -38,6 +37,5 @@ export default {
|
|||||||
vi,
|
vi,
|
||||||
pl,
|
pl,
|
||||||
el,
|
el,
|
||||||
hr,
|
hr
|
||||||
th
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
"settings": "Nustatymai",
|
"settings": "Nustatymai",
|
||||||
"logout": "Atsijungti",
|
"logout": "Atsijungti",
|
||||||
"users": "Vartotojai",
|
"users": "Vartotojai",
|
||||||
"modules": "Moduliai"
|
"modules": "Modules"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add_company": "Pridėti įmonę",
|
"add_company": "Pridėti įmonę",
|
||||||
@ -93,14 +93,14 @@
|
|||||||
"no_note_found": "Jokių žinučių nerasta",
|
"no_note_found": "Jokių žinučių nerasta",
|
||||||
"insert_note": "Terpti prierašą",
|
"insert_note": "Terpti prierašą",
|
||||||
"copied_pdf_url_clipboard": "Nukopijuotas PDF url į iškarpinę!",
|
"copied_pdf_url_clipboard": "Nukopijuotas PDF url į iškarpinę!",
|
||||||
"copied_url_clipboard": "Nuoroda nukopijuota!",
|
"copied_url_clipboard": "Copied url to clipboard!",
|
||||||
"docs": "Dokumentacija",
|
"docs": "Dokumentacija",
|
||||||
"do_you_wish_to_continue": "Ar norite tęsti?",
|
"do_you_wish_to_continue": "Ar norite tęsti?",
|
||||||
"note": "Užrašas",
|
"note": "Užrašas",
|
||||||
"pay_invoice": "Apmokėti",
|
"pay_invoice": "Pay Invoice",
|
||||||
"login_successfully": "Prisijungta sėkmingai!",
|
"login_successfully": "Logged in successfully!",
|
||||||
"logged_out_successfully": "Atsijungta sėkmingai",
|
"logged_out_successfully": "Logged out successfully",
|
||||||
"mark_as_default": "Pažymėti kaip numatytąjį"
|
"mark_as_default": "Mark as default"
|
||||||
},
|
},
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"select_year": "Pasirinkite metus",
|
"select_year": "Pasirinkite metus",
|
||||||
@ -109,7 +109,7 @@
|
|||||||
"customers": "Klientai",
|
"customers": "Klientai",
|
||||||
"invoices": "Sąskaitos",
|
"invoices": "Sąskaitos",
|
||||||
"estimates": "Įverčiai",
|
"estimates": "Įverčiai",
|
||||||
"payments": "Mokėjimai"
|
"payments": "Payments"
|
||||||
},
|
},
|
||||||
"chart_info": {
|
"chart_info": {
|
||||||
"total_sales": "Pardavimai",
|
"total_sales": "Pardavimai",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -29,7 +29,7 @@
|
|||||||
"to_date": "До даты",
|
"to_date": "До даты",
|
||||||
"from": "Отправитель",
|
"from": "Отправитель",
|
||||||
"to": "Получатель",
|
"to": "Получатель",
|
||||||
"ok": "Ок",
|
"ok": "Ok",
|
||||||
"yes": "Да",
|
"yes": "Да",
|
||||||
"no": "Нет",
|
"no": "Нет",
|
||||||
"sort_by": "Сортировать",
|
"sort_by": "Сортировать",
|
||||||
@ -97,10 +97,10 @@
|
|||||||
"docs": "Docs",
|
"docs": "Docs",
|
||||||
"do_you_wish_to_continue": "Хотите продолжить?",
|
"do_you_wish_to_continue": "Хотите продолжить?",
|
||||||
"note": "Note",
|
"note": "Note",
|
||||||
"pay_invoice": "Оплатить счет",
|
"pay_invoice": "Pay Invoice",
|
||||||
"login_successfully": "Вход выполнен!",
|
"login_successfully": "Вход выполнен!",
|
||||||
"logged_out_successfully": "Вы успешно вышли",
|
"logged_out_successfully": "Logged out successfully",
|
||||||
"mark_as_default": "Установить по умолчанию"
|
"mark_as_default": "Mark as default"
|
||||||
},
|
},
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"select_year": "Выберите год",
|
"select_year": "Выберите год",
|
||||||
@ -109,7 +109,7 @@
|
|||||||
"customers": "Клиенты",
|
"customers": "Клиенты",
|
||||||
"invoices": "Счет-фактуры",
|
"invoices": "Счет-фактуры",
|
||||||
"estimates": "Заказы",
|
"estimates": "Заказы",
|
||||||
"payments": "Платежи"
|
"payments": "Payments"
|
||||||
},
|
},
|
||||||
"chart_info": {
|
"chart_info": {
|
||||||
"total_sales": "Продажи",
|
"total_sales": "Продажи",
|
||||||
@ -151,17 +151,17 @@
|
|||||||
"no_results_found": "Ничего не найдено"
|
"no_results_found": "Ничего не найдено"
|
||||||
},
|
},
|
||||||
"company_switcher": {
|
"company_switcher": {
|
||||||
"label": "СМЕНИТЬ КОМПАНИЮ",
|
"label": "SWITCH COMPANY",
|
||||||
"no_results_found": "Результаты не найдены",
|
"no_results_found": "No Results Found",
|
||||||
"add_new_company": "Добавить новую компанию",
|
"add_new_company": "Add new company",
|
||||||
"new_company": "Новая компания",
|
"new_company": "New company",
|
||||||
"created_message": "Компания создана успешно"
|
"created_message": "Company created successfully"
|
||||||
},
|
},
|
||||||
"dateRange": {
|
"dateRange": {
|
||||||
"today": "Сегодня",
|
"today": "Сегодня",
|
||||||
"this_week": "На этой неделе",
|
"this_week": "На этой неделе",
|
||||||
"this_month": "В этом месяце",
|
"this_month": "В этом месяце",
|
||||||
"this_quarter": "Текущий квартал",
|
"this_quarter": "This Quarter",
|
||||||
"this_year": "В этом году",
|
"this_year": "В этом году",
|
||||||
"previous_week": "Предыдущая неделя",
|
"previous_week": "Предыдущая неделя",
|
||||||
"previous_month": "Предыдущий месяц",
|
"previous_month": "Предыдущий месяц",
|
||||||
@ -171,7 +171,7 @@
|
|||||||
},
|
},
|
||||||
"customers": {
|
"customers": {
|
||||||
"title": "Клиенты",
|
"title": "Клиенты",
|
||||||
"prefix": "Префикс",
|
"prefix": "Prefix",
|
||||||
"add_customer": "Добавить клиента",
|
"add_customer": "Добавить клиента",
|
||||||
"contacts_list": "Список клиентов",
|
"contacts_list": "Список клиентов",
|
||||||
"name": "Имя",
|
"name": "Имя",
|
||||||
@ -186,9 +186,9 @@
|
|||||||
"phone": "Телефон",
|
"phone": "Телефон",
|
||||||
"website": "Сайт",
|
"website": "Сайт",
|
||||||
"overview": "Обзор",
|
"overview": "Обзор",
|
||||||
"invoice_prefix": "Префикс счета",
|
"invoice_prefix": "Invoice Prefix",
|
||||||
"estimate_prefix": "Estimate Prefix",
|
"estimate_prefix": "Estimate Prefix",
|
||||||
"payment_prefix": "Префикс платежа",
|
"payment_prefix": "Payment Prefix",
|
||||||
"enable_portal": "Разрешить портал",
|
"enable_portal": "Разрешить портал",
|
||||||
"country": "Страна",
|
"country": "Страна",
|
||||||
"state": "Область",
|
"state": "Область",
|
||||||
@ -197,7 +197,7 @@
|
|||||||
"added_on": "Добавлено",
|
"added_on": "Добавлено",
|
||||||
"action": "Действие",
|
"action": "Действие",
|
||||||
"password": "Пароль",
|
"password": "Пароль",
|
||||||
"confirm_password": "Подтвердить пароль",
|
"confirm_password": "Confirm Password",
|
||||||
"street_number": "Номер дома",
|
"street_number": "Номер дома",
|
||||||
"primary_currency": "Основная валюта",
|
"primary_currency": "Основная валюта",
|
||||||
"description": "Описание",
|
"description": "Описание",
|
||||||
@ -208,10 +208,10 @@
|
|||||||
"new_customer": "New Клиент",
|
"new_customer": "New Клиент",
|
||||||
"edit_customer": "Редактировать клиента",
|
"edit_customer": "Редактировать клиента",
|
||||||
"basic_info": "Основное",
|
"basic_info": "Основное",
|
||||||
"portal_access": "Доступ к порталу",
|
"portal_access": "Portal Access",
|
||||||
"portal_access_text": "Хотите ли вы разрешить данному клиенту доступ к порталу для клиентов?",
|
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?",
|
||||||
"portal_access_url": "URL для входа на портал клиента",
|
"portal_access_url": "Customer Portal Login URL",
|
||||||
"portal_access_url_help": "Пожалуйста, скопируйте и перешлите вышеуказанный URL вашему клиенту для предоставления доступа.",
|
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.",
|
||||||
"billing_address": "Адрес плательщика",
|
"billing_address": "Адрес плательщика",
|
||||||
"shipping_address": "Адрес доставки",
|
"shipping_address": "Адрес доставки",
|
||||||
"copy_billing_address": "Скопировать из биллинга",
|
"copy_billing_address": "Скопировать из биллинга",
|
||||||
@ -231,9 +231,9 @@
|
|||||||
"confirm_delete": "Восстановление клиента вместе со всеми его оплатами, сметами и счетами-фактурами будет невозможно. | Восстановление клиентов вместе со всеми их оплатами, сметами и счетами-фактурами будет невозможно.",
|
"confirm_delete": "Восстановление клиента вместе со всеми его оплатами, сметами и счетами-фактурами будет невозможно. | Восстановление клиентов вместе со всеми их оплатами, сметами и счетами-фактурами будет невозможно.",
|
||||||
"created_message": "Клиент добавлен",
|
"created_message": "Клиент добавлен",
|
||||||
"updated_message": "Клиент обновлён",
|
"updated_message": "Клиент обновлён",
|
||||||
"address_updated_message": "Информация об адресе успешно обновлена",
|
"address_updated_message": "Address Information Updated succesfully",
|
||||||
"deleted_message": "Клиент удалён | Клиенты удалены",
|
"deleted_message": "Клиент удалён | Клиенты удалены",
|
||||||
"edit_currency_not_allowed": "Невозможно изменить валюту после создания транзакций."
|
"edit_currency_not_allowed": "Cannot change currency once transactions created."
|
||||||
},
|
},
|
||||||
"items": {
|
"items": {
|
||||||
"title": "Товары",
|
"title": "Товары",
|
||||||
@ -265,8 +265,8 @@
|
|||||||
},
|
},
|
||||||
"estimates": {
|
"estimates": {
|
||||||
"title": "Заказы",
|
"title": "Заказы",
|
||||||
"accept_estimate": "Принять заказ",
|
"accept_estimate": "Accept Estimate",
|
||||||
"reject_estimate": "Отклонить заказ",
|
"reject_estimate": "Reject Estimate",
|
||||||
"estimate": "Заказ | Заказы",
|
"estimate": "Заказ | Заказы",
|
||||||
"estimates_list": "Список заказов",
|
"estimates_list": "Список заказов",
|
||||||
"days": "{days} дней",
|
"days": "{days} дней",
|
||||||
@ -355,14 +355,14 @@
|
|||||||
"select_an_item": "Выберите товар",
|
"select_an_item": "Выберите товар",
|
||||||
"type_item_description": "Описание товара (необязательно)"
|
"type_item_description": "Описание товара (необязательно)"
|
||||||
},
|
},
|
||||||
"mark_as_default_estimate_template_description": "Если включено, выбранный шаблон будет автоматически выбираться для новых заказов."
|
"mark_as_default_estimate_template_description": "If enabled, the selected template will be automatically selected for new estimates."
|
||||||
},
|
},
|
||||||
"invoices": {
|
"invoices": {
|
||||||
"title": "Счет-фактуры",
|
"title": "Счет-фактуры",
|
||||||
"download": "Загрузить",
|
"download": "Загрузить",
|
||||||
"pay_invoice": "Оплатить счет",
|
"pay_invoice": "Pay Invoice",
|
||||||
"invoices_list": "Список счетов",
|
"invoices_list": "Список счетов",
|
||||||
"invoice_information": "Информация о счете",
|
"invoice_information": "Invoice Information",
|
||||||
"days": "{days} дн.",
|
"days": "{days} дн.",
|
||||||
"months": "{months} мес.",
|
"months": "{months} мес.",
|
||||||
"years": "{years} г.",
|
"years": "{years} г.",
|
||||||
@ -397,16 +397,16 @@
|
|||||||
"send_invoice": "Отправить счёт",
|
"send_invoice": "Отправить счёт",
|
||||||
"resend_invoice": "Повторно отправить счет",
|
"resend_invoice": "Повторно отправить счет",
|
||||||
"invoice_template": "Шаблон счета",
|
"invoice_template": "Шаблон счета",
|
||||||
"conversion_message": "Счет успешно скопирован",
|
"conversion_message": "Invoice cloned successful",
|
||||||
"template": "Шаблон",
|
"template": "Шаблон",
|
||||||
"mark_as_sent": "Пометить как отправленное",
|
"mark_as_sent": "Пометить как отправленное",
|
||||||
"confirm_send_invoice": "Этот счет будет отправлен клиенту по электронной почте",
|
"confirm_send_invoice": "Этот счет будет отправлен клиенту по электронной почте",
|
||||||
"invoice_mark_as_sent": "Этот счет будет помечен как отправленный",
|
"invoice_mark_as_sent": "Этот счет будет помечен как отправленный",
|
||||||
"confirm_mark_as_accepted": "Данный счет будет помечен как принятый",
|
"confirm_mark_as_accepted": "This invoice will be marked as Accepted",
|
||||||
"confirm_mark_as_rejected": "Данный счет будет помечен как отклоненный",
|
"confirm_mark_as_rejected": "This invoice will be marked as Rejected",
|
||||||
"confirm_send": "Этот счет будет отправлен клиенту по электронной почте",
|
"confirm_send": "Этот счет будет отправлен клиенту по электронной почте",
|
||||||
"invoice_date": "Дата счета-фактуры",
|
"invoice_date": "Дата счета-фактуры",
|
||||||
"record_payment": "Добавить платёж",
|
"record_payment": "Record Payment",
|
||||||
"add_new_invoice": "Добавить новый счёт",
|
"add_new_invoice": "Добавить новый счёт",
|
||||||
"update_expense": "Обновить расходы",
|
"update_expense": "Обновить расходы",
|
||||||
"edit_invoice": "Редактировать счет-фактуру",
|
"edit_invoice": "Редактировать счет-фактуру",
|
||||||
@ -415,13 +415,13 @@
|
|||||||
"update_invoice": "Обновить счет",
|
"update_invoice": "Обновить счет",
|
||||||
"add_new_tax": "Добавить новый налог",
|
"add_new_tax": "Добавить новый налог",
|
||||||
"no_invoices": "Пока нет счетов!",
|
"no_invoices": "Пока нет счетов!",
|
||||||
"mark_as_rejected": "Пометить как отклонённый",
|
"mark_as_rejected": "Mark as rejected",
|
||||||
"mark_as_accepted": "Пометить как принятый",
|
"mark_as_accepted": "Mark as accepted",
|
||||||
"list_of_invoices": "Этот раздел будет содержать список счетов-фактур.",
|
"list_of_invoices": "Этот раздел будет содержать список счетов-фактур.",
|
||||||
"select_invoice": "Выберите счет",
|
"select_invoice": "Выберите счет",
|
||||||
"no_matching_invoices": "Нет соответствующих счетов!",
|
"no_matching_invoices": "Нет соответствующих счетов!",
|
||||||
"mark_as_sent_successfully": "Счет помечен как успешно отправленный",
|
"mark_as_sent_successfully": "Счет помечен как успешно отправленный",
|
||||||
"invoice_sent_successfully": "Счет-фактура успешно отправлен",
|
"invoice_sent_successfully": "Invoice sent successfully",
|
||||||
"cloned_successfully": "Счет успешно клонирован",
|
"cloned_successfully": "Счет успешно клонирован",
|
||||||
"clone_invoice": "Клонировать счет",
|
"clone_invoice": "Клонировать счет",
|
||||||
"confirm_clone": "Этот счет будет клонирован в новый счет",
|
"confirm_clone": "Этот счет будет клонирован в новый счет",
|
||||||
@ -439,26 +439,26 @@
|
|||||||
"select_an_item": "Выберите товар",
|
"select_an_item": "Выберите товар",
|
||||||
"type_item_description": "Описание товара (необязательно)"
|
"type_item_description": "Описание товара (необязательно)"
|
||||||
},
|
},
|
||||||
"payment_attached_message": "К одному из выбранных счетов уже прикреплен платеж. Для удаления сначала удалите прикрепленные платежи",
|
"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": "Восстановление данного счета будет невозможно | Восстановление данного счета будет невозможно",
|
"confirm_delete": "You will not be able to recover this Invoice | You will not be able to recover these Invoices",
|
||||||
"created_message": "Счет-фактура успешно создан",
|
"created_message": "Счет-фактура успешно создан",
|
||||||
"updated_message": "Счет-фактура успешно обновлен",
|
"updated_message": "Счет-фактура успешно обновлен",
|
||||||
"deleted_message": "Счет успешно удален | Счета успешно удалены",
|
"deleted_message": "Счет успешно удален | Счета успешно удалены",
|
||||||
"marked_as_sent_message": "Счет помечен как успешно отправленный",
|
"marked_as_sent_message": "Счет помечен как успешно отправленный",
|
||||||
"something_went_wrong": "что-то пошло не так",
|
"something_went_wrong": "что-то пошло не так",
|
||||||
"invalid_due_amount_message": "Итоговая сумма счета не может быть меньше оплаченной суммы по данному счету. Пожалуйста, обновите счет или удалите связанные с ним платежи, чтобы продолжить.",
|
"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": "Если включено, выбранный шаблон будет автоматически выбираться для новых счетов."
|
"mark_as_default_invoice_template_description": "If enabled, the selected template will be automatically selected for new invoices."
|
||||||
},
|
},
|
||||||
"recurring_invoices": {
|
"recurring_invoices": {
|
||||||
"title": "Recurring Invoices",
|
"title": "Recurring Invoices",
|
||||||
"invoices_list": "Recurring Invoices List",
|
"invoices_list": "Recurring Invoices List",
|
||||||
"days": "{days} Дней",
|
"days": "{days} Days",
|
||||||
"months": "{months} Месяц",
|
"months": "{months} Month",
|
||||||
"years": "{years} Год",
|
"years": "{years} Year",
|
||||||
"all": "Все",
|
"all": "All",
|
||||||
"paid": "Оплачено",
|
"paid": "Paid",
|
||||||
"unpaid": "Не оплачено",
|
"unpaid": "Unpaid",
|
||||||
"viewed": "Просмотрено",
|
"viewed": "Viewed",
|
||||||
"overdue": "Просрочен",
|
"overdue": "Просрочен",
|
||||||
"active": "Активный",
|
"active": "Активный",
|
||||||
"completed": "Выполнен",
|
"completed": "Выполнен",
|
||||||
@ -466,14 +466,14 @@
|
|||||||
"paid_status": "СТАТУС ПЛАТЕЖА",
|
"paid_status": "СТАТУС ПЛАТЕЖА",
|
||||||
"ref_no": "REF NO.",
|
"ref_no": "REF NO.",
|
||||||
"number": "НОМЕР",
|
"number": "НОМЕР",
|
||||||
"amount_due": "К ОПЛАТЕ",
|
"amount_due": "AMOUNT DUE",
|
||||||
"partially_paid": "Частично оплачен",
|
"partially_paid": "Partially Paid",
|
||||||
"total": "Итого",
|
"total": "Итого",
|
||||||
"discount": "Скидка",
|
"discount": "Скидка",
|
||||||
"sub_total": "Промежуточный итог",
|
"sub_total": "Промежуточный итог",
|
||||||
"invoice": "Recurring Invoice | Recurring Invoices",
|
"invoice": "Recurring Invoice | Recurring Invoices",
|
||||||
"invoice_number": "Recurring Invoice Number",
|
"invoice_number": "Recurring Invoice Number",
|
||||||
"next_invoice_date": "Дата следующего счета",
|
"next_invoice_date": "Next Invoice Date",
|
||||||
"ref_number": "Ref Number",
|
"ref_number": "Ref Number",
|
||||||
"contact": "Контакты",
|
"contact": "Контакты",
|
||||||
"add_item": "Добавить элемент",
|
"add_item": "Добавить элемент",
|
||||||
@ -482,31 +482,31 @@
|
|||||||
"limit_date": "Limit Date",
|
"limit_date": "Limit Date",
|
||||||
"limit_count": "Limit Count",
|
"limit_count": "Limit Count",
|
||||||
"count": "Количество",
|
"count": "Количество",
|
||||||
"status": "Статус",
|
"status": "Status",
|
||||||
"select_a_status": "Выбрать статус",
|
"select_a_status": "Выбрать статус",
|
||||||
"working": "В процессе",
|
"working": "Working",
|
||||||
"on_hold": "На удержании",
|
"on_hold": "На удержании",
|
||||||
"complete": "Завершено",
|
"complete": "Completed",
|
||||||
"add_tax": "Добавить налог",
|
"add_tax": "Add Tax",
|
||||||
"amount": "Сумма",
|
"amount": "Amount",
|
||||||
"action": "Действие",
|
"action": "Action",
|
||||||
"notes": "Заметки",
|
"notes": "Notes",
|
||||||
"view": "Просмотр",
|
"view": "View",
|
||||||
"basic_info": "Общая информация",
|
"basic_info": "Basic Info",
|
||||||
"send_invoice": "Send Recurring Invoice",
|
"send_invoice": "Send Recurring Invoice",
|
||||||
"auto_send": "Автоотправка",
|
"auto_send": "Auto Send",
|
||||||
"resend_invoice": "Resend Recurring Invoice",
|
"resend_invoice": "Resend Recurring Invoice",
|
||||||
"invoice_template": "Recurring Invoice Template",
|
"invoice_template": "Recurring Invoice Template",
|
||||||
"conversion_message": "Recurring Invoice cloned successful",
|
"conversion_message": "Recurring Invoice cloned successful",
|
||||||
"template": "Шаблон",
|
"template": "Шаблон",
|
||||||
"mark_as_sent": "Пометить как отправленное",
|
"mark_as_sent": "Mark as sent",
|
||||||
"confirm_send_invoice": "This recurring invoice will be sent via email to the customer",
|
"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",
|
"invoice_mark_as_sent": "This recurring invoice will be marked as sent",
|
||||||
"confirm_send": "This recurring invoice will be sent via email to the customer",
|
"confirm_send": "This recurring invoice will be sent via email to the customer",
|
||||||
"starts_at": "Дата начала",
|
"starts_at": "Start Date",
|
||||||
"due_date": "Срок оплаты счёта",
|
"due_date": "Invoice Due Date",
|
||||||
"record_payment": "Добавить платёж",
|
"record_payment": "Record Payment",
|
||||||
"add_new_invoice": "Добавить новый повторяющийся счет",
|
"add_new_invoice": "Add New Recurring Invoice",
|
||||||
"update_expense": "Update Expense",
|
"update_expense": "Update Expense",
|
||||||
"edit_invoice": "Edit Recurring Invoice",
|
"edit_invoice": "Edit Recurring Invoice",
|
||||||
"new_invoice": "New Recurring Invoice",
|
"new_invoice": "New Recurring Invoice",
|
||||||
@ -547,22 +547,22 @@
|
|||||||
"minute": "Minute",
|
"minute": "Minute",
|
||||||
"hour": "Hour",
|
"hour": "Hour",
|
||||||
"day_month": "Day of month",
|
"day_month": "Day of month",
|
||||||
"month": "Месяц",
|
"month": "Month",
|
||||||
"day_week": "День недели"
|
"day_week": "Day of week"
|
||||||
},
|
},
|
||||||
"confirm_delete": "You will not be able to recover this Invoice | You will not be able to recover these Invoices",
|
"confirm_delete": "You will not be able to recover this Invoice | You will not be able to recover these Invoices",
|
||||||
"created_message": "Recurring Invoice created successfully",
|
"created_message": "Recurring Invoice created successfully",
|
||||||
"updated_message": "Recurring Invoice updated successfully",
|
"updated_message": "Recurring Invoice updated successfully",
|
||||||
"deleted_message": "Recurring Invoice deleted successfully | Recurring Invoices deleted successfully",
|
"deleted_message": "Recurring Invoice deleted successfully | Recurring Invoices deleted successfully",
|
||||||
"marked_as_sent_message": "Recurring Invoice marked as sent successfully",
|
"marked_as_sent_message": "Recurring Invoice marked as sent successfully",
|
||||||
"user_email_does_not_exist": "Адрес электронной почты пользователя не найден",
|
"user_email_does_not_exist": "User email does not exist",
|
||||||
"something_went_wrong": "что-то пошло не так",
|
"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."
|
"invalid_due_amount_message": "Total Recurring Invoice amount cannot be less than total paid amount for this Recurring Invoice. Please update the invoice or delete the associated payments to continue."
|
||||||
},
|
},
|
||||||
"payments": {
|
"payments": {
|
||||||
"title": "Платежи",
|
"title": "Платежи",
|
||||||
"payments_list": "Список платежей",
|
"payments_list": "Список платежей",
|
||||||
"record_payment": "Добавить платёж",
|
"record_payment": "Record Payment",
|
||||||
"customer": "Клиент",
|
"customer": "Клиент",
|
||||||
"date": "Дата",
|
"date": "Дата",
|
||||||
"amount": "Сумма",
|
"amount": "Сумма",
|
||||||
@ -603,7 +603,7 @@
|
|||||||
"select_a_customer": "Выберите клиента",
|
"select_a_customer": "Выберите клиента",
|
||||||
"expense_title": "Заголовок",
|
"expense_title": "Заголовок",
|
||||||
"customer": "Клиент",
|
"customer": "Клиент",
|
||||||
"currency": "Валюта",
|
"currency": "Currency",
|
||||||
"contact": "Контакт",
|
"contact": "Контакт",
|
||||||
"category": "Категория",
|
"category": "Категория",
|
||||||
"from_date": "От даты",
|
"from_date": "От даты",
|
||||||
@ -626,11 +626,11 @@
|
|||||||
"new_expense": "Новый расход",
|
"new_expense": "Новый расход",
|
||||||
"expense": "Расход | Расходы",
|
"expense": "Расход | Расходы",
|
||||||
"no_expenses": "No expenses yet!",
|
"no_expenses": "No expenses yet!",
|
||||||
"list_of_expenses": "В этом разделе будет содержаться список расходов.",
|
"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",
|
"confirm_delete": "You will not be able to recover this Expense | You will not be able to recover these Expenses",
|
||||||
"created_message": "Расход создан успешно",
|
"created_message": "Expense created successfully",
|
||||||
"updated_message": "Расход успешно обновлен",
|
"updated_message": "Expense updated successfully",
|
||||||
"deleted_message": "Расход успешно удален | Расходы успешно удалены",
|
"deleted_message": "Expense deleted successfully | Expenses deleted successfully",
|
||||||
"categories": {
|
"categories": {
|
||||||
"categories_list": "Список категорий",
|
"categories_list": "Список категорий",
|
||||||
"title": "Заголовок",
|
"title": "Заголовок",
|
||||||
@ -658,40 +658,40 @@
|
|||||||
"retype_password": "Повторите пароль"
|
"retype_password": "Повторите пароль"
|
||||||
},
|
},
|
||||||
"modules": {
|
"modules": {
|
||||||
"buy_now": "Купить",
|
"buy_now": "Buy Now",
|
||||||
"install": "Установить",
|
"install": "Install",
|
||||||
"price": "Цена",
|
"price": "Price",
|
||||||
"download_zip_file": "Скачать ZIP-файл",
|
"download_zip_file": "Download ZIP file",
|
||||||
"unzipping_package": "Распаковка пакета",
|
"unzipping_package": "Unzipping Package",
|
||||||
"copying_files": "Копирование файлов",
|
"copying_files": "Copying Files",
|
||||||
"deleting_files": "Удаление неиспользуемых файлов",
|
"deleting_files": "Deleting Unused files",
|
||||||
"completing_installation": "Завершение установки",
|
"completing_installation": "Completing Installation",
|
||||||
"update_failed": "Не удалось обновить",
|
"update_failed": "Update Failed",
|
||||||
"install_success": "Модуль успешно установлен!",
|
"install_success": "Module has been installed successfully!",
|
||||||
"customer_reviews": "Отзывы",
|
"customer_reviews": "Reviews",
|
||||||
"license": "Лицензия",
|
"license": "License",
|
||||||
"faq": "Часто задаваемые вопросы",
|
"faq": "FAQ",
|
||||||
"monthly": "Ежемесячно",
|
"monthly": "Monthly",
|
||||||
"yearly": "Ежегодно",
|
"yearly": "Yearly",
|
||||||
"updated": "Обновлено",
|
"updated": "Updated",
|
||||||
"version": "Версия",
|
"version": "Version",
|
||||||
"disable": "Отключить",
|
"disable": "Disable",
|
||||||
"module_disabled": "Модуль отключен",
|
"module_disabled": "Module Disabled",
|
||||||
"enable": "Включить",
|
"enable": "Enable",
|
||||||
"module_enabled": "Модуль включен",
|
"module_enabled": "Module Enabled",
|
||||||
"update_to": "Обновить до",
|
"update_to": "Update To",
|
||||||
"module_updated": "Модуль успешно обновлен!",
|
"module_updated": "Module Updated Successfully!",
|
||||||
"title": "Модули",
|
"title": "Modules",
|
||||||
"module": "Модуль | Модули",
|
"module": "Module | Modules",
|
||||||
"api_token": "API-токен",
|
"api_token": "API token",
|
||||||
"invalid_api_token": "Неверный API-токен.",
|
"invalid_api_token": "Invalid API Token.",
|
||||||
"other_modules": "Другие модули",
|
"other_modules": "Other Modules",
|
||||||
"view_all": "Показать всё",
|
"view_all": "Показать всё",
|
||||||
"no_reviews_found": "Для данного модуля пока нет отзывов!",
|
"no_reviews_found": "There are no reviews for this module yet!",
|
||||||
"module_not_purchased": "Модуль не приобретен",
|
"module_not_purchased": "Module Not Purchased",
|
||||||
"module_not_found": "Модуль не найден",
|
"module_not_found": "Module Not Found",
|
||||||
"version_not_supported": "This module version doesn't support the current version of Crater",
|
"version_not_supported": "This module version doesn't support the current version of Crater",
|
||||||
"last_updated": "Последнее обновление",
|
"last_updated": "Last Updated On",
|
||||||
"connect_installation": "Connect your installation",
|
"connect_installation": "Connect your installation",
|
||||||
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
"api_token_description": "Login to {url} and connect this installation by entering the API Token. Your purchased modules will show up here after the connection is established.",
|
||||||
"view_module": "View Module",
|
"view_module": "View Module",
|
||||||
@ -911,49 +911,49 @@
|
|||||||
"sort_in_alphabetical_order": "Sort in Alphabetical Order",
|
"sort_in_alphabetical_order": "Sort in Alphabetical Order",
|
||||||
"add_options_in_bulk": "Add options in bulk",
|
"add_options_in_bulk": "Add options in bulk",
|
||||||
"use_predefined_options": "Use Predefined Options",
|
"use_predefined_options": "Use Predefined Options",
|
||||||
"select_custom_date": "Выберите произвольную дату",
|
"select_custom_date": "Select Custom Date",
|
||||||
"select_relative_date": "Выберите относительную дату",
|
"select_relative_date": "Select Relative Date",
|
||||||
"ticked_by_default": "Отмечен по умолчанию",
|
"ticked_by_default": "Ticked by default",
|
||||||
"updated_message": "Пользовательское поле успешно обновлено",
|
"updated_message": "Custom Field updated successfully",
|
||||||
"added_message": "Пользовательское поле успешно добавлено",
|
"added_message": "Custom Field added successfully",
|
||||||
"press_enter_to_add": "Нажмите ввод для добавления новой опции",
|
"press_enter_to_add": "Press enter to add new option",
|
||||||
"model_in_use": "Невозможно обновить модель для полей, которые уже используются.",
|
"model_in_use": "Cannot update model for fields which are already in use.",
|
||||||
"type_in_use": "Невозможно обновить тип для полей, которые уже используются."
|
"type_in_use": "Cannot update type for fields which are already in use."
|
||||||
},
|
},
|
||||||
"customization": {
|
"customization": {
|
||||||
"customization": "персонализация",
|
"customization": "customization",
|
||||||
"updated_message": "Информация о компании успешно обновлена",
|
"updated_message": "Информация о компании успешно обновлена",
|
||||||
"save": "Сохранить",
|
"save": "Сохранить",
|
||||||
"insert_fields": "Вставить поля",
|
"insert_fields": "Insert Fields",
|
||||||
"learn_custom_format": "Learn how to use custom format",
|
"learn_custom_format": "Learn how to use custom format",
|
||||||
"add_new_component": "Добавить компонент",
|
"add_new_component": "Add New Component",
|
||||||
"component": "Компонент",
|
"component": "Component",
|
||||||
"Parameter": "Параметр",
|
"Parameter": "Parameter",
|
||||||
"series": "Series",
|
"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_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",
|
"series_param_label": "Series Value",
|
||||||
"delimiter": "Разделитель",
|
"delimiter": "Delimiter",
|
||||||
"delimiter_description": "Символ для обозначения границы между двумя компонентами. По умолчанию имеет значение -",
|
"delimiter_description": "Single character for specifying the boundary between 2 separate components. By default its set to -",
|
||||||
"delimiter_param_label": "Разделитель",
|
"delimiter_param_label": "Delimiter Value",
|
||||||
"date_format": "Формат даты",
|
"date_format": "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_description": "A local date and time field which accepts a format parameter. The default format: 'Y' renders the current year.",
|
||||||
"date_format_param_label": "Формат",
|
"date_format_param_label": "Format",
|
||||||
"sequence": "Последовательность",
|
"sequence": "Sequence",
|
||||||
"sequence_description": "Consecutive sequence of numbers across your company. You can specify the length on the given parameter.",
|
"sequence_description": "Consecutive sequence of numbers across your company. You can specify the length on the given parameter.",
|
||||||
"sequence_param_label": "Длина последовательности",
|
"sequence_param_label": "Sequence Length",
|
||||||
"customer_series": "Customer Series",
|
"customer_series": "Customer Series",
|
||||||
"customer_series_description": "Установить отдельный префикс/постфикс для каждого клиента.",
|
"customer_series_description": "To set a different prefix/postfix for each customer.",
|
||||||
"customer_sequence": "Customer Sequence",
|
"customer_sequence": "Customer Sequence",
|
||||||
"customer_sequence_description": "Consecutive sequence of numbers for each of your customer.",
|
"customer_sequence_description": "Consecutive sequence of numbers for each of your customer.",
|
||||||
"customer_sequence_param_label": "Длина последовательности",
|
"customer_sequence_param_label": "Sequence Length",
|
||||||
"random_sequence": "Случайная последовательность",
|
"random_sequence": "Random Sequence",
|
||||||
"random_sequence_description": "Произвольная буквенно-цифровая строка. Вы можете указать длину в качестве параметра.",
|
"random_sequence_description": "Random alphanumeric string. You can specify the length on the given parameter.",
|
||||||
"random_sequence_param_label": "Длина последовательности",
|
"random_sequence_param_label": "Sequence Length",
|
||||||
"invoices": {
|
"invoices": {
|
||||||
"title": "Счет-фактуры",
|
"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.",
|
"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": "Due Date",
|
||||||
"due_date_description": "Specify how due date is automatically set when you create an invoice.",
|
"due_date_description": "Specify how due date is automatically set when you create an invoice.",
|
||||||
"due_date_days": "Invoice Due after days",
|
"due_date_days": "Invoice Due after days",
|
||||||
@ -969,7 +969,7 @@
|
|||||||
"invoice_email_attachment_setting_description": "Включите, если вы хотите отправлять счета-фактуры как вложение по электронной почте. Пожалуйста, обратите внимание, что кнопка «Просмотр счета» в письмах больше не будет отображаться, если включено.",
|
"invoice_email_attachment_setting_description": "Включите, если вы хотите отправлять счета-фактуры как вложение по электронной почте. Пожалуйста, обратите внимание, что кнопка «Просмотр счета» в письмах больше не будет отображаться, если включено.",
|
||||||
"invoice_settings_updated": "Invoice Settings updated successfully",
|
"invoice_settings_updated": "Invoice Settings updated successfully",
|
||||||
"retrospective_edits": "Retrospective Edits",
|
"retrospective_edits": "Retrospective Edits",
|
||||||
"allow": "Разрешить",
|
"allow": "Allow",
|
||||||
"disable_on_invoice_partial_paid": "Disable after partial payment is recorded",
|
"disable_on_invoice_partial_paid": "Disable after partial payment is recorded",
|
||||||
"disable_on_invoice_paid": "Disable after full payment is recorded",
|
"disable_on_invoice_paid": "Disable after full payment is recorded",
|
||||||
"disable_on_invoice_sent": "Disable after invoice is sent",
|
"disable_on_invoice_sent": "Disable after invoice is sent",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -17,7 +17,7 @@
|
|||||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||||
|
|
||||||
<!-- Module Styles -->
|
<!-- Module Styles -->
|
||||||
@foreach (\Crater\Services\Module\ModuleFacade::allStyles() as $name => $path)
|
@foreach(\Crater\Services\Module\ModuleFacade::allStyles() as $name => $path)
|
||||||
<link rel="stylesheet" href="/modules/styles/{{ $name }}">
|
<link rel="stylesheet" href="/modules/styles/{{ $name }}">
|
||||||
@endforeach
|
@endforeach
|
||||||
|
|
||||||
@ -25,8 +25,8 @@
|
|||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body
|
<body
|
||||||
class="h-full overflow-hidden bg-gray-100 dark:bg-gray-900 dark:text-white font-base
|
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 ">
|
@if(isset($current_theme)) theme-{{ $current_theme }} @else theme-{{get_app_setting('admin_portal_theme') ?? 'crater'}} @endif ">
|
||||||
|
|
||||||
<!-- Module Scripts -->
|
<!-- Module Scripts -->
|
||||||
@foreach (\Crater\Services\Module\ModuleFacade::allScripts() as $name => $path)
|
@foreach (\Crater\Services\Module\ModuleFacade::allScripts() as $name => $path)
|
||||||
@ -38,14 +38,6 @@
|
|||||||
@endforeach
|
@endforeach
|
||||||
|
|
||||||
<script type="module">
|
<script type="module">
|
||||||
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
|
||||||
document.documentElement.classList.add('dark')
|
|
||||||
document.documentElement.style.setProperty('color-scheme', 'dark');
|
|
||||||
} else {
|
|
||||||
document.documentElement.classList.remove('dark')
|
|
||||||
document.documentElement.style.setProperty('color-scheme', 'light')
|
|
||||||
}
|
|
||||||
|
|
||||||
@if(isset($customer_logo))
|
@if(isset($customer_logo))
|
||||||
|
|
||||||
window.customer_logo = "/storage/{{$customer_logo}}"
|
window.customer_logo = "/storage/{{$customer_logo}}"
|
||||||
@ -65,12 +57,12 @@
|
|||||||
|
|
||||||
window.login_page_description = "{{$login_page_description}}"
|
window.login_page_description = "{{$login_page_description}}"
|
||||||
|
|
||||||
@endif
|
@endif
|
||||||
@if(isset($copyright_text))
|
@if(isset($copyright_text))
|
||||||
|
|
||||||
window.copyright_text = "{{$copyright_text}}"
|
window.copyright_text = "{{$copyright_text}}"
|
||||||
|
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
window.Crater.start()
|
window.Crater.start()
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -386,10 +386,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@if (App::isLocale('th'))
|
|
||||||
@include('app.pdf.locale.th')
|
|
||||||
@endif
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@ -408,10 +408,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@if (App::isLocale('th'))
|
|
||||||
@include('app.pdf.locale.th')
|
|
||||||
@endif
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@ -346,10 +346,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@if (App::isLocale('th'))
|
|
||||||
@include('app.pdf.locale.th')
|
|
||||||
@endif
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@ -327,10 +327,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@if (App::isLocale('th'))
|
|
||||||
@include('app.pdf.locale.th')
|
|
||||||
@endif
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@ -377,10 +377,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@if (App::isLocale('th'))
|
|
||||||
@include('app.pdf.locale.th')
|
|
||||||
@endif
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
<html>
|
<html>
|
||||||
|
|
||||||
<head>
|
<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" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
@ -187,7 +187,7 @@
|
|||||||
|
|
||||||
|
|
||||||
.total-display-table {
|
.total-display-table {
|
||||||
border-top: none;
|
border-top: none;
|
||||||
page-break-inside: avoid;
|
page-break-inside: avoid;
|
||||||
page-break-before: auto;
|
page-break-before: auto;
|
||||||
page-break-after: auto;
|
page-break-after: auto;
|
||||||
@ -304,12 +304,7 @@
|
|||||||
.pl-0 {
|
.pl-0 {
|
||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@if (App::isLocale('th'))
|
|
||||||
@include('app.pdf.locale.th')
|
|
||||||
@endif
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
@ -317,10 +312,10 @@
|
|||||||
<table width="100%">
|
<table width="100%">
|
||||||
<tr>
|
<tr>
|
||||||
<td width="50%" class="header-section-left">
|
<td width="50%" class="header-section-left">
|
||||||
@if ($logo)
|
@if($logo)
|
||||||
<img class="header-logo" style="height: 50px;" src="{{ $logo }}" alt="Company Logo">
|
<img class="header-logo" style="height: 50px;" src="{{ $logo }}" alt="Company Logo">
|
||||||
@else
|
@else
|
||||||
<h1 class="header-logo"> {{ $invoice->customer->company->name }} </h1>
|
<h1 class="header-logo"> {{$invoice->customer->company->name}} </h1>
|
||||||
@endif
|
@endif
|
||||||
</td>
|
</td>
|
||||||
<td width="50%" class="text-right company-address-container company-address">
|
<td width="50%" class="text-right company-address-container company-address">
|
||||||
@ -336,14 +331,14 @@
|
|||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
<div class="customer-address-container">
|
<div class="customer-address-container">
|
||||||
<div class="billing-address-container billing-address">
|
<div class="billing-address-container billing-address">
|
||||||
@if ($billing_address)
|
@if($billing_address)
|
||||||
<b>@lang('pdf_bill_to')</b> <br>
|
<b>@lang('pdf_bill_to')</b> <br>
|
||||||
{!! $billing_address !!}
|
{!! $billing_address !!}
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div @if ($billing_address !== '</br>') class="shipping-address-container shipping-address" @else class="shipping-address-container--left shipping-address" @endif>
|
<div @if($billing_address !== '</br>') class="shipping-address-container shipping-address" @else class="shipping-address-container--left shipping-address" @endif>
|
||||||
@if ($shipping_address)
|
@if($shipping_address)
|
||||||
<b>@lang('pdf_ship_to')</b> <br>
|
<b>@lang('pdf_ship_to')</b> <br>
|
||||||
{!! $shipping_address !!}
|
{!! $shipping_address !!}
|
||||||
@endif
|
@endif
|
||||||
@ -355,15 +350,15 @@
|
|||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="attribute-label">@lang('pdf_invoice_number')</td>
|
<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>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="attribute-label">@lang('pdf_invoice_date')</td>
|
<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>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="attribute-label">@lang('pdf_invoice_due_date')</td>
|
<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>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
@ -373,7 +368,7 @@
|
|||||||
@include('app.pdf.invoice.partials.table')
|
@include('app.pdf.invoice.partials.table')
|
||||||
|
|
||||||
<div class="notes">
|
<div class="notes">
|
||||||
@if ($notes)
|
@if($notes)
|
||||||
<div class="notes-label">
|
<div class="notes-label">
|
||||||
@lang('pdf_notes')
|
@lang('pdf_notes')
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,34 +0,0 @@
|
|||||||
<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,10 +276,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@if (App::isLocale('th'))
|
|
||||||
@include('app.pdf.locale.th')
|
|
||||||
@endif
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<title>@lang('pdf_expense_report_label')</title>
|
<title>@lang('pdf_expense_report_label')</title>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
@ -12,7 +11,7 @@
|
|||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sub-container {
|
.sub-container{
|
||||||
padding: 0px 20px;
|
padding: 0px 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,12 +133,7 @@
|
|||||||
color: #5851D8;
|
color: #5851D8;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@if (App::isLocale('th'))
|
|
||||||
@include('app.pdf.locale.th')
|
|
||||||
@endif
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="sub-container">
|
<div class="sub-container">
|
||||||
<table class="report-header">
|
<table class="report-header">
|
||||||
@ -161,18 +155,18 @@
|
|||||||
<div class="expenses-table-container">
|
<div class="expenses-table-container">
|
||||||
<table class="expenses-table">
|
<table class="expenses-table">
|
||||||
@foreach ($expenseCategories as $expenseCategory)
|
@foreach ($expenseCategories as $expenseCategory)
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<p class="expense-title">
|
<p class="expense-title">
|
||||||
{{ $expenseCategory->category->name }}
|
{{ $expenseCategory->category->name }}
|
||||||
</p>
|
</p>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<p class="expense-amount">
|
<p class="expense-amount">
|
||||||
{!! format_money_pdf($expenseCategory->total_amount, $currency) !!}
|
{!! format_money_pdf($expenseCategory->total_amount) !!}
|
||||||
</p>
|
</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
@endforeach
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
@ -181,7 +175,7 @@
|
|||||||
<table class="expense-total-table">
|
<table class="expense-total-table">
|
||||||
<tr>
|
<tr>
|
||||||
<td class="expense-total-cell">
|
<td class="expense-total-cell">
|
||||||
<p class="expense-total">{!! format_money_pdf($totalExpense, $currency) !!}</p>
|
<p class="expense-total">{!! format_money_pdf($totalExpense) !!}</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@ -191,10 +185,9 @@
|
|||||||
<p class="report-footer-label">@lang('pdf_total_expenses_label')</p>
|
<p class="report-footer-label">@lang('pdf_total_expenses_label')</p>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<p class="report-footer-value">{!! format_money_pdf($totalExpense, $currency) !!}</p>
|
<p class="report-footer-value">{!! format_money_pdf($totalExpense) !!}</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</body>
|
</body>
|
||||||
|
</html>
|
||||||
</html>
|
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<title>@lang('pdf_profit_loss_label')</title>
|
<title>@lang('pdf_profit_loss_label')</title>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
@ -12,7 +11,7 @@
|
|||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sub-container {
|
.sub-container{
|
||||||
padding: 0px 20px;
|
padding: 0px 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,12 +158,7 @@
|
|||||||
color: #5851D8;
|
color: #5851D8;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@if (App::isLocale('th'))
|
|
||||||
@include('app.pdf.locale.th')
|
|
||||||
@endif
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="sub-container">
|
<div class="sub-container">
|
||||||
<table class="report-header">
|
<table class="report-header">
|
||||||
@ -189,7 +183,7 @@
|
|||||||
<p class="income-title">@lang("pdf_income_label")</p>
|
<p class="income-title">@lang("pdf_income_label")</p>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<p class="income-amount">{!! format_money_pdf($income, $currency) !!}</p>
|
<p class="income-amount">{!! format_money_pdf($income) !!}</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@ -197,18 +191,18 @@
|
|||||||
<div class="expenses-table-container">
|
<div class="expenses-table-container">
|
||||||
<table class="expenses-table">
|
<table class="expenses-table">
|
||||||
@foreach ($expenseCategories as $expenseCategory)
|
@foreach ($expenseCategories as $expenseCategory)
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<p class="expense-title">
|
<p class="expense-title">
|
||||||
{{ $expenseCategory->category->name }}
|
{{ $expenseCategory->category->name }}
|
||||||
</p>
|
</p>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<p class="expense-amount">
|
<p class="expense-amount">
|
||||||
{!! format_money_pdf($expenseCategory->total_amount, $currency) !!}
|
{!! format_money_pdf($expenseCategory->total_amount) !!}
|
||||||
</p>
|
</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
@endforeach
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
@ -218,7 +212,7 @@
|
|||||||
<table class="expense-total-indicator-table">
|
<table class="expense-total-indicator-table">
|
||||||
<tr>
|
<tr>
|
||||||
<td class="expense-total-cell">
|
<td class="expense-total-cell">
|
||||||
<p class="expense-total">{!! format_money_pdf($totalExpense, $currency) !!}</p>
|
<p class="expense-total">{!! format_money_pdf($totalExpense) !!}</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@ -228,10 +222,9 @@
|
|||||||
<p class="report-footer-label">@lang("pdf_net_profit_label")</p>
|
<p class="report-footer-label">@lang("pdf_net_profit_label")</p>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<p class="report-footer-value">{!! format_money_pdf($income - $totalExpense, $currency) !!}</p>
|
<p class="report-footer-value">{!! format_money_pdf(($income-$totalExpense)) !!}</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</body>
|
</body>
|
||||||
|
</html>
|
||||||
</html>
|
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<title>@lang('pdf_sales_customers_label')</title>
|
<title>@lang('pdf_sales_customers_label')</title>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
@ -12,7 +11,7 @@
|
|||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sub-container {
|
.sub-container{
|
||||||
padding: 0px 20px;
|
padding: 0px 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,17 +132,11 @@
|
|||||||
line-height: 21px;
|
line-height: 21px;
|
||||||
color: #5851D8;
|
color: #5851D8;
|
||||||
}
|
}
|
||||||
|
|
||||||
.text-center {
|
.text-center {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@if (App::isLocale('th'))
|
|
||||||
@include('app.pdf.locale.th')
|
|
||||||
@endif
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="sub-container">
|
<div class="sub-container">
|
||||||
<table class="report-header">
|
<table class="report-header">
|
||||||
@ -163,34 +156,34 @@
|
|||||||
</table>
|
</table>
|
||||||
|
|
||||||
@foreach ($customers as $customer)
|
@foreach ($customers as $customer)
|
||||||
<p class="sales-customer-name">{{ $customer->name }}</p>
|
<p class="sales-customer-name">{{ $customer->name }}</p>
|
||||||
<div class="sales-table-container">
|
<div class="sales-table-container">
|
||||||
<table class="sales-table">
|
<table class="sales-table">
|
||||||
@foreach ($customer->invoices as $invoice)
|
@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">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td class="sales-total-cell">
|
||||||
<p class="sales-information-text">
|
<p class="sales-total-amount">
|
||||||
{{ $invoice->formattedInvoiceDate }} ({{ $invoice->invoice_number }})
|
{!! format_money_pdf($customer->totalAmount) !!}
|
||||||
</p>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<p class="sales-amount">
|
|
||||||
{!! format_money_pdf($invoice->base_total, $currency) !!}
|
|
||||||
</p>
|
</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
|
||||||
</table>
|
</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
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -202,11 +195,10 @@
|
|||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<p class="report-footer-value">
|
<p class="report-footer-value">
|
||||||
{!! format_money_pdf($totalAmount, $currency) !!}
|
{!! format_money_pdf($totalAmount) !!}
|
||||||
</p>
|
</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</body>
|
</body>
|
||||||
|
</html>
|
||||||
</html>
|
|
||||||
|
|||||||
@ -1,18 +1,17 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<title>@lang('pdf_sales_items_label')</title>
|
<title>@lang('pdf_sales_items_label')</title>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
body {
|
body {
|
||||||
font-family: "DejaVu Sans";
|
font-family: "DejaVu Sans";
|
||||||
}
|
}
|
||||||
|
|
||||||
table {
|
table {
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sub-container {
|
.sub-container{
|
||||||
padding: 0px 20px;
|
padding: 0px 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,17 +132,11 @@
|
|||||||
line-height: 21px;
|
line-height: 21px;
|
||||||
color: #5851D8;
|
color: #5851D8;
|
||||||
}
|
}
|
||||||
|
|
||||||
.text-center {
|
.text-center {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@if (App::isLocale('th'))
|
|
||||||
@include('app.pdf.locale.th')
|
|
||||||
@endif
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="sub-container">
|
<div class="sub-container">
|
||||||
<table class="report-header">
|
<table class="report-header">
|
||||||
@ -161,36 +154,36 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<p class="sales-items-title">@lang('pdf_items_label')</p>
|
<p class="sales-items-title">@lang('pdf_items_label')</p>
|
||||||
@foreach ($items as $item)
|
@foreach ($items as $item)
|
||||||
<div class="items-table-container">
|
<div class="items-table-container">
|
||||||
<table class="items-table">
|
<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">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td class="sales-total-cell">
|
||||||
<p class="item-title">
|
<p class="sales-total-amount">
|
||||||
{{ $item->name }}
|
{!! format_money_pdf($totalAmount) !!}
|
||||||
</p>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<p class="item-sales-amount">
|
|
||||||
{!! format_money_pdf($item->total_amount, $currency) !!}
|
|
||||||
</p>
|
</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</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>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
@ -201,11 +194,10 @@
|
|||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<p class="report-footer-value">
|
<p class="report-footer-value">
|
||||||
{!! format_money_pdf($totalAmount, $currency) !!}
|
{!! format_money_pdf($totalAmount) !!}
|
||||||
</p>
|
</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</body>
|
</body>
|
||||||
|
</html>
|
||||||
</html>
|
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<title>@lang('pdf_tax_summery_label')</title>
|
<title>@lang('pdf_tax_summery_label')</title>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
@ -12,7 +11,7 @@
|
|||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sub-container {
|
.sub-container{
|
||||||
padding: 0px 20px;
|
padding: 0px 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,12 +134,7 @@
|
|||||||
color: #5851D8;
|
color: #5851D8;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@if (App::isLocale('th'))
|
|
||||||
@include('app.pdf.locale.th')
|
|
||||||
@endif
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="sub-container">
|
<div class="sub-container">
|
||||||
<table class="report-header">
|
<table class="report-header">
|
||||||
@ -166,18 +160,18 @@
|
|||||||
<div class="tax-table-container">
|
<div class="tax-table-container">
|
||||||
<table class="tax-table">
|
<table class="tax-table">
|
||||||
@foreach ($taxTypes as $tax)
|
@foreach ($taxTypes as $tax)
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<p class="tax-title">
|
<p class="tax-title">
|
||||||
{{ $tax->taxType->name }}
|
{{ $tax->taxType->name }}
|
||||||
</p>
|
</p>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<p class="tax-amount">
|
<p class="tax-amount">
|
||||||
{!! format_money_pdf($tax->total_tax_amount, $currency) !!}
|
{!! format_money_pdf($tax->total_tax_amount) !!}
|
||||||
</p>
|
</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
@endforeach
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
@ -188,7 +182,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td class="tax-total-cell">
|
<td class="tax-total-cell">
|
||||||
<p class="tax-total">
|
<p class="tax-total">
|
||||||
{!! format_money_pdf($totalTaxAmount, $currency) !!}
|
{!! format_money_pdf($totalTaxAmount) !!}
|
||||||
</p>
|
</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -200,11 +194,10 @@
|
|||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<p class="report-footer-value">
|
<p class="report-footer-value">
|
||||||
{!! format_money_pdf($totalTaxAmount, $currency) !!}
|
{!! format_money_pdf($totalTaxAmount) !!}
|
||||||
</p>
|
</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</body>
|
</body>
|
||||||
|
</html>
|
||||||
</html>
|
|
||||||
|
|||||||
@ -19,7 +19,6 @@ module.exports = {
|
|||||||
'./resources/scripts/**/*.js',
|
'./resources/scripts/**/*.js',
|
||||||
'./resources/scripts/**/*.vue',
|
'./resources/scripts/**/*.vue',
|
||||||
],
|
],
|
||||||
darkMode: 'class',
|
|
||||||
theme: {
|
theme: {
|
||||||
extend: {
|
extend: {
|
||||||
colors: {
|
colors: {
|
||||||
|
|||||||
@ -415,31 +415,32 @@ test('update estimate with EUR currency', function () {
|
|||||||
|
|
||||||
$response = putJson('api/v1/estimates/'.$estimate->id, $estimate2);
|
$response = putJson('api/v1/estimates/'.$estimate->id, $estimate2);
|
||||||
|
|
||||||
$estimate_assert = collect($estimate2)
|
$this->assertDatabaseHas('estimates', [
|
||||||
->only([
|
'id' => $estimate['id'],
|
||||||
'id',
|
'template_name' => $estimate2['template_name'],
|
||||||
'template_name',
|
'estimate_number' => $estimate2['estimate_number'],
|
||||||
'estimate_number',
|
'discount_type' => $estimate2['discount_type'],
|
||||||
'discount_type',
|
'discount_val' => $estimate2['discount_val'],
|
||||||
'discount_val',
|
'sub_total' => $estimate2['sub_total'],
|
||||||
'sub_total',
|
'discount' => $estimate2['discount'],
|
||||||
'discount',
|
'customer_id' => $estimate2['customer_id'],
|
||||||
'customer_id',
|
'total' => $estimate2['total'],
|
||||||
'total',
|
'tax' => $estimate2['tax'],
|
||||||
'tax'
|
'exchange_rate' => $estimate2['exchange_rate'],
|
||||||
])
|
'base_discount_val' => $estimate2['base_discount_val'],
|
||||||
->toArray();
|
'base_sub_total' => $estimate2['base_sub_total'],
|
||||||
|
'base_total' => $estimate2['base_total'],
|
||||||
|
'base_tax' => $estimate2['base_tax'],
|
||||||
|
]);
|
||||||
|
|
||||||
$this->assertDatabaseHas('estimates', $estimate_assert);
|
$this->assertDatabaseHas('estimate_items', [
|
||||||
|
'estimate_id' => $estimate2['items'][0]['estimate_id'],
|
||||||
$estimate_item_assert = collect($estimate2['items'][0])
|
'exchange_rate' => $estimate2['items'][0]['exchange_rate'],
|
||||||
->only([
|
'base_price' => $estimate2['items'][0]['base_price'],
|
||||||
'estimate_id',
|
'base_discount_val' => $estimate2['items'][0]['base_discount_val'],
|
||||||
'amount'
|
'base_tax' => $estimate2['items'][0]['base_tax'],
|
||||||
])
|
'base_total' => $estimate2['items'][0]['base_total'],
|
||||||
->toArray();
|
]);
|
||||||
|
|
||||||
$this->assertDatabaseHas('estimate_items', $estimate_item_assert);
|
|
||||||
|
|
||||||
$response->assertStatus(200);
|
$response->assertStatus(200);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -37,15 +37,13 @@ test('create expense', function () {
|
|||||||
|
|
||||||
postJson('api/v1/expenses', $expense)->assertStatus(201);
|
postJson('api/v1/expenses', $expense)->assertStatus(201);
|
||||||
|
|
||||||
$expense = collect($expense)
|
$this->assertDatabaseHas('expenses', [
|
||||||
->only([
|
'notes' => $expense['notes'],
|
||||||
'notes',
|
'expense_category_id' => $expense['expense_category_id'],
|
||||||
'expense_category_id',
|
'amount' => $expense['amount'],
|
||||||
'amount'
|
'exchange_rate' => $expense['exchange_rate'],
|
||||||
])
|
'base_amount' => $expense['base_amount'],
|
||||||
->toArray();
|
]);
|
||||||
|
|
||||||
$this->assertDatabaseHas('expenses', $expense);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('store validates using a form request', function () {
|
test('store validates using a form request', function () {
|
||||||
@ -148,13 +146,11 @@ test('update expense with EUR currency', function () {
|
|||||||
|
|
||||||
putJson('api/v1/expenses/'.$expense->id, $expense2)->assertOk();
|
putJson('api/v1/expenses/'.$expense->id, $expense2)->assertOk();
|
||||||
|
|
||||||
$expense2 = collect($expense2)
|
$this->assertDatabaseHas('expenses', [
|
||||||
->only([
|
'id' => $expense->id,
|
||||||
'id',
|
'expense_category_id' => $expense2['expense_category_id'],
|
||||||
'expense_category_id',
|
'amount' => $expense2['amount'],
|
||||||
'amount'
|
'exchange_rate' => $expense2['exchange_rate'],
|
||||||
])
|
'base_amount' => $expense2['base_amount'],
|
||||||
->toArray();
|
]);
|
||||||
|
|
||||||
$this->assertDatabaseHas('expenses', $expense2);
|
|
||||||
});
|
});
|
||||||
|
|||||||
@ -9,6 +9,7 @@ use Crater\Models\Tax;
|
|||||||
use Crater\Models\User;
|
use Crater\Models\User;
|
||||||
use Illuminate\Support\Facades\Artisan;
|
use Illuminate\Support\Facades\Artisan;
|
||||||
use Laravel\Sanctum\Sanctum;
|
use Laravel\Sanctum\Sanctum;
|
||||||
|
|
||||||
use function Pest\Laravel\getJson;
|
use function Pest\Laravel\getJson;
|
||||||
use function Pest\Laravel\postJson;
|
use function Pest\Laravel\postJson;
|
||||||
use function Pest\Laravel\putJson;
|
use function Pest\Laravel\putJson;
|
||||||
@ -430,36 +431,31 @@ test('update invoice with EUR currency', function () {
|
|||||||
|
|
||||||
putJson('api/v1/invoices/'.$invoice->id, $invoice2)->assertOk();
|
putJson('api/v1/invoices/'.$invoice->id, $invoice2)->assertOk();
|
||||||
|
|
||||||
$invoice_assert = collect($invoice2)
|
$this->assertDatabaseHas('invoices', [
|
||||||
->only([
|
'id' => $invoice['id'],
|
||||||
'invoice_number',
|
'invoice_number' => $invoice2['invoice_number'],
|
||||||
'template_name',
|
'sub_total' => $invoice2['sub_total'],
|
||||||
'sub_total',
|
'total' => $invoice2['total'],
|
||||||
'total',
|
'tax' => $invoice2['tax'],
|
||||||
'tax',
|
'discount' => $invoice2['discount'],
|
||||||
'discount',
|
'customer_id' => $invoice2['customer_id'],
|
||||||
'customer_id',
|
'template_name' => $invoice2['template_name'],
|
||||||
])
|
'exchange_rate' => $invoice2['exchange_rate'],
|
||||||
->toArray();
|
'base_total' => $invoice2['base_total'],
|
||||||
|
]);
|
||||||
|
|
||||||
$this->assertDatabaseHas('invoices', $invoice_assert);
|
$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'],
|
||||||
|
]);
|
||||||
|
|
||||||
$invoice_item_assert = collect($invoice2['items'][0])
|
$this->assertDatabaseHas('taxes', [
|
||||||
->only([
|
'amount' => $invoice2['taxes'][0]['amount'],
|
||||||
'invoice_id',
|
'name' => $invoice2['taxes'][0]['name'],
|
||||||
'item_id',
|
'base_amount' => $invoice2['taxes'][0]['base_amount'],
|
||||||
'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);
|
|
||||||
});
|
});
|
||||||
|
|||||||
@ -1,40 +0,0 @@
|
|||||||
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=""
|
|
||||||
@ -1,48 +0,0 @@
|
|||||||
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
|
|
||||||
@ -1,68 +0,0 @@
|
|||||||
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"]
|
|
||||||
@ -1,58 +0,0 @@
|
|||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
FROM nginx:1.17-alpine
|
|
||||||
|
|
||||||
RUN rm /etc/nginx/conf.d/default.conf
|
|
||||||
|
|
||||||
COPY ./ /var/www
|
|
||||||
COPY ./uffizzi/nginx/nginx /etc/nginx/conf.d/
|
|
||||||
|
|
||||||
@ -1,22 +0,0 @@
|
|||||||
server {
|
|
||||||
client_max_body_size 64M;
|
|
||||||
listen 80;
|
|
||||||
index index.php index.html;
|
|
||||||
error_log /var/log/nginx/error.log;
|
|
||||||
access_log /var/log/nginx/access.log;
|
|
||||||
root /var/www/public;
|
|
||||||
location ~ \.php$ {
|
|
||||||
try_files $uri =404;
|
|
||||||
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
|
||||||
fastcgi_pass localhost:9000;
|
|
||||||
fastcgi_index index.php;
|
|
||||||
include fastcgi_params;
|
|
||||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
|
||||||
fastcgi_param PATH_INFO $fastcgi_path_info;
|
|
||||||
fastcgi_read_timeout 300;
|
|
||||||
}
|
|
||||||
location / {
|
|
||||||
try_files $uri $uri/ /index.php?$query_string;
|
|
||||||
gzip_static on;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user