Compare commits

..

71 Commits

Author SHA1 Message Date
db1b0db461 update dompdf version 2021-03-23 13:14:34 +05:30
17c00c322d Add test ci 2021-03-22 16:52:01 +01:00
331b8ea44e Merge pull request #426 from TheZoker/fix-invoice-address-capitalize
Don't capitalize address on invoice
2021-03-22 19:20:05 +05:30
428be640c3 Don't capitalize address on invoice 2021-03-22 14:49:31 +01:00
51f79433b9 feat: Added MAD (Moroccan dirham) currency (#355)
Add MAD (Moroccan dirham) currency
2021-03-22 17:33:36 +05:30
8008ed0527 Merge pull request #423 from TheZoker/add-more-translation
Add more translation
2021-03-22 14:59:04 +05:30
57b302666a Address review comments 2021-03-22 10:17:01 +01:00
ee1d1ccff4 update readme and fix formatting on utilities 2021-03-22 13:05:02 +05:30
81e7109ad1 new build 2021-03-22 13:02:17 +05:30
784bf39df5 fix max-discount issue on estimates and generate new public files 2021-03-22 12:57:46 +05:30
f66755c4aa Merge pull request #365 from DjKhireddine/patch-1
Update Item.vue
2021-03-22 12:56:37 +05:30
b4e1e99d37 Merge pull request #354 from habibhaidari1/master
Fixed small typo that caused wrong breadcrumb
2021-03-22 12:42:33 +05:30
d8aa3dc8a6 Merge pull request #336 from romanobarassi/barassi-crater-fix1
Update composer.json
2021-03-22 12:32:45 +05:30
9af51660cb Merge pull request #405 from itsaboutcode/show_field_min_length
Showing length error for Payment, Note and ItemUnit Model Views
2021-03-22 12:26:41 +05:30
38d0da9618 Merge pull request #419 from TheZoker/translate-pdf-title
Translate PDF titles
2021-03-22 12:22:41 +05:30
761c0143ec Merge pull request #420 from TheZoker/adjust-money-format
Adjust money format to respect swap_currency_symbol
2021-03-22 12:12:13 +05:30
fdc4de5093 Merge pull request #407 from sebastiancretu/send_inv_est_pay_as_attachment
Send invoices, estimates and payments as attachments
2021-03-22 12:06:06 +05:30
f8591f96a9 Write € symbol after amount 2021-03-21 13:05:49 +01:00
e47cb01ce2 Translate badges 2021-03-21 00:45:43 +01:00
454ad3091a Add some missing translations 2021-03-21 00:45:37 +01:00
cc73a8a842 Adjust money format to respect swap_currency_symbol 2021-03-20 17:49:57 +01:00
cea8405ace Translate PDF titles 2021-03-20 14:35:22 +01:00
49a6e03e9d Merge pull request #408 from sebastiancretu/fix_unit_name_in_emails
fix(items): added unit name after quantity in the pdf templates
2021-03-15 16:18:54 +05:30
f9d6e8b0cc fix(items): added unit name after quantity in the pdf templates 2021-03-03 17:09:05 +01:00
2b78aacc83 feat(emails): implemented sending invoice, estimates and payments as attachements 2021-03-02 21:49:03 +01:00
1932c5a75e a 2021-03-02 21:19:16 +01:00
449968ae88 Showing length error for Payment, Note and ItemUnit Model Views 2021-03-02 10:50:27 +05:00
02a2db4417 Merge pull request #372 from makakken/master
Fixes #371
2021-02-24 15:40:34 +05:30
a53582f916 Merge pull request #398 from renzocastillo/master
added new currency: peruvian soles
2021-02-24 15:40:10 +05:30
340bf3be06 added new currency: peruvian soles 2021-02-22 11:34:25 -05:00
7f0da9dc36 fix conflict 2021-02-12 13:19:56 +05:30
c4ace76275 Merge branch 'master' of gitlab.com:mohit.panjvani/crater-web 2021-02-12 13:18:03 +05:30
553bcc053b Merge pull request #375 from sebastiancretu/fix_payment_receipt_currency
fix(payments): display the currency in receipts
2021-02-12 11:54:19 +05:30
375a59a504 fix(payments): display the currency in receipts 2021-02-08 20:42:10 +01:00
cfc0a1ef75 Regenerated assets 2021-02-05 20:53:34 +01:00
392f6f469b Send Invoices/Estimates/Payments as email attachments 2021-02-05 20:24:56 +01:00
6cb8d30915 Update invoice3.blade.php
Fix Exception: 'box_sizing' is not a recognized CSS property.
2021-02-04 11:02:59 +01:00
9b55e84724 Update invoice2.blade.php
Fix Exception: 'box_sizing' is not a recognized CSS property.
2021-02-04 11:02:32 +01:00
cf5da7684b Update invoice1.blade.php
fix box_sizing DOMPDF Bug
2021-02-04 11:01:57 +01:00
f47029ca78 fix payment invalid-number issue 2021-02-03 14:25:05 +05:30
761df2ffac Merge branch 'mail-name-issue' into 'master'
invoice mail name issue fix

See merge request mohit.panjvani/crater-web!669
2021-02-03 07:19:32 +00:00
8fbc257b23 payment from mail name 2021-02-03 12:24:28 +05:30
baebfedf37 invoice and estimate from mail name issue 2021-02-03 12:21:03 +05:30
9321eb9d86 Merge branch 'payment_issue' into 'master'
fix payment currency issue

See merge request mohit.panjvani/crater-web!668
2021-02-03 06:31:23 +00:00
70bed01e7b invoice mail name issue fix 2021-02-03 11:38:59 +05:30
739efcce79 Update Item.vue
There is an error in calculating maxDiscount. 
maxDiscount = item.price * item.quantity
2021-02-02 19:23:32 +01:00
3695e7d075 fix payment currency issue 2021-02-02 17:22:44 +05:30
8f2033f621 Fixed small type that caused wrong breadcrumb 2021-01-23 19:29:26 +01:00
7b95ccb5fc fix company logo issue 2021-01-22 19:00:37 +05:30
b7370ed85c update version on migration 2021-01-22 14:49:05 +05:30
818f2fbaf7 build 404 2021-01-22 14:27:30 +05:30
91a1dbf91c new build 2021-01-22 14:17:08 +05:30
a4d556f41e fix tax rounding issues 2021-01-22 14:15:44 +05:30
83de1c47ee fix tax rounding errors and styling issues 2021-01-22 13:44:59 +05:30
678ace744a fix purgecss issue and insert-note z-index 2021-01-22 12:00:10 +05:30
9e26fee1b0 upgrade tailwind 2021-01-21 18:31:11 +05:30
e455c3de50 Merge branch 'date-issue' into 'master'
solve date issue

See merge request mohit.panjvani/crater-web!665
2021-01-15 10:17:51 +00:00
c4db50d3f0 Merge branch 'logo-issue' into 'master'
fix logo display issue

See merge request mohit.panjvani/crater-web!664
2021-01-15 10:16:28 +00:00
411ee57946 solve date issue 2021-01-15 14:26:35 +05:30
9c5e9e56f5 fix logo display issue 2021-01-15 14:22:42 +05:30
8eeafd3fed fix tailwind-v2 issues 2021-01-06 21:12:22 +05:30
ed978d0174 upgrade tailwind version and laravel-mix 2021-01-06 14:18:41 +05:30
607b1795bb Merge branch 'discount-issue' into 'master'
fix total discount issue

See merge request mohit.panjvani/crater-web!655
2021-01-06 06:58:07 +00:00
a6c3c815b5 Update composer.json 2021-01-04 18:59:07 +01:00
ead0ebb012 fix note button z-index issue 2021-01-04 11:43:00 +05:30
d4550e62f8 add 403 migration 2020-12-31 15:39:01 +05:30
ff3846137e fix translations & build 403 2020-12-31 12:33:56 +05:30
b55f8e5391 fix floating errors 2020-12-31 12:16:04 +05:30
0f1d7627ea fix next number issue on estimate & invoice 2020-12-31 11:52:42 +05:30
1be462ef82 fix eslint and prettier config 2020-12-31 11:52:10 +05:30
8b04e94446 fix total discount issue 2020-12-24 13:43:29 +05:30
116 changed files with 4350 additions and 16678 deletions

View File

@ -1,21 +0,0 @@
{
"root": true,
"extends": [
"plugin:vue/recommended",
"eslint:recommended",
"prettier/vue",
"plugin:prettier/recommended"
],
"rules": {
"vue/max-attributes-per-line": [
"error",
{
"singleline": 20,
"multiline": {
"max": 1,
"allowFirstLine": false
}
}
]
}
}

20
.eslintrc.js Normal file
View File

@ -0,0 +1,20 @@
module.exports = {
root: true,
env: {
node: true,
},
extends: [
'plugin:vue/recommended',
'eslint:recommended',
'prettier/vue',
'plugin:prettier/recommended',
],
parserOptions: {
parser: 'babel-eslint',
},
plugins: ['prettier'],
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
},
}

34
.github/workflows/ci.yaml vendored Normal file
View File

@ -0,0 +1,34 @@
name: CI
on: [push, pull_request]
jobs:
build-test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php: ['7.4', '8.0']
name: PHP ${{ matrix.php }}
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Install dependencies
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: exif
- name: Install PHP 7 dependencies
run: composer update --no-interaction --no-progress
if: "matrix.php < 8"
- name: Install PHP 8 dependencies
run: composer update --ignore-platform-req=php --no-interaction --no-progress
if: "matrix.php >= 8"
- name: Unit Tests
run: php ./vendor/bin/pest

View File

@ -40,9 +40,16 @@ class SendEstimateMail extends Mailable
'mailable_id' => $this->data['estimate']['id']
]);
return $this->from($this->data['from'])
$mailContent = $this->from($this->data['from'], config('mail.from.name'))
->subject($this->data['subject'])
->markdown('emails.send.estimate', ['data', $this->data]);
if ($this->data['attach']['data'])
$mailContent->attachData(
$this->data['attach']['data']->output(),
$this->data['estimate']['estimate_number'] . '.pdf'
);
return $mailContent;
}
}

View File

@ -1,6 +1,7 @@
<?php
namespace Crater\Mail;
use Config;
use Crater\Models\EmailLog;
use Crater\Models\Invoice;
use Illuminate\Bus\Queueable;
@ -40,8 +41,16 @@ class SendInvoiceMail extends Mailable
'mailable_id' => $this->data['invoice']['id']
]);
return $this->from($this->data['from'])
->subject($this->data['subject'])
->markdown('emails.send.invoice', ['data', $this->data]);
$mailContent = $this->from($this->data['from'], config('mail.from.name'))
->subject($this->data['subject'])
->markdown('emails.send.invoice', ['data', $this->data]);
if ($this->data['attach']['data'])
$mailContent->attachData(
$this->data['attach']['data']->output(),
$this->data['invoice']['invoice_number'] . '.pdf'
);
return $mailContent;
}
}

View File

@ -41,9 +41,16 @@ class SendPaymentMail extends Mailable
'mailable_id' => $this->data['payment']['id']
]);
return $this->from($this->data['from'])
$mailContent = $this->from($this->data['from'], config('mail.from.name'))
->subject($this->data['subject'])
->markdown('emails.send.payment', ['data', $this->data]);
if ($this->data['attach']['data'])
$mailContent->attachData(
$this->data['attach']['data']->output(),
$this->data['payment']['payment_number'] . '.pdf'
);
return $mailContent;
}
}

View File

@ -1,4 +1,5 @@
<?php
namespace Crater\Models;
use Crater\Models\Address;
@ -17,15 +18,34 @@ class Company extends Model implements HasMedia
protected $fillable = ['name', 'logo', 'unique_hash'];
protected $appends=['logo'];
protected $appends = ['logo', 'logo_path'];
public function getLogoPathAttribute()
{
$logo = $this->getMedia('logo')->first();
$isSystem = FileDisk::whereSetAsDefault(true)->first()->isSystem();
if ($logo) {
if ($isSystem) {
return $logo->getPath();
} else {
return $logo->getFullUrl();
}
}
return null;
}
public function getLogoAttribute()
{
$logo = $this->getMedia('logo')->first();
if ($logo) {
return asset($logo->getUrl());
return $logo->getFullUrl();
}
return ;
return null;
}
public function user()

View File

@ -33,9 +33,7 @@ class Estimate extends Model implements HasMedia
protected $dates = [
'created_at',
'updated_at',
'deleted_at',
'estimate_date',
'expiry_date'
'deleted_at'
];
protected $appends = [
@ -77,7 +75,7 @@ class Estimate extends Model implements HasMedia
{
// Get the last created order
$lastOrder = Estimate::where('estimate_number', 'LIKE', $value . '-%')
->orderBy('created_at', 'desc')
->orderBy('estimate_number', 'desc')
->first();
if (!$lastOrder) {
@ -381,6 +379,7 @@ class Estimate extends Model implements HasMedia
$data['user'] = $this->user->toArray();
$data['company'] = $this->company->toArray();
$data['body'] = $this->getEmailBody($data['body']);
$data['attach']['data'] = ($this->getEmailAttachmentSetting()) ? $this->getPDFData() : null;
\Mail::to($data['to'])->send(new SendEstimateMail($data));
@ -428,16 +427,7 @@ class Estimate extends Model implements HasMedia
$estimateTemplate = EstimateTemplate::find($this->estimate_template_id);
$company = Company::find($this->company_id);
$logo = $company->getMedia('logo')->first();
$isSystem = FileDisk::whereSetAsDefault(true)->first()->isSystem();
$isLocalhost = config('session.domain') === 'localhost';
if ($logo && $isLocalhost && $isSystem) {
$logo = $logo->getPath();
} else if($logo) {
$logo = $logo->getFullUrl();
}
$logo = $company->logo_path;
view()->share([
'estimate' => $this,
@ -479,6 +469,17 @@ class Estimate extends Model implements HasMedia
return $this->getFormattedString($this->notes);
}
public function getEmailAttachmentSetting()
{
$estimateAsAttachment = CompanySetting::getSetting('estimate_email_attachment', $this->company_id);
if($estimateAsAttachment == 'NO') {
return false;
}
return true;
}
public function getEmailBody($body)
{
$values = array_merge($this->getFieldsArray(), $this->getExtraFields());

View File

@ -22,7 +22,8 @@ class EstimateItem extends Model
'discount_val',
'tax',
'total',
'discount'
'discount',
'unit_name',
];
protected $casts = [

View File

@ -39,9 +39,7 @@ class Invoice extends Model implements HasMedia
protected $dates = [
'created_at',
'updated_at',
'deleted_at',
'invoice_date',
'due_date'
'deleted_at'
];
protected $casts = [
@ -81,7 +79,7 @@ class Invoice extends Model implements HasMedia
{
// Get the last created order
$lastOrder = Invoice::where('invoice_number', 'LIKE', $value . '-%')
->orderBy('created_at', 'desc')
->orderBy('invoice_number', 'desc')
->first();
@ -363,11 +361,11 @@ class Invoice extends Model implements HasMedia
}
$invoice = Invoice::with([
'items',
'user',
'invoiceTemplate',
'taxes'
])
'items',
'user',
'invoiceTemplate',
'taxes'
])
->find($invoice->id);
return $invoice;
@ -431,6 +429,7 @@ class Invoice extends Model implements HasMedia
$data['user'] = $this->user->toArray();
$data['company'] = Company::find($this->company_id);
$data['body'] = $this->getEmailBody($data['body']);
$data['attach']['data'] = ($this->getEmailAttachmentSetting()) ? $this->getPDFData() : null;
if ($this->status == Invoice::STATUS_DRAFT) {
$this->status = Invoice::STATUS_SENT;
@ -512,16 +511,7 @@ class Invoice extends Model implements HasMedia
$company = Company::find($this->company_id);
$logo = $company->getMedia('logo')->first();
$isSystem = FileDisk::whereSetAsDefault(true)->first()->isSystem();
$isLocalhost = config('session.domain') === 'localhost';
if ($logo && $isLocalhost && $isSystem) {
$logo = $logo->getPath();
} else if($logo) {
$logo = $logo->getFullUrl();
}
$logo = $company->logo_path;
view()->share([
'invoice' => $this,
@ -537,6 +527,17 @@ class Invoice extends Model implements HasMedia
return PDF::loadView('app.pdf.invoice.' . $invoiceTemplate->view);
}
public function getEmailAttachmentSetting()
{
$invoiceAsAttachment = CompanySetting::getSetting('invoice_email_attachment', $this->company_id);
if($invoiceAsAttachment == 'NO') {
return false;
}
return true;
}
public function getCompanyAddress()
{
$format = CompanySetting::getSetting('invoice_company_address_format', $this->company_id);

View File

@ -25,7 +25,8 @@ class InvoiceItem extends Model
'discount_val',
'total',
'tax',
'discount'
'discount',
'unit_name',
];
protected $casts = [

View File

@ -31,7 +31,7 @@ class Payment extends Model implements HasMedia
const PAYMENT_MODE_CREDIT_CARD = 'CREDIT_CARD';
const PAYMENT_MODE_BANK_TRANSFER = 'BANK_TRANSFER';
protected $dates = ['created_at', 'updated_at', 'payment_date'];
protected $dates = ['created_at', 'updated_at'];
protected $guarded = ['id'];
@ -124,6 +124,7 @@ class Payment extends Model implements HasMedia
$data['user'] = $this->user->toArray();
$data['company'] = Company::find($this->company_id);
$data['body'] = $this->getEmailBody($data['body']);
$data['attach']['data'] = ($this->getEmailAttachmentSetting()) ? $this->getPDFData() : null;
\Mail::to($data['to'])->send(new SendPaymentMail($data));
@ -216,10 +217,10 @@ class Payment extends Model implements HasMedia
}
$payment = Payment::with([
'user',
'invoice',
'paymentMethod',
])
'user',
'invoice',
'paymentMethod',
])
->find($this->id);
return $payment;
@ -268,7 +269,7 @@ class Payment extends Model implements HasMedia
{
// Get the last created order
$payment = Payment::where('payment_number', 'LIKE', $value . '-%')
->orderBy('created_at', 'desc')
->orderBy('payment_number', 'desc')
->first();
if (!$payment) {
// We get here if there is no order at all
@ -373,16 +374,7 @@ class Payment extends Model implements HasMedia
{
$company = Company::find($this->company_id);
$logo = $company->getMedia('logo')->first();
$isSystem = FileDisk::whereSetAsDefault(true)->first()->isSystem();
$isLocalhost = config('session.domain') === 'localhost';
if ($logo && $isLocalhost && $isSystem) {
$logo = $logo->getPath();
} else if($logo) {
$logo = $logo->getFullUrl();
}
$logo = $company->logo_path;
view()->share([
'payment' => $this,
@ -409,6 +401,17 @@ class Payment extends Model implements HasMedia
return $this->getFormattedString($format);
}
public function getEmailAttachmentSetting()
{
$paymentAsAttachment = CompanySetting::getSetting('payment_email_attachment', $this->company_id);
if($paymentAsAttachment == 'NO') {
return false;
}
return true;
}
public function getNotes()
{
return $this->getFormattedString($this->notes);

View File

@ -8,9 +8,9 @@
"license": "MIT",
"type": "project",
"require": {
"php": "^7.3",
"php": "^7.4 || ^8.0",
"aws/aws-sdk-php": "^3.142",
"barryvdh/laravel-dompdf": "^0.8.1",
"barryvdh/laravel-dompdf": "^0.9.0",
"doctrine/dbal": "^2.10",
"fideloper/proxy": "^4.0",
"fruitcake/laravel-cors": "^1.0",

1016
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
<?php
use Crater\Models\Setting;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class UpdateCraterVersion403 extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Setting::setSetting('version', '4.0.3');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

View File

@ -0,0 +1,29 @@
<?php
use Crater\Models\Setting;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class UpdateCraterVersion404 extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Setting::setSetting('version', '4.0.4');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

View File

@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddUnitNameToPdf extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('invoice_items', function (Blueprint $table) {
$table->string('unit_name')->nullable()->after('quantity');
});
Schema::table('estimate_items', function (Blueprint $table) {
$table->string('unit_name')->nullable()->after('quantity');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('invoice_items', function (Blueprint $table) {
$table->dropColumn('unit_name');
});
Schema::table('estimate_items', function (Blueprint $table) {
$table->dropColumn('unit_name');
});
}
}

View File

@ -37,7 +37,8 @@ class CurrenciesTableSeeder extends Seeder
'symbol' => '€',
'precision' => '2',
'thousand_separator' => '.',
'decimal_separator' => ','
'decimal_separator' => ',',
'swap_currency_symbol' => true
],
[
'name' => 'South African Rand',
@ -550,6 +551,22 @@ class CurrenciesTableSeeder extends Seeder
'thousand_separator' => ',',
'decimal_separator' => '.'
],
[
'name' => 'Peruvian Soles',
'code' => 'PEN',
'symbol' => 'S/',
'precision' => '2',
'thousand_separator' => ',',
'decimal_separator' => '.'
],
[
'name' => 'Moroccan Dirham',
'code' => 'MAD',
'symbol' => 'DH',
'precision' => '2',
'thousand_separator' => ',',
'decimal_separator' => '.'
],
];
foreach ($currencies as $currency) {

View File

@ -60,6 +60,9 @@ class DefaultSettingsSeeder extends Seeder
'payment_prefix' => 'PAY',
'payment_auto_generate' => 'YES',
'save_pdf_to_disk' => 'NO',
'invoice_email_attachment' => 'NO',
'estimate_email_attachment' => 'NO',
'payment_email_attachment' => 'NO',
];
CompanySetting::setSettings($settings, $user->company_id);

13060
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,49 +1,50 @@
{
"private": true,
"scripts": {
"dev": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch-poll": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --watch-poll --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
},
"devDependencies": {
"babel-eslint": "^8.2.6",
"cross-env": "^5.1",
"eslint": "^4.19.1",
"eslint-config-prettier": "^6.10.1",
"eslint-loader": "^3.0.3",
"eslint-plugin-prettier": "^3.1.2",
"eslint-plugin-vue": "^4.7.1",
"laravel-mix": "^5.0.7",
"prettier": "^2.0.2",
"resolve-url-loader": "3.1.0",
"sass": "^1.29.0",
"sass-loader": "^8.0.2",
"tailwindcss-plugins": "^0.3.0",
"vue-template-compiler": "^2.6.10"
},
"dependencies": {
"@bytefury/spacewind": "^0.3.3",
"@vue-hero-icons/outline": "^1.6.3",
"@vue-hero-icons/solid": "^1.6.3",
"axios": "^0.19",
"chart.js": "^2.7.3",
"guid": "0.0.12",
"lodash": "^4.17.13",
"moment": "^2.29.1",
"sweet-modal-vue": "^2.0.0",
"sweetalert": "^2.1.2",
"tailwindcss": "^1.9.1",
"toastr": "^2.1.4",
"v-tooltip": "^2.0.2",
"vue": "^2.6.10",
"vue-i18n": "^8.22.0",
"vue-loader": "^15.9.3",
"vue-router": "2.7.0",
"vue2-transitions": "^0.3.0",
"vuedraggable": "^2.24.2",
"vuelidate": "^0.6.2",
"vuex": "^3.0.1"
}
"private": true,
"scripts": {
"dev": "mix",
"watch": "mix watch",
"watch-poll": "mix watch -- --watch-options-poll=1000",
"hot": "mix watch --hot",
"production": "mix --production"
},
"devDependencies": {
"babel-eslint": "^8.2.6",
"cross-env": "^5.1",
"eslint": "^4.19.1",
"eslint-config-prettier": "^6.15.0",
"eslint-loader": "^3.0.4",
"eslint-plugin-prettier": "^3.3.0",
"eslint-plugin-vue": "^4.7.1",
"laravel-mix": "^6.0.6",
"postcss": "^8.1",
"prettier": "^2.2.1",
"resolve-url-loader": "3.1.0",
"sass": "^1.29.0",
"sass-loader": "^8.0.2",
"tailwindcss-plugins": "^0.3.0",
"vue-template-compiler": "^2.6.10"
},
"dependencies": {
"@bytefury/spacewind": "^0.5.0",
"@vue-hero-icons/outline": "^1.6.3",
"@vue-hero-icons/solid": "^1.6.3",
"axios": "^0.19",
"chart.js": "^2.7.3",
"guid": "0.0.12",
"lodash": "^4.17.13",
"moment": "^2.29.1",
"sweet-modal-vue": "^2.0.0",
"sweetalert": "^2.1.2",
"tailwindcss": "^2.0.1",
"toastr": "^2.1.4",
"v-tooltip": "^2.0.2",
"vue": "^2.6.10",
"vue-i18n": "^8.22.0",
"vue-loader": "^15.9.3",
"vue-router": "2.7.0",
"vue2-transitions": "^0.3.0",
"vuedraggable": "^2.24.2",
"vuelidate": "^0.6.2",
"vuex": "^3.0.1"
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,3 @@
/* flatpickr v4.6.6, @license MIT */
/*!
* tiptap v1.29.6
* (c) 2020 überdosis GbR (limited liability)
@ -69,13 +67,6 @@
* Date: 2020-03-14
*/
/*!
* The buffer module from node.js, for the browser.
*
* @author Feross Aboukhadijeh <http://feross.org>
* @license MIT
*/
/*!
* Vue.js v2.6.12
* (c) 2014-2020 Evan You
@ -96,6 +87,12 @@
* Date: 2020-05-04T22:49Z
*/
/*!
* vue-i18n v8.22.2
* (c) 2020 kazuya kawaguchi
* Released under the MIT License.
*/
/*!
* vue2-transitions v0.3.0
* (c) 2019-present cristij <joracristi@gmail.com>
@ -103,40 +100,13 @@
*/
/*!
* vuex v3.5.1
* vuex v3.6.0
* (c) 2020 Evan You
* @license MIT
*/
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/*! For license information please see index.js.LICENSE.txt */
/*! https://mths.be/punycode v1.4.1 by @mathias */
/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
/**
* vue-router v2.7.0
* (c) 2017 Evan You
* @license MIT
*/
/**
* @license
* Lodash <https://lodash.com/>

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
{
"/assets/js/app.js": "/assets/js/app.js?id=1d9cf52055fe7be22fd1",
"/assets/css/crater.css": "/assets/css/crater.css?id=912348e74f68a41a1b35"
"/assets/js/app.js": "/assets/js/app.js?id=abd09b4669350c773e19",
"/assets/css/crater.css": "/assets/css/crater.css?id=56e62ddcc9434f8f3fe5"
}

View File

@ -70,6 +70,8 @@ Crater is a product of [Bytefury](https://bytefury.com)
- [Birkhoff Lee](https://github.com/BirkhoffLee)
- [Akaunting](https://github.com/akaunting/akaunting)
- [MakerLab](https://github.com/MakerLab-Dev)
- [Sebastian Cretu](https://github.com/sebastiancretu)
- [Florian Gareis](https://github.com/TheZoker)
## Translate

View File

@ -3,6 +3,7 @@
* include Vue and Vue Resource. This gives a great starting point for
* building robust, powerful web applications using Vue and Laravel.
*/
import Vue from 'vue'
import router from './router.js'
import store from './store/index'
import utils from './helpers/utilities'
@ -11,7 +12,7 @@ import swal from 'sweetalert'
require('./bootstrap')
window.Vue.prototype.$utils = utils
Vue.prototype.$utils = utils
/**
* Next, we will create a fresh Vue application instance and attach it to

View File

@ -25,13 +25,6 @@ Vue.use(Vuelidate)
Vue.use(Transitions)
window._ = require('lodash')
/**
* Vue is a modern JavaScript library for building interactive web interfaces
* using reactive data binding and reusable components. Vue's API is clean
* and simple, leaving you to focus on building your next great project.
*/
window.Vue = require('vue')
/**
* Custom Directives
@ -97,7 +90,8 @@ global.axios.interceptors.response.use(undefined, function (err) {
}
if (!err.response) {
window.toastr['error'](
'Please check your internet connection or wait until servers are back online', 'Network Error'
'Please check your internet connection or wait until servers are back online',
'Network Error'
)
} else {
if (
@ -121,7 +115,8 @@ global.axios.interceptors.response.use(undefined, function (err) {
window.toastr['error'](
err.response.data.message
? err.response.data.message
: err.response.data || 'Unknown error occurred', 'Error'
: err.response.data || 'Unknown error occurred',
'Error'
)
}
}

View File

@ -1,3 +1,5 @@
import Vue from 'vue'
import BaseModal from './modal/BaseModal.vue'
import BaseLoader from './BaseLoader.vue'
import BaseCustomerSelect from './BaseCustomerSelect.vue'

View File

@ -43,7 +43,7 @@
:options="itemUnits"
:searchable="true"
:show-labels="false"
:maxHeight="200"
:max-height="200"
label="name"
>
</sw-select>
@ -160,7 +160,7 @@ export default {
return this.formData.price / 100
},
set: function (newValue) {
this.formData.price = newValue * 100
this.formData.price = Math.round(newValue * 100)
},
},

View File

@ -68,6 +68,14 @@ export default {
if (!this.$v.formData.name.required) {
return this.$tc('validation.required')
}
if (!this.$v.formData.name.minLength) {
return this.$tc(
'validation.name_min_length',
this.$v.formData.name.$params.minLength.min,
{ count: this.$v.formData.name.$params.minLength.min }
)
}
},
},
validations: {

View File

@ -105,6 +105,14 @@ export default {
if (!this.$v.formData.name.required) {
return this.$tc('validation.required')
}
if (!this.$v.formData.name.minLength) {
return this.$tc(
'validation.name_min_length',
this.$v.formData.name.$params.minLength.min,
{ count: this.$v.formData.name.$params.minLength.min }
)
}
},
noteError() {
if (!this.$v.formData.notes.$error) {

View File

@ -62,6 +62,14 @@ export default {
if (!this.$v.formData.name.required) {
return this.$tc('validation.required')
}
if (!this.$v.formData.name.minLength) {
return this.$tc(
'validation.name_min_length',
this.$v.formData.name.$params.minLength.min,
{ count: this.$v.formData.name.$params.minLength.min }
)
}
},
},
validations: {

View File

@ -12,7 +12,7 @@ export default {
disabledMultiSelectTags: 'bg-gray-200 text-gray-400',
multiselectTagsWrap: 'multiselect__tags-wrap inline',
multiselectTag:
'multiselect__tag relative inline-block pt-1 pr-6 pb-1 pl-2 rounded mr-2 text-white leading-none mb-1 whitespace-no-wrap overflow-hidden max-w-full',
'multiselect__tag relative inline-block pt-1 pr-6 pb-1 pl-2 rounded mr-2 text-white leading-none mb-1 whitespace-nowrap overflow-hidden max-w-full',
multiselectTagIcon:
'multiselect__tag-icon cursor-pointer ml-2 absolute right-0 top-0 bottom-0 font-bold w-5 text-center leading-5 delay-200 transition-all ease-linear rounded',
multiselectStrong: 'mb-2 leading-5 inline-block align-top',
@ -26,6 +26,6 @@ export default {
multiselectContent:
'multiselect__content list-none inline-block p-0 m-0 min-w-full align-top',
multiselectOption:
'multiselect__option block p-3 no-underline leading-4 normal-case align-middle relative cursor-pointer whitespace-no-wrap text-sm',
'multiselect__option block p-3 no-underline leading-4 normal-case align-middle relative cursor-pointer whitespace-nowrap text-sm',
multiselectElement: 'multiselect__element block',
}

View File

@ -73,7 +73,7 @@ export default {
callbacks: {
label: function (tooltipItem, data) {
return self.FormatGraphMoney(
tooltipItem.value * 100,
Math.round(tooltipItem.value * 100),
self.defaultCurrency
)
},

View File

@ -13,4 +13,10 @@ export default {
'inline-flex items-center justify-center text-black transition px-2 duration-150 ease-in-out border border-gray-300 border-solid focus:outline-none bg-white',
},
},
sizes: {
discount: {
button: 'py-2 px-2 text-sm leading-5 rounded',
loadingIcon: 'w-4 h-4 -ml-2',
},
},
}

View File

@ -6,7 +6,7 @@ export default {
itemContainer:
'z-10 p-2 max-h-60 text-base text-left list-none rounded border-0 shadow bg-white text-black overflow-auto sw-scroll',
item:
'flex p-2 text-sm font-light text-left text-black bg-transparent rounded cursor-pointer none hover:bg-gray-200 whitespace-no-wrap',
'flex p-2 text-sm font-light text-left text-black bg-transparent rounded cursor-pointer none hover:bg-gray-200 whitespace-nowrap',
itemIcon: 'w-5 h-5 mr-3 text-secondary',
},
variants: {
@ -16,7 +16,7 @@ export default {
divider:
'border-t border-solid border-gray-200 my-2 mx-0 overflow-hidden',
item:
'flex p-0 text-sm font-light text-left text-black bg-transparent rounded cursor-pointer none hover:bg-gray-200 whitespace-no-wrap',
'flex p-0 text-sm font-light text-left text-black bg-transparent rounded cursor-pointer none hover:bg-gray-200 whitespace-nowrap',
itemContainer:
'z-10 p-2 text-base text-left list-none rounded border-0 shadow bg-white text-black',
itemIcon: 'w-5 h-5 mr-3 text-secondary',

View File

@ -1,3 +1,5 @@
import Vue from 'vue'
Vue.directive('click-outside', {
bind: function (el, binding, vnode) {
el.event = function (event) {
@ -17,7 +19,9 @@ Vue.directive('click-outside', {
Vue.directive('autoresize', {
inserted: function (el) {
el.style.height = el.scrollHeight + 'px'
el.style.overflow.y = 'hidden'
if (el.style.overflow && el.style.overflow.y) {
el.style.overflow.y = 'hidden'
}
el.style.resize = 'none'
function OnInput() {
this.style.height = 'auto'

View File

@ -1,3 +1,5 @@
import i18n from '../plugins/i18n';
export default {
addClass(el, className) {
if (el.classList) el.classList.add(className)
@ -23,7 +25,13 @@ export default {
amount = amount / 100
let { precision, decimal_separator, thousand_separator, symbol } = currency
let {
precision,
decimal_separator,
thousand_separator,
symbol,
swap_currency_symbol,
} = currency
try {
precision = Math.abs(precision)
@ -37,20 +45,22 @@ export default {
let j = i.length > 3 ? i.length % 3 : 0
let moneySymbol = `<span style="font-family: sans-serif">${symbol}</span>`
let thousandText = j ? i.substr(0, j) + thousand_separator : ''
let amountText = i
.substr(j)
.replace(/(\d{3})(?=\d)/g, '$1' + thousand_separator)
let precisionText = precision
? decimal_separator +
Math.abs(amount - i)
.toFixed(precision)
.slice(2)
: ''
let combinedAmountText =
negativeSign + thousandText + amountText + precisionText
return (
moneySymbol +
' ' +
negativeSign +
(j ? i.substr(0, j) + thousand_separator : '') +
i.substr(j).replace(/(\d{3})(?=\d)/g, '$1' + thousand_separator) +
(precision
? decimal_separator +
Math.abs(amount - i)
.toFixed(precision)
.slice(2)
: '')
)
return swap_currency_symbol
? combinedAmountText + ' ' + moneySymbol
: moneySymbol + ' ' + combinedAmountText
} catch (e) {
console.log(e)
}
@ -68,7 +78,13 @@ export default {
amount = amount / 100
let { precision, decimal_separator, thousand_separator, symbol } = currency
let {
precision,
decimal_separator,
thousand_separator,
symbol,
swap_currency_symbol,
} = currency
try {
precision = Math.abs(precision)
@ -82,20 +98,22 @@ export default {
let j = i.length > 3 ? i.length % 3 : 0
let moneySymbol = `${symbol}`
let thousandText = j ? i.substr(0, j) + thousand_separator : ''
let amountText = i
.substr(j)
.replace(/(\d{3})(?=\d)/g, '$1' + thousand_separator)
let precisionText = precision
? decimal_separator +
Math.abs(amount - i)
.toFixed(precision)
.slice(2)
: ''
let combinedAmountText =
negativeSign + thousandText + amountText + precisionText
return (
moneySymbol +
' ' +
negativeSign +
(j ? i.substr(0, j) + thousand_separator : '') +
i.substr(j).replace(/(\d{3})(?=\d)/g, '$1' + thousand_separator) +
(precision
? decimal_separator +
Math.abs(amount - i)
.toFixed(precision)
.slice(2)
: '')
)
return swap_currency_symbol
? combinedAmountText + ' ' + moneySymbol
: moneySymbol + ' ' + combinedAmountText
} catch (e) {
console.log(e)
}
@ -245,6 +263,36 @@ export default {
}
}
},
getStatusTranslation(status) {
switch (status) {
case 'DRAFT':
return i18n.t('general.draft')
case 'PAID':
return i18n.t('invoices.paid')
case 'UNPAID':
return i18n.t('invoices.unpaid')
case 'SENT':
return i18n.t('general.sent')
case 'REJECTED':
return i18n.t('estimates.rejected')
case 'ACCEPTED':
return i18n.t('estimates.accepted')
case 'VIEWED':
return i18n.t('invoices.viewed')
case 'EXPIRED':
return i18n.t('estimates.expired')
case 'PARTIALLY PAID':
return i18n.t('estimates.partially_paid')
case 'OVERDUE':
return i18n.t('invoices.overdue')
case 'COMPLETED':
return i18n.t('invoices.completed')
case 'DUE':
return i18n.t('general.due')
default:
return status
}
},
compareVersion(v1, v2, options) {
const lexicographical = options && options.lexicographical
const zeroExtend = options && options.zeroExtend
@ -280,5 +328,5 @@ export default {
return -1
}
return 0
}
},
}

View File

@ -177,6 +177,8 @@
"copy_billing_address": "نسخ من عنوان الفوترة",
"no_customers": "لا يوجد عملاء حتى الآن!",
"no_customers_found": "لم يتم الحصول على عملاء!",
"no_contact": "No contact",
"no_contact_name": "No contact name",
"list_of_customers": "سوف يحتوي هذا القسم على قائمة العملاء.",
"primary_display_name": "اسم العرض الرئيسي",
"select_currency": "اختر العملة",
@ -200,6 +202,7 @@
"added_on": "أضيف في",
"price": "السعر",
"date_of_creation": "تاريخ الإنشاء",
"not_selected": "No item selected",
"action": "إجراء",
"add_item": "إضافة صنف",
"save_item": "حفظ الصنف",
@ -270,6 +273,7 @@
"required": "حقل مطلوب"
},
"accepted": "مقبول",
"rejected": "Rejected",
"sent": "مرسل",
"draft": "مسودة",
"declined": "مرفوض",
@ -316,6 +320,9 @@
"all": "الكل",
"paid": "مدفوع",
"unpaid": "غير مدفوع",
"viewed": "Viewed",
"overdue": "Overdue",
"completed": "Completed",
"customer": "العميل",
"paid_status": "حالة الدفع",
"ref_no": "رقم المرجع.",
@ -434,6 +441,8 @@
"update_payment": "تحديث الدفعة",
"payment": "دفعة | مدفوعات",
"no_payments": "لا يوجد مدفوعات حتى الآن!",
"not_selected": "Not selected",
"no_invoice": "No invoice",
"no_matching_payments": "لا توجد مدفوعات مطابقة!",
"list_of_payments": "سوف تحتوي هذه القائمة على مدفوعات الفواتير.",
"select_payment_mode": "اختر طريقة الدفع",
@ -463,6 +472,7 @@
"receipt": "سند القبض",
"amount": "المبلغ المطلوب",
"action": "إجراء",
"not_selected": "Not selected",
"note": "ملاحظة",
"category_id": "رمز الفئة",
"date": "تاريخ النفقات",
@ -1147,6 +1157,7 @@
"pdf_amount_label": "المبلغ المطلوب",
"pdf_subtotal": "Subtotal",
"pdf_total": "الإجمالي",
"pdf_payment_label": "Payment",
"pdf_payment_receipt_label": "PAYMENT RECEIPT",
"pdf_payment_date": "Payment Date",
"pdf_payment_number": "رقم الدفعة",
@ -1155,6 +1166,9 @@
"pdf_expense_report_label": "EXPENSES REPORT",
"pdf_total_expenses_label": "TOTAL EXPENSE",
"pdf_profit_loss_label": "PROFIT & LOSS REPORT",
"pdf_sales_customers_label": "Sales Customer Report",
"pdf_sales_items_label": "Sales Item Report",
"pdf_tax_summery_label": "Tax Summary Report",
"pdf_income_label": "INCOME",
"pdf_net_profit_label": "NET PROFIT",
"pdf_customer_sales_report": "Sales Report: By Customer",

View File

@ -15,13 +15,13 @@
"general": {
"add_company": "Unternehmen hinzufügen",
"view_pdf": "PDF anzeigen",
"copy_pdf_url": "PDF Url kopieren",
"copy_pdf_url": "PDF-Link kopieren",
"download_pdf": "PDF herunterladen",
"save": "Speichern",
"create": "Erstellen",
"cancel": "Abbrechen",
"update": "Aktualisieren",
"deselect": "Entfernen",
"deselect": "Abwählen",
"download": "Herunterladen",
"from_date": "Von Datum",
"to_date": "bis Datum",
@ -63,7 +63,7 @@
"choose_template": "Wählen Sie eine Vorlage",
"choose": "Wählen",
"remove": "Entfernen",
"powered_by": "Powered by",
"powered_by": "Betrieben durch",
"bytefury": "Bytefury",
"select_a_status": "Status wählen",
"select_a_tax": "Steuersatz wählen",
@ -144,7 +144,7 @@
"contacts_list": "Kunden-Liste",
"name": "Name",
"mail": "E-Mail| E-Mails",
"statement": "Statement",
"statement": "Stellungnahme",
"display_name": "Anzeige Name",
"primary_contact_name": "Ansprechpartner",
"contact_name": "Kontakt Name",
@ -177,6 +177,8 @@
"copy_billing_address": "Rechnungsadresse kopieren",
"no_customers": "Noch keine Kunden!",
"no_customers_found": "Keine Kunden gefunden!",
"no_contact": "Kein Kontakt",
"no_contact_name": "Kein Kontaktname",
"list_of_customers": "Dieser Abschnitt enthält die Liste der Kunden.",
"primary_display_name": "Primärer Anzeige Name",
"select_currency": "Währung wählen",
@ -200,6 +202,7 @@
"added_on": "Hinzugefügt am",
"price": "Preis",
"date_of_creation": "Erstellt am",
"not_selected": "Keine ausgewählt",
"action": "Aktion",
"add_item": "Artikel hinzufügen",
"save_item": "Artikel speichern",
@ -270,6 +273,7 @@
"required": "Feld ist erforderlich"
},
"accepted": "Angenommen",
"rejected": "Abgelehnt",
"sent": "Gesendet",
"draft": "Entwurf",
"declined": "Abgelehnt",
@ -315,7 +319,10 @@
"years": "{years} Jahre",
"all": "Alle",
"paid": "Bezahlt",
"unpaid": "Unbezahlte",
"unpaid": "Unbezahlt",
"viewed": "Gesehen",
"overdue": "Überfällig",
"completed": "Abgeschlossen",
"customer": "KUNDEN",
"paid_status": "BEZAHLT-STATUS",
"ref_no": "REF. - NR.",
@ -434,6 +441,8 @@
"update_payment": "Zahlung ändern",
"payment": "Zahlung | Zahlungen",
"no_payments": "Keine Zahlungen vorhanden!",
"not_selected": "Nicht ausgewählt",
"no_invoice": "Keine Rechnung",
"no_matching_payments": "Es gibt keine passenden Zahlungen!",
"list_of_payments": "Dieser Abschnitt enthält die Liste der Zahlungen.",
"select_payment_mode": "Wählen Sie den Zahlungsmodus",
@ -462,6 +471,7 @@
"description": "Beschreibung",
"receipt": "Eingang",
"amount": "Summe",
"not_selected": "Nicht ausgewählt",
"action": "Aktion",
"note": "Hinweis",
"category_id": "Kategorie-Id",
@ -766,7 +776,7 @@
},
"payments": {
"title": "Zahlungen",
"description": "Modes of transaction for payments",
"description": "Transaktionsmodi für Zahlungen",
"payment_prefix": "Zahlung Präfix",
"default_payment_email_body": "Zahlung - E-Mail Text",
"payment_settings": "Zahlung Einstellungen",
@ -918,7 +928,7 @@
},
"backup": {
"title": "Sicherung | Sicherungen",
"description": "The backup is a zipfile that contains all files in the directories you specify along with a dump of your database",
"description": "Die Sicherung ist eine ZIP-Datei, die alle Dateien der ausgewählten Pfade und eine Kopie der Datenbank enthält",
"new_backup": "Neues Backup",
"create_backup": "Datensicherung erstellen",
"select_backup_type": "Wählen Sie den Sicherungs-Typ",
@ -950,23 +960,23 @@
"disk_name": "Speicher Bezeichnung",
"new_disk": "Speicher hinzufügen",
"filesystem_driver": "Dateisystem-Treiber",
"local_driver": "local Driver",
"local_root": "local Root",
"public_driver": "Public Driver",
"public_root": "Public Root",
"public_url": "Public URL",
"public_visibility": "Public Visibility",
"media_driver": "Media Driver",
"media_root": "Media Root",
"aws_driver": "AWS Driver",
"aws_key": "AWS Key",
"aws_secret": "AWS Secret",
"aws_region": "AWS Region",
"local_driver": "Lokaler Treiber",
"local_root": "lokaler Pfad",
"public_driver": "Öffentlicher Treiber",
"public_root": "Öffentlicher Pfad",
"public_url": "Öffentliche URL",
"public_visibility": "Öffentliche Sichtbarkeit",
"media_driver": "Medientreiber",
"media_root": "Medienpfad",
"aws_driver": "AWS-Treiber",
"aws_key": "AWS-Schlüssel",
"aws_secret": "AWS-Geheimnis",
"aws_region": "AWS-Region",
"aws_bucket": "AWS Bucket",
"aws_root": "AWS Root",
"do_spaces_type": "Do Spaces type",
"do_spaces_key": "Do Spaces key",
"do_spaces_secret": "Do Spaces Secret",
"aws_root": "AWS-Pfad",
"do_spaces_type": "Do Spaces-Typ",
"do_spaces_key": "Do Spaces-Schlüssel",
"do_spaces_secret": "Do Spaces-Geheimnis",
"do_spaces_region": "Do Spaces Region",
"do_spaces_bucket": "Do Spaces Bucket",
"do_spaces_endpoint": "Do Spaces Endpoint",
@ -984,7 +994,7 @@
"save_pdf_to_disk": "PDFs auf Festplatte speichern",
"disk_setting_description": " Aktivieren Sie dies, um eine Kopie von jeder Rechnung, jedem Kostenvoranschlag & jedem Zahlungsbelegung als PDF automatisch auf ihrem Standard-Speicher abzulegen. Wenn Sie diese Option aktivieren, verringert sich die Ladezeit beim Betrachten der PDFs.",
"select_disk": "Speicherort auswählen",
"disk_settings": "Disk Settings",
"disk_settings": "Speichermedienkonfiguration",
"confirm_delete": "Ihre existierenden Dateien und Ordner auf der angegebenen Festplatte werden nicht beeinflusst, aber Dieser Speicherort wird aus Crater gelöscht",
"action": "Aktion",
"edit_file_disk": "Edit File Disk",
@ -1037,10 +1047,10 @@
"port": "Datenbank Port",
"password": "Datenbank Passwort",
"app_url": "App-URL",
"app_domain": "App Domain",
"app_domain": "Domain der App",
"username": "Datenbank Benutzername",
"db_name": "Datenbank Name",
"db_path": "Database Path",
"db_path": "Datenbankpfad",
"desc": "Erstellen Sie eine Datenbank auf Ihrem Server und legen Sie die Anmeldeinformationen mithilfe des folgenden Formulars fest."
},
"permissions": {
@ -1147,14 +1157,18 @@
"pdf_amount_label": "Summe",
"pdf_subtotal": "Zwischensumme",
"pdf_total": "Gesamt",
"pdf_payment_label": "Zahlung",
"pdf_payment_receipt_label": "Zahlungsbeleg",
"pdf_payment_date": "Zahlungsdatum",
"pdf_payment_number": "Zahlungsnummer",
"pdf_payment_mode": "Zahlungsart",
"pdf_payment_amount_received_label": "Amount Received",
"pdf_payment_amount_received_label": "Betrag erhalten",
"pdf_expense_report_label": "Ausgaben Bericht",
"pdf_total_expenses_label": "Gesamtausgaben",
"pdf_profit_loss_label": "Gewinn & Verlust Bericht",
"pdf_sales_customers_label": "Kundenverkaufs Bericht",
"pdf_sales_items_label": "Artikelverkaufs Bericht",
"pdf_tax_summery_label": "Steuer Bericht",
"pdf_income_label": "Einkommen",
"pdf_net_profit_label": "Nettogewinn",
"pdf_customer_sales_report": "Umsatzbericht: Nach Kunde",

View File

@ -178,6 +178,8 @@
"copy_billing_address": "Copy from Billing",
"no_customers": "No customers yet!",
"no_customers_found": "No customers found!",
"no_contact": "No contact",
"no_contact_name": "No contact name",
"list_of_customers": "This section will contain the list of customers.",
"primary_display_name": "Primary Display Name",
"select_currency": "Select currency",
@ -201,6 +203,7 @@
"added_on": "Added On",
"price": "Price",
"date_of_creation": "Date Of Creation",
"not_selected": "No item selected",
"action": "Action",
"add_item": "Add Item",
"save_item": "Save Item",
@ -271,6 +274,7 @@
"required": "Field is required"
},
"accepted": "Accepted",
"rejected": "Rejected",
"sent": "Sent",
"draft": "Draft",
"declined": "Declined",
@ -317,6 +321,9 @@
"all": "All",
"paid": "Paid",
"unpaid": "Unpaid",
"viewed": "Viewed",
"overdue": "Overdue",
"completed": "Completed",
"customer": "CUSTOMER",
"paid_status": "PAID STATUS",
"ref_no": "REF NO.",
@ -435,6 +442,8 @@
"update_payment": "Update Payment",
"payment": "Payment | Payments",
"no_payments": "No payments yet!",
"not_selected": "Not selected",
"no_invoice": "No invoice",
"no_matching_payments": "There are no matching payments!",
"list_of_payments": "This section will contain the list of payments.",
"select_payment_mode": "Select payment mode",
@ -464,6 +473,7 @@
"receipt": "Receipt",
"amount": "Amount",
"action": "Action",
"not_selected": "Not selected",
"note": "Note",
"category_id": "Category Id",
"date": "Date",
@ -745,6 +755,8 @@
"invoice_settings": "Invoice Settings",
"autogenerate_invoice_number": "Auto-generate Invoice Number",
"invoice_setting_description": "Disable this, If you don't wish to auto-generate invoice numbers each time you create a new invoice.",
"invoice_email_attachment": "Send invoices as attachments",
"invoice_email_attachment_setting_description": "Enable this if you want to send invoices as email attachment. Please note that 'View Invoice' button in emails will not be displayed anymore when enabled.",
"enter_invoice_prefix": "Enter invoice prefix",
"terms_and_conditions": "Terms and Conditions",
"company_address_format": "Company Address Format",
@ -759,6 +771,8 @@
"estimate_settings": "Estimate Settings",
"autogenerate_estimate_number": "Auto-generate Estimate Number",
"estimate_setting_description": "Disable this, If you don't wish to auto-generate estimate numbers each time you create a new estimate.",
"estimate_email_attachment": "Send estimates as attachments",
"estimate_email_attachment_setting_description": "Enable this if you want to send the estimates as an email attachment. Please note that 'View Estimate' button in emails will not be displayed anymore when enabled.",
"enter_estimate_prefix": "Enter estmiate prefix",
"estimate_setting_updated": "Estimate Setting updated successfully",
"company_address_format": "Company Address Format",
@ -773,6 +787,8 @@
"payment_settings": "Payment Settings",
"autogenerate_payment_number": "Auto-generate Payment Number",
"payment_setting_description": "Disable this, If you don't wish to auto-generate payment numbers each time you create a new payment.",
"payment_email_attachment": "Send payments as attachments",
"payment_email_attachment_setting_description": "Enable this if you want to send the payment receipts as an email attachment. Please note that 'View Payment' button in emails will not be displayed anymore when enabled.",
"enter_payment_prefix": "Enter Payment Prefix",
"payment_setting_updated": "Payment Setting updated successfully",
"payment_modes": "Payment Modes",
@ -1150,6 +1166,7 @@
"pdf_amount_label": "Amount",
"pdf_subtotal": "Subtotal",
"pdf_total": "Total",
"pdf_payment_label": "Payment",
"pdf_payment_receipt_label": "PAYMENT RECEIPT",
"pdf_payment_date": "Payment Date",
"pdf_payment_number": "Payment Number",
@ -1158,6 +1175,9 @@
"pdf_expense_report_label": "EXPENSES REPORT",
"pdf_total_expenses_label": "TOTAL EXPENSE",
"pdf_profit_loss_label": "PROFIT & LOSS REPORT",
"pdf_sales_customers_label": "Sales Customer Report",
"pdf_sales_items_label": "Sales Item Report",
"pdf_tax_summery_label": "Tax Summary Report",
"pdf_income_label": "INCOME",
"pdf_net_profit_label": "NET PROFIT",
"pdf_customer_sales_report": "Sales Report: By Customer",

View File

@ -10,18 +10,18 @@
"reports": "Informes",
"settings": "Configuraciones",
"logout": "Cerrar sesión",
"users": "Users"
"users": "Usuarios"
},
"general": {
"add_company": "Add Company",
"add_company": "Añadir empresa",
"view_pdf": "Ver PDF",
"copy_pdf_url": "Copy PDF Url",
"copy_pdf_url": "Copiar dirección URL del archivo PDF",
"download_pdf": "Descargar PDF",
"save": "Guardar",
"create": "Create",
"create": "Crear",
"cancel": "Cancelar",
"update": "Actualizar",
"deselect": "Deselect",
"deselect": "Deseleccionar",
"download": "Descargar",
"from_date": "Desde la fecha",
"to_date": "Hasta la fecha",
@ -33,7 +33,7 @@
"subject": "Sujeta",
"body": "Cuerpo",
"message": "Mensaje",
"send": "Send",
"send": "Enviar",
"go_back": "Volver",
"back_to_login": "¿Volver al inicio de sesión?",
"home": "Inicio",
@ -84,9 +84,9 @@
"street_2": "Calle 2",
"action_failed": "Accion Fallida",
"retry": "Procesar de nuevo",
"choose_note": "Choose Note",
"no_note_found": "No Note Found",
"insert_note": "Insert Note"
"choose_note": "Elegir nota",
"no_note_found": "No se encontró ninguna nota",
"insert_note": "Insertar una nota"
},
"dashboard": {
"select_year": "Seleccionar año",
@ -133,28 +133,28 @@
"compound_tax": "Impuesto compuesto"
},
"global_search": {
"search": "Search...",
"search": "Buscar...",
"customers": "Clientes",
"users": "Users",
"no_results_found": "No Results Found"
"users": "Usuarios",
"no_results_found": "No se encontraron resultados"
},
"customers": {
"title": "Clientes",
"add_customer": "Agregar cliente",
"contacts_list": "Lista de clientes",
"name": "Nombre",
"mail": "Mail | Mails",
"statement": "Statement",
"mail": "Correo | Correos",
"statement": "Declaración",
"display_name": "Nombre para mostrar",
"primary_contact_name": "Nombre de contacto primario",
"contact_name": "Nombre de contacto",
"amount_due": "Cantidad Debida",
"email": "Email",
"email": "Correo electrónico",
"address": "Dirección",
"phone": "Teléfono",
"website": "Sitio web",
"overview": "Overview",
"enable_portal": "Enable Portal",
"overview": "Descripción general",
"enable_portal": "Habilitar Portal",
"country": "País",
"state": "Estado",
"city": "Ciudad",
@ -177,6 +177,8 @@
"copy_billing_address": "Copia de facturación",
"no_customers": "¡Aún no hay clientes!",
"no_customers_found": "¡No se encontraron clientes!",
"no_contact": "No contact",
"no_contact_name": "No contact name",
"list_of_customers": "Esta sección contendrá la lista de clientes.",
"primary_display_name": "Nombre de visualización principal",
"select_currency": "Seleccione el tipo de moneda",
@ -200,6 +202,7 @@
"added_on": "Añadido",
"price": "Precio",
"date_of_creation": "Fecha de creación",
"not_selected": "No item selected",
"action": "Acción",
"add_item": "Añadir artículo",
"save_item": "Guardar artículo",
@ -253,7 +256,7 @@
"convert_to_invoice": "Convertir a factura",
"mark_as_sent": "Marcar como enviado",
"send_estimate": "Enviar presupuesto",
"resend_estimate": "Resend Estimate",
"resend_estimate": "Reenviar estimado",
"record_payment": "Registro de pago",
"add_estimate": "Agregar presupuesto",
"save_estimate": "Guardar presupuesto",
@ -270,6 +273,7 @@
"required": "Se requiere campo"
},
"accepted": "Aceptado",
"rejected": "Rejected",
"sent": "Enviado",
"draft": "Borrador",
"declined": "Rechazado",
@ -316,6 +320,9 @@
"all": "Todas",
"paid": "Pagada",
"unpaid": "No pagado",
"viewed": "Viewed",
"overdue": "Overdue",
"completed": "Completed",
"customer": "CLIENTE",
"paid_status": "ESTADO PAGADO",
"ref_no": "NÚMERO DE REFERENCIA.",
@ -339,7 +346,7 @@
"notes": "Notas",
"view": "Ver",
"send_invoice": "Enviar la factura",
"resend_invoice": "Resend Invoice",
"resend_invoice": "Reenviar factura",
"invoice_template": "Plantilla de factura",
"template": "Modelo",
"mark_as_sent": "Marcar como enviada",
@ -434,12 +441,14 @@
"update_payment": "Actualizar pago",
"payment": "Pago | Pagos",
"no_payments": "¡Aún no hay pagos!",
"not_selected": "Not selected",
"no_invoice": "No invoice",
"no_matching_payments": "¡No hay pagos equivalentes!",
"list_of_payments": "Esta sección contendrá la lista de pagos.",
"select_payment_mode": "Seleccionar modo de pago",
"confirm_mark_as_sent": "Este presupuesto se marcará como enviado",
"confirm_send_payment": "This payment will be sent via email to the customer",
"send_payment_successfully": "Payment sent successfully",
"confirm_send_payment": "Este pago se enviará por correo electrónico al cliente",
"send_payment_successfully": "Pago enviado correctamente",
"user_email_does_not_exist": "El email del usuario no existe",
"something_went_wrong": "Algo fue mal",
"confirm_delete": "No podrá recuperar este pago | No podrá recuperar estos pagos",
@ -463,6 +472,7 @@
"receipt": "Recibo",
"amount": "Cantidad",
"action": "Acción",
"not_selected": "Not selected",
"note": "Nota",
"category_id": "Categoria ID",
"date": "Fecha de gastos",
@ -494,7 +504,7 @@
}
},
"login": {
"email": "Email",
"email": "Correo electrónico",
"password": "Contraseña",
"forgot_password": "¿Olvidaste tu contraseña?",
"or_signIn_with": "o Inicia sesión con",
@ -505,33 +515,33 @@
"enter_email": "Escriba el correo electrónico",
"enter_password": "Escriba la contraseña",
"retype_password": "Reescriba la contraseña",
"login_placeholder": "mail@example.com"
"login_placeholder": "correo@ejemplo.com"
},
"users": {
"title": "Users",
"users_list": "Users List",
"title": "Usuarios",
"users_list": "Lista de usuarios",
"name": "Nombre",
"description": "Descripción",
"added_on": "Añadido",
"date_of_creation": "Fecha de creación",
"action": "Acción",
"add_user": "Add User",
"save_user": "Save User",
"update_user": "Update User",
"user": "User | Users",
"add_new_user": "Add New User",
"new_user": "New User",
"edit_user": "Edit User",
"no_users": "No users yet!",
"list_of_users": "This section will contain the list of users.",
"email": "Email",
"add_user": "Agregar usuario",
"save_user": "Guardar usuario",
"update_user": "Actualizar usuario",
"user": "Usuario | Usuarios",
"add_new_user": "Agregar Nuevo Usuario",
"new_user": "Nuevo usuario",
"edit_user": "Editar usuario",
"no_users": "¡Aún no hay usuarios!",
"list_of_users": "Esta sección contendrá la lista de usuarios.",
"email": "Correo",
"phone": "Teléfono",
"password": "Contraseña",
"user_attached_message": "No se puede eliminar un elemento que ya está en uso.",
"confirm_delete": "You will not be able to recover this User | You will not be able to recover these Users",
"created_message": "User created successfully",
"updated_message": "User updated successfully",
"deleted_message": "User deleted successfully | User deleted successfully"
"confirm_delete": "No podrá recuperar este Usuario | No podrá recuperar estos Usuarios",
"created_message": "Usuario creado satisfactoriamente",
"updated_message": "Usuario actualizado satisfactoriamente",
"deleted_message": "Usuario eliminado exitosamente | Usuario eliminado correctamente"
},
"reports": {
"title": "Informe",
@ -604,10 +614,10 @@
"tax_types": "Tipos de impuestos",
"expense_category": "Categorías de gastos",
"update_app": "Actualizar aplicación",
"backup": "Backup",
"file_disk": "File Disk",
"backup": "Copias de seguridad",
"file_disk": "Disco de archivo",
"custom_fields": "Campos Personalizados",
"payment_modes": "Payment Modes",
"payment_modes": "Modos de pago",
"notes": "Notas"
},
"title": "Configuraciones",
@ -674,7 +684,7 @@
},
"custom_fields": {
"title": "Campos Personalizados",
"section_description": "Customize your Invoices, Estimates & Payment Receipts with your own fields. Make sure to use the below added fields on the address formats on Customization settings page.",
"section_description": "Personalice sus facturas, estimaciones y recibos de pago en sus propios campos. Asegúrese de usar los siguientes campos añadidos en los formatos de dirección de la página de configuración de personalización.",
"add_custom_field": "Agregar campo personalizado",
"edit_custom_field": "Editar campo personalizado",
"field_name": "Nombre del campo",
@ -722,7 +732,7 @@
"address": "Dirección",
"display_name": "Nombre para mostrar",
"primary_contact_name": "Nombre de contacto principal",
"email": "Email",
"email": "Correo electrónico",
"website": "Sitio web",
"name": "Nombre",
"country": "País",
@ -740,41 +750,41 @@
"title": "Facturas",
"notes": "Notas",
"invoice_prefix": "Prefijo de las facturas",
"default_invoice_email_body": "Default Invoice Email Body",
"default_invoice_email_body": "Cuerpo predeterminado del correo electrónico de la factura",
"invoice_settings": "Ajustes de facturas",
"autogenerate_invoice_number": "Autogenerar número de factura",
"invoice_setting_description": "Desactive esto, si no desea generar automáticamente números de factura cada vez que cree una nueva factura.",
"enter_invoice_prefix": "Introduzca el prefijo de factura",
"terms_and_conditions": "Términos y Condiciones",
"company_address_format": "Company Address Format",
"shipping_address_format": "Shipping Address Format",
"billing_address_format": "Billing Address Format",
"company_address_format": "Formato de dirección de la empresa",
"shipping_address_format": "Formato de la dirección de envío",
"billing_address_format": "Formato de dirección de facturación",
"invoice_setting_updated": "Configuración de factura actualizada correctamente"
},
"estimates": {
"title": "Estimaciones",
"estimate_prefix": "Prefijo de los presupuestos",
"default_estimate_email_body": "Default Estimate Email Body",
"default_estimate_email_body": "Cuerpo predeterminado estimado del correo electrónico",
"estimate_settings": "Ajustes de presupuestos",
"autogenerate_estimate_number": "Autogenerar número de presupuesto",
"estimate_setting_description": "Desactive esto, si no desea generar automáticamente números de presupuesto cada vez que cree un nuevo presupuesto.",
"enter_estimate_prefix": "Introduzca el prefijo de presupuesto",
"estimate_setting_updated": "Configuración de presupuestos actualizada correctamente",
"company_address_format": "Company Address Format",
"billing_address_format": "Billing Address Format",
"shipping_address_format": "Shipping Address Format"
"company_address_format": "Formato de dirección de la empresa",
"billing_address_format": "Formato de la dirección de facturación",
"shipping_address_format": "Formato de dirección de envío"
},
"payments": {
"title": "Pagos",
"description": "Modes of transaction for payments",
"description": "Modos de transacción de pagos",
"payment_prefix": "Prefijo de los pagos",
"default_payment_email_body": "Default Payment Email Body",
"default_payment_email_body": "Cuerpo predeterminado del correo electrónico del pago",
"payment_settings": "Ajustes de pagos",
"autogenerate_payment_number": "Autogenerar número de pago",
"payment_setting_description": "Desactive esto, si no desea generar automáticamente números de pago cada vez que cree un nuevo pago.",
"enter_payment_prefix": "Introduzca el prefijo de pago",
"payment_setting_updated": "Configuración de pagos actualizada correctamente",
"payment_modes": "Payment Modes",
"payment_modes": "Modos de pago",
"add_payment_mode": "Agregar modo de pago",
"edit_payment_mode": "Editar modo de pago",
"mode_name": "Nombre del modo",
@ -783,8 +793,8 @@
"payment_mode_confirm_delete": "No podrá recuperar este modo de pago",
"already_in_use": "El modo de pago ya está en uso",
"deleted_message": "Modo de pago eliminado correctamente",
"company_address_format": "Company Address Format",
"from_customer_address_format": "From Customer Address Format"
"company_address_format": "Formato de dirección de la empresa",
"from_customer_address_format": "Desde el formato de dirección del cliente"
},
"items": {
"title": "Artículos",
@ -800,24 +810,24 @@
},
"notes": {
"title": "Notas",
"description": "Save time by creating notes and reusing them on your invoices, estimates & payments.",
"description": "Ahorre tiempo creando notas y reutilizándolas en sus facturas, cálculos y pagos.",
"notes": "Notas",
"type": "Tipo",
"add_note": "Add Note",
"add_new_note": "Add New Note",
"add_note": "Agregar nota",
"add_new_note": "Agregar nueva nota",
"name": "Nombre",
"edit_note": "Edit Note",
"note_added": "Note added successfully",
"note_updated": "Note Updated successfully",
"note_confirm_delete": "You will not be able to recover this Note",
"already_in_use": "Note is already in use",
"deleted_message": "Note deleted successfully"
"edit_note": "Editar nota",
"note_added": "Nota agregada correctamente",
"note_updated": "Nota actualizada correctamente",
"note_confirm_delete": "No podrá recuperar esta nota",
"already_in_use": "Nota ya está en uso",
"deleted_message": "Nota eliminada correctamente"
}
},
"account_settings": {
"profile_picture": "Foto de perfil",
"name": "Nombre",
"email": "Email",
"email": "Correo electrónico",
"password": "Contraseña",
"confirm_password": "Confirmar contraseña",
"account_settings": "Configuraciones de la cuenta",
@ -827,7 +837,7 @@
},
"user_profile": {
"name": "Nombre",
"email": "Email",
"email": "Correo electrónico",
"password": "Contraseña",
"confirm_password": "Confirmar contraseña"
},
@ -879,7 +889,7 @@
},
"preferences": {
"currency": "Moneda",
"default_language": "Default Language",
"default_language": "Idioma predeterminado",
"time_zone": "Zona horaria",
"fiscal_year": "Año financiero",
"date_format": "Formato de fecha",
@ -892,7 +902,7 @@
"updated_message": "Preferencias actualizadas exitosamente",
"select_language": "seleccione el idioma",
"select_time_zone": "selecciona la zona horaria",
"select_date_format": "Select Date Format",
"select_date_format": "Seleccionar formato de fecha",
"select_financial_year": "seleccione año financiero"
},
"update_app": {
@ -901,7 +911,7 @@
"check_update": "Buscar actualizaciones",
"avail_update": "Nueva actualización disponible",
"next_version": "Próxima versión",
"requirements": "Requirements",
"requirements": "Requisitos",
"update": "Actualizar",
"update_progress": "Actualización en progreso...",
"progress_text": "Solo tomará unos minutos. No actualice la pantalla ni cierre la ventana antes de que finalice la actualización.",
@ -917,91 +927,91 @@
"update_failed_text": "¡Lo siento! Su actualización falló el: {step} paso"
},
"backup": {
"title": "Backup | Backups",
"description": "The backup is a zipfile that contains all files in the directories you specify along with a dump of your database",
"new_backup": "Add New Backup",
"create_backup": "Create Backup",
"select_backup_type": "Select Backup Type",
"backup_confirm_delete": "You will not be able to recover this Backup",
"path": "path",
"new_disk": "New Disk",
"created_at": "created at",
"size": "size",
"title": "Copia de seguridad | Copias de seguridad",
"description": "La copia de seguridad es un archivo comprimido zip que contiene todos los archivos en los directorios que especifiques junto con tu base de datos",
"new_backup": "Agregar nueva copia de seguridad",
"create_backup": "Crear copia de seguridad",
"select_backup_type": "Seleccione Tipo de Copia de Seguridad",
"backup_confirm_delete": "No podrá recuperar esta copia de seguridad",
"path": "ruta",
"new_disk": "Nuevo Disco",
"created_at": "creado el",
"size": "tamaño",
"dropbox": "dropbox",
"local": "local",
"healthy": "healthy",
"amount_of_backups": "amount of backups",
"newest_backups": "newest backups",
"used_storage": "used storage",
"select_disk": "Select Disk",
"healthy": "saludable",
"amount_of_backups": "cantidad de copias de seguridad",
"newest_backups": "copias de seguridad más recientes",
"used_storage": "almacenamiento utilizado",
"select_disk": "Seleccionar Disco",
"action": "Acción",
"deleted_message": "Backup deleted successfully",
"created_message": "Backup created successfully",
"invalid_disk_credentials": "Invalid credential of selected disk"
"deleted_message": "Copia de seguridad eliminada exitosamente",
"created_message": "Copia de seguridad creada satisfactoriamente",
"invalid_disk_credentials": "Credencial no válida del disco seleccionado"
},
"disk": {
"title": "File Disk | File Disks",
"description": "By default, Crater will use your local disk for saving backups, avatar and other image files. You can configure more than one disk drivers like DigitalOcean, S3 and Dropbox according to your preference.",
"created_at": "created at",
"title": "Disco de archivos | Discos de archivos",
"description": "Por defecto, Crater utilizará su disco local para guardar copias de seguridad, avatar y otros archivos de imagen. Puede configurar varios controladores de disco como DigitalOcean, S3 y Dropbox según sus preferencias.",
"created_at": "creado el",
"dropbox": "dropbox",
"name": "Nombre",
"driver": "Driver",
"driver": "Controlador",
"disk_type": "Tipo",
"disk_name": "Disk Name",
"new_disk": "Add New Disk",
"filesystem_driver": "Filesystem Driver",
"local_driver": "local Driver",
"local_root": "local Root",
"public_driver": "Public Driver",
"public_root": "Public Root",
"public_url": "Public URL",
"public_visibility": "Public Visibility",
"media_driver": "Media Driver",
"media_root": "Media Root",
"aws_driver": "AWS Driver",
"aws_key": "AWS Key",
"aws_secret": "AWS Secret",
"aws_region": "AWS Region",
"aws_bucket": "AWS Bucket",
"aws_root": "AWS Root",
"do_spaces_type": "Do Spaces type",
"do_spaces_key": "Do Spaces key",
"do_spaces_secret": "Do Spaces Secret",
"do_spaces_region": "Do Spaces Region",
"do_spaces_bucket": "Do Spaces Bucket",
"do_spaces_endpoint": "Do Spaces Endpoint",
"do_spaces_root": "Do Spaces Root",
"dropbox_type": "Dropbox Type",
"dropbox_token": "Dropbox Token",
"dropbox_key": "Dropbox Key",
"disk_name": "Nombre del disco",
"new_disk": "Agregar nuevo disco",
"filesystem_driver": "Controlador del sistema de archivos",
"local_driver": "controlador local",
"local_root": "raíz local",
"public_driver": "Controlador público",
"public_root": "Raíz pública",
"public_url": "URL pública",
"public_visibility": "Visibilidad pública",
"media_driver": "Controlador multimedia",
"media_root": "Raíz multimedia",
"aws_driver": "Controlador AWS",
"aws_key": "Clave AWS",
"aws_secret": "Secreto AWS",
"aws_region": "Región de AWS",
"aws_bucket": "Cubo AWS",
"aws_root": "Raíz AWS",
"do_spaces_type": "Hacer Espacios tipo",
"do_spaces_key": "Disponer espacios",
"do_spaces_secret": "Disponer espacios secretos",
"do_spaces_region": "Disponer región de espacios",
"do_spaces_bucket": "Disponer espacios",
"do_spaces_endpoint": "Disponer espacios extremos",
"do_spaces_root": "Disponer espacios en la raíz",
"dropbox_type": "Tipo de Dropbox",
"dropbox_token": "Token de DropBox",
"dropbox_key": "Clave Dropbox",
"dropbox_secret": "Dropbox Secret",
"dropbox_app": "Dropbox App",
"dropbox_root": "Dropbox Root",
"default_driver": "Default Driver",
"is_default": "IS DEFAULT",
"set_default_disk": "Set Default Disk",
"success_set_default_disk": "Disk set as default successfully",
"save_pdf_to_disk": "Save PDFs to Disk",
"disk_setting_description": " Enable this, if you wish to save a copy of each Invoice, Estimate & Payment Receipt PDF on your default disk automatically. Turning this option will decrease the load-time when viewing the PDFs.",
"select_disk": "Select Disk",
"disk_settings": "Disk Settings",
"confirm_delete": "Your existing files & folders in the specified disk will not be affected but your disk configuration will be deleted from Crater",
"dropbox_app": "Aplicación Dropbox",
"dropbox_root": "Raíz Dropbox",
"default_driver": "Controlador por defecto",
"is_default": "ES PREDETERMINADO",
"set_default_disk": "Establecer disco predeterminado",
"success_set_default_disk": "Disco establecido correctamente como predeterminado",
"save_pdf_to_disk": "Guardar PDFs a disco",
"disk_setting_description": " Habilite esto, si desea guardar automáticamente una copia en formato pdf de cada factura, cálculo y recibo de pago en su disco predeterminado. Al activar esta opción, se reducirá el tiempo de carga al visualizar los archivos PDFs.",
"select_disk": "Seleccionar Disco",
"disk_settings": "Configuración del disco",
"confirm_delete": "Los archivos y carpetas existentes en el disco especificado no se verán afectados, pero su configuración de disco será eliminada de Crater",
"action": "Acción",
"edit_file_disk": "Edit File Disk",
"success_create": "Disk added successfully",
"success_update": "Disk updated successfully",
"error": "Disk addition failed",
"deleted_message": "File Disk deleted successfully",
"disk_variables_save_successfully": "Disk Configured Successfully",
"disk_variables_save_error": "Disk configuration failed.",
"invalid_disk_credentials": "Invalid credential of selected disk"
"edit_file_disk": "Editar disco de ficheros",
"success_create": "Disco añadido satisfactoriamente",
"success_update": "Disco actualizado satisfactoriamente",
"error": "Error al añadir disco",
"deleted_message": "Disco de archivo borrado correctamente",
"disk_variables_save_successfully": "Disco configurado correctamente",
"disk_variables_save_error": "La configuración del disco ha fallado.",
"invalid_disk_credentials": "Credencial no válida del disco seleccionado"
}
},
"wizard": {
"account_info": "Información de la cuenta",
"account_info_desc": "Los detalles a continuación se utilizarán para crear la cuenta principal de administrador. También puede cambiar los detalles en cualquier momento después de iniciar sesión.",
"name": "Nombre",
"email": "Email",
"email": "Correo",
"password": "Contraseña",
"confirm_password": "Confirmar contraseña",
"save_cont": "Guardar y continuar",
@ -1037,10 +1047,10 @@
"port": "Puerto de la base de datos",
"password": "Contraseña de la base de datos",
"app_url": "URL de la aplicación",
"app_domain": "App Domain",
"app_domain": "Dominio",
"username": "Nombre de usuario de la base de datos",
"db_name": "Nombre de la base de datos",
"db_path": "Database Path",
"db_path": "Ruta de la base de datos",
"desc": "Cree una base de datos en su servidor y establezca las credenciales utilizando el siguiente formulario."
},
"permissions": {
@ -1101,7 +1111,7 @@
"email_incorrect": "Email incorrecto.",
"email_already_taken": "Este email ya está en uso",
"email_does_not_exist": "El usuario con el correo electrónico dado no existe",
"item_unit_already_taken": "This item unit name has already been taken",
"item_unit_already_taken": "El nombre de la unidad ya está en uso",
"payment_mode_already_taken": "El modo de pago ya ha sido tomado",
"send_reset_link": "Enviar enlace de restablecimiento",
"not_yet": "¿Aún no? Envíalo de nuevo",
@ -1122,8 +1132,8 @@
"amount_maxlength": "La cantidad no debe ser mayor de 20 dígitos.",
"amount_minvalue": "La cantidad debe ser mayor que 0 dígitos",
"description_maxlength": "La descripción no debe tener más de 255 caracteres.",
"subject_maxlength": "Subject should not be greater than 100 characters.",
"message_maxlength": "Message should not be greater than 255 characters.",
"subject_maxlength": "El asunto no debe tener más de 100 caracteres.",
"message_maxlength": "El mensaje no debe tener más de 255 caracteres.",
"maximum_options_error": "Máximo de {max} opciones seleccionadas. Primero elimine una opción seleccionada para seleccionar otra.",
"notes_maxlength": "Las notas no deben tener más de 255 caracteres.",
"address_maxlength": "La dirección no debe tener más de 255 caracteres.",
@ -1134,11 +1144,11 @@
"pdf_estimate_label": "Presupuestar",
"pdf_estimate_number": "Número de Presupuesto",
"pdf_estimate_date": "Fecha presupuesto",
"pdf_estimate_expire_date": "Expiry date",
"pdf_estimate_expire_date": "Fecha de caducidad",
"pdf_invoice_label": "Factura",
"pdf_invoice_number": "Numero de factura",
"pdf_invoice_date": "Fecha de la factura",
"pdf_invoice_due_date": "Due date",
"pdf_invoice_due_date": "Fecha final",
"pdf_notes": "Notas",
"pdf_items_label": "Artículos",
"pdf_quantity_label": "Cantidad",
@ -1147,24 +1157,28 @@
"pdf_amount_label": "Cantidad",
"pdf_subtotal": "Subtotal",
"pdf_total": "Total",
"pdf_payment_receipt_label": "PAYMENT RECEIPT",
"pdf_payment_date": "Payment Date",
"pdf_payment_label": "Payment",
"pdf_payment_receipt_label": "RECIBO DE PAGO",
"pdf_payment_date": "Fecha de pago",
"pdf_payment_number": "Numero de pago",
"pdf_payment_mode": "Modo de pago",
"pdf_payment_amount_received_label": "Amount Received",
"pdf_expense_report_label": "EXPENSES REPORT",
"pdf_total_expenses_label": "TOTAL EXPENSE",
"pdf_profit_loss_label": "PROFIT & LOSS REPORT",
"pdf_income_label": "INCOME",
"pdf_net_profit_label": "NET PROFIT",
"pdf_customer_sales_report": "Sales Report: By Customer",
"pdf_total_sales_label": "TOTAL SALES",
"pdf_item_sales_label": "Sales Report: By Item",
"pdf_tax_report_label": "TAX REPORT",
"pdf_total_tax_label": "TOTAL TAX",
"pdf_payment_amount_received_label": "Monto Recibido",
"pdf_expense_report_label": "INFORME DE GASTOS",
"pdf_total_expenses_label": "GASTO TOTAL",
"pdf_profit_loss_label": "INFORME PERDIDAS & GANANCIAS",
"pdf_sales_customers_label": "Sales Customer Report",
"pdf_sales_items_label": "Sales Item Report",
"pdf_tax_summery_label": "Tax Summary Report",
"pdf_income_label": "INGRESO",
"pdf_net_profit_label": "GANANCIA NETA",
"pdf_customer_sales_report": "Informe de ventas: Por cliente",
"pdf_total_sales_label": "VENTAS TOTALES",
"pdf_item_sales_label": "Informe de ventas: por artículo",
"pdf_tax_report_label": "INFORME DE IMPUESTOS",
"pdf_total_tax_label": "TOTAL IMPUESTOS",
"pdf_tax_types_label": "Tipos de impuestos",
"pdf_expenses_label": "Gastos",
"pdf_bill_to": "Cobrar a,",
"pdf_ship_to": "Enviar a,",
"pdf_received_from": "Received from:"
"pdf_received_from": "Recibido desde:"
}

File diff suppressed because it is too large Load Diff

View File

@ -177,6 +177,8 @@
"copy_billing_address": "Copy from Billing",
"no_customers": "No customers yet!",
"no_customers_found": "No customers found!",
"no_contact": "No contact",
"no_contact_name": "No contact name",
"list_of_customers": "This section will contain the list of customers.",
"primary_display_name": "Primary Display Name",
"select_currency": "Select currency",
@ -200,6 +202,7 @@
"added_on": "Added On",
"price": "Price",
"date_of_creation": "Date Of Creation",
"not_selected": "No item selected",
"action": "Action",
"add_item": "Add Item",
"save_item": "Save Item",
@ -270,6 +273,7 @@
"required": "Field is required"
},
"accepted": "Accepted",
"rejected": "Rejected",
"sent": "Sent",
"draft": "Draft",
"declined": "Declined",
@ -316,6 +320,9 @@
"all": "All",
"paid": "Paid",
"unpaid": "Unpaid",
"viewed": "Viewed",
"overdue": "Overdue",
"completed": "Completed",
"customer": "CUSTOMER",
"paid_status": "PAID STATUS",
"ref_no": "REF NO.",
@ -434,6 +441,8 @@
"update_payment": "Update Payment",
"payment": "Payment | Payments",
"no_payments": "No payments yet!",
"not_selected": "Not selected",
"no_invoice": "No invoice",
"no_matching_payments": "There are no matching payments!",
"list_of_payments": "This section will contain the list of payments.",
"select_payment_mode": "Select payment mode",
@ -463,6 +472,7 @@
"receipt": "Receipt",
"amount": "Amount",
"action": "Action",
"not_selected": "Not selected",
"note": "Note",
"category_id": "Category Id",
"date": "Date",
@ -1148,6 +1158,7 @@
"pdf_amount_label": "Amount",
"pdf_subtotal": "Subtotal",
"pdf_total": "Total",
"pdf_payment_label": "Payment",
"pdf_payment_receipt_label": "PAYMENT RECEIPT",
"pdf_payment_date": "Payment Date",
"pdf_payment_number": "Payment Number",
@ -1156,6 +1167,9 @@
"pdf_expense_report_label": "EXPENSES REPORT",
"pdf_total_expenses_label": "TOTAL EXPENSE",
"pdf_profit_loss_label": "PROFIT & LOSS REPORT",
"pdf_sales_customers_label": "Sales Customer Report",
"pdf_sales_items_label": "Sales Item Report",
"pdf_tax_summery_label": "Tax Summary Report",
"pdf_income_label": "INCOME",
"pdf_net_profit_label": "NET PROFIT",
"pdf_customer_sales_report": "Sales Report: By Customer",

View File

@ -177,6 +177,8 @@
"copy_billing_address": "Copia da Fatturazione",
"no_customers": "Ancora nessun Cliente!",
"no_customers_found": "Nessun cliente trovato!",
"no_contact": "No contact",
"no_contact_name": "No contact name",
"list_of_customers": "Qui ci sarà la lista dei tuoi clienti",
"primary_display_name": "Mostra il Nome Principale",
"select_currency": "Selezione Valùta",
@ -200,6 +202,7 @@
"added_on": "Aggiunto il",
"price": "Prezzo",
"date_of_creation": "Data di creazione",
"not_selected": "No item selected",
"action": "Azione",
"add_item": "Aggiungi Commessa",
"save_item": "Salva",
@ -270,6 +273,7 @@
"required": "Campo obbligatorio"
},
"accepted": "Accettato",
"rejected": "Rejected",
"sent": "Inviato",
"draft": "Bozza",
"declined": "Rifiutato",
@ -316,6 +320,9 @@
"all": "Tutti",
"paid": "Pagato",
"unpaid": "Insoluto",
"viewed": "Viewed",
"overdue": "Overdue",
"completed": "Completed",
"customer": "CLIENTE",
"paid_status": "STATO DI PAGAMENTO",
"ref_no": "RIF N.",
@ -434,6 +441,8 @@
"update_payment": "Aggiorna pagamento",
"payment": "Pagamento | Pagamenti",
"no_payments": "Ancora nessun pagamento!",
"not_selected": "Not selected",
"no_invoice": "No invoice",
"no_matching_payments": "Non ci sono pagamenti!",
"list_of_payments": "Questa sezione conterrà la lista dei pagamenti.",
"select_payment_mode": "Seleziona modalità di pagamento",
@ -463,6 +472,7 @@
"receipt": "Ricevuta",
"amount": "Ammontare",
"action": "Azione",
"not_selected": "Not selected",
"note": "Nota",
"category_id": "Id categoria",
"date": "Data Spesa",
@ -1147,6 +1157,7 @@
"pdf_amount_label": "Ammontare",
"pdf_subtotal": "Subtotal",
"pdf_total": "Totale",
"pdf_payment_label": "Payment",
"pdf_payment_receipt_label": "PAYMENT RECEIPT",
"pdf_payment_date": "Payment Date",
"pdf_payment_number": "Numero di pagamento",
@ -1155,6 +1166,9 @@
"pdf_expense_report_label": "EXPENSES REPORT",
"pdf_total_expenses_label": "TOTAL EXPENSE",
"pdf_profit_loss_label": "PROFIT & LOSS REPORT",
"pdf_sales_customers_label": "Sales Customer Report",
"pdf_sales_items_label": "Sales Item Report",
"pdf_tax_summery_label": "Tax Summary Report",
"pdf_income_label": "INCOME",
"pdf_net_profit_label": "NET PROFIT",
"pdf_customer_sales_report": "Sales Report: By Customer",

View File

@ -177,6 +177,8 @@
"copy_billing_address": "Kopēt no juridiskās adreses",
"no_customers": "Pagaidām nav klientu!",
"no_customers_found": "Klienti netika atrasti!",
"no_contact": "No contact",
"no_contact_name": "No contact name",
"list_of_customers": "Šajā sadaļā būs klientu saraksts.",
"primary_display_name": "Klienta nosaukums",
"select_currency": "Izvēlieties valūtu",
@ -200,6 +202,7 @@
"added_on": "Pievienots",
"price": "Cena",
"date_of_creation": "Izveidošanas datums",
"not_selected": "No item selected",
"action": "Darbība",
"add_item": "Pievienot",
"save_item": "Saglabāt",
@ -270,6 +273,7 @@
"required": "Šis lauks ir obligāts"
},
"accepted": "Apstiprināts",
"rejected": "Rejected",
"sent": "Nosūtīts",
"draft": "Melnraksts",
"declined": "Noraidīts",
@ -316,6 +320,9 @@
"all": "Visi",
"paid": "Apmaksāts",
"unpaid": "Neapmaksāts",
"viewed": "Viewed",
"overdue": "Overdue",
"completed": "Completed",
"customer": "KLIENTS",
"paid_status": "APMAKSAS STATUS",
"ref_no": "REF NR.",
@ -434,6 +441,8 @@
"update_payment": "Labot maksājumu",
"payment": "Maksājums | Maksājumi",
"no_payments": "Nav pievienotu maksājumu!",
"not_selected": "Not selected",
"no_invoice": "No invoice",
"no_matching_payments": "Netika atrasts neviens maksājums!",
"list_of_payments": "Šajā sadaļā būs maksājumu saraksts.",
"select_payment_mode": "Izvēlēties maksājuma veidu",
@ -463,6 +472,7 @@
"receipt": "Čeks",
"amount": "Summa",
"action": "Darbība",
"not_selected": "Not selected",
"note": "Piezīme",
"category_id": "Kategorijas Id",
"date": "Datums",
@ -1147,6 +1157,7 @@
"pdf_amount_label": "Summa",
"pdf_subtotal": "Starpsumma",
"pdf_total": "Kopā",
"pdf_payment_label": "Payment",
"pdf_payment_receipt_label": "MAKSĀJUMA IZDRUKA",
"pdf_payment_date": "Maksājuma datums",
"pdf_payment_number": "Maksājuma numurs",
@ -1155,6 +1166,9 @@
"pdf_expense_report_label": "IZDEVUMU ATSKAITE",
"pdf_total_expenses_label": "KOPĀ IZDEVUMI",
"pdf_profit_loss_label": "PEĻŅAS & IZDEVUMU ATSKAITE",
"pdf_sales_customers_label": "Sales Customer Report",
"pdf_sales_items_label": "Sales Item Report",
"pdf_tax_summery_label": "Tax Summary Report",
"pdf_income_label": "IENĀKUMI",
"pdf_net_profit_label": "PEĻŅA",
"pdf_customer_sales_report": "Atskaite par pārdoto: Pēc lietotāja",

View File

@ -30,7 +30,7 @@
"sort_by": "Sorteer op",
"ascending": "Oplopend",
"descending": "Aflopend",
"subject": "Onderwerpen",
"subject": "Onderwerp",
"body": "Inhoud",
"message": "Bericht",
"send": "Verstuur",
@ -94,7 +94,7 @@
"due_amount": "Openstaand bedrag",
"customers": "Klanten",
"invoices": "Facturen",
"estimates": "Offerte"
"estimates": "Offertes"
},
"chart_info": {
"total_sales": "Verkoop",
@ -166,7 +166,7 @@
"primary_currency": "Primaire valuta",
"description": "Omschrijving",
"add_new_customer": "Nieuwe klant toevoegen",
"save_customer": "Klant redden",
"save_customer": "Klant opslaan",
"update_customer": "Klant bijwerken",
"customer": "Klant | Klanten",
"new_customer": "Nieuwe klant",
@ -177,6 +177,8 @@
"copy_billing_address": "Kopiëren van facturering",
"no_customers": "Nog geen klanten!",
"no_customers_found": "Geen klanten gevonden!",
"no_contact": "No contact",
"no_contact_name": "No contact name",
"list_of_customers": "Hier vind je jouw klanten terug.",
"primary_display_name": "Primaire weergavenaam",
"select_currency": "Selecteer valuta",
@ -186,7 +188,7 @@
"no_matching_customers": "Er zijn geen overeenkomende klanten!",
"phone_number": "Telefoonnummer",
"create_date": "Aangemaakt op",
"confirm_delete": "U kunt deze klant en alle gerelateerde facturen, offertes en betalingen niet terugkrijgen. | U zult deze klanten en alle gerelateerde facturen, offertes en betalingen niet kunnen terugkrijgen.",
"confirm_delete": "Deze klant en alle gerelateerde facturen, offertes en betalingen worden permanent verwijderd. | Deze klanten en alle gerelateerde facturen, offertes en betalingen worden permanent verwijderd.",
"created_message": "Klant succesvol aangemaakt",
"updated_message": "Klant succesvol geüpdatet",
"deleted_message": "Klant succesvol verwijderd | Klanten zijn succesvol verwijderd"
@ -200,6 +202,7 @@
"added_on": "Toegevoegd",
"price": "Prijs",
"date_of_creation": "Datum van creatie",
"not_selected": "No item selected",
"action": "Actie",
"add_item": "Voeg item toe",
"save_item": "Item opslaan",
@ -236,14 +239,14 @@
"total": "Totaal",
"discount": "Korting",
"sub_total": "Subtotaal",
"estimate_number": "Geschat aantal",
"estimate_number": "Offerte nummer",
"ref_number": "Referentie nummer",
"contact": "Contact",
"add_item": "Voeg een item toe",
"date": "Datum",
"due_date": "Opleveringsdatum",
"expiry_date": "Vervaldatum",
"status": "Statu",
"status": "Status",
"add_tax": "Belasting toevoegen",
"amount": "Bedrag",
"action": "Actie",
@ -270,6 +273,7 @@
"required": "Veld is vereist"
},
"accepted": "Geaccepteerd",
"rejected": "Rejected",
"sent": "Verzonden",
"draft": "Concept",
"declined": "Geweigerd",
@ -316,6 +320,9 @@
"all": "Allemaal",
"paid": "Betaald",
"unpaid": "Onbetaald",
"viewed": "Viewed",
"overdue": "Overdue",
"completed": "Completed",
"customer": "Klant",
"paid_status": "Betaling",
"ref_no": "REF NR.",
@ -332,7 +339,7 @@
"add_item": "Voeg een item toe",
"date": "Datum",
"due_date": "Opleveringsdatum",
"status": "Statu",
"status": "Status",
"add_tax": "Belasting toevoegen",
"amount": "Bedrag",
"action": "Actie",
@ -379,7 +386,7 @@
"type_item_description": "Type Item Beschrijving (optioneel)"
},
"payment_attached_message": "Aan een van de geselecteerde facturen is al een betaling gekoppeld. Zorg ervoor dat u eerst de bijgevoegde betalingen verwijdert om door te gaan met de verwijdering",
"confirm_delete": "U kunt deze factuur | niet terugvorderen U kunt deze facturen niet terugkrijgen",
"confirm_delete": "Deze factuur wordt permanent verwijderd | Deze facturen worden permanent verwijderd",
"created_message": "Factuur succesvol aangemaakt",
"updated_message": "Factuur succesvol bijgewerkt",
"deleted_message": "Factuur succesvol verwijderd | Facturen succesvol verwijderd",
@ -434,6 +441,8 @@
"update_payment": "Betaling bijwerken",
"payment": "Betaling | Betalingen",
"no_payments": "Nog geen betalingen!",
"not_selected": "Not selected",
"no_invoice": "No invoice",
"no_matching_payments": "Er zijn geen overeenkomende betalingen!",
"list_of_payments": "Hier vind je jouw betalingen terug.",
"select_payment_mode": "Selecteer betalingswijze",
@ -442,7 +451,7 @@
"send_payment_successfully": "Betaling succesvol verzonden",
"user_email_does_not_exist": "E-mailadres van gebruiker bestaat niet",
"something_went_wrong": "Er is iets fout gegaan",
"confirm_delete": "U kunt deze betaling niet herstellen U kunt deze betalingen niet terugkrijgen",
"confirm_delete": "Deze betaling wordt permanent verwijderd | Deze betalingen worden permanent verwijderd",
"created_message": "De betaling is succesvol aangemaakt",
"updated_message": "Betaling succesvol bijgewerkt",
"deleted_message": "Betaling succesvol verwijderd | Betalingen zijn verwijderd",
@ -463,6 +472,7 @@
"receipt": "Bon",
"amount": "Bedrag",
"action": "Actie",
"not_selected": "Not selected",
"note": "Notitie",
"category_id": "Categorie ID",
"date": "Uitgavendatum",
@ -476,7 +486,7 @@
"expense": "Uitgaven | Uitgaven",
"no_expenses": "Nog geen kosten!",
"list_of_expenses": "Hier vind je jouw uitgaven terug.",
"confirm_delete": "U kunt deze kosten | niet terugkrijgen U kunt deze kosten niet terugvorderen",
"confirm_delete": "Deze uitgave wordt permanent verwijderd | Deze kosten worden permanent verwijderd",
"created_message": "Kosten succesvol gemaakt",
"updated_message": "Kosten succesvol bijgewerkt",
"deleted_message": "Kosten succesvol verwijderd | Uitgaven zijn verwijderd",
@ -537,7 +547,7 @@
"title": "Verslag doen van",
"from_date": "Van datum",
"to_date": "Tot datum",
"status": "Statu",
"status": "Status",
"paid": "Betaald",
"unpaid": "Onbetaald",
"download_pdf": "Download PDF",
@ -572,17 +582,17 @@
"due_date": "Opleveringsdatum",
"amount": "Bedrag",
"contact_name": "Contactnaam",
"status": "Statu"
"status": "Status"
},
"estimates": {
"estimate": "Offerte",
"estimate_date": "Geschatte datum",
"estimate_date": "Offerte Datum",
"due_date": "Opleveringsdatum",
"estimate_number": "Geschat aantal",
"estimate_number": "Offerte nummer",
"ref_number": "Referentie nummer",
"amount": "Bedrag",
"contact_name": "Contactnaam",
"status": "Statu"
"status": "Status"
},
"expenses": {
"expenses": "Uitgaven",
@ -606,7 +616,7 @@
"update_app": "App bijwerken",
"backup": "Back-up",
"file_disk": "Bestandsopslag",
"custom_fields": "Custom Fields",
"custom_fields": "Aangepaste velden",
"payment_modes": "Betaalmethodes",
"notes": "Opmerkingen"
},
@ -762,7 +772,7 @@
"estimate_setting_updated": "Instelling Offerte succesvol bijgewerkt",
"company_address_format": "Bedrijfsadres format",
"billing_address_format": "Factuuradres Format",
"shipping_address_format": "Shipping Address Format"
"shipping_address_format": "Verzendadres format"
},
"payments": {
"title": "Betalingen",
@ -774,7 +784,7 @@
"payment_setting_description": "Schakel dit uit als u niet elke keer dat u een nieuwe betaling aanmaakt, automatisch betalingsnummers wilt genereren.",
"enter_payment_prefix": "Voer het betalingsvoorvoegsel in",
"payment_setting_updated": "Betalingsinstelling geüpdatet",
"payment_modes": "Payment Modes",
"payment_modes": "Betaalmethodes",
"add_payment_mode": "Betaalmodus toevoegen",
"edit_payment_mode": "Betaalmodus bewerken",
"mode_name": "Mode naam",
@ -783,8 +793,8 @@
"payment_mode_confirm_delete": "U kunt deze betalingsmodus niet herstellen",
"already_in_use": "De betalingsmodus is al in gebruik",
"deleted_message": "Betaalwijze succesvol verwijderd",
"company_address_format": "Company Address Format",
"from_customer_address_format": "From Customer Address Format"
"company_address_format": "Bedrijfsadres format",
"from_customer_address_format": "Van klant adres formaat"
},
"items": {
"title": "Artikelen",
@ -800,18 +810,18 @@
},
"notes": {
"title": "Opmerkingen",
"description": "Save time by creating notes and reusing them on your invoices, estimates & payments.",
"description": "Bespaar tijd door notities te maken en ze opnieuw te gebruiken op uw facturen, ramingen en betalingen.",
"notes": "Opmerkingen",
"type": "Type",
"add_note": "Add Note",
"add_new_note": "Add New Note",
"add_note": "Notitie toevoegen",
"add_new_note": "Voeg een nieuwe notitie toe",
"name": "Naam",
"edit_note": "Edit Note",
"note_added": "Note added successfully",
"note_updated": "Note Updated successfully",
"note_confirm_delete": "You will not be able to recover this Note",
"already_in_use": "Note is already in use",
"deleted_message": "Note deleted successfully"
"edit_note": "Notitie bewerken",
"note_added": "Notitie toegevoegd",
"note_updated": "Notitie bijgewerkt",
"note_confirm_delete": "U kunt deze notitie niet terughalen",
"already_in_use": "Notitie is reeds in gebruik",
"deleted_message": "Notitie verwijderd"
}
},
"account_settings": {
@ -859,7 +869,7 @@
"created_message": "Belastingtype is gemaakt",
"updated_message": "Belastingtype succesvol bijgewerkt",
"deleted_message": "Belastingtype succesvol verwijderd",
"confirm_delete": "U kunt dit belastingtype niet terugkrijgen",
"confirm_delete": "Dit belastingtype wordt permanent verwijderd",
"already_in_use": "Belasting al in gebruik"
},
"expense_category": {
@ -879,7 +889,7 @@
},
"preferences": {
"currency": "Valuta",
"default_language": "Default Language",
"default_language": "Standaard taal",
"time_zone": "Tijdzone",
"fiscal_year": "Financieel jaar",
"date_format": "Datumnotatie",
@ -892,7 +902,7 @@
"updated_message": "Voorkeuren succesvol bijgewerkt",
"select_language": "Selecteer taal",
"select_time_zone": "Selecteer Tijdzone",
"select_date_format": "Select Date Format",
"select_date_format": "Selecteer datum/tijdindeling",
"select_financial_year": "Selecteer financieel ja"
},
"update_app": {
@ -901,7 +911,7 @@
"check_update": "Controleer op updates",
"avail_update": "Nieuwe update beschikbaar",
"next_version": "Volgende versie",
"requirements": "Requirements",
"requirements": "Vereisten",
"update": "Nu updaten",
"update_progress": "Update wordt uitgevoerd...",
"progress_text": "Het duurt maar een paar minuten. Vernieuw het scherm niet en sluit het venster niet voordat de update is voltooid",
@ -918,11 +928,11 @@
},
"backup": {
"title": "Backup | Backups",
"description": "The backup is a zipfile that contains all files in the directories you specify along with a dump of your database",
"new_backup": "Add New Backup",
"create_backup": "Create Backup",
"select_backup_type": "Select Backup Type",
"backup_confirm_delete": "You will not be able to recover this Backup",
"description": "De back-up is een zipfile met alle bestanden in de mappen die je opgeeft samen met een dump van je database",
"new_backup": "Nieuwe back-up",
"create_backup": "Backup maken",
"select_backup_type": "Backup-type selecteren",
"backup_confirm_delete": "U kunt deze back-up niet terughalen",
"path": "pad",
"new_disk": "Nieuwe schijf",
"created_at": "aangemaakt op",
@ -935,39 +945,39 @@
"used_storage": "gebruikte opslag",
"select_disk": "Selecteer Disk",
"action": "Actie",
"deleted_message": "Backup deleted successfully",
"created_message": "Backup created successfully",
"deleted_message": "Back-up is succesvol verwijderd",
"created_message": "Back-up successvol gemaakt",
"invalid_disk_credentials": "Ongeldige inloggegevens voor geselecteerde schijf"
},
"disk": {
"title": "File Disk | File Disks",
"description": "By default, Crater will use your local disk for saving backups, avatar and other image files. You can configure more than one disk drivers like DigitalOcean, S3 and Dropbox according to your preference.",
"title": "Bestandsschijf | Bestandsschijven",
"description": "Standaard gebruikt Crater uw lokale schijf om back-ups, avatars en andere afbeeldingen op te slaan. U kunt indien gewenst meer dan één opslaglocatie configureren zoals DigitalOcean, S3 en Dropbox.",
"created_at": "aangemaakt op",
"dropbox": "dropbox",
"name": "Naam",
"driver": "Stuurprogramma",
"disk_type": "Type",
"disk_name": "Disk Name",
"new_disk": "Add New Disk",
"disk_name": "Naam van de schijf",
"new_disk": "Nieuwe schijf toevoegen",
"filesystem_driver": "Filesystem Driver",
"local_driver": "local Driver",
"local_driver": "lokaal besturingsprogramma",
"local_root": "local Root",
"public_driver": "Public Driver",
"public_driver": "Publiek besturingsprogramma",
"public_root": "Public Root",
"public_url": "Public URL",
"public_visibility": "Public Visibility",
"media_driver": "Media Driver",
"public_url": "Publieke URL",
"public_visibility": "Publieke zichtbaarheid",
"media_driver": "Media stuurprogramma",
"media_root": "Media Root",
"aws_driver": "AWS Driver",
"aws_key": "AWS Key",
"aws_driver": "AWS Stuurprogramma",
"aws_key": "AWS Sleutel",
"aws_secret": "AWS Secret",
"aws_region": "AWS Region",
"aws_region": "AWS Regio",
"aws_bucket": "AWS Bucket",
"aws_root": "AWS Root",
"do_spaces_type": "Do Spaces type",
"do_spaces_key": "Do Spaces key",
"do_spaces_key": "Do Spaces Key",
"do_spaces_secret": "Do Spaces Secret",
"do_spaces_region": "Do Spaces Region",
"do_spaces_region": "Do Spaces Regio",
"do_spaces_bucket": "Do Spaces Bucket",
"do_spaces_endpoint": "Do Spaces Endpoint",
"do_spaces_root": "Do Spaces Root",
@ -977,24 +987,24 @@
"dropbox_secret": "Dropbox Secret",
"dropbox_app": "Dropbox App",
"dropbox_root": "Dropbox Root",
"default_driver": "Default Driver",
"is_default": "IS DEFAULT",
"set_default_disk": "Set Default Disk",
"success_set_default_disk": "Disk set as default successfully",
"save_pdf_to_disk": "Save PDFs to Disk",
"disk_setting_description": " Enable this, if you wish to save a copy of each Invoice, Estimate & Payment Receipt PDF on your default disk automatically. Turning this option will decrease the load-time when viewing the PDFs.",
"select_disk": "Select Disk",
"disk_settings": "Disk Settings",
"confirm_delete": "Your existing files & folders in the specified disk will not be affected but your disk configuration will be deleted from Crater",
"default_driver": "Standaard stuurprogramma",
"is_default": "IS STANDAARD",
"set_default_disk": "Standaardschijf instellen",
"success_set_default_disk": "Standaardschijf ingesteld",
"save_pdf_to_disk": "PDF's opslaan op schijf",
"disk_setting_description": " Schakel dit in als je een kopie van elke factuur, raming en betalingsbewijs automatisch op je standaard schijf wilt opslaan. Het inschakelen van deze optie zal de laadtijd verminderen wanneer de PDF's worden bekeken.",
"select_disk": "Selecteer Schijf",
"disk_settings": "Schijfinstellingen",
"confirm_delete": "Uw bestaande bestanden en mappen in de opgegeven schijf worden niet beïnvloed, maar uw schijfconfiguratie wordt uit Crater verwijderd",
"action": "Actie",
"edit_file_disk": "Edit File Disk",
"success_create": "Disk added successfully",
"success_update": "Disk updated successfully",
"error": "Disk addition failed",
"deleted_message": "File Disk deleted successfully",
"disk_variables_save_successfully": "Disk Configured Successfully",
"disk_variables_save_error": "Disk configuration failed.",
"invalid_disk_credentials": "Invalid credential of selected disk"
"edit_file_disk": "Bestandsschijf bewerken",
"success_create": "Schijf toegevoegd",
"success_update": "Schijf bijgewerkt",
"error": "Schijf niet toegevoegd",
"deleted_message": "Bestandsschijf verwijderd",
"disk_variables_save_successfully": "Schijf geconfigureerd",
"disk_variables_save_error": "Schijfconfiguratie mislukt.",
"invalid_disk_credentials": "Ongeldige inloggegevens voor geselecteerde schijf"
}
},
"wizard": {
@ -1033,14 +1043,14 @@
"database": {
"database": "Site-URL en database",
"connection": "Database verbinding",
"host": "Database Host",
"host": "Database host",
"port": "Databasepoort",
"password": "Database wachtwoord",
"app_url": "App-URL",
"app_domain": "App Domain",
"app_domain": "App Domein",
"username": "Database gebruikersnaam",
"db_name": "Database naam",
"db_path": "Database Path",
"db_path": "Databankpad",
"desc": "Maak een database op uw server en stel de referenties in via het onderstaande formulier."
},
"permissions": {
@ -1050,8 +1060,8 @@
"permission_desc": "Hieronder vindt u de lijst met mapmachtigingen die vereist zijn om de app te laten werken. Als de machtigingscontrole mislukt, moet u de mapmachtigingen bijwerken."
},
"mail": {
"host": "Mail Host",
"port": "Mail Port",
"host": "E-mail server",
"port": "E-mail Poort",
"driver": "Mail-stuurprogramma",
"secret": "Geheim",
"mailgun_secret": "Mailgun Secret",
@ -1094,7 +1104,7 @@
"invoices_and_estimates": "facturen en offertes met de mogelijkheid om meerdere sjablonen te kiezen."
},
"validation": {
"invalid_phone": "Invalid Phone Number",
"invalid_phone": "Ongeldig Telefoonnummer",
"invalid_url": "Ongeldige URL (bijvoorbeeld: http://www.crater.com))",
"invalid_domain_url": "Ongeldige URL (bijvoorbeeld: crater.com))",
"required": "Veld is verplicht",
@ -1132,39 +1142,43 @@
"something_went_wrong": "Er is iets fout gegaan"
},
"pdf_estimate_label": "Offerte",
"pdf_estimate_number": "Geschat aantal",
"pdf_estimate_date": "Geschatte datum",
"pdf_estimate_expire_date": "Expiry date",
"pdf_estimate_number": "Offerte nummer",
"pdf_estimate_date": "Offerte Datum",
"pdf_estimate_expire_date": "Vervaldatum",
"pdf_invoice_label": "Factuur",
"pdf_invoice_number": "Factuurnummer",
"pdf_invoice_date": "Factuur datum",
"pdf_invoice_due_date": "Due date",
"pdf_invoice_due_date": "Opleveringsdatum",
"pdf_notes": "Opmerkingen",
"pdf_items_label": "Artikelen",
"pdf_quantity_label": "Aantal stuks",
"pdf_price_label": "Prijs",
"pdf_discount_label": "Korting",
"pdf_amount_label": "Bedrag",
"pdf_subtotal": "Subtotal",
"pdf_subtotal": "Subtotaal",
"pdf_total": "Totaal",
"pdf_payment_receipt_label": "PAYMENT RECEIPT",
"pdf_payment_date": "Payment Date",
"pdf_payment_label": "Payment",
"pdf_payment_receipt_label": "Betalingsafschrift",
"pdf_payment_date": "Betalingsdatum",
"pdf_payment_number": "Betalingsnummer",
"pdf_payment_mode": "Betaalmethode",
"pdf_payment_amount_received_label": "Amount Received",
"pdf_expense_report_label": "EXPENSES REPORT",
"pdf_total_expenses_label": "TOTAL EXPENSE",
"pdf_profit_loss_label": "PROFIT & LOSS REPORT",
"pdf_income_label": "INCOME",
"pdf_net_profit_label": "NET PROFIT",
"pdf_customer_sales_report": "Sales Report: By Customer",
"pdf_total_sales_label": "TOTAL SALES",
"pdf_item_sales_label": "Sales Report: By Item",
"pdf_tax_report_label": "TAX REPORT",
"pdf_total_tax_label": "TOTAL TAX",
"pdf_payment_amount_received_label": "Ontvangen bedrag",
"pdf_expense_report_label": "UITGAVEN RAPPORT",
"pdf_total_expenses_label": "TOTALE UITGAVEN",
"pdf_profit_loss_label": "WINST & VERLIES RAPPORT",
"pdf_sales_customers_label": "Sales Customer Report",
"pdf_sales_items_label": "Sales Item Report",
"pdf_tax_summery_label": "Tax Summary Report",
"pdf_income_label": "INKOMEN",
"pdf_net_profit_label": "NETTO WINST",
"pdf_customer_sales_report": "Verkooprapport: per klant",
"pdf_total_sales_label": "TOTALE VERKOPEN",
"pdf_item_sales_label": "Verkooprapport: Per Item",
"pdf_tax_report_label": "BELASTINGEN RAPPORT",
"pdf_total_tax_label": "TOTALE BELASTINGEN",
"pdf_tax_types_label": "Belastingtypen",
"pdf_expenses_label": "Uitgaven",
"pdf_bill_to": "Rekening naar,",
"pdf_ship_to": "Verzend naar,",
"pdf_received_from": "Received from:"
"pdf_received_from": "Ontvangen van:"
}

View File

@ -158,6 +158,8 @@
"copy_billing_address": "Cópia de faturamento",
"no_customers": "Ainda não há clientes!",
"no_customers_found": "Clientes não encontrados!",
"no_contact": "No contact",
"no_contact_name": "No contact name",
"list_of_customers": "Esta seção conterá a lista de clientes.",
"primary_display_name": "Nome de exibição principal",
"select_currency": "Selecione o tipo de moeda",
@ -181,6 +183,7 @@
"added_on": "Adicionado",
"price": "Preço",
"date_of_creation": "Data de criação",
"not_selected": "No item selected",
"action": "Ação",
"add_item": "Adicionar item",
"save_item": "Salvar item",
@ -250,6 +253,7 @@
"required": "Campo obrigatório"
},
"accepted": "Aceito",
"rejected": "Rejected",
"sent": "Enviado",
"draft": "Rascunho",
"declined": "Rejeitado",
@ -296,6 +300,9 @@
"all": "Todas",
"paid": "Paga",
"unpaid": "Não Paga",
"viewed": "Viewed",
"overdue": "Overdue",
"completed": "Completed",
"customer": "CLIENTE",
"paid_status": "STATUS PAGAMENTO",
"ref_no": "REFERÊNCIA",
@ -413,6 +420,8 @@
"update_payment": "Atualizar Pagamento",
"payment": "Pagamento | Pagamentos",
"no_payments": "Ainda sem pagamentos!",
"not_selected": "Not selected",
"no_invoice": "No invoice",
"no_matching_payments": "Não há pagamentos correspondentes!",
"list_of_payments": "Esta seção conterá a lista de pagamentos.",
"select_payment_mode": "Selecione a forma de pagamento",
@ -436,6 +445,7 @@
"receipt": "Receita",
"amount": "Montante",
"action": "Ação",
"not_selected": "Not selected",
"note": "Observação",
"category_id": "Categoria",
"date": "Data da Despesa",

View File

@ -177,6 +177,8 @@
"copy_billing_address": "Cópia de faturamento",
"no_customers": "Ainda não há clientes!",
"no_customers_found": "Clientes não encontrados!",
"no_contact": "No contact",
"no_contact_name": "No contact name",
"list_of_customers": "Esta seção conterá a lista de clientes.",
"primary_display_name": "Nome de exibição principal",
"select_currency": "Selecione o tipo de moeda",
@ -200,6 +202,7 @@
"added_on": "Adicionado",
"price": "Preço",
"date_of_creation": "Data de criação",
"not_selected": "No item selected",
"action": "Ação",
"add_item": "Adicionar item",
"save_item": "Salvar item",
@ -270,6 +273,7 @@
"required": "Campo obrigatório"
},
"accepted": "Aceito",
"rejected": "Rejected",
"sent": "Enviado",
"draft": "Rascunho",
"declined": "Rejeitado",
@ -316,6 +320,9 @@
"all": "Todas",
"paid": "Paga",
"unpaid": "Não Paga",
"viewed": "Viewed",
"overdue": "Overdue",
"completed": "Completed",
"customer": "CLIENTE",
"paid_status": "STATUS PAGAMENTO",
"ref_no": "REFERÊNCIA",
@ -434,6 +441,8 @@
"update_payment": "Atualizar Pagamento",
"payment": "Pagamento | Pagamentos",
"no_payments": "Ainda sem pagamentos!",
"not_selected": "Not selected",
"no_invoice": "No invoice",
"no_matching_payments": "Não há pagamentos correspondentes!",
"list_of_payments": "Esta seção conterá a lista de pagamentos.",
"select_payment_mode": "Selecione a forma de pagamento",
@ -463,6 +472,7 @@
"receipt": "Receita",
"amount": "Montante",
"action": "Ação",
"not_selected": "Not selected",
"note": "Observação",
"category_id": "Categoria",
"date": "Data da Despesa",
@ -1147,6 +1157,7 @@
"pdf_amount_label": "Montante",
"pdf_subtotal": "Subtotal",
"pdf_total": "Total",
"pdf_payment_label": "Payment",
"pdf_payment_receipt_label": "PAYMENT RECEIPT",
"pdf_payment_date": "Payment Date",
"pdf_payment_number": "Número do Pagamento",
@ -1155,6 +1166,9 @@
"pdf_expense_report_label": "EXPENSES REPORT",
"pdf_total_expenses_label": "TOTAL EXPENSE",
"pdf_profit_loss_label": "PROFIT & LOSS REPORT",
"pdf_sales_customers_label": "Sales Customer Report",
"pdf_sales_items_label": "Sales Item Report",
"pdf_tax_summery_label": "Tax Summary Report",
"pdf_income_label": "INCOME",
"pdf_net_profit_label": "NET PROFIT",
"pdf_customer_sales_report": "Sales Report: By Customer",

View File

@ -178,6 +178,8 @@
"copy_billing_address": "Kopiraj iz adrese za naplatu",
"no_customers": "Još uvek nema klijenata!",
"no_customers_found": "Klijenti nisu pronađeni!",
"no_contact": "No contact",
"no_contact_name": "No contact name",
"list_of_customers": "Ova sekcija će da sadrži spisak klijenata.",
"primary_display_name": "Primarni naziv koji se prikazuje",
"select_currency": "Odaberi valutu",
@ -201,6 +203,7 @@
"added_on": "Datum dodavanja",
"price": "Cena",
"date_of_creation": "Datum kreiranja",
"not_selected": "No item selected",
"action": "Akcije",
"add_item": "Dodaj Stavku",
"save_item": "Sačuvaj Stavku",
@ -271,6 +274,7 @@
"required": "Polje je obavezno"
},
"accepted": "Prihvaćeno",
"rejected": "Rejected",
"sent": "Poslato",
"draft": "U izradi",
"declined": "Odbijeno",
@ -317,6 +321,9 @@
"all": "Sve",
"paid": "Plaćeno",
"unpaid": "Neplaćeno",
"viewed": "Viewed",
"overdue": "Overdue",
"completed": "Completed",
"customer": "KLIJENT",
"paid_status": "STATUS UPLATE",
"ref_no": "POZIV NA BROJ",
@ -435,6 +442,8 @@
"update_payment": "Ažuriraj Uplatu",
"payment": "Uplata | Uplate",
"no_payments": "Još uvek nema uplata!",
"not_selected": "Not selected",
"no_invoice": "No invoice",
"no_matching_payments": "Ne postoje uplate koje odgovaraju pretrazi!",
"list_of_payments": "Ova sekcija će da sadrži listu uplata.",
"select_payment_mode": "Odaberi način plaćanja",
@ -464,6 +473,7 @@
"receipt": "Račun",
"amount": "Iznos",
"action": "Akcija",
"not_selected": "Not selected",
"note": "Napomena",
"category_id": "ID kategorije",
"date": "Datum",
@ -1150,6 +1160,7 @@
"pdf_amount_label": "Iznos",
"pdf_subtotal": "Osnovica za obračun PDV-a",
"pdf_total": "Ukupan iznos",
"pdf_payment_label": "Payment",
"pdf_payment_receipt_label": "POTVRDA O UPLATI",
"pdf_payment_date": "Datum Uplate",
"pdf_payment_number": "Broj Uplate",
@ -1158,6 +1169,9 @@
"pdf_expense_report_label": "IZVEŠTAJ O RASHODIMA",
"pdf_total_expenses_label": "RASHODI UKUPNO",
"pdf_profit_loss_label": "IZVEŠTAJ O PRIHODIMA I RASHODIMA",
"pdf_sales_customers_label": "Sales Customer Report",
"pdf_sales_items_label": "Sales Item Report",
"pdf_tax_summery_label": "Tax Summary Report",
"pdf_income_label": "PRIHOD",
"pdf_net_profit_label": "NETO PROFIT",
"pdf_customer_sales_report": "Izveštaj o Prodaji: Po Klijentu",

View File

@ -178,6 +178,8 @@
"copy_billing_address": "Kopiera från faktura",
"no_customers": "Inga kunder än!",
"no_customers_found": "Hittade inga kunder!",
"no_contact": "No contact",
"no_contact_name": "No contact name",
"list_of_customers": "Här kommer det finnas en lista med kunder.",
"primary_display_name": "Visningsnamn",
"select_currency": "Välj valuta",
@ -201,6 +203,7 @@
"added_on": "Tillagd den",
"price": "Pris",
"date_of_creation": "Skapandedatum",
"not_selected": "No item selected",
"action": "Handling",
"add_item": "Skapa artikel",
"save_item": "Spara artikel",
@ -271,6 +274,7 @@
"required": "Fältet är tvingande"
},
"accepted": "Accepterad",
"rejected": "Rejected",
"sent": "Skickat",
"draft": "Utkast",
"declined": "Avvisad",
@ -317,6 +321,9 @@
"all": "Alla",
"paid": "Betalda",
"unpaid": "Obetalda",
"viewed": "Viewed",
"overdue": "Overdue",
"completed": "Completed",
"customer": "KUNDER",
"paid_status": "BETALSTATUS",
"ref_no": "REF NR.",
@ -435,6 +442,8 @@
"update_payment": "Uppdatera betalning",
"payment": "Betalning | Betalningar",
"no_payments": "Inga betalningar än!",
"not_selected": "Not selected",
"no_invoice": "No invoice",
"no_matching_payments": "Inga matchande betalningar!",
"list_of_payments": "Här kommer listan med betalningar finnas.",
"select_payment_mode": "Välj betalningssätt",
@ -464,6 +473,7 @@
"receipt": "Kvitto",
"amount": "Summa",
"action": "Handling",
"not_selected": "Not selected",
"note": "Notering",
"category_id": "Kategorins ID",
"date": "Datum",
@ -1149,6 +1159,7 @@
"pdf_amount_label": "Belopp",
"pdf_subtotal": "Delsumma",
"pdf_total": "Summa",
"pdf_payment_label": "Payment",
"pdf_payment_receipt_label": "Betalningskvitto",
"pdf_payment_date": "Betalningsdatum",
"pdf_payment_number": "Betalningsnummer",
@ -1157,6 +1168,9 @@
"pdf_expense_report_label": "Kostnadsrapport",
"pdf_total_expenses_label": "Totalkostnad",
"pdf_profit_loss_label": "Resultat- och förlustrapport",
"pdf_sales_customers_label": "Sales Customer Report",
"pdf_sales_items_label": "Sales Item Report",
"pdf_tax_summery_label": "Tax Summary Report",
"pdf_income_label": "Inkomst",
"pdf_net_profit_label": "Nettoförtjänst",
"pdf_customer_sales_report": "Försäljningsrapport: Per kund",

View File

@ -2,10 +2,10 @@
<base-page class="customer-create">
<sw-page-header :title="$t('customers.title')">
<sw-breadcrumb slot="breadcrumbs">
<sw-breadcrumb-item to="dashboard" :title="$t('general.home')" />
<sw-breadcrumb-item :title="$t('general.home')" to="dashboard" />
<sw-breadcrumb-item
to="#"
:title="$tc('customers.customer', 2)"
to="#"
active
/>
</sw-breadcrumb>
@ -159,7 +159,7 @@
:filterable="false"
cell-class="no-click"
>
<div class="relative block" slot-scope="row">
<div slot-scope="row" class="relative block">
<sw-checkbox
:id="row.id"
v-model="selectField"
@ -195,7 +195,7 @@
<template slot-scope="row">
<span>{{ $t('customers.contact_name') }}</span>
<span>
{{ row.contact_name ? row.contact_name : 'No Contact Name' }}
{{ row.contact_name ? row.contact_name : $t('customers.no_contact_name') }}
</span>
</template>
</sw-table-column>
@ -208,7 +208,7 @@
<template slot-scope="row">
<span>{{ $t('customers.phone') }}</span>
<span>
{{ row.phone ? row.phone : 'No Contact' }}
{{ row.phone ? row.phone : $t('customers.no_contact') }}
</span>
</template>
</sw-table-column>
@ -243,16 +243,16 @@
<dot-icon slot="activator" />
<sw-dropdown-item
tag-name="router-link"
:to="`customers/${row.id}/edit`"
tag-name="router-link"
>
<pencil-icon class="h-5 mr-3 text-gray-600" />
{{ $t('general.edit') }}
</sw-dropdown-item>
<sw-dropdown-item
tag-name="router-link"
:to="`customers/${row.id}/view`"
tag-name="router-link"
>
<eye-icon class="h-5 mr-3 text-gray-600" />
{{ $t('general.view') }}
@ -281,7 +281,6 @@ import {
EyeIcon,
} from '@vue-hero-icons/solid'
import AstronautIcon from '../../components/icon/AstronautIcon'
import { request } from 'http'
export default {
components: {

View File

@ -35,10 +35,10 @@
<sw-dropdown-item class="flex cursor-pointer">
<sw-input-group class="-mt-3 font-normal">
<sw-radio
:label="$t('customers.create_date')"
size="sm"
id="filter_create_date"
:label="$t('customers.create_date')"
v-model="searchData.orderByField"
size="sm"
name="filter"
value="invoices.created_at"
@change="onSearch"
@ -49,10 +49,10 @@
<sw-dropdown-item class="flex cursor-pointer">
<sw-input-group class="-mt-3 font-normal">
<sw-radio
:label="$t('customers.display_name')"
size="sm"
id="filter_display_name"
:label="$t('customers.display_name')"
v-model="searchData.orderByField"
size="sm"
name="filter"
value="users.name"
@change="onSearch"
@ -62,8 +62,8 @@
</sw-dropdown>
<sw-button
class="ml-1"
v-tooltip.top-center="{ content: getOrderName }"
class="ml-1"
size="md"
variant="gray-light"
@click="sortData"
@ -102,13 +102,13 @@
{{ customer.name }}
</div>
<div
class="mt-1 text-xs not-italic font-medium leading-5 text-gray-600"
v-if="customer.contact_name"
class="mt-1 text-xs not-italic font-medium leading-5 text-gray-600"
>
{{ customer.contact_name }}
</div>
</div>
<div class="flex-1 whitespace-no-wrap right">
<div class="flex-1 whitespace-nowrap right">
<div
class="text-xl not-italic font-semibold leading-8 text-right text-gray-900"
v-html="$utils.formatMoney(customer.due_amount, customer.currency)"

View File

@ -65,9 +65,11 @@
:color="$utils.getBadgeStatusColor(row.status).color"
>
{{
row.status != 'PARTIALLY_PAID'
? row.status
: row.status.replace('_', ' ')
$utils.getStatusTranslation(
row.status != 'PARTIALLY_PAID'
? row.status
: row.status.replace('_', ' ')
)
}}
</sw-badge>
</template>

View File

@ -9,7 +9,7 @@
{{ $t('general.you_got_lost') }}
</h5>
<router-link
class="flex items-center w-32 h-12 px-2 py-1 text-base font-medium leading-none text-center text-white whitespace-no-wrap rounded bg-primary-500 btn-lg hover:text-white"
class="flex items-center w-32 h-12 px-2 py-1 text-base font-medium leading-none text-center text-white whitespace-nowrap rounded bg-primary-500 btn-lg hover:text-white"
to="/admin/dashboard"
>
<arrow-left-icon class="mr-2 text-white icon" />

View File

@ -7,23 +7,23 @@
<sw-page-header :title="pageTitle">
<sw-breadcrumb slot="breadcrumbs">
<sw-breadcrumb-item
to="/admin/dashboard"
:title="$t('general.home')"
to="/admin/dashboard"
/>
<sw-breadcrumb-item
to="/admin/estimates"
:title="$tc('estimates.estimate', 2)"
to="/admin/estimates"
/>
<sw-breadcrumb-item
v-if="$route.name === 'estimates.edit'"
to="#"
:title="$t('estimates.edit_estimate')"
to="#"
active
/>
<sw-breadcrumb-item
v-else
to="#"
:title="$t('estimates.new_estimate')"
to="#"
active
/>
</sw-breadcrumb>
@ -31,8 +31,8 @@
<template slot="actions">
<sw-button
v-if="$route.name === 'estimates.edit'"
tag-name="a"
:href="`/estimates/pdf/${newEstimate.unique_hash}`"
tag-name="a"
target="_blank"
class="mr-3"
variant="primary-outline"
@ -59,9 +59,9 @@
<!-- Select Customer & Basic Fields -->
<div class="grid-cols-12 gap-8 mt-6 mb-8 lg:grid">
<customer-select
class="col-span-5 pr-0"
:valid="$v.selectedCustomer"
:customer-id="customerId"
class="col-span-5 pr-0"
/>
<div
@ -218,7 +218,7 @@
<div class="mb-6">
<sw-popup
ref="notePopup"
class="text-sm font-semibold leading-5 text-primary-400"
class="z-10 text-sm font-semibold leading-5 text-primary-400"
>
<div slot="activator" class="float-right mt-1">
+ {{ $t('general.insert_note') }}
@ -235,8 +235,8 @@
</div>
<div
class="grid gap-x-4 gap-y-2 md:gap-x-8 md:gap-y-4 grid-col-1 md:grid-cols-2"
v-if="customFields.length > 0"
class="grid gap-x-4 gap-y-2 md:gap-x-8 md:gap-y-4 grid-col-1 md:grid-cols-2"
>
<sw-input-group
v-for="(field, index) in customFields"
@ -247,7 +247,7 @@
<component
:type="field.type.label"
:field="field"
:isEdit="isEdit"
:is-edit="isEdit"
:is="field.type + 'Field'"
:invalid-fields="invalidFields"
@update="setCustomFieldValue"
@ -322,8 +322,8 @@
<sw-button
slot="activator"
type="button"
class="flex items-center justify-center w-12 border border-gray-300 border-solid rounded-tl-none rounded-bl-none font-base"
data-toggle="dropdown"
size="discount"
aria-haspopup="true"
aria-expanded="false"
style="height: 43px"
@ -366,8 +366,8 @@
</div>
<sw-popup
ref="taxModal"
v-if="taxPerItem === 'NO' || taxPerItem === null"
ref="taxModal"
class="my-3 text-sm font-semibold leading-5 text-primary-400"
>
<div slot="activator" class="float-right pt-2 pb-4">
@ -425,8 +425,6 @@ const {
} = require('vuelidate/lib/validators')
export default {
mixins: [CustomFieldsMixin],
components: {
EstimateItem,
CustomerSelect,
@ -438,6 +436,7 @@ export default {
PlusSmIcon,
HashtagIcon,
},
mixins: [CustomFieldsMixin],
data() {
return {
@ -470,7 +469,6 @@ export default {
isLoadingEstimate: false,
isLoadingData: false,
isLoading: false,
maxDiscount: 0,
estimateNumAttribute: null,
estimatePrefix: null,
EstimateFields: [
@ -563,7 +561,7 @@ export default {
if (this.newEstimate.discount_type === 'percentage') {
this.newEstimate.discount_val = (this.subtotal * newValue) / 100
} else {
this.newEstimate.discount_val = newValue * 100
this.newEstimate.discount_val = Math.round(newValue * 100)
}
this.newEstimate.discount = newValue
@ -727,7 +725,9 @@ export default {
return
}
this.newEstimate.discount_val = this.newEstimate.discount * 100
this.newEstimate.discount_val = Math.round(
this.newEstimate.discount * 100
)
this.newEstimate.discount_type = 'fixed'
},
@ -953,12 +953,15 @@ export default {
let amount = 0
if (selectedTax.compound_tax && this.subtotalWithDiscount) {
amount =
amount = Math.round(
((this.subtotalWithDiscount + this.totalSimpleTax) *
selectedTax.percent) /
100
100
)
} else if (this.subtotalWithDiscount && selectedTax.percent) {
amount = (this.subtotalWithDiscount * selectedTax.percent) / 100
amount = Math.round(
(this.subtotalWithDiscount * selectedTax.percent) / 100
)
}
this.newEstimate.taxes.push({
@ -971,7 +974,7 @@ export default {
amount,
})
if (this.$$refs) {
if (this.$refs) {
this.$refs.taxModal.close()
}
},

View File

@ -25,7 +25,7 @@
<div v-if="selectedCustomer.billing_address">
<div class="flex flex-col">
<label
class="mb-1 text-sm font-medium text-gray-500 uppercase whitespace-no-wrap"
class="mb-1 text-sm font-medium text-gray-500 uppercase whitespace-nowrap"
>
{{ $t('general.bill_to') }}
</label>
@ -77,7 +77,7 @@
<div v-if="selectedCustomer.shipping_address">
<div class="flex flex-col">
<label
class="mb-1 text-sm font-medium text-gray-500 uppercase whitespace-no-wrap"
class="mb-1 text-sm font-medium text-gray-500 uppercase whitespace-nowrap"
>
{{ $t('general.ship_to') }}
</label>

View File

@ -45,11 +45,13 @@ export default {
computed: {
taxAmount() {
if (this.tax.compound_tax && this.total) {
return ((this.total + this.totalTax) * this.tax.percent) / 100
return Math.round(
((this.total + this.totalTax) * this.tax.percent) / 100
)
}
if (this.total && this.tax.percent) {
return (this.total * this.tax.percent) / 100
return Math.round((this.total * this.tax.percent) / 100)
}
return 0

View File

@ -254,7 +254,7 @@
:color="$utils.getBadgeStatusColor(row.status).color"
class="px-3 py-1"
>
{{ row.status }}
{{ $utils.getStatusTranslation(row.status) }}
</sw-badge>
</template>
</sw-table-column>

View File

@ -85,9 +85,10 @@
slot="activator"
type="button"
data-toggle="dropdown"
size="discount"
aria-haspopup="true"
aria-expanded="false"
style="height: 43px; padding: 6px"
style="height: 43px"
variant="white"
>
<span class="flex">
@ -256,7 +257,7 @@ export default {
if (this.item.discount_type === 'percentage') {
this.item.discount_val = (this.subtotal * newValue) / 100
} else {
this.item.discount_val = newValue * 100
this.item.discount_val = Math.round(newValue * 100)
}
this.item.discount = newValue
@ -266,22 +267,26 @@ export default {
return this.subtotal - this.item.discount_val
},
totalSimpleTax() {
return window._.sumBy(this.item.taxes, function (tax) {
if (!tax.compound_tax) {
return tax.amount
}
return Math.round(
window._.sumBy(this.item.taxes, function (tax) {
if (!tax.compound_tax) {
return tax.amount
}
return 0
})
return 0
})
)
},
totalCompoundTax() {
return window._.sumBy(this.item.taxes, function (tax) {
if (tax.compound_tax) {
return tax.amount
}
return Math.round(
window._.sumBy(this.item.taxes, function (tax) {
if (tax.compound_tax) {
return tax.amount
}
return 0
})
return 0
})
)
},
totalTax() {
return this.totalSimpleTax + this.totalCompoundTax
@ -296,8 +301,8 @@ export default {
},
set: function (newValue) {
if (parseFloat(newValue) > 0) {
this.item.price = (newValue * 100).toFixed(2)
this.maxDiscount = this.item.price
this.item.price = Math.round(newValue * 100)
this.maxDiscount = this.item.price * this.item.quantity
} else {
this.item.price = newValue
}
@ -411,7 +416,7 @@ export default {
return
}
this.item.discount_val = this.item.discount * 100
this.item.discount_val = Math.round(this.item.discount * 100)
this.item.discount_type = 'fixed'
},
selectPercentage() {

View File

@ -32,8 +32,8 @@
</sw-dropdown-item>
<sw-dropdown-item
tag-name="router-link"
:to="`/admin/estimates/${$route.params.id}/edit`"
tag-name="router-link"
>
<pencil-icon class="h-5 mr-3 text-primary-800" />
{{ $t('general.edit') }}
@ -96,8 +96,8 @@
<sw-radio
id="filter_due_date"
v-model="searchData.orderByField"
value="expiry_date"
:label="$t('estimates.due_date')"
value="expiry_date"
size="sm"
name="filter"
@change="onSearched"
@ -110,8 +110,8 @@
<sw-radio
id="filter_estimate_number"
v-model="searchData.orderByField"
value="estimate_number"
:label="$t('estimates.estimate_number')"
value="estimate_number"
size="sm"
name="filter"
@change="onSearched"
@ -121,8 +121,8 @@
</sw-dropdown>
<sw-button
class="ml-1"
v-tooltip.top-center="{ content: getOrderName }"
class="ml-1"
size="md"
variant="gray-light"
@click="sortData"
@ -168,15 +168,15 @@
</div>
<sw-badge
class="px-1 text-xs"
:bg-color="$utils.getBadgeStatusColor(estimate.status).bgColor"
:color="$utils.getBadgeStatusColor(estimate.status).color"
class="px-1 text-xs"
>
{{ estimate.status }}
{{ $utils.getStatusTranslation(estimate.status) }}
</sw-badge>
</div>
<div class="flex-1 whitespace-no-wrap right">
<div class="flex-1 whitespace-nowrap right">
<div
class="mb-2 text-xl not-italic font-semibold leading-8 text-right text-gray-900"
v-html="

View File

@ -2,29 +2,29 @@
<base-page class="relative">
<form action="" @submit.prevent="sendData">
<!-- Page Header -->
<sw-page-header class="mb-5" :title="pageTitle">
<sw-page-header :title="pageTitle" class="mb-5">
<sw-breadcrumb slot="breadcrumbs">
<sw-breadcrumb-item
to="/admin/dashboard"
:title="$t('general.home')"
to="/admin/dashboard"
/>
<sw-breadcrumb-item
to="/admin/expenses"
:title="$tc('expenses.expense', 2)"
to="/admin/expenses"
/>
<sw-breadcrumb-item
v-if="$route.name === 'expenses.edit'"
to="#"
:title="$t('expenses.edit_expense')"
to="#"
active
/>
<sw-breadcrumb-item
v-else
to="#"
:title="$t('expenses.new_expense')"
to="#"
active
/>
</sw-breadcrumb>
@ -32,8 +32,8 @@
<template slot="actions">
<sw-button
v-if="isReceiptAvailable"
tag-name="a"
:href="getReceiptUrl"
tag-name="a"
variant="primary"
outline
size="lg"
@ -122,8 +122,8 @@
<sw-money
v-model="amount"
:currency="defaultCurrencyForInput"
class="focus:border focus:border-solid focus:border-primary-500"
:invalid="$v.formData.amount.$error"
class="focus:border focus:border-solid focus:border-primary-500"
@input="$v.formData.amount.$touch()"
/>
</sw-input-group>
@ -176,9 +176,9 @@
</div>
<sw-avatar
trigger="#receipt-box"
:preview-avatar="previewReceipt"
:enable-cropper="false"
trigger="#receipt-box"
@changed="onChange"
>
<template v-slot:icon>
@ -201,7 +201,7 @@
<component
:type="field.type.label"
:field="field"
:isEdit="isEdit"
:is-edit="isEdit"
:is="field.type + 'Field'"
:invalid-fields="invalidFields"
@update="setCustomFieldValue"
@ -242,13 +242,12 @@ import { CloudUploadIcon, ShoppingCartIcon } from '@vue-hero-icons/solid'
import CustomFieldsMixin from '../../mixins/customFields'
export default {
mixins: [CustomFieldsMixin],
components: {
CloudUploadIcon,
ShoppingCartIcon,
DownloadIcon,
},
mixins: [CustomFieldsMixin],
props: {
addname: {
@ -315,7 +314,7 @@ export default {
return this.formData.amount / 100
},
set: function (newValue) {
this.formData.amount = newValue * 100
this.formData.amount = Math.round(newValue * 100)
},
},

View File

@ -208,7 +208,7 @@
>
<template slot-scope="row">
<span>{{ $t('expenses.customer') }}</span>
<span> {{ row.user_name ? row.user_name : 'Not selected' }} </span>
<span> {{ row.user_name ? row.user_name : $t('expenses.not_selected') }} </span>
</template>
</sw-table-column>

View File

@ -7,23 +7,23 @@
<sw-page-header :title="pageTitle">
<sw-breadcrumb slot="breadcrumbs">
<sw-breadcrumb-item
to="/admin/dashboard"
:title="$t('general.home')"
to="/admin/dashboard"
/>
<sw-breadcrumb-item
to="/admin/invoices"
:title="$tc('invoices.invoice', 2)"
to="/admin/invoices"
/>
<sw-breadcrumb-item
v-if="$route.name === 'invoice.edit'"
to="#"
v-if="$route.name === 'invoices.edit'"
:title="$t('invoices.edit_invoice')"
to="#"
active
/>
<sw-breadcrumb-item
v-else
to="#"
:title="$t('invoices.new_invoice')"
to="#"
active
/>
</sw-breadcrumb>
@ -32,8 +32,8 @@
<sw-button
v-if="$route.name === 'invoices.edit'"
:disabled="isLoading"
tag-name="a"
:href="`/invoices/pdf/${newInvoice.unique_hash}`"
tag-name="a"
variant="primary-outline"
class="mr-3"
target="_blank"
@ -58,9 +58,9 @@
<!-- Select Customer & Basic Fields -->
<div class="grid-cols-12 gap-8 mt-6 mb-8 lg:grid">
<customer-select
class="col-span-5 pr-0"
:valid="$v.selectedCustomer"
:customer-id="customerId"
class="col-span-5 pr-0"
/>
<div
@ -211,7 +211,7 @@
<div class="mb-6">
<sw-popup
ref="notePopup"
class="text-sm font-semibold leading-5 text-primary-400"
class="z-10 text-sm font-semibold leading-5 text-primary-400"
>
<div slot="activator" class="float-right mt-1">
+ {{ $t('general.insert_note') }}
@ -227,8 +227,8 @@
</div>
<div
class="grid gap-x-4 gap-y-2 md:gap-x-8 md:gap-y-4 grid-col-1 md:grid-cols-2"
v-if="customFields.length > 0"
class="grid gap-x-4 gap-y-2 md:gap-x-8 md:gap-y-4 grid-col-1 md:grid-cols-2"
>
<sw-input-group
v-for="(field, index) in customFields"
@ -239,7 +239,7 @@
<component
:type="field.type.label"
:field="field"
:isEdit="isEdit"
:is-edit="isEdit"
:is="field.type + 'Field'"
:invalid-fields="invalidFields"
@update="setCustomFieldValue"
@ -315,8 +315,8 @@
<sw-button
slot="activator"
type="button"
class="flex items-center justify-center w-12 border border-gray-300 border-solid rounded-tl-none rounded-bl-none font-base"
data-toggle="dropdown"
size="discount"
aria-haspopup="true"
aria-expanded="false"
style="height: 43px"
@ -418,8 +418,6 @@ const {
} = require('vuelidate/lib/validators')
export default {
mixins: [CustomFieldsMixin],
components: {
InvoiceItem,
CustomerSelect,
@ -431,6 +429,7 @@ export default {
ShoppingCartIcon,
HashtagIcon,
},
mixins: [CustomFieldsMixin],
data() {
return {
@ -558,7 +557,7 @@ export default {
if (this.newInvoice.discount_type === 'percentage') {
this.newInvoice.discount_val = (this.subtotal * newValue) / 100
} else {
this.newInvoice.discount_val = newValue * 100
this.newInvoice.discount_val = Math.round(newValue * 100)
}
this.newInvoice.discount = newValue
@ -566,23 +565,27 @@ export default {
},
totalSimpleTax() {
return window._.sumBy(this.newInvoice.taxes, function (tax) {
if (!tax.compound_tax) {
return tax.amount
}
return Math.round(
window._.sumBy(this.newInvoice.taxes, function (tax) {
if (!tax.compound_tax) {
return tax.amount
}
return 0
})
return 0
})
)
},
totalCompoundTax() {
return window._.sumBy(this.newInvoice.taxes, function (tax) {
if (tax.compound_tax) {
return tax.amount
}
return Math.round(
window._.sumBy(this.newInvoice.taxes, function (tax) {
if (tax.compound_tax) {
return tax.amount
}
return 0
})
return 0
})
)
},
totalTax() {
@ -590,9 +593,11 @@ export default {
return this.totalSimpleTax + this.totalCompoundTax
}
return window._.sumBy(this.newInvoice.items, function (tax) {
return tax.tax
})
return Math.round(
window._.sumBy(this.newInvoice.items, function (tax) {
return tax.tax
})
)
},
allTaxes() {
@ -722,7 +727,7 @@ export default {
return
}
this.newInvoice.discount_val = this.newInvoice.discount * 100
this.newInvoice.discount_val = Math.round(this.newInvoice.discount * 100)
this.newInvoice.discount_type = 'fixed'
},
@ -952,12 +957,15 @@ export default {
let amount = 0
if (selectedTax.compound_tax && this.subtotalWithDiscount) {
amount =
amount = Math.round(
((this.subtotalWithDiscount + this.totalSimpleTax) *
selectedTax.percent) /
100
100
)
} else if (this.subtotalWithDiscount && selectedTax.percent) {
amount = (this.subtotalWithDiscount * selectedTax.percent) / 100
amount = Math.round(
(this.subtotalWithDiscount * selectedTax.percent) / 100
)
}
this.newInvoice.taxes.push({

View File

@ -27,7 +27,7 @@
<div v-if="selectedCustomer.billing_address">
<div class="flex flex-col">
<label
class="mb-1 text-sm font-medium text-gray-500 uppercase whitespace-no-wrap"
class="mb-1 text-sm font-medium text-gray-500 uppercase whitespace-nowrap"
>
{{ $t('general.bill_to') }}
</label>
@ -79,7 +79,7 @@
<div v-if="selectedCustomer.shipping_address" class="col col-6">
<div class="flex flex-col">
<label
class="mb-1 text-sm font-medium text-gray-500 uppercase whitespace-no-wrap"
class="mb-1 text-sm font-medium text-gray-500 uppercase whitespace-nowrap"
>
{{ $t('general.ship_to') }}
</label>

View File

@ -241,7 +241,7 @@
:bg-color="$utils.getBadgeStatusColor(row.status).bgColor"
:color="$utils.getBadgeStatusColor(row.status).color"
>
{{ row.status.replace('_', ' ') }}
{{ $utils.getStatusTranslation(row.status.replace('_', ' ')) }}
</sw-badge>
</template>
</sw-table-column>
@ -258,7 +258,7 @@
:bg-color="$utils.getBadgeStatusColor(row.status).bgColor"
:color="$utils.getBadgeStatusColor(row.status).color"
>
{{ row.paid_status.replace('_', ' ') }}
{{ $utils.getStatusTranslation(row.paid_status.replace('_', ' ')) }}
</sw-badge>
</template>
</sw-table-column>

View File

@ -45,11 +45,13 @@ export default {
computed: {
taxAmount() {
if (this.tax.compound_tax && this.total) {
return ((this.total + this.totalTax) * this.tax.percent) / 100
return Math.round(
((this.total + this.totalTax) * this.tax.percent) / 100
)
}
if (this.total && this.tax.percent) {
return (this.total * this.tax.percent) / 100
return Math.round((this.total * this.tax.percent) / 100)
}
return 0

View File

@ -83,8 +83,8 @@
<sw-button
slot="activator"
type="button"
class="flex items-center px-5 py-1 text-sm font-medium leading-none text-center text-gray-500 whitespace-no-wrap border border-gray-300 border-solid rounded rounded-tl-none rounded-bl-none dropdown-toggle"
data-toggle="dropdown"
size="discount"
aria-haspopup="true"
aria-expanded="false"
style="height: 43px"
@ -256,7 +256,7 @@ export default {
if (this.item.discount_type === 'percentage') {
this.item.discount_val = (this.subtotal * newValue) / 100
} else {
this.item.discount_val = newValue * 100
this.item.discount_val = Math.round(newValue * 100)
}
this.item.discount = newValue
@ -266,22 +266,26 @@ export default {
return this.subtotal - this.item.discount_val
},
totalSimpleTax() {
return window._.sumBy(this.item.taxes, function (tax) {
if (!tax.compound_tax) {
return tax.amount
}
return Math.round(
window._.sumBy(this.item.taxes, function (tax) {
if (!tax.compound_tax) {
return tax.amount
}
return 0
})
return 0
})
)
},
totalCompoundTax() {
return window._.sumBy(this.item.taxes, function (tax) {
if (tax.compound_tax) {
return tax.amount
}
return Math.round(
window._.sumBy(this.item.taxes, function (tax) {
if (tax.compound_tax) {
return tax.amount
}
return 0
})
return 0
})
)
},
totalTax() {
return this.totalSimpleTax + this.totalCompoundTax
@ -296,8 +300,8 @@ export default {
},
set: function (newValue) {
if (parseFloat(newValue) > 0) {
this.item.price = (newValue * 100).toFixed(2)
this.maxDiscount = this.item.price
this.item.price = Math.round(newValue * 100)
this.maxDiscount = this.item.price * this.item.quantity
} else {
this.item.price = newValue
}
@ -412,7 +416,7 @@ export default {
return
}
this.item.discount_val = this.item.discount * 100
this.item.discount_val = Math.round(this.item.discount * 100)
this.item.discount_type = 'fixed'
},
selectPercentage() {

View File

@ -105,11 +105,13 @@ export default {
},
taxAmount() {
if (this.tax.compound_tax && this.total) {
return ((this.total + this.totalTax) * this.tax.percent) / 100
return Math.round(
((this.total + this.totalTax) * this.tax.percent) / 100
)
}
if (this.total && this.tax.percent) {
return (this.total * this.tax.percent) / 100
return Math.round((this.total * this.tax.percent) / 100)
}
return 0

View File

@ -27,8 +27,8 @@
invoice.status === 'OVERDUE' ||
invoice.status === 'VIEWED'
"
tag-name="router-link"
:to="`/admin/payments/${$route.params.id}/create`"
tag-name="router-link"
variant="primary"
class="text-sm"
>
@ -45,8 +45,8 @@
</sw-dropdown-item>
<sw-dropdown-item
tag-name="router-link"
:to="`/admin/invoices/${$route.params.id}/edit`"
tag-name="router-link"
>
<pencil-icon class="h-5 mr-3 text-gray-600" />
{{ $t('general.edit') }}
@ -125,10 +125,10 @@
<sw-radio
id="filter_invoice_number"
v-model="searchData.orderByField"
:label="$t('invoices.invoice_number')"
size="sm"
type="radio"
name="filter"
:label="$t('invoices.invoice_number')"
value="invoice_number"
@change="onSearch"
/>
@ -137,8 +137,8 @@
</sw-dropdown>
<sw-button
class="ml-1"
v-tooltip.top-center="{ content: getOrderName }"
class="ml-1"
size="md"
variant="gray-light"
@click="sortData"
@ -184,16 +184,16 @@
</div>
<sw-badge
class="px-1 text-xs"
:bg-color="$utils.getBadgeStatusColor(invoice.status).bgColor"
:color="$utils.getBadgeStatusColor(invoice.status).color"
:font-size="$utils.getBadgeStatusColor(invoice.status).fontSize"
class="px-1 text-xs"
>
{{ invoice.status }}
{{ $utils.getStatusTranslation(invoice.status) }}
</sw-badge>
</div>
<div class="flex-1 whitespace-no-wrap right">
<div class="flex-1 whitespace-nowrap right">
<div
class="mb-2 text-xl not-italic font-semibold leading-8 text-right text-gray-900"
v-html="

View File

@ -1,20 +1,20 @@
<template>
<base-page>
<!-- Page Header -->
<sw-page-header class="mb-3" :title="pageTitle">
<sw-page-header :title="pageTitle" class="mb-3">
<sw-breadcrumb slot="breadcrumbs">
<sw-breadcrumb-item to="/admin/dashboard" :title="$t('general.home')" />
<sw-breadcrumb-item to="/admin/items" :title="$tc('items.item', 2)" />
<sw-breadcrumb-item :title="$t('general.home')" to="/admin/dashboard" />
<sw-breadcrumb-item :title="$tc('items.item', 2)" to="/admin/items" />
<sw-breadcrumb-item
v-if="$route.name === 'items.edit'"
to="#"
:title="$t('items.edit_item')"
to="#"
active
/>
<sw-breadcrumb-item
v-else
to="#"
:title="$t('items.new_item')"
to="#"
active
/>
</sw-breadcrumb>
@ -59,11 +59,11 @@
<sw-input-group :label="$t('items.unit')" class="mb-4">
<sw-select
v-model="formData.unit"
class="mt-2"
:options="itemUnits"
:searchable="true"
:show-labels="false"
:placeholder="$t('items.select_a_unit')"
class="mt-2"
label="name"
>
<div
@ -89,12 +89,12 @@
>
<sw-select
v-model="formData.taxes"
class="mt-2"
:options="getTaxTypes"
:searchable="true"
:show-labels="false"
:allow-empty="true"
:multiple="true"
class="mt-2"
track-by="tax_type_id"
label="tax_name"
/>
@ -187,7 +187,7 @@ export default {
return this.formData.price / 100
},
set: function (newValue) {
this.formData.price = newValue * 100
this.formData.price = Math.round(newValue * 100)
},
},

View File

@ -2,8 +2,8 @@
<base-page>
<sw-page-header :title="$t('items.title')">
<sw-breadcrumb slot="breadcrumbs">
<sw-breadcrumb-item to="dashboard" :title="$t('general.home')" />
<sw-breadcrumb-item to="#" :title="$tc('items.item', 2)" active />
<sw-breadcrumb-item :title="$t('general.home')" to="dashboard" />
<sw-breadcrumb-item :title="$tc('items.item', 2)" to="#" active />
</sw-breadcrumb>
<template slot="actions">
@ -50,9 +50,9 @@
v-model="filters.unit"
:options="itemUnits"
:searchable="true"
class="mt-2"
:show-labels="false"
:placeholder="$t('items.select_a_unit')"
class="mt-2"
label="name"
autocomplete="off"
/>
@ -189,7 +189,7 @@
<span>{{ $t('items.unit') }}</span>
<span>
{{ row.unit_name ? row.unit_name : 'Not selected' }}
{{ row.unit_name ? row.unit_name : $t('items.not_selected') }}
</span>
</template>
</sw-table-column>
@ -225,8 +225,8 @@
<dot-icon slot="activator" />
<sw-dropdown-item
tag-name="router-link"
:to="`items/${row.id}/edit`"
tag-name="router-link"
>
<pencil-icon class="h-5 mr-3 text-gray-600" />
{{ $t('general.edit') }}
@ -356,7 +356,7 @@ export default {
let data = {
search: this.filters.name !== null ? this.filters.name : '',
unit_id: this.filters.unit !== null ? this.filters.unit.id : '',
price: this.filters.price * 100,
price: Math.round(this.filters.price * 100),
orderByField: sort.fieldName || 'created_at',
orderBy: sort.order || 'desc',
page,

View File

@ -1,26 +1,26 @@
<template>
<base-page class="relative payment-create">
<form action="" @submit.prevent="submitPaymentData">
<sw-page-header class="mb-5" :title="pageTitle">
<sw-page-header :title="pageTitle" class="mb-5">
<sw-breadcrumb slot="breadcrumbs">
<sw-breadcrumb-item
to="/admin/dashboard"
:title="$t('general.home')"
to="/admin/dashboard"
/>
<sw-breadcrumb-item
to="/admin/payments"
:title="$tc('payments.payment', 2)"
to="/admin/payments"
/>
<sw-breadcrumb-item
v-if="$route.name === 'payments.edit'"
to="#"
:title="$t('payments.edit_payment')"
to="#"
active
/>
<sw-breadcrumb-item
v-else
to="#"
:title="$t('payments.new_payment')"
to="#"
active
/>
</sw-breadcrumb>
@ -134,8 +134,8 @@
:searchable="true"
:show-labels="false"
:placeholder="$t('payments.select_payment_mode')"
:max-height="150"
label="name"
:maxHeight="150"
class="mt-1"
>
<div slot="afterList">
@ -165,7 +165,7 @@
<component
:type="field.type.label"
:field="field"
:isEdit="isEdit"
:is-edit="isEdit"
:is="field.type + 'Field'"
:invalid-fields="invalidFields"
@update="setCustomFieldValue"
@ -218,9 +218,8 @@ import CustomFieldsMixin from '../../mixins/customFields'
const { required, between, numeric } = require('vuelidate/lib/validators')
export default {
mixins: [CustomFieldsMixin],
components: { ShoppingCartIcon },
mixins: [CustomFieldsMixin],
data() {
return {
@ -288,7 +287,7 @@ export default {
return this.formData.amount / 100
},
set: function (newValue) {
this.formData.amount = (newValue * 100).toFixed(2)
this.formData.amount = Math.round(newValue * 100)
},
},
pageTitle() {
@ -552,9 +551,11 @@ export default {
},
id: this.$route.params.id,
}
try {
this.isLoading = true
let response = await this.updatePayment(data)
if (response.data.success) {
this.isLoading = false
this.$router.push(
@ -563,17 +564,21 @@ export default {
window.toastr['success'](this.$t('payments.updated_message'))
return true
}
if (response.data.error === 'invalid_amount') {
window.toastr['error'](this.$t('invalid_amount_message'))
return false
}
window.toastr['error'](response.data.error)
} catch (err) {
this.isLoading = false
if (err.response.data.errors.payment_number) {
window.toastr['error'](err.response.data.errors.payment_number)
return true
}
window.toastr['error'](err.response.data.message)
}
} else {
@ -584,9 +589,12 @@ export default {
: null,
payment_date: moment(this.formData.payment_date).format('YYYY-MM-DD'),
}
this.isLoading = true
try {
let response = await this.addPayment(data)
if (response.data.success) {
this.$router.push(
`/admin/payments/${response.data.payment.id}/view`
@ -595,17 +603,21 @@ export default {
this.isLoading = true
return true
}
if (response.data.error === 'invalid_amount') {
window.toastr['error'](this.$t('invalid_amount_message'))
return false
}
window.toastr['error'](response.data.error)
} catch (err) {
this.isLoading = false
if (err.response.data.errors.payment_number) {
window.toastr['error'](err.response.data.errors.payment_number)
return true
}
window.toastr['error'](err.response.data.message)
}
}

View File

@ -202,7 +202,7 @@
<template slot-scope="row">
<span>{{ $t('payments.payment_mode') }}</span>
<span>
{{ row.payment_mode ? row.payment_mode : 'Not selected' }}
{{ row.payment_mode ? row.payment_mode : $t('payments.not_selected') }}
</span>
</template>
</sw-table-column>
@ -216,7 +216,7 @@
<template slot-scope="row">
<span>{{ $t('invoices.invoice_number') }}</span>
<span>
{{ row.invoice_number ? row.invoice_number : 'No Invoice' }}
{{ row.invoice_number ? row.invoice_number : $t('payments.no_invoice') }}
</span>
</template>
</sw-table-column>

View File

@ -20,8 +20,8 @@
</sw-dropdown-item>
<sw-dropdown-item
tag-name="router-link"
:to="`/admin/payments/${$route.params.id}/edit`"
tag-name="router-link"
>
<pencil-icon class="h-5 mr-3 text-gray-600" />
{{ $t('general.edit') }}
@ -68,10 +68,10 @@
<sw-dropdown-item class="flex cursor-pointer">
<sw-input-group class="-mt-3 font-normal">
<sw-radio
:label="$t('invoices.title')"
size="sm"
id="filter_invoice_number"
:label="$t('invoices.title')"
v-model="searchData.orderByField"
size="sm"
name="filter"
value="invoice_number"
@change="onSearch"
@ -82,10 +82,10 @@
<sw-dropdown-item class="flex cursor-pointer">
<sw-input-group class="-mt-3 font-normal">
<sw-radio
:label="$t('payments.date')"
size="sm"
id="filter_payment_date"
:label="$t('payments.date')"
v-model="searchData.orderByField"
size="sm"
name="filter"
value="payment_date"
@change="onSearch"
@ -109,8 +109,8 @@
</sw-dropdown>
<sw-button
class="ml-1"
v-tooltip.top-center="{ content: getOrderName }"
class="ml-1"
size="md"
variant="gray-light"
@click="sortData"
@ -162,7 +162,7 @@
</div>
</div>
<div class="flex-1 whitespace-no-wrap right">
<div class="flex-1 whitespace-nowrap right">
<div
class="mb-2 text-xl not-italic font-semibold leading-8 text-right text-gray-900"
v-html="$utils.formatMoney(payment.amount, payment.user.currency)"

View File

@ -65,7 +65,7 @@
/>
<a
class="flex items-center justify-center h-10 px-5 py-1 text-sm font-medium leading-none text-center text-white whitespace-no-wrap rounded md:hidden bg-primary-500"
class="flex items-center justify-center h-10 px-5 py-1 text-sm font-medium leading-none text-center text-white whitespace-nowrap rounded md:hidden bg-primary-500"
@click="viewReportsPDF"
>
<document-text-icon />

View File

@ -67,7 +67,7 @@
/>
<a
class="flex items-center justify-center h-10 px-5 py-1 text-sm font-medium leading-none text-center text-white whitespace-no-wrap rounded md:hidden bg-primary-500"
class="flex items-center justify-center h-10 px-5 py-1 text-sm font-medium leading-none text-center text-white whitespace-nowrap rounded md:hidden bg-primary-500"
@click="viewReportsPDF"
>
<document-text-icon />

View File

@ -79,7 +79,7 @@
class="hidden w-full h-screen border-gray-100 border-solid rounded md:flex"
/>
<a
class="flex items-center justify-center h-10 px-5 py-1 text-sm font-medium leading-none text-center text-white whitespace-no-wrap rounded md:hidden bg-primary-500"
class="flex items-center justify-center h-10 px-5 py-1 text-sm font-medium leading-none text-center text-white whitespace-nowrap rounded md:hidden bg-primary-500"
@click="viewReportsPDF"
>
<document-text-icon />

View File

@ -61,7 +61,7 @@
class="hidden w-full h-screen border-gray-100 border-solid rounded md:flex"
/>
<a
class="flex items-center justify-center h-10 px-5 py-1 text-sm font-medium leading-none text-center text-white whitespace-no-wrap rounded md:hidden bg-primary-500"
class="flex items-center justify-center h-10 px-5 py-1 text-sm font-medium leading-none text-center text-white whitespace-nowrap rounded md:hidden bg-primary-500"
@click="viewReportsPDF"
>
<document-text-icon />

View File

@ -1,7 +1,7 @@
<template>
<div class="relative setting-main-container backup">
<sw-card variant="setting-card">
<div slot="header" class="flex flex-wrap justify-between lg:flex-no-wrap">
<div slot="header" class="flex flex-wrap justify-between lg:flex-nowrap">
<div>
<h6 class="sw-section-title">
{{ $tc('settings.backup.title', 1) }}

View File

@ -1,6 +1,6 @@
<template>
<sw-card variant="setting-card">
<div slot="header" class="flex flex-wrap justify-between lg:flex-no-wrap">
<div slot="header" class="flex flex-wrap justify-between lg:flex-nowrap">
<div>
<h6 class="sw-section-title">
{{ $t('settings.menu_title.custom_fields') }}

View File

@ -59,12 +59,15 @@ export default {
this.isRequestOnGoing = true
let res = await this.fetchCompanySettings([
'payment_auto_generate',
'payment_email_attachment',
'payment_prefix',
'payment_mail_body',
'invoice_auto_generate',
'invoice_email_attachment',
'invoice_prefix',
'invoice_mail_body',
'estimate_auto_generate',
'estimate_email_attachment',
'estimate_prefix',
'estimate_mail_body',
'invoice_billing_address_format',

View File

@ -1,6 +1,6 @@
<template>
<sw-card variant="setting-card">
<div slot="header" class="flex flex-wrap justify-between lg:flex-no-wrap">
<div slot="header" class="flex flex-wrap justify-between lg:flex-nowrap">
<div>
<h6 class="sw-section-title">
{{ $t('settings.expense_category.title') }}
@ -51,7 +51,7 @@
}}</span>
<div class="w-48 overflow-hidden notes">
<div
class="overflow-hidden whitespace-no-wrap"
class="overflow-hidden whitespace-nowrap"
style="text-overflow: ellipsis"
>
{{ row.description }}

View File

@ -1,7 +1,7 @@
<template>
<div class="setting-main-container backup">
<sw-card variant="setting-card">
<div slot="header" class="flex flex-wrap justify-between lg:flex-no-wrap">
<div slot="header" class="flex flex-wrap justify-between lg:flex-nowrap">
<div>
<h6 class="sw-section-title">
{{ $tc('settings.disk.title', 1) }}

View File

@ -1,6 +1,6 @@
<template>
<sw-card variant="setting-card">
<div slot="header" class="flex flex-wrap justify-between lg:flex-no-wrap">
<div slot="header" class="flex flex-wrap justify-between lg:flex-nowrap">
<div>
<h6 class="sw-section-title">
{{ $t('settings.customization.notes.title') }}

View File

@ -1,6 +1,6 @@
<template>
<sw-card variant="setting-card">
<div slot="header" class="flex flex-wrap justify-between lg:flex-no-wrap">
<div slot="header" class="flex flex-wrap justify-between lg:flex-nowrap">
<div>
<h6 class="sw-section-title">
{{ $t('settings.customization.payments.payment_modes') }}

View File

@ -1,6 +1,6 @@
<template>
<sw-card variant="setting-card">
<div slot="header" class="flex flex-wrap justify-between lg:flex-no-wrap">
<div slot="header" class="flex flex-wrap justify-between lg:flex-nowrap">
<div>
<h6 class="sw-section-title">
{{ $t('settings.tax_types.title') }}

View File

@ -1,5 +1,5 @@
<template>
<form @submit.prevent="updateUserData" class="relative h-full">
<form class="relative h-full" @submit.prevent="updateUserData">
<base-loader v-if="isRequestOnGoing" :show-bg-overlay="true" />
<sw-card variant="setting-card">
<template slot="header">
@ -17,7 +17,7 @@
<div class="grid mb-4 md:grid-cols-6">
<div>
<label
class="text-sm not-italic font-medium leading-4 text-black whitespace-no-wrap"
class="text-sm not-italic font-medium leading-4 text-black whitespace-nowrap"
>
{{ $tc('settings.account_settings.profile_picture') }}
</label>
@ -114,9 +114,9 @@
</div>
<sw-button
class="mt-6"
:loading="isLoading"
:disabled="isLoading"
class="mt-6"
variant="primary"
>
<save-icon v-if="!isLoading" class="mr-2 -ml-1" />

View File

@ -70,7 +70,7 @@
<sw-divider class="mt-6 mb-8" />
<div class="flex">
<div class="flex mt-3 mb-4">
<div class="relative w-12">
<sw-switch
v-model="estimateAutogenerate"
@ -96,6 +96,32 @@
</p>
</div>
</div>
<div class="flex mb-2">
<div class="relative w-12">
<sw-switch
v-model="estimateAsAttachment"
class="absolute"
style="top: -20px"
@change="setEstimateSetting"
/>
</div>
<div class="ml-4">
<p class="p-0 mb-1 text-base leading-snug text-black">
{{
$t('settings.customization.estimates.estimate_email_attachment')
}}
</p>
<p
class="p-0 m-0 text-xs leading-tight text-gray-500"
style="max-width: 480px"
>
{{
$t('settings.customization.estimates.estimate_email_attachment_setting_description')
}}
</p>
</div>
</div>
</div>
</template>
@ -115,6 +141,7 @@ export default {
data() {
return {
estimateAutogenerate: false,
estimateAsAttachment: false,
estimates: {
estimate_prefix: null,
@ -204,6 +231,14 @@ export default {
} else {
this.estimateAutogenerate = false
}
this.estimate_email_attachment = val ? val.estimate_email_attachment : ''
if (this.estimate_email_attachment === 'YES') {
this.estimateAsAttachment = true
} else {
this.estimateAsAttachment = false
}
},
},
@ -214,6 +249,7 @@ export default {
let data = {
settings: {
estimate_auto_generate: this.estimateAutogenerate ? 'YES' : 'NO',
estimate_email_attachment: this.estimateAsAttachment ? 'YES' : 'NO',
},
}
let response = await this.updateCompanySettings(data)

View File

@ -74,7 +74,7 @@
<sw-divider class="mt-6 mb-8" />
<div class="flex">
<div class="flex mt-3 mb-4">
<div class="relative w-12">
<sw-switch
v-model="invoiceAutogenerate"
@ -101,6 +101,33 @@
</p>
</div>
</div>
<div class="flex mb-2">
<div class="relative w-12">
<sw-switch
v-model="invoiceAsAttachment"
class="absolute"
style="top: -20px"
@change="setInvoiceSetting"
/>
</div>
<div class="ml-4">
<p class="p-0 mb-1 text-base leading-snug text-black">
{{
$t('settings.customization.invoices.invoice_email_attachment')
}}
</p>
<p
class="p-0 m-0 text-xs leading-tight text-gray-500"
style="max-width: 480px"
>
{{
$t('settings.customization.invoices.invoice_email_attachment_setting_description')
}}
</p>
</div>
</div>
</div>
</template>
@ -120,6 +147,7 @@ export default {
data() {
return {
invoiceAutogenerate: false,
invoiceAsAttachment: false,
invoices: {
invoice_prefix: null,
@ -189,6 +217,14 @@ export default {
} else {
this.invoiceAutogenerate = false
}
this.invoice_email_attachment = val ? val.invoice_email_attachment : ''
if (this.invoice_email_attachment === 'YES') {
this.invoiceAsAttachment = true
} else {
this.invoiceAsAttachment = false
}
},
},
@ -209,6 +245,7 @@ export default {
let data = {
settings: {
invoice_auto_generate: this.invoiceAutogenerate ? 'YES' : 'NO',
invoice_email_attachment: this.invoiceAsAttachment ? 'YES' : 'NO',
},
}

View File

@ -1,6 +1,6 @@
<template>
<div>
<div class="flex flex-wrap justify-end mt-8 lg:flex-no-wrap">
<div class="flex flex-wrap justify-end mt-8 lg:flex-nowrap">
<sw-button size="lg" variant="primary-outline" @click="addItemUnit">
<plus-icon class="w-6 h-6 mr-1 -ml-2" />
{{ $t('settings.customization.items.add_item_unit') }}

View File

@ -63,7 +63,7 @@
<sw-divider class="mt-6 mb-8" />
<div class="flex">
<div class="flex mt-3 mb-4">
<div class="relative w-12">
<sw-switch
v-model="paymentAutogenerate"
@ -90,6 +90,33 @@
</p>
</div>
</div>
<div class="flex mb-2">
<div class="relative w-12">
<sw-switch
v-model="paymentAsAttachment"
class="absolute"
style="top: -20px"
@change="setPaymentSetting"
/>
</div>
<div class="ml-4">
<p class="p-0 mb-1 text-base leading-snug text-black">
{{
$t('settings.customization.payments.payment_email_attachment')
}}
</p>
<p
class="p-0 m-0 text-xs leading-tight text-gray-500"
style="max-width: 480px"
>
{{
$t('settings.customization.payments.payment_email_attachment_setting_description')
}}
</p>
</div>
</div>
</div>
</template>
<script>
@ -108,6 +135,7 @@ export default {
data() {
return {
paymentAutogenerate: false,
paymentAsAttachment: false,
payments: {
payment_prefix: null,
@ -184,6 +212,14 @@ export default {
} else {
this.paymentAutogenerate = false
}
this.payment_email_attachment = val ? val.payment_email_attachment : ''
if (this.payment_email_attachment === 'YES') {
this.paymentAsAttachment = true
} else {
this.paymentAsAttachment = false
}
},
},
@ -203,6 +239,7 @@ export default {
let data = {
settings: {
payment_auto_generate: this.paymentAutogenerate ? 'YES' : 'NO',
payment_email_attachment: this.paymentAsAttachment ? 'YES' : 'NO',
},
}
let response = await this.updateCompanySettings(data)

View File

@ -1,11 +1,9 @@
// Tailwind
//----------------------------------
@tailwind base;
@import 'tailwindcss/base';
@tailwind components;
@import 'tailwindcss/components';
@tailwind utilities;
@import 'tailwindcss/utilities';
// Plugins
//----------------------------------

View File

@ -2,7 +2,7 @@
<html>
<head>
<title>Estimate</title>
<title>@lang('pdf_estimate_label') - {{$estimate->estimate_number}}</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">

View File

@ -2,7 +2,7 @@
<html>
<head>
<title>Estimate</title>
<title>@lang('pdf_estimate_label') - {{$estimate->estimate_number}}</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
/* -- Base -- */

View File

@ -2,7 +2,7 @@
<html>
<head>
<title>Estimate</title>
<title>@lang('pdf_estimate_label') - {{$estimate->estimate_number}}</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">

View File

@ -34,7 +34,7 @@
class="pr-20 text-right item-cell"
style="vertical-align: top;"
>
{{$item->quantity}}
{{$item->quantity}} @if($item->unit_name) {{$item->unit_name}} @endif
</td>
<td
class="pr-20 text-right item-cell"
@ -94,26 +94,27 @@
</tr>
@endforeach
@endif
@if ($estimate->discount_per_item === 'NO')
<tr>
<td class="pl-10 border-0 total-table-attribute-label">
@if($estimate->discount_type === 'fixed')
@lang('pdf_discount_label')
@endif
@if($estimate->discount_type === 'percentage')
@lang('pdf_discount_label') ({{$estimate->discount}}%)
@endif
</td>
<td class="text-right border-0 item-cell total-table-attribute-value">
@if($estimate->discount_type === 'fixed')
{!! format_money_pdf($estimate->discount_val, $estimate->user->currency) !!}
@endif
@if($estimate->discount_type === 'percentage')
{!! format_money_pdf($estimate->discount_val, $estimate->user->currency) !!}
@endif
</td>
</tr>
@if($estimate->discount > 0)
@if ($estimate->discount_per_item === 'NO')
<tr>
<td class="pl-10 border-0 total-table-attribute-label">
@if($estimate->discount_type === 'fixed')
@lang('pdf_discount_label')
@endif
@if($estimate->discount_type === 'percentage')
@lang('pdf_discount_label') ({{$estimate->discount}}%)
@endif
</td>
<td class="text-right border-0 item-cell total-table-attribute-value">
@if($estimate->discount_type === 'fixed')
{!! format_money_pdf($estimate->discount_val, $estimate->user->currency) !!}
@endif
@if($estimate->discount_type === 'percentage')
{!! format_money_pdf($estimate->discount_val, $estimate->user->currency) !!}
@endif
</td>
</tr>
@endif
@endif
<tr>
<td class="py-3"></td>

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