Compare commits

...

88 Commits
4.0.4 ... 4.1.0

Author SHA1 Message Date
633cad9b89 add update migration 2021-05-05 12:10:14 +05:30
f5bbe68a4b new build 2021-05-05 12:00:12 +05:30
1fac9c9dde Merge branch 'master' of https://github.com/bytefury/crater 2021-05-05 11:58:36 +05:30
1208d3a924 new build 2021-05-05 11:58:14 +05:30
3257b18d58 update translations from crowdin 2021-05-05 11:25:30 +05:30
16a941f787 Bump axios from 0.19.2 to 0.21.1 (#337)
Bumps [axios](https://github.com/axios/axios) from 0.19.2 to 0.21.1.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v0.21.1/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.19.2...v0.21.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-03 23:51:00 +05:30
4f5cd9fba1 Bump composer/composer from 2.0.11 to 2.0.13 (#447)
Bumps [composer/composer](https://github.com/composer/composer) from 2.0.11 to 2.0.13.
- [Release notes](https://github.com/composer/composer/releases)
- [Changelog](https://github.com/composer/composer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/composer/composer/compare/2.0.11...2.0.13)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-03 23:50:46 +05:30
80e6a3c757 Bump elliptic from 6.5.3 to 6.5.4 (#411)
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.3 to 6.5.4.
- [Release notes](https://github.com/indutny/elliptic/releases)
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.3...v6.5.4)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-03 23:50:36 +05:30
d4e7420640 Bump laravel/framework from 8.33.1 to 8.40.0 (#448)
Bumps [laravel/framework](https://github.com/laravel/framework) from 8.33.1 to 8.40.0.
- [Release notes](https://github.com/laravel/framework/releases)
- [Changelog](https://github.com/laravel/framework/blob/8.x/CHANGELOG-8.x.md)
- [Commits](https://github.com/laravel/framework/compare/v8.33.1...v8.40.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-03 23:48:51 +05:30
ac30ba599b Update Vietnamese, Initial Japanese and Korean language (#436)
* Update Vietnamese locate
* Add Japanese and Korean Language


Co-authored-by: Dung <dung.phan@mediabridge.vn>
2021-05-03 16:59:30 +05:30
6dd0ccce8b update translations from crowdin 2021-05-03 16:37:12 +05:30
2f32ff4d5b temporarily disable the user tests 2021-04-13 13:06:07 +05:30
54a5ca83f8 new build 2021-04-13 13:00:35 +05:30
eede2fc17f fix notification module issues 2021-04-13 05:42:28 +00:00
e586adde26 update default email description 2021-04-12 16:43:07 +05:30
1ffb1b2eec bug: notification issues solved 2021-04-12 16:02:44 +05:30
55d838371a new build 2021-04-12 14:42:40 +05:30
cdaa1ff103 refactor estimate & invoice templates 2021-04-12 14:40:59 +05:30
63f7cdec82 fix customer update notification not firing 2021-04-12 14:40:22 +05:30
fadba7fa3a fix send email tests 2021-04-12 14:40:10 +05:30
d0f6e207ee add App namespace to models 2021-04-12 12:09:54 +05:30
845f01f170 fix conflicts and issue with add_number_length migration 2021-04-12 11:53:03 +05:30
7f9938c80d Make SMTP username & password optional in mail configuration
Fixes #438
2021-04-10 07:46:32 +00:00
16e4212300 Fixes #439 2021-04-10 07:45:14 +00:00
109de237b1 update: SMTP username & password not mandatory in mail configuraiton 2021-04-10 12:56:09 +05:30
82cf63f200 fix: Custom optional Date field issue 2021-04-10 12:38:50 +05:30
03fc0fd659 Add New SweetAlert & Notification Components 2021-04-09 12:35:50 +00:00
c3d3e5e35f Add New SweetAlert & Notification Components 2021-04-09 12:35:50 +00:00
909e4f93e4 fix(attachments): Fixed language on pdf attachments (#434) 2021-03-27 18:33:54 +05:30
bfd9850bf6 Add invoice/estimate/payment number length setting (#425)
* Add invoice/estimate/payment number length setting
2021-03-26 13:01:43 +05:30
3f7db2793f add fallback language and generate public files 2021-03-24 17:01:38 +05:30
8693672b09 Slovak language (#428)
* Add Slovak Language

Co-authored-by: Mohit Panjwani <mohit.panjvani@gmail.com>
2021-03-24 16:59:12 +05:30
a9b0d62cd6 generate public files 2021-03-24 14:09:18 +05:30
9f57a4200f Merge branch 'master' of https://github.com/bytefury/crater 2021-03-24 14:07:17 +05:30
9e130b3db8 Add VietNamese Locale (#431)
Co-authored-by: Dung <dung.phan@mediabridge.vn>
2021-03-24 14:06:53 +05:30
7c9a846090 update spacewind version 2021-03-24 13:47:45 +05:30
b2e08dda7f fix php8 dompdf issue 2021-03-23 13:31:40 +05:30
a2026fbc8b Merge pull request #427 from TheZoker/add-ci
Add test ci
2021-03-23 13:31:00 +05:30
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
a6c3c815b5 Update composer.json 2021-01-04 18:59:07 +01:00
158 changed files with 13638 additions and 2948 deletions

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

@ -37,14 +37,6 @@ class MailEnvironmentRequest extends FormRequest
'mail_port' => [
'required'
],
'mail_username' => [
'required',
'string'
],
'mail_password' => [
'required',
'string'
],
'mail_encryption' => [
'required',
'string'

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,9 +18,9 @@ class Company extends Model implements HasMedia
protected $fillable = ['name', 'logo', 'unique_hash'];
protected $appends=['logo'];
protected $appends = ['logo', 'logo_path'];
public function getLogoAttribute()
public function getLogoPathAttribute()
{
$logo = $this->getMedia('logo')->first();
@ -28,10 +29,22 @@ class Company extends Model implements HasMedia
if ($logo) {
if ($isSystem) {
return $logo->getPath();
} else {
} else {
return $logo->getFullUrl();
}
}
return null;
}
public function getLogoAttribute()
{
$logo = $this->getMedia('logo')->first();
if ($logo) {
return $logo->getFullUrl();
}
return null;
}

View File

@ -22,17 +22,26 @@ class CustomFieldValue extends Model
public function setDateAnswerAttribute($value)
{
$this->attributes['date_answer'] = Carbon::createFromFormat('Y-m-d', $value);
if ($value && $value != null) {
$this->attributes['date_answer'] = Carbon::createFromFormat('Y-m-d', $value);
}
$this->attributes['date_answer'] = null;
}
public function setTimeAnswerAttribute($value)
{
$this->attributes['time_answer'] = date("H:i:s", strtotime($value));
if ($value && $value != null) {
$this->attributes['time_answer'] = date("H:i:s", strtotime($value));
}
$this->attributes['time_answer'] = null;
}
public function setDateTimeAnswerAttribute($value)
{
$this->attributes['date_time_answer'] = Carbon::createFromFormat('Y-m-d H:i', $value);
if ($value && $value != null) {
$this->attributes['date_time_answer'] = Carbon::createFromFormat('Y-m-d H:i', $value);
}
$this->attributes['time_answer'] = null;
}
public function getDefaultAnswerAttribute()

View File

@ -2,6 +2,7 @@
namespace Crater\Models;
use App;
use Crater\Models\EstimateTemplate;
use Crater\Models\Company;
use Crater\Models\Tax;
@ -78,6 +79,10 @@ class Estimate extends Model implements HasMedia
->orderBy('estimate_number', 'desc')
->first();
// Get number length config
$numberLength = CompanySetting::getSetting('estimate_number_length', request()->header('company'));
$numberLengthText = "%0{$numberLength}d";
if (!$lastOrder) {
// We get here if there is no order at all
// If there is no number set it to 0, which will be 1 at the end.
@ -94,7 +99,7 @@ class Estimate extends Model implements HasMedia
// the %05d part makes sure that there are always 6 numbers in the string.
// so it adds the missing zero's when needed.
return sprintf('%06d', intval($number) + 1);
return sprintf($numberLengthText, intval($number) + 1);
}
public function emailLogs()
@ -379,6 +384,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));
@ -426,7 +432,11 @@ class Estimate extends Model implements HasMedia
$estimateTemplate = EstimateTemplate::find($this->estimate_template_id);
$company = Company::find($this->company_id);
$logo = $company->logo;
$locale = CompanySetting::getSetting('language', $company->id);
App::setLocale($locale);
$logo = $company->logo_path;
view()->share([
'estimate' => $this,
@ -468,6 +478,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

@ -2,6 +2,7 @@
namespace Crater\Models;
use App;
use Crater\Models\Company;
use Crater\Models\CompanySetting;
use Crater\Models\Currency;
@ -82,6 +83,9 @@ class Invoice extends Model implements HasMedia
->orderBy('invoice_number', 'desc')
->first();
// Get number length config
$numberLength = CompanySetting::getSetting('invoice_number_length', request()->header('company'));
$numberLengthText = "%0{$numberLength}d";
if (!$lastOrder) {
// We get here if there is no order at all
@ -98,7 +102,7 @@ class Invoice extends Model implements HasMedia
// the %06d part makes sure that there are always 6 numbers in the string.
// so it adds the missing zero's when needed.
return sprintf('%06d', intval($number) + 1);
return sprintf($numberLengthText, intval($number) + 1);
}
public function emailLogs()
@ -429,6 +433,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;
@ -509,8 +514,11 @@ class Invoice extends Model implements HasMedia
$invoiceTemplate = InvoiceTemplate::find($this->invoice_template_id);
$company = Company::find($this->company_id);
$locale = CompanySetting::getSetting('language', $company->id);
$logo = $company->logo;
App::setLocale($locale);
$logo = $company->logo_path;
view()->share([
'invoice' => $this,
@ -526,6 +534,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

@ -2,6 +2,7 @@
namespace Crater\Models;
use App;
use Crater\Models\CompanySetting;
use Crater\Models\User;
use Crater\Models\Invoice;
@ -124,6 +125,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 +218,10 @@ class Payment extends Model implements HasMedia
}
$payment = Payment::with([
'user',
'invoice',
'paymentMethod',
])
'user',
'invoice',
'paymentMethod',
])
->find($this->id);
return $payment;
@ -268,8 +270,13 @@ 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();
// Get number length config
$numberLength = CompanySetting::getSetting('payment_number_length', request()->header('company'));
$numberLengthText = "%0{$numberLength}d";
if (!$payment) {
// We get here if there is no order at all
// If there is no number set it to 0, which will be 1 at the end.
@ -285,7 +292,7 @@ class Payment extends Model implements HasMedia
// the %05d part makes sure that there are always 6 numbers in the string.
// so it adds the missing zero's when needed.
return sprintf('%06d', intval($number) + 1);
return sprintf($numberLengthText, intval($number) + 1);
}
public function scopeWhereSearch($query, $search)
@ -372,8 +379,11 @@ class Payment extends Model implements HasMedia
public function getPDFData()
{
$company = Company::find($this->company_id);
$locale = CompanySetting::getSetting('language', $company->id);
$logo = $company->logo;
\App::setLocale($locale);
$logo = $company->logo_path;
view()->share([
'payment' => $this,
@ -400,6 +410,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",

1178
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -16,12 +16,16 @@ return [
["code"=>"en", "name" => "English"],
["code"=>"fr", "name" => "French"],
["code"=>"de", "name" => "German"],
["code"=>"ja", "name" => "Japanese"],
["code"=>"it", "name" => "Italian"],
["code"=>"lv", "name" => "Latvian"],
["code"=>"pt_BR", "name" => "Portuguese (Brazilian)"],
["code"=>"sr", "name" => "Serbian Latin"],
["code"=>"ko", "name" => "Korean"],
["code"=>"es", "name" => "Spanish"],
["code"=>"sv", "name"=> "Svenska"]
["code"=>"sv", "name"=> "Svenska"],
["code"=>"sk", "name"=> "Slovak"],
["code"=>"vi", "name"=> "Tiếng Việt"]
],
/*

View File

@ -80,16 +80,16 @@ class UpdateCraterVersion400 extends Migration
FileDisk::create([
'credentials' => json_encode($publicDisk),
'name'=> 'local_public',
'type'=> 'SYSTEM',
'name' => 'local_public',
'type' => 'SYSTEM',
'driver' => 'local',
'set_as_default' => false,
]);
FileDisk::create([
'credentials' => json_encode($privateDisk),
'name'=> 'local_private',
'type'=> 'SYSTEM',
'name' => 'local_private',
'type' => 'SYSTEM',
'driver' => 'local',
'set_as_default' => true,
]);
@ -107,9 +107,9 @@ class UpdateCraterVersion400 extends Migration
private function updateCompanySettings($user)
{
$defaultInvoiceEmailBody = 'You have received a new invoice from <b>{COMPANY_NAME}</b>.</br>Please download using the button below:';
$defaultEstimateEmailBody = 'You have received a new estimate from <b>{COMPANY_NAME}</b>.</br>Please download using the button below:';
$defaultPaymentEmailBody = 'Thank you for the payment.</b></br>Please download your payment receipt using the button below:';
$defaultInvoiceEmailBody = 'You have received a new invoice from <b>{COMPANY_NAME}</b>.</br> Please download using the button below:';
$defaultEstimateEmailBody = 'You have received a new estimate from <b>{COMPANY_NAME}</b>.</br> Please download using the button below:';
$defaultPaymentEmailBody = 'Thank you for the payment.</b></br> Please download your payment receipt using the button below:';
$billingAddressFormat = '<h3>{BILLING_ADDRESS_NAME}</h3><p>{BILLING_ADDRESS_STREET_1}</p><p>{BILLING_ADDRESS_STREET_2}</p><p>{BILLING_CITY} {BILLING_STATE}</p><p>{BILLING_COUNTRY} {BILLING_ZIP_CODE}</p><p>{BILLING_PHONE}</p>';
$shippingAddressFormat = '<h3>{SHIPPING_ADDRESS_NAME}</h3><p>{SHIPPING_ADDRESS_STREET_1}</p><p>{SHIPPING_ADDRESS_STREET_2}</p><p>{SHIPPING_CITY} {SHIPPING_STATE}</p><p>{SHIPPING_COUNTRY} {SHIPPING_ZIP_CODE}</p><p>{SHIPPING_PHONE}</p>';
$companyAddressFormat = '<h3><strong>{COMPANY_NAME}</strong></h3><p>{COMPANY_ADDRESS_STREET_1}</p><p>{COMPANY_ADDRESS_STREET_2}</p><p>{COMPANY_CITY} {COMPANY_STATE}</p><p>{COMPANY_COUNTRY} {COMPANY_ZIP_CODE}</p><p>{COMPANY_PHONE}</p>';

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

@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Crater\Models\CompanySetting;
use Crater\Models\User;
class AddNumberLengthSetting extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
$user = User::where('role', 'super admin')->first();
if ($user) {
$invoice_number_length = CompanySetting::getSetting('invoice_number_length', $user->company_id);
if (empty($invoice_number_length)) {
CompanySetting::setSettings(['invoice_number_length' => '6'], $user->company_id);
}
$estimate_number_length = CompanySetting::getSetting('estimate_number_length', $user->company_id);
if (empty($estimate_number_length)) {
CompanySetting::setSettings(['estimate_number_length' => '6'], $user->company_id);
}
$payment_number_length = CompanySetting::getSetting('payment_number_length', $user->company_id);
if (empty($payment_number_length)) {
CompanySetting::setSettings(['payment_number_length' => '6'], $user->company_id);
}
}
}
/**
* 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 UpdateCraterVersion410 extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Setting::setSetting('version', '4.1.0');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

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

@ -18,9 +18,9 @@ class DefaultSettingsSeeder extends Seeder
{
$user = User::where('role', 'super admin')->first();
$defaultInvoiceEmailBody = 'You have received a new invoice from <b>{COMPANY_NAME}</b>.</br>Please download using the button below:';
$defaultEstimateEmailBody = 'You have received a new estimate from <b>{COMPANY_NAME}</b>.</br>Please download using the button below:';
$defaultPaymentEmailBody = 'Thank you for the payment.</b></br>Please download your payment receipt using the button below:';
$defaultInvoiceEmailBody = 'You have received a new invoice from <b>{COMPANY_NAME}</b>.</br> Please download using the button below:';
$defaultEstimateEmailBody = 'You have received a new estimate from <b>{COMPANY_NAME}</b>.</br> Please download using the button below:';
$defaultPaymentEmailBody = 'Thank you for the payment.</b></br> Please download your payment receipt using the button below:';
$billingAddressFormat = '<h3>{BILLING_ADDRESS_NAME}</h3><p>{BILLING_ADDRESS_STREET_1}</p><p>{BILLING_ADDRESS_STREET_2}</p><p>{BILLING_CITY} {BILLING_STATE}</p><p>{BILLING_COUNTRY} {BILLING_ZIP_CODE}</p><p>{BILLING_PHONE}</p>';
$shippingAddressFormat = '<h3>{SHIPPING_ADDRESS_NAME}</h3><p>{SHIPPING_ADDRESS_STREET_1}</p><p>{SHIPPING_ADDRESS_STREET_2}</p><p>{SHIPPING_CITY} {SHIPPING_STATE}</p><p>{SHIPPING_COUNTRY} {SHIPPING_ZIP_CODE}</p><p>{SHIPPING_PHONE}</p>';
$companyAddressFormat = '<h3><strong>{COMPANY_NAME}</strong></h3><p>{COMPANY_ADDRESS_STREET_1}</p><p>{COMPANY_ADDRESS_STREET_2}</p><p>{COMPANY_CITY} {COMPANY_STATE}</p><p>{COMPANY_COUNTRY} {COMPANY_ZIP_CODE}</p><p>{COMPANY_PHONE}</p>';
@ -53,12 +53,18 @@ class DefaultSettingsSeeder extends Seeder
'notify_estimate_viewed' => 'NO',
'tax_per_item' => 'NO',
'discount_per_item' => 'NO',
'invoice_auto_generate' => 'YES',
'invoice_prefix' => 'INV',
'invoice_auto_generate' => 'YES',
'invoice_number_length' => 6,
'invoice_email_attachment' => 'NO',
'estimate_prefix' => 'EST',
'estimate_auto_generate' => 'YES',
'estimate_number_length' => 6,
'estimate_email_attachment' => 'NO',
'payment_prefix' => 'PAY',
'payment_auto_generate' => 'YES',
'payment_number_length' => 6,
'payment_email_attachment' => 'NO',
'save_pdf_to_disk' => 'NO',
];

View File

@ -25,23 +25,22 @@
"vue-template-compiler": "^2.6.10"
},
"dependencies": {
"@bytefury/spacewind": "^0.5.0",
"@bytefury/spacewind": "^0.5.3",
"@vue-hero-icons/outline": "^1.6.3",
"@vue-hero-icons/solid": "^1.6.3",
"axios": "^0.19",
"axios": "^0.21",
"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",
"vue-sweetalert2": "^4.2.1",
"vue2-transitions": "^0.3.0",
"vuedraggable": "^2.24.2",
"vuelidate": "^0.6.2",

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,54 +1,27 @@
/*!
* tiptap v1.30.0
* (c) 2021 überdosis GbR (limited liability)
* tiptap v1.29.6
* (c) 2020 überdosis GbR (limited liability)
* @license MIT
*/
/*!
* tiptap-commands v1.15.0
* (c) 2021 überdosis GbR (limited liability)
* tiptap-commands v1.14.6
* (c) 2020 überdosis GbR (limited liability)
* @license MIT
*/
/*!
* tiptap-extensions v1.33.2
* (c) 2021 überdosis GbR (limited liability)
* tiptap-extensions v1.33.1
* (c) 2020 überdosis GbR (limited liability)
* @license MIT
*/
/*!
* tiptap-utils v1.11.0
* (c) 2021 überdosis GbR (limited liability)
* tiptap-utils v1.10.4
* (c) 2020 überdosis GbR (limited liability)
* @license MIT
*/
/*!
*
* Copyright 2009-2017 Kris Kowal under the terms of the MIT
* license found at https://github.com/kriskowal/q/blob/v1/LICENSE
*
* With parts by Tyler Close
* Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
* at http://www.opensource.org/licenses/mit-license.html
* Forked at ref_send.js version: 2009-05-11
*
* With parts by Mark Miller
* Copyright (C) 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
/*!
* Chart.js v2.9.4
* https://www.chartjs.org
@ -56,43 +29,12 @@
* Released under the MIT License
*/
/*!
* Sizzle CSS Selector Engine v2.3.5
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
* Date: 2020-03-14
*/
/*!
* Vue.js v2.6.12
* (c) 2014-2020 Evan You
* Released under the MIT License.
*/
/*!
* jQuery JavaScript Library v3.5.1
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* 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>

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=2fe48b55fc5693cab09f",
"/assets/css/crater.css": "/assets/css/crater.css?id=7a822f915d7e413148f6"
"/assets/js/app.js": "/assets/js/app.js?id=ccf2d83d1f924a997810",
"/assets/css/crater.css": "/assets/css/crater.css?id=6ba60df7635dc2f5fbc5"
}

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

@ -8,7 +8,6 @@ import router from './router.js'
import store from './store/index'
import utils from './helpers/utilities'
import i18n from './plugins/i18n'
import swal from 'sweetalert'
require('./bootstrap')
@ -27,5 +26,4 @@ new Vue({
router,
store,
i18n,
swal,
}).$mount('#app')

View File

@ -8,6 +8,8 @@ import money from 'v-money'
import VTooltip from 'v-tooltip'
import Transitions from 'vue2-transitions'
import SpaceWind from '@bytefury/spacewind'
import swal from 'vue-sweetalert2'
import 'sweetalert2/dist/sweetalert2.min.css'
/**
* Theme
@ -22,6 +24,33 @@ Vue.use(SpaceWind, { theme })
Vue.use(Vuelidate)
Vue.use(swal, {
customClass: {
container:
'fixed z-50 inset-0 overflow-y-auto bg-black bg-opacity-25 flex justify-center min-h-screen items-center sm:p-0 swal2-container',
popup:
'flex items-center flex-col justify-center align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full sm:p-6',
header: 'swal2-header',
title: 'swal2-title',
closeButton: '',
icon: 'swal2-icon',
image: '',
content: 'swal2-content',
input: '',
inputLabel: '',
validationMessage: '',
actions: 'swal2-actions',
confirmButton:
'w-full inline-flex py-2 px-4 text-sm leading-5 rounded items-center justify-center text-white font-normal transition duration-150 ease-in-out border border-transparent focus:outline-none bg-primary-500 hover:bg-opacity-75 whitespace-nowrap',
denyButton: '',
cancelButton:
'w-full inline-flex py-2 px-4 text-sm leading-5 rounded justify-center items-center focus:outline-none font-normal transition ease-in-out duration-150 border border-transparent border border-solid border-primary-500 text-primary-500 hover:bg-primary-200 shadow-inner whitespace-nowrap',
loader: '',
footer: '',
},
buttonsStyling: false,
})
Vue.use(Transitions)
window._ = require('lodash')
@ -89,10 +118,11 @@ global.axios.interceptors.response.use(undefined, function (err) {
return true
}
if (!err.response) {
window.toastr['error'](
'Please check your internet connection or wait until servers are back online',
'Network Error'
)
store.dispatch('notification/showNotification', {
type: 'error',
message:
'Please check your internet connection or wait until servers are back online.',
})
} else {
if (
err.response.data &&
@ -100,24 +130,30 @@ global.axios.interceptors.response.use(undefined, function (err) {
err.response.data === ' Unauthorized.')
) {
// Unauthorized and log out
window.toastr['error'](
err.response.data.message ? err.response.data.message : 'Unauthorized'
)
store.dispatch('notification/showNotification', {
type: 'error',
message: err.response.data.message
? err.response.data.message
: 'Unauthorized',
})
store.dispatch('auth/logout', true)
} else if (err.response.data.errors) {
// Show a notification per error
const errors = JSON.parse(JSON.stringify(err.response.data.errors))
for (const i in errors) {
window.toastr['error'](errors[i])
store.dispatch('notification/showNotification', {
type: 'error',
message: errors[i],
})
}
} else {
// Unknown error
window.toastr['error'](
err.response.data.message
store.dispatch('notification/showNotification', {
type: 'error',
message: err.response.data.message
? err.response.data.message
: err.response.data || 'Unknown error occurred',
'Error'
)
})
}
}
return Promise.reject(err)
@ -126,8 +162,6 @@ global.axios.interceptors.response.use(undefined, function (err) {
/**
* Global plugins
*/
window.toastr = require('toastr')
Vue.use(VueRouter)
Vue.use(Vuex)
Vue.use(VTooltip)

View File

@ -0,0 +1,147 @@
<template>
<transition
enter-class="translate-y-2 opacity-0 sm:translate-y-0 sm:translate-x-2 "
enter-active-class="transition duration-300 ease-out transform"
enter-to-class="duration-300 translate-y-0 opacity-100 sm:translate-x-0"
leave-active-class="transition duration-100 ease-in"
leave-class="duration-200 opacity-100"
leave-to-class="duration-200 opacity-0"
>
<div
v-if="notificationActive"
class="fixed inset-0 z-50 flex items-end justify-center px-4 py-6 pointer-events-none sm:p-6 sm:items-start sm:justify-end"
>
<div
:class="success || info ? 'bg-white' : 'bg-red-50'"
class="w-full max-w-sm rounded-lg shadow-lg cursor-pointer pointer-events-auto"
@click="hideNotification"
>
<div class="overflow-hidden rounded-lg shadow-xs">
<div class="p-4">
<div class="flex items-start">
<div class="flex-shrink-0">
<svg
v-if="success"
class="w-6 h-6 text-green-400"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"
/>
</svg>
<exclamation-circle-icon
v-if="info"
class="w-6 h-6 text-blue-400"
/>
<svg
v-if="error"
class="w-6 h-6 text-red-400"
fill="currentColor"
viewBox="0 0 24 24"
>
<path
fill-rule="evenodd"
d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z"
clip-rule="evenodd"
/>
</svg>
</div>
<div class="flex-1 w-0 ml-3">
<p
:class="`text-sm leading-5 font-medium ${
success || info ? 'text-gray-900' : 'text-red-800'
}`"
>
{{
notificationTitle ? notificationTitle : success ? 'Success!' : 'Error'
}}
</p>
<p
:class="`mt-1 text-sm leading-5 ${
success || info ? 'text-gray-500' : 'text-red-700'
}`"
>
{{
notificationMessage
? notificationMessage
: success
? 'Successful'
: 'Somthing went wrong'
}}
</p>
</div>
<div class="flex flex-shrink-0">
<button
:class="
success || info
? ' text-gray-400 focus:text-gray-500'
: 'text-red-400 focus:text-red-500'
"
class="inline-flex w-5 h-5 transition duration-150 ease-in-out focus:outline-none"
@click="hideNotification"
>
<x-icon />
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</transition>
</template>
<script>
import { mapActions, mapGetters } from 'vuex'
import { XIcon } from '@vue-hero-icons/outline'
import { ExclamationCircleIcon } from '@vue-hero-icons/solid'
export default {
components: {
XIcon,
ExclamationCircleIcon,
},
data() {
return {
hasFocus: false,
}
},
computed: {
...mapGetters('notification', [
'notificationActive',
'notificationTitle',
'notificationType',
'notificationAutoHide',
'notificationMessage',
]),
success() {
return this.notificationType.toLowerCase() === 'success'
},
error() {
return this.notificationType.toLowerCase() === 'error'
},
info() {
return this.notificationType.toLowerCase() === 'info'
},
},
watch: {
notificationActive(val) {
if (val && this.notificationAutoHide) {
window.setTimeout(this.hideNotification, 5000)
}
},
},
mounted() {
if (this.notificationActive && this.notificationAutoHide) {
window.setTimeout(this.hideNotification, 5000)
}
},
methods: {
...mapActions('notification', ['showNotification', 'hideNotification']),
},
}
</script>

View File

@ -13,6 +13,7 @@ import NoteSelectPopup from './popup/NoteSelectPopup.vue'
import BaseDatePicker from '../base/BaseDatePicker.vue'
import BaseTimePicker from './BaseTimePicker.vue'
import BasePage from './BasePage.vue'
import BaseNotification from './BaseNotification.vue'
import GlobalSearch from '../GlobalSearch.vue'
@ -39,6 +40,7 @@ Vue.component('tax-select-popup', TaxSelectPopup)
Vue.component('note-select-popup', NoteSelectPopup)
Vue.component('base-time-picker', BaseTimePicker)
Vue.component('base-notification', BaseNotification)
Vue.component('dot-icon', DotIcon)
Vue.component('save-icon', SaveIcon)

View File

@ -2,8 +2,8 @@
<div class="relative customer-modal">
<base-loader
v-if="isRequestOngoing"
class="h-130"
:show-bg-overlay="true"
class="h-130"
/>
<form @submit.prevent="createNewBackup">
<div class="p-6">
@ -21,7 +21,7 @@
:show-labels="false"
:placeholder="$t('settings.backup.select_backup_type')"
:allow-empty="false"
:maxHeight="100"
:max-height="100"
/>
</sw-input-group>
<sw-input-group
@ -38,11 +38,11 @@
:show-labels="false"
:placeholder="$t('settings.disk.select_disk')"
:allow-empty="false"
track-by="id"
:preselect-first="true"
:custom-label="getCustomLabel"
:maxHeight="100"
:max-height="100"
:loading="isLoading"
track-by="id"
/>
</sw-input-group>
</div>
@ -59,9 +59,9 @@
</sw-button>
<sw-button
:loading="isCreateLoading"
:disabled="isCreateLoading"
variant="primary"
type="submit"
:disabled="isCreateLoading"
>
<save-icon v-if="!isCreateLoading" class="mr-2" />
{{ $t('general.create') }}
@ -140,6 +140,8 @@ export default {
...mapActions('modal', ['closeModal']),
...mapActions('notification', ['showNotification']),
getCustomLabel({ driver, name }) {
return `${name} — [${driver}]`
},
@ -154,12 +156,18 @@ export default {
this.isCreateLoading = true
await this.createBackup(data)
this.isCreateLoading = false
window.toastr['success'](this.$t('settings.backup.created_message'))
this.showNotification({
type: 'success',
message: this.$t('settings.backup.created_message'),
})
this.refreshData ? this.refreshData() : ''
this.cancelBackup()
} catch (e) {
this.isCreateLoading = false
window.toastr['error'](e.response.data.message)
this.showNotification({
type: 'error',
message: e.response.data.message,
})
}
},

View File

@ -41,7 +41,7 @@
>
{{ $t('general.cancel') }}
</sw-button>
<sw-button variant="primary" type="submit" :loading="isLoading">
<sw-button :loading="isLoading" variant="primary" type="submit">
<save-icon v-if="!isLoading" class="mr-2" />
{{ !isEdit ? $t('general.save') : $t('general.update') }}
</sw-button>
@ -135,6 +135,8 @@ export default {
methods: {
...mapActions('modal', ['closeModal']),
...mapActions('category', ['addCategory', 'updateCategory']),
...mapActions('notification', ['showNotification']),
resetFormData() {
this.formData = {
id: null,
@ -159,13 +161,15 @@ export default {
if (response.data) {
if (!this.isEdit) {
window.toastr['success'](
this.$t('settings.expense_category.created_message')
)
this.showNotification({
type: 'success',
message: this.$t('settings.expense_category.created_message'),
})
} else {
window.toastr['success'](
this.$t('settings.expense_category.updated_message')
)
this.showNotification({
type: 'success',
message: this.$t('settings.expense_category.updated_message'),
})
}
window.hub.$emit('newCategory', response.data.category)
this.refreshData ? this.refreshData() : ''
@ -173,7 +177,10 @@ export default {
this.isLoading = false
return true
}
window.toastr['error'](response.data.error)
this.showNotification({
type: 'error',
message: response.data.error,
})
},
async setData() {
this.formData = {

View File

@ -78,9 +78,9 @@
/>
</sw-input-group>
<sw-input-group
v-if="isDropdownSelected"
:label="$t('settings.custom_fields.options')"
class="mt-5"
v-if="isDropdownSelected"
horizontal
>
<option-create @onAdd="addNewOptions" />
@ -92,28 +92,28 @@
>
<sw-input v-model="option.name" type="text" style="width: 90%" />
<minus-circle-icon
@click="removeOption(index)"
class="ml-1 cursor-pointer icon text-danger"
@click="removeOption(index)"
/>
</div>
</sw-input-group>
<sw-input-group
v-if="formData.type"
:label="$t('settings.custom_fields.default_value')"
horizontal
class="relative mt-5"
v-if="formData.type"
>
<component
:value="formData.default_answer"
:is="formData.type + 'Type'"
:options="formData.options"
:defaultDateTime="formData.dateTimeValue"
:default-date-time="formData.dateTimeValue"
v-model="formData.default_answer"
/>
</sw-input-group>
<sw-input-group
:label="$t('settings.custom_fields.placeholder')"
v-if="!isSwitchTypeSelected"
:label="$t('settings.custom_fields.placeholder')"
class="mt-5"
horizontal
>
@ -376,6 +376,7 @@ export default {
'fetchCustomField',
]),
...mapActions('modal', ['closeModal']),
...mapActions('notification', ['showNotification']),
resetFormData() {
this.formData = {
label: null,
@ -433,9 +434,10 @@ export default {
if (this.isEdit) {
this.isLoading = true
response = await this.updateCustomField(data)
window.toastr['success'](
this.$tc('settings.custom_fields.updated_message')
)
this.showNotification({
type: 'success',
message: this.$tc('settings.custom_fields.updated_message'),
})
this.refreshData()
this.closeCategoryModal()
return true
@ -444,7 +446,10 @@ export default {
this.isLoading = true
response = await this.addCustomField(data)
window.toastr['success'](this.$tc('settings.custom_fields.added_message'))
this.showNotification({
type: 'success',
message: this.$tc('settings.custom_fields.added_message'),
})
this.refreshData()
this.closeCategoryModal()
return true

View File

@ -62,7 +62,7 @@
:allow-empty="false"
:show-labels="false"
:placeholder="$t('customers.select_currency')"
:maxHeight="200"
:max-height="200"
label="name"
class="mt-1 md:mt-0"
track-by="id"
@ -343,7 +343,7 @@
>
{{ $t('general.cancel') }}
</sw-button>
<sw-button variant="primary" type="submit" :loading="isLoading">
<sw-button :loading="isLoading" variant="primary" type="submit">
<save-icon v-if="!isLoading" class="mr-2" />
{{ $t('general.save') }}
</sw-button>
@ -444,6 +444,7 @@ export default {
...mapGetters(['currencies', 'countries']),
...mapGetters('company', ['defaultCurrency']),
...mapGetters('modal', ['modalDataID', 'modalData', 'modalActive']),
nameError() {
if (!this.$v.formData.name.$error) {
return ''
@ -586,6 +587,7 @@ export default {
'updateCustomer',
]),
...mapActions('modal', ['closeModal']),
...mapActions('notification', ['showNotification']),
resetData() {
this.formData = {
name: null,
@ -700,9 +702,15 @@ export default {
}
if (response.data) {
if (this.modalDataID) {
window.toastr['success'](this.$tc('customers.updated_message'))
this.showNotification({
type: 'success',
message: this.$tc('customers.updated_message'),
})
} else {
window.toastr['success'](this.$tc('customers.created_message'))
this.showNotification({
type: 'success',
message: this.$tc('customers.created_message'),
})
}
this.isLoading = false

View File

@ -5,9 +5,9 @@
:is="selected_disk"
:loading="isLoading"
:disks="getDiskDrivers"
:is-edit="isEdit"
@on-change-disk="(disk) => (selected_disk = disk.value)"
@submit="createNewDisk"
:is-edit="isEdit"
>
<template v-slot="slotProps">
<div
@ -16,15 +16,15 @@
<sw-button
class="mr-3 text-sm"
variant="primary-outline"
@click="closeDisk"
type="button"
@click="closeDisk"
>
{{ $t('general.cancel') }}
</sw-button>
<sw-button
:loading="isRequestFire(slotProps)"
variant="primary"
:disabled="isRequestFire(slotProps)"
variant="primary"
type="submit"
>
<save-icon v-if="!isRequestFire(slotProps)" class="mr-2" />
@ -96,6 +96,8 @@ export default {
...mapActions('modal', ['closeModal']),
...mapActions('notification', ['showNotification']),
isRequestFire(slotProps) {
return slotProps && (slotProps.diskData.isLoading || this.isLoading)
},
@ -131,14 +133,21 @@ export default {
this.refreshData()
this.closeDisk()
if (this.isEdit) {
window.toastr['success'](this.$t('settings.disk.success_update'))
this.showNotification({
type: 'success',
message: this.$t('settings.disk.success_update'),
})
} else {
window.toastr['success'](this.$t('settings.disk.success_create'))
this.showNotification({
type: 'success',
message: this.$t('settings.disk.success_create'),
})
}
} else {
window.toastr['error'](
this.$t('settings.disk.invalid_disk_credentials')
)
this.showNotification({
type: 'error',
message: this.$t('settings.disk.invalid_disk_credentials'),
})
}
this.isLoading = false
},

View File

@ -251,6 +251,7 @@ export default {
...mapActions('modal', ['closeModal', 'resetModalData']),
...mapActions('item', ['addItem', 'updateItem', 'fetchItemUnits']),
...mapActions('invoice', ['setItem']),
...mapActions('notification', ['showNotification']),
resetFormData() {
this.formData = {
@ -304,7 +305,10 @@ export default {
response = await this.addItem(data)
}
if (response.data) {
window.toastr['success'](this.$tc('items.created_message'))
this.showNotification({
type: 'success',
message: this.$tc('items.created_message'),
})
this.setItem(response.data.item)
window.hub.$emit('newItem', response.data.item)
@ -314,7 +318,10 @@ export default {
this.closeModal()
return true
}
window.toastr['error'](response.data.error)
this.showNotification({
type: 'error',
message: response.data.error,
})
},
closeItemModal() {

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: {
@ -89,6 +97,7 @@ export default {
methods: {
...mapActions('modal', ['closeModal', 'resetModalData']),
...mapActions('item', ['addItemUnit', 'updateItemUnit', 'fatchItemUnit']),
...mapActions('notification', ['showNotification']),
resetFormData() {
this.formData = {
id: null,
@ -115,13 +124,17 @@ export default {
if (response.data) {
this.isLoading = false
if (!this.isEdit) {
window.toastr['success'](
this.$t('settings.customization.items.item_unit_added')
)
this.showNotification({
type: 'success',
message: this.$t('settings.customization.items.item_unit_added'),
})
} else {
window.toastr['success'](
this.$t('settings.customization.items.item_unit_updated')
)
this.showNotification({
type: 'success',
message: this.$t(
'settings.customization.items.item_unit_updated'
),
})
}
this.refreshData ? this.refreshData() : ''
this.closeItemUnitModal()
@ -129,7 +142,10 @@ export default {
}
} catch (error) {
this.isLoading = false
window.toastr['error'](response.data.error)
this.showNotification({
type: 'error',
message: response.data.error,
})
}
},
async setData() {

View File

@ -4,8 +4,8 @@
<div class="p-4 md:p-8">
<sw-input-group
:label="$t('general.to')"
class="mt-3"
:error="emailError"
class="mt-3"
variant="horizontal"
required
>
@ -19,8 +19,8 @@
</sw-input-group>
<sw-input-group
:label="$t('general.subject')"
class="mt-3"
:error="subjectError"
class="mt-3"
variant="horizontal"
required
>
@ -33,8 +33,8 @@
</sw-input-group>
<sw-input-group
:label="$t('general.message')"
class="mt-3"
:error="messageError"
class="mt-3"
variant="horizontal"
required
>
@ -57,7 +57,7 @@
>
{{ $t('general.cancel') }}
</sw-button>
<sw-button variant="primary" type="submit" :loading="isLoading">
<sw-button :loading="isLoading" variant="primary" type="submit">
<paper-airplane-icon v-if="!isLoading" class="mr-2" />
{{ !isEdit ? $t('general.send') : $t('general.update') }}
</sw-button>
@ -149,6 +149,7 @@ export default {
methods: {
...mapActions('modal', ['closeModal', 'resetModalData']),
...mapActions('company', ['sendTestMail']),
...mapActions('notification', ['showNotification']),
resetFormData() {
this.formData = {
to: null,
@ -169,18 +170,26 @@ export default {
if (response.data) {
if (response.data.success) {
window.toastr['success'](this.$tc('general.send_mail_successfully'))
this.showNotification({
type: 'success',
message: this.$tc('general.send_mail_successfully'),
})
this.closeTaxModal()
this.isLoading = false
return true
}
window.toastr['error'](this.$tc('validation.something_went_wrong'))
this.showNotification({
type: 'error',
message: this.$tc('validation.something_went_wrong'),
})
this.closeTaxModal()
this.isLoading = false
return true
}
window.toastr['error'](response.data.error)
this.showNotification({
type: 'error',
message: response.data.error,
})
},
closeTaxModal() {
this.resetModalData()

43
resources/assets/js/components/base/modal/NoteModal.vue Normal file → Executable file
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) {
@ -139,6 +147,11 @@ export default {
required,
},
},
watch: {
noteType() {
this.setFields()
},
},
async mounted() {
this.setFields()
if (this.modalDataID) {
@ -150,14 +163,10 @@ export default {
: (this.noteType = 'Invoice')
}
},
watch: {
noteType() {
this.setFields()
},
},
methods: {
...mapActions('modal', ['closeModal', 'resetModalData']),
...mapActions('notes', ['addNote', 'updateNote']),
...mapActions('notification', ['showNotification']),
...mapActions('invoice', {
setInvoiceNote: 'selectNote',
}),
@ -214,15 +223,19 @@ export default {
let res = await this.updateNote(data)
if (res.data) {
window.toastr['success'](
this.$t('settings.customization.notes.note_updated')
)
this.showNotification({
type: 'success',
message: this.$t('settings.customization.notes.note_updated'),
})
this.refreshData ? this.refreshData() : ''
this.closeNoteModal()
return true
}
window.toastr['error'](res.data.error)
this.showNotification({
type: 'error',
message: res.data.error,
})
} else {
try {
let data = {
@ -235,9 +248,10 @@ export default {
if (response.data && response.data.note) {
this.isLoading = false
window.toastr['success'](
this.$t('settings.customization.notes.note_added')
)
this.showNotification({
type: 'success',
message: this.$t('settings.customization.notes.note_added'),
})
if (
(this.$route.name === 'invoices.create' &&
response.data.note.type === 'Invoice') ||
@ -269,7 +283,10 @@ export default {
this.closeNoteModal()
return true
}
window.toastr['error'](response.data.error)
this.showNotification({
type: 'error',
message: response.data.error,
})
} catch (err) {
if (err.response.data.errors.name) {
this.isLoading = true

View File

@ -26,7 +26,7 @@
{{ $t('general.cancel') }}
</sw-button>
<sw-button :loading="isLoading" variant="primary" type="submit">
<save-icon class="mr-2" v-if="!isLoading" />
<save-icon v-if="!isLoading" class="mr-2" />
{{ !isEdit ? $t('general.save') : $t('general.update') }}
</sw-button>
</div>
@ -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: {
@ -82,6 +90,7 @@ export default {
methods: {
...mapActions('modal', ['closeModal', 'resetModalData']),
...mapActions('payment', ['addPaymentMode', 'updatePaymentMode']),
...mapActions('notification', ['showNotification']),
resetFormData() {
this.formData = {
id: null,
@ -100,27 +109,39 @@ export default {
if (this.isEdit) {
response = await this.updatePaymentMode(this.formData)
if (response.data) {
window.toastr['success'](
this.$t('settings.customization.payments.payment_mode_updated')
)
this.showNotification({
type: 'success',
message: this.$t(
'settings.customization.payments.payment_mode_updated'
),
})
this.refreshData ? this.refreshData() : ''
this.closePaymentModeModal()
return true
}
window.toastr['error'](response.data.error)
this.showNotification({
type: 'error',
message: response.data.error,
})
} else {
try {
response = await this.addPaymentMode(this.formData)
if (response.data) {
this.isLoading = false
window.toastr['success'](
this.$t('settings.customization.payments.payment_mode_added')
)
this.showNotification({
type: 'success',
message: this.$t(
'settings.customization.payments.payment_mode_added'
),
})
this.refreshData ? this.refreshData() : ''
this.closePaymentModeModal()
return true
}
window.toastr['error'](response.data.error)
this.showNotification({
type: 'error',
message: response.data.error,
})
} catch (err) {
this.isLoading = false
}

View File

@ -61,8 +61,8 @@
v-model="formData.body"
:fields="estimateMailFields"
:invalid="$v.formData.body.$error"
@input="$v.formData.body.$touch()"
class="mt-2"
@input="$v.formData.body.$touch()"
/>
</sw-input-group>
</div>
@ -140,6 +140,7 @@ export default {
computed: {
...mapGetters('modal', ['modalDataID', 'modalData', 'modalActive']),
...mapGetters('user', ['currentUser']),
...mapActions('notification', ['showNotification']),
getEmailUrl() {
return this.url
},
@ -224,15 +225,31 @@ export default {
if (this.$v.$invalid) {
return true
}
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_send_estimate'),
icon: '/assets/icon/check-circle-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (value) => {
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
class="w-6 h-6"
focusable="false"
data-prefix="fas"
data-icon="check-circle"
class="svg-inline--fa fa-check-circle fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#55547A"
d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
try {
if (value) {
if (result.value) {
let data = {
...this.formData,
id: this.modalDataID,
@ -244,21 +261,26 @@ export default {
this.closeModal()
if (res.data.success) {
this.isLoading = false
window.toastr['success'](
this.$tc('estimates.send_estimate_successfully')
)
this.showNotification({
type: 'success',
message: this.$tc('estimates.send_estimate_successfully'),
})
return true
}
if (res.data.error === 'estimates.user_email_does_not_exist') {
window.toastr['error'](
this.$tc('estimates.user_email_does_not_exist')
)
this.showNotification({
type: 'error',
message: this.$tc('estimates.user_email_does_not_exist'),
})
return false
}
}
} catch (error) {
this.isLoading = false
window.toastr['error'](this.$tc('estimates.something_went_wrong'))
this.showNotification({
type: 'error',
message: this.$tc('estimates.something_went_wrong'),
})
}
})
},

View File

@ -55,8 +55,8 @@
v-model="formData.body"
:fields="InvoiceMailFields"
:invalid="$v.formData.body.$error"
@input="$v.formData.body.$touch()"
class="mt-2"
@input="$v.formData.body.$touch()"
/>
</sw-input-group>
</div>
@ -194,6 +194,8 @@ export default {
...mapActions('company', ['fetchCompanySettings', 'fetchMailConfig']),
...mapActions('notification', ['showNotification']),
async setInitialData() {
let admin = await this.fetchMailConfig()
@ -220,15 +222,31 @@ export default {
if (this.$v.$invalid) {
return true
}
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('invoices.confirm_send_invoice'),
icon: '/assets/icon/check-circle-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (value) => {
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
class="w-6 h-6"
focusable="false"
data-prefix="fas"
data-icon="check-circle"
class="svg-inline--fa fa-check-circle fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#55547A"
d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
try {
if (value) {
if (result.value) {
let data = {
...this.formData,
id: this.modalDataID,
@ -239,21 +257,26 @@ export default {
this.closeModal()
if (res.data.success) {
this.isLoading = false
window.toastr['success'](
this.$tc('invoices.send_invoice_successfully')
)
this.showNotification({
type: 'success',
message: this.$tc('invoices.send_invoice_successfully'),
})
return true
}
if (res.data.error === 'invoices.user_email_does_not_exist') {
window.toastr['error'](
this.$tc('invoices.user_email_does_not_exist')
)
this.showNotification({
type: 'error',
message: this.$tc('invoices.user_email_does_not_exist'),
})
return false
}
}
} catch (error) {
this.isLoading = false
window.toastr['error'](this.$tc('invoices.something_went_wrong'))
this.showNotification({
type: 'error',
message: this.$tc('invoices.something_went_wrong'),
})
}
})
},

View File

@ -4,9 +4,9 @@
<div class="px-8 py-8 sm:p-6">
<sw-input-group
:label="$t('general.from')"
:error="fromError"
class="mb-4"
variant="vertical"
:error="fromError"
required
>
<sw-input
@ -25,8 +25,8 @@
>
<sw-input
v-model="formData.to"
type="text"
:invalid="$v.formData.to.$error"
type="text"
@input="$v.formData.to.$touch()"
/>
</sw-input-group>
@ -188,6 +188,8 @@ export default {
...mapActions('company', ['fetchCompanySettings', 'fetchMailConfig']),
...mapActions('notification', ['showNotification']),
async setInitialData() {
let admin = await this.fetchMailConfig()
@ -216,15 +218,31 @@ export default {
if (this.$v.$invalid) {
return true
}
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('payments.confirm_send_payment'),
icon: '/assets/icon/check-circle-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (value) => {
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
class="w-6 h-6"
focusable="false"
data-prefix="fas"
data-icon="check-circle"
class="svg-inline--fa fa-check-circle fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#55547A"
d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
try {
if (value) {
if (result.value) {
let data = {
...this.formData,
id: this.modalDataID,
@ -236,21 +254,26 @@ export default {
this.closeModal()
if (res.data.success) {
this.isLoading = false
window.toastr['success'](
this.$tc('payments.send_payment_successfully')
)
this.showNotification({
type: 'success',
message: this.$tc('payments.send_payment_successfully'),
})
return true
}
if (res.data.error === 'payments.user_email_does_not_exist') {
window.toastr['error'](
this.$tc('payments.user_email_does_not_exist')
)
this.showNotification({
type: 'error',
message: this.$tc('payments.user_email_does_not_exist'),
})
return false
}
}
} catch (error) {
this.isLoading = false
window.toastr['error'](this.$tc('payments.something_went_wrong'))
this.showNotification({
type: 'error',
message: this.$tc('payments.something_went_wrong'),
})
}
})
},

View File

@ -9,9 +9,9 @@
:searchable="true"
:allow-empty="false"
:show-labels="false"
:custom-label="getCustomLabel"
class="mt-2"
track-by="id"
:custom-label="getCustomLabel"
/>
</sw-input-group>
</div>
@ -90,6 +90,8 @@ export default {
...mapActions('modal', ['closeModal']),
...mapActions('notification', ['showNotification']),
async loadData() {
this.loading = true
@ -107,7 +109,10 @@ export default {
if (response.data.success) {
this.refreshData()
this.closeDisk()
window.toastr['success'](this.$t('settings.disk.success'))
this.showNotification({
type: 'success',
message: this.$t('settings.disk.success'),
})
}
this.isLoading = true
},

View File

@ -69,7 +69,7 @@
{{ $t('general.cancel') }}
</sw-button>
<sw-button :loading="isLoading" variant="primary" type="submit">
<save-icon class="mr-2" v-if="!isLoading" />
<save-icon v-if="!isLoading" class="mr-2" />
{{ !isEdit ? $t('general.save') : $t('general.update') }}
</sw-button>
</div>
@ -174,6 +174,7 @@ export default {
methods: {
...mapActions('modal', ['closeModal', 'resetModalData']),
...mapActions('taxType', ['addTaxType', 'updateTaxType', 'fetchTaxType']),
...mapActions('notification', ['showNotification']),
resetFormData() {
this.formData = {
id: null,
@ -198,13 +199,15 @@ export default {
}
if (response.data) {
if (!this.isEdit) {
window.toastr['success'](
this.$t('settings.tax_types.created_message')
)
this.showNotification({
type: 'success',
message: this.$t('settings.tax_types.created_message'),
})
} else {
window.toastr['success'](
this.$t('settings.tax_types.updated_message')
)
this.showNotification({
type: 'success',
message: this.$t('settings.tax_types.updated_message'),
})
}
window.hub.$emit('newTax', response.data.taxType)
this.refreshData ? this.refreshData() : ''
@ -212,7 +215,10 @@ export default {
this.isLoading = false
return true
}
window.toastr['error'](response.data.error)
this.showNotification({
type: 'error',
message: response.data.error,
})
},
async setData() {
this.formData = {

View File

@ -72,11 +72,9 @@ export default {
deep: true,
},
},
mounted() {
created() {
this.date =
this.field && this.field.defaultAnswer
? this.field.defaultAnswer
: new Date()
this.field && this.field.defaultAnswer && this.field.defaultAnswer
this.placeholder =
this.field && this.field.placeholder ? this.field.placeholder : ''
},

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

@ -1,28 +1,28 @@
{
"navigation": {
"dashboard": "الرئيسية",
"dashboard": "لوحة القيادة",
"customers": "العملاء",
"items": "الأصناف",
"items": "بضائع/خدمات",
"invoices": "الفواتير",
"expenses": "النفقات",
"estimates": "التقديرات",
"payments": "المدفوعات",
"payments": "الدفوعات",
"reports": "التقارير",
"settings": "الإعدادات",
"logout": "خروج",
"logout": "تسجيل الخروج",
"users": "المستخدمون"
},
"general": {
"add_company": "أضف شركة",
"view_pdf": "عرض PDF",
"copy_pdf_url": "Copy PDF Url",
"copy_pdf_url": "نسخ رابط PDF",
"download_pdf": "تنزيل PDF",
"save": "حفظ",
"create": "خلق",
"cancel": "إلغاء الأمر",
"create": "إنشاء",
"cancel": "تراجع",
"update": "تحديث",
"deselect": "Deselect",
"download": نزيل",
"deselect": "إلغاء الإختيار",
"download": حميل",
"from_date": "من تاريخ",
"to_date": "إلى تاريخ",
"from": "من",
@ -50,43 +50,44 @@
"discount": "خصم",
"fixed": "ثابت",
"percentage": "نسبة",
"tax": "ضريبة",
"tax": "اداء",
"total_amount": "المبلغ الإجمالي",
"bill_to": "مطلوب من",
"bill_to": "الفاتورة لـ",
"ship_to": "يشحن إلى",
"due": "واجبة السداد",
"due": "المتبقي",
"draft": "مسودة",
"sent": "مرسلة",
"sent": "ارسلت",
"all": "الكل",
"select_all": "تحديد الل",
"select_all": "تحديد الكل",
"choose_file": "اضغط هنا لاختيار ملف",
"choose_template": "اختيار القالب",
"choose": "اختر",
"remove": "إزالة",
"powered_by": "تصميم",
"bytefury": "باترفوري",
"remove": "حذف",
"powered_by": "بدعم من",
"bytefury": "Bytefury",
"select_a_status": "اختر الحالة",
"select_a_tax": "اختر الضريبة",
"select_a_tax": "اختر الاداء",
"search": "بحث",
"are_you_sure": "هل أنت متأكد?",
"are_you_sure": "هل أنت متأكد؟",
"list_is_empty": "القائمة فارغة.",
"no_tax_found": "لا يوجد ضريبة!",
"four_zero_four": "404",
"you_got_lost": "عفواً! يبدو أنك قد تهت!",
"go_home": "عودة إلى الرئيسية",
"test_mail_conf": "اختبار تكوين البريد",
"go_home": "الذهاب الى الصفحة الرئيسية",
"test_mail_conf": "اختبار اعدادات البريد",
"send_mail_successfully": "تم إرسال البريد بنجاح",
"setting_updated": "تم تحديث الإعدادات بنجاح",
"select_state": "اختر الولاية/المنطقة",
"select_country": "اختر الدولة",
"select_city": "اختر المدينة",
"street_1": "عنوان الشارع 1",
"street_2": "عنوان الشارع 2",
"street_2": "الشارع 2",
"action_failed": "فشلت العملية",
"retry": "أعد المحاولة",
"choose_note": "اختر ملاحظة",
"no_note_found": "لم يتم العثور على الملاحظة",
"insert_note": "أدخل ملاحظة"
"insert_note": "أدخل ملاحظة",
"copied_pdf_url_clipboard": "Copied PDF url to clipboard!"
},
"dashboard": {
"select_year": "اختر السنة",
@ -154,7 +155,7 @@
"phone": "الهاتف",
"website": "موقع الإنترنت",
"overview": "استعراض",
"enable_portal": "Enable Portal",
"enable_portal": "تفعيل البوابة",
"country": "الدولة",
"state": "الولاية/المنطقة",
"city": "المدينة",
@ -177,6 +178,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 +203,7 @@
"added_on": "أضيف في",
"price": "السعر",
"date_of_creation": "تاريخ الإنشاء",
"not_selected": "No item selected",
"action": "إجراء",
"add_item": "إضافة صنف",
"save_item": "حفظ الصنف",
@ -270,6 +274,7 @@
"required": "حقل مطلوب"
},
"accepted": "مقبول",
"rejected": "Rejected",
"sent": "مرسل",
"draft": "مسودة",
"declined": "مرفوض",
@ -316,6 +321,9 @@
"all": "الكل",
"paid": "مدفوع",
"unpaid": "غير مدفوع",
"viewed": "Viewed",
"overdue": "Overdue",
"completed": "Completed",
"customer": "العميل",
"paid_status": "حالة الدفع",
"ref_no": "رقم المرجع.",
@ -428,18 +436,20 @@
"edit_payment": "تعديل الدفعة",
"view_payment": "عرض الدفعة",
"add_new_payment": "إضافة دفعة جديدة",
"send_payment_receipt": "Send Payment Receipt",
"send_payment_receipt": "إرسال إيصال الدفع",
"send_payment": "إرسال الدفعة",
"save_payment": "حفظ الدفعة",
"update_payment": "تحديث الدفعة",
"payment": "دفعة | مدفوعات",
"no_payments": "لا يوجد مدفوعات حتى الآن!",
"not_selected": "Not selected",
"no_invoice": "No invoice",
"no_matching_payments": "لا توجد مدفوعات مطابقة!",
"list_of_payments": "سوف تحتوي هذه القائمة على مدفوعات الفواتير.",
"select_payment_mode": "اختر طريقة الدفع",
"confirm_mark_as_sent": "سيتم التحديد كمرسل على هذا التقدير",
"confirm_send_payment": "This payment will be sent via email to the customer",
"send_payment_successfully": "Payment sent successfully",
"confirm_send_payment": "سيتم إرسال هذه الدفعة عبر البريد الإلكتروني إلى العميل",
"send_payment_successfully": "تم إرسال الدفعة بنجاح",
"user_email_does_not_exist": "البريد الإلكتروني للمستخدم غير موجود!",
"something_went_wrong": "خطأ غير معروف!",
"confirm_delete": "لن تكون قادر على استرجاع هذه الدفعة | لن تكون قادراً على استرجاع هذه المدفوعات",
@ -463,6 +473,7 @@
"receipt": "سند القبض",
"amount": "المبلغ المطلوب",
"action": "إجراء",
"not_selected": "Not selected",
"note": "ملاحظة",
"category_id": "رمز الفئة",
"date": "تاريخ النفقات",
@ -505,7 +516,7 @@
"enter_email": "أدخل البريد الالكتروني",
"enter_password": "أكتب كلمة المرور",
"retype_password": "أعد كتابة كلمة المرور",
"login_placeholder": "mail@example.com"
"login_placeholder": "name@example.com"
},
"users": {
"title": "المستخدمون",
@ -740,10 +751,13 @@
"title": "الفواتير",
"notes": "ملاحظات",
"invoice_prefix": "بادئة رقم الفاتورة",
"invoice_number_length": "Invoice number length",
"default_invoice_email_body": "نص الفاتورة الافتراضي للبريد الإلكتروني",
"invoice_settings": "إعدادات الفاتورة",
"autogenerate_invoice_number": "ترقيم آلي للفاتورة",
"invoice_setting_description": "تعطيل الترقيم الآلي ، إذا كنت لا ترغب في إنشاء أرقام الفاتورة تلقائيًا في كل مرة تقوم فيها بإنشاء فاتورة جديدة.",
"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": "أدخل بادئة رقم الفاتورة",
"terms_and_conditions": "الأحكام والشروط",
"company_address_format": "تنسيق عنوان الشركة",
@ -754,10 +768,13 @@
"estimates": {
"title": "التقديرات",
"estimate_prefix": "بادئة رقم التقدير",
"estimate_number_length": "Estimate number length",
"default_estimate_email_body": "تقدير نص البريد الإلكتروني الافتراضي",
"estimate_settings": "إعدادت التقدير",
"autogenerate_estimate_number": "ترقيم آلي للتقدير",
"estimate_setting_description": "تعطيل الترقيم الآلي ، إذا كنت لا ترغب في إنشاء أرقام التقديرات تلقائيًا في كل مرة تقوم فيها بإنشاء تقدير جديد.",
"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": "أدخل بادئة رقم التقدير",
"estimate_setting_updated": "تم تحديث إعدادات التقدير بنجاح",
"company_address_format": "تنسيق عنوان الشركة",
@ -766,12 +783,15 @@
},
"payments": {
"title": "المدفوعات",
"description": "Modes of transaction for payments",
"description": "أساليب المعاملات المتعلقة بالمدفوعات",
"payment_prefix": "بادئة رقم الدفعة",
"payment_number_length": "Payment number lenght",
"default_payment_email_body": "نص البريد الإلكتروني للدفع الافتراضي",
"payment_settings": "إعدادات الدفعة",
"autogenerate_payment_number": "ترقيم آلي للمدفوعات",
"payment_setting_description": "تعطيل الترقيم الآلي ، إذا كنت لا ترغب في إنشاء أرقام الدفعة تلقائيًا في كل مرة تقوم فيها بإنشاء دفعة جديدة.",
"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": "أدخل بادئة رقم الدفعة",
"payment_setting_updated": "تم تحديث إعدادات الدفعة بنجاح",
"payment_modes": "طرق الدفع",
@ -800,7 +820,7 @@
},
"notes": {
"title": "ملاحظات",
"description": "Save time by creating notes and reusing them on your invoices, estimates & payments.",
"description": "توفير الوقت عن طريق إنشاء الملاحظات وإعادة استخدامها على الفواتير والتقديرات والمدفوعات.",
"notes": "ملاحظات",
"type": "نوع",
"add_note": "اضف ملاحظة",
@ -892,7 +912,7 @@
"updated_message": "تم تحديث التفضيلات بنجاح",
"select_language": "اختر اللغة",
"select_time_zone": "اختر المنطة الزمنية",
"select_date_format": "Select Date Format",
"select_date_format": "اختر صيغة التاريخ",
"select_financial_year": "اختر السنة المالية"
},
"update_app": {
@ -901,7 +921,7 @@
"check_update": "تحقق من التحديثات",
"avail_update": "تحديث جديد متوفر",
"next_version": "النسخة الجديدة",
"requirements": "Requirements",
"requirements": "المتطلبات",
"update": "حدث الآن",
"update_progress": "قيد التحديث...",
"progress_text": "سوف يستغرق التحديث بضع دقائق. يرجى عدم تحديث الشاشة أو إغلاق النافذة قبل انتهاء التحديث",
@ -911,6 +931,7 @@
"download_zip_file": "تنزيل ملف ZIP",
"unzipping_package": "حزمة فك الضغط",
"copying_files": "نسخ الملفات",
"deleting_files": "Deleting Unused files",
"running_migrations": "إدارة عمليات الترحيل",
"finishing_update": "تحديث التشطيب",
"update_failed": "فشل التحديث",
@ -926,7 +947,7 @@
"path": "مسار",
"new_disk": "قرص جديد",
"created_at": "أنشئت في",
"size": "size",
"size": "حجم الملف",
"dropbox": "بصندوق الإسقاط",
"local": "محلي",
"healthy": "صحي",
@ -936,7 +957,7 @@
"select_disk": "حدد القرص",
"action": "عمل",
"deleted_message": "تم حذف النسخة الاحتياطية بنجاح",
"created_message": "Backup created successfully",
"created_message": "تم إنشاء النسخة الاحتياطية بنجاح",
"invalid_disk_credentials": "بيانات اعتماد غير صالحة للقرص المحدد"
},
"disk": {
@ -980,6 +1001,7 @@
"default_driver": "برنامج التشغيل الافتراضي",
"is_default": "أمر افتراضي",
"set_default_disk": "تعيين القرص الافتراضي",
"set_default_disk_confirm": "This disk will be set as default and all the new PDFs will be saved on this disk",
"success_set_default_disk": "Disk set as default successfully",
"save_pdf_to_disk": "حفظ ملفات PDF على القرص",
"disk_setting_description": "قم بتمكين هذا ، إذا كنت ترغب في حفظ نسخة من كل فاتورة ، تقدير وإيصال دفع PDF على القرص الافتراضي الخاص بك تلقائيًا. سيؤدي تشغيل هذا الخيار إلى تقليل وقت التحميل عند عرض ملفات PDF.",
@ -1037,10 +1059,10 @@
"port": "منفذ قاعدة البيانات",
"password": "كلمة مرور قاعدة البيانات",
"app_url": "عنوان الإنترنت للنظام",
"app_domain": "App Domain",
"app_domain": "رابط التطبيق",
"username": "اسم المستخدم لقاعدة البيانات",
"db_name": "سم قاعدة البيانات",
"db_path": "Database Path",
"db_path": "مسار قاعدة البيانات",
"desc": "قم بإنشاء قاعدة بيانات على الخادم الخاص بك وتعيين بيانات الاعتماد باستخدام النموذج أدناه."
},
"permissions": {
@ -1122,49 +1144,54 @@
"amount_maxlength": "يجب ألا يزيد المبلغ عن 20 رقماً.",
"amount_minvalue": "يجب أن يكون المبلغ أكبر من صفر.",
"description_maxlength": "يجب ألا يزيد الوصف عن 255 حرفاً.",
"subject_maxlength": "Subject should not be greater than 100 characters.",
"message_maxlength": "Message should not be greater than 255 characters.",
"subject_maxlength": "يجب الا يزيد العنوان عن 100 حرف.",
"message_maxlength": "يجب ألا يزيد حجم النص عن 255 حرف.",
"maximum_options_error": "الحد الأعلى هو {max} خيارات. قم بإزالة أحد الخيارات لتحديد خيار آخر.",
"notes_maxlength": "يجب ألا يزيد حجم الملاحظات عن 255 حرفاً.",
"address_maxlength": "يجب ألا يزيد العنوان عن 255 حرفاً.",
"ref_number_maxlength": "يجب ألا يزيد الرقم المرجعي عن 255 حرفاً.",
"prefix_maxlength": "يجب ألا تزيد البادئة عن 5 أحرف.",
"something_went_wrong": "خطأ غير معروف!"
"something_went_wrong": "خطأ غير معروف!",
"number_length_minvalue": "Number lenght should be greater than 0"
},
"pdf_estimate_label": "تقدير",
"pdf_estimate_number": "رقم تقدير",
"pdf_estimate_date": "تاريخ التقدير",
"pdf_estimate_expire_date": "Expiry date",
"pdf_estimate_expire_date": "تاريخ انتهاء الصلاحية",
"pdf_invoice_label": "الفاتورة",
"pdf_invoice_number": "رقم الفاتورة",
"pdf_invoice_date": "تاريخ الفاتورة",
"pdf_invoice_due_date": "Due date",
"pdf_invoice_due_date": "تاريخ الاستحقاق",
"pdf_notes": "ملاحظات",
"pdf_items_label": "الأصناف",
"pdf_quantity_label": "الكمية",
"pdf_price_label": "السعر",
"pdf_discount_label": "الخصم",
"pdf_amount_label": "المبلغ المطلوب",
"pdf_subtotal": "Subtotal",
"pdf_subtotal": "المجموع الفرعي",
"pdf_total": "الإجمالي",
"pdf_payment_receipt_label": "PAYMENT RECEIPT",
"pdf_payment_date": "Payment Date",
"pdf_payment_label": "Payment",
"pdf_payment_receipt_label": "ايصال الدفع",
"pdf_payment_date": "تاريخ الدفع",
"pdf_payment_number": "رقم الدفعة",
"pdf_payment_mode": "نوع الدفعة",
"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": "المبلغ المستلم",
"pdf_expense_report_label": "تقرير المصاريف",
"pdf_total_expenses_label": "مجموع المصاريف",
"pdf_profit_loss_label": "تقرير الارباح و الخسائر",
"pdf_sales_customers_label": "Sales Customer Report",
"pdf_sales_items_label": "Sales Item Report",
"pdf_tax_summery_label": "Tax Summary Report",
"pdf_income_label": "الايرادات",
"pdf_net_profit_label": "صافي الأرباح",
"pdf_customer_sales_report": "تقرير المبيعات: حسب العميل",
"pdf_total_sales_label": "مجموع المبيعات",
"pdf_item_sales_label": "تقرير المبيعات: حسب البضاعة او الخدمة",
"pdf_tax_report_label": "تقرير الاداءات",
"pdf_total_tax_label": "اجمالي الاداءات",
"pdf_tax_types_label": "أنواع الضرائب",
"pdf_expenses_label": "النفقات",
"pdf_bill_to": "مطلوب من,",
"pdf_ship_to": "يشحن إلى,",
"pdf_received_from": "Received from:"
"pdf_received_from": "تم الاستلام من:"
}

View File

@ -4,7 +4,7 @@
"customers": "Kunden",
"items": "Artikel",
"invoices": "Rechnungen",
"expenses": "Kosten",
"expenses": "Ausgaben",
"estimates": "Kostenvoranschläge",
"payments": "Zahlungen",
"reports": "Berichte",
@ -26,7 +26,7 @@
"from_date": "Von Datum",
"to_date": "bis Datum",
"from": "Von",
"to": "bis",
"to": "An",
"sort_by": "Sortieren nach",
"ascending": "Aufsteigend",
"descending": "Absteigend",
@ -53,7 +53,7 @@
"tax": "Steuer",
"total_amount": "GESAMTSUMME",
"bill_to": "Rechnungsempfänger",
"ship_to": "Versand ein",
"ship_to": "Versand an",
"due": "Fällig",
"draft": "Entwurf",
"sent": "Gesendet",
@ -75,18 +75,19 @@
"you_got_lost": "Hoppla! Du hast dich verirrt!",
"go_home": "Geh zurück",
"test_mail_conf": "E-Mail Konfiguration testen",
"send_mail_successfully": "E-Mail versendet erfolgreich",
"send_mail_successfully": "E-Mail erfolgreich versendet",
"setting_updated": "Einstellungen erfolgreich aktualisiert",
"select_state": "Bundesland wählen",
"select_country": "Land wählen",
"select_city": "Stadt wählen",
"street_1": "Straße",
"street_2": "Zusatz Strasse",
"street_1": "Straße und Hausnummer",
"street_2": "Adresszusatz",
"action_failed": "Aktion fehlgeschlagen",
"retry": "Wiederholen",
"choose_note": "Notiz auswählen",
"no_note_found": "Keine Notizen gefunden",
"insert_note": "Notiz einfügen"
"insert_note": "Notiz einfügen",
"copied_pdf_url_clipboard": "Copied PDF url to clipboard!"
},
"dashboard": {
"select_year": "Jahr wählen",
@ -94,12 +95,12 @@
"due_amount": "Offene Beträge",
"customers": "Kunden",
"invoices": "Rechnungen",
"estimates": "Kostenvoranschläge"
"estimates": "Angebote"
},
"chart_info": {
"total_sales": "Aufträge gesamt",
"total_receipts": "Zahlungen gesamt",
"total_expense": "Kosten gesamt",
"total_expense": "Ausgaben",
"net_income": "Einnahmen Netto",
"year": "Jahr"
},
@ -107,7 +108,7 @@
"title": "Wöchentliche Rechnungen"
},
"monthly_chart": {
"title": "Umsatz & Kosten"
"title": "Umsatz & Ausgaben"
},
"recent_invoices_card": {
"title": "Fällige Rechnungen",
@ -118,7 +119,7 @@
"view_all": "Alle Anzeigen"
},
"recent_estimate_card": {
"title": "Aktuelle Kostenvoranschläge",
"title": "Aktuelle Angebote",
"date": "Datum",
"customer": "Kunden",
"amount_due": "Betrag",
@ -177,7 +178,9 @@
"copy_billing_address": "Rechnungsadresse kopieren",
"no_customers": "Noch keine Kunden!",
"no_customers_found": "Keine Kunden gefunden!",
"list_of_customers": "Dieser Abschnitt enthält die Liste der Kunden.",
"no_contact": "Kein Kontakt",
"no_contact_name": "Kein Kontaktname",
"list_of_customers": "Dieser Bereich zeigt alle Kunden.",
"primary_display_name": "Primärer Anzeige Name",
"select_currency": "Währung wählen",
"select_a_customer": "Wählen Sie einen Kunden",
@ -200,6 +203,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",
@ -209,8 +213,8 @@
"new_item": "Neuer Artikel",
"edit_item": "Artikel bearbeiten",
"no_items": "Keine Artikel vorhanden!",
"list_of_items": "Dieser Abschnitt enthält die Liste der Artikel.",
"select_a_unit": "wählen Sie die Einheit",
"list_of_items": "Dieser Bereich zeigt alle Artikel.",
"select_a_unit": "Einheit auswählen",
"taxes": "Steuern",
"item_attached_message": "Ein Artikel der bereits verwendet wird kann nicht gelöscht werden",
"confirm_delete": "Sie können diesen Artikel nicht wiederherstellen | Sie können diese Artikel nicht wiederherstellen",
@ -219,24 +223,24 @@
"deleted_message": "Artikel erfolgreich gelöscht | Artikel erfolgreich gelöscht"
},
"estimates": {
"title": "Kostenvoranschläge",
"estimate": "Kostenvoranschlag | Kostenvoranschläge",
"estimates_list": "Liste Kostenvoranschläge",
"title": "Angebote",
"estimate": "Angebot | Angebote",
"estimates_list": "Angebotsübersicht",
"days": "{days} Tage",
"months": "{months} Monat",
"years": "{years} Jahre",
"all": "Alle",
"paid": "Bezahlt",
"unpaid": "Unbezahlte",
"unpaid": "Unbezahlt",
"customer": "KUNDEN",
"ref_no": "REF. - NR.",
"number": "ANZAHL",
"number": "NUMMER",
"amount_due": "OFFENER BETRAG",
"partially_paid": "Teilweise bezahlt",
"total": "Gesamt",
"discount": "Rabatt",
"sub_total": "Zwischensumme",
"estimate_number": "Kostenvoran. Nummer",
"estimate_number": "Angebotsnummer",
"ref_number": "Ref-Nummer",
"contact": "Kontakt",
"add_item": "Fügen Sie ein Artikel hinzu",
@ -247,49 +251,50 @@
"add_tax": "Steuer hinzufügen",
"amount": "Summe",
"action": "Aktion",
"notes": "Hinweise",
"notes": "Notizen",
"tax": "Steuer",
"estimate_template": "Vorlage",
"convert_to_invoice": "Konvertieren in Rechnung",
"mark_as_sent": "Als gesendet markieren",
"send_estimate": "Kostenvoranschlag senden",
"resend_estimate": "Kostenvoranschlag erneut senden",
"send_estimate": "Angebot senden",
"resend_estimate": "Angebot erneut senden",
"record_payment": "Zahlung erfassen",
"add_estimate": "Kostenvoranschlag hinzufügen",
"save_estimate": "Kostenvoranschlag speichern",
"add_estimate": "Angebote hinzufügen",
"save_estimate": "Angebot speichern",
"confirm_conversion": "Sie möchten, konvertieren Sie diese Schätzung in die Rechnung?",
"conversion_message": "Rechnung erfolgreich erstellt",
"confirm_send_estimate": "Der Kostenvoranschlag wird per E-Mail an den Kunden gesendet",
"confirm_mark_as_sent": "Dieser Kostenvoranschlag wird als gesendet markiert",
"confirm_mark_as_accepted": "Dieser Kostenvoranschlag wird als angenommen markiert",
"confirm_mark_as_rejected": "Dieser Kostenvoranschlag wird als abgelehnt markiert",
"no_matching_estimates": "Es gibt keine übereinstimmenden Kostenvoranschläge!",
"mark_as_sent_successfully": "Kostenvoranschlag als gesendet markiert.",
"send_estimate_successfully": "Kostenvoranschlag erfolgreich gesendet",
"confirm_send_estimate": "Das Angebot wird per E-Mail an den Kunden gesendet",
"confirm_mark_as_sent": "Dieses Angebot wird als gesendet markiert",
"confirm_mark_as_accepted": "Dieses Angebot wird als angenommen markiert",
"confirm_mark_as_rejected": "Dieses Angebot wird als abgelehnt markiert",
"no_matching_estimates": "Es gibt keine übereinstimmenden Angebote!",
"mark_as_sent_successfully": "Angebot als gesendet markiert",
"send_estimate_successfully": "Angebot erfolgreich gesendet",
"errors": {
"required": "Feld ist erforderlich"
},
"accepted": "Angenommen",
"rejected": "Abgelehnt",
"sent": "Gesendet",
"draft": "Entwurf",
"declined": "Abgelehnt",
"new_estimate": "Neuer Kostenvoranschlag",
"add_new_estimate": "Neuen Kostenvoranschlag hinzufügen",
"update_Estimate": "Kostenvoranschlag aktualisieren",
"edit_estimate": "Kostenvoranschlag ändern",
"new_estimate": "Neues Angebot",
"add_new_estimate": "Neues Angebot hinzufügen",
"update_Estimate": "Angebot aktualisieren",
"edit_estimate": "Angebot ändern",
"items": "Artikel",
"Estimate": "Kostenvoranschlag | Kostenvoranschläge",
"Estimate": "Angebot | Angebote",
"add_new_tax": "neuen Steuersatz hinzufügen",
"no_estimates": "Keine Kostenvoranschläge vorhanden!",
"list_of_estimates": "Dieser Abschnitt enthält die Liste der Kostenvoranschläge.",
"no_estimates": "Keine Angebote vorhanden!",
"list_of_estimates": "Dieser Bereich zeigt alle Angebote.",
"mark_as_rejected": "Markiert als abgelehnt",
"mark_as_accepted": "Markiert als angenommen",
"marked_as_accepted_message": "Kostenvoranschlag als angenommen markiert",
"marked_as_rejected_message": "Kostenvoranschlag als abgelehnt markiert",
"confirm_delete": "Der Kostenvoranschlag kann nicht wiederhergestellt werden | Die Kostenvoranschläge können nicht wiederhergestellt werden",
"created_message": "Kostenvoranschlag erfolgreich erstellt",
"updated_message": "Kostenvoranschlag erfolgreich aktualisiert",
"deleted_message": "Kostenvoranschlag erfolgreich gelöscht | Kostenvoranschläge erfolgreich gelöscht",
"marked_as_accepted_message": "Angebot als angenommen markiert",
"marked_as_rejected_message": "Angebot als abgelehnt markiert",
"confirm_delete": "Das Angebot kann nicht wiederhergestellt werden | Die Angebote können nicht wiederhergestellt werden",
"created_message": "Angebot erfolgreich erstellt",
"updated_message": "Angebot erfolgreich aktualisiert",
"deleted_message": "Angebot(e) erfolgreich gelöscht",
"user_email_does_not_exist": "Benutzer-E-Mail nicht vorhanden",
"something_went_wrong": "Da ging etwas schief",
"item": {
@ -315,11 +320,14 @@
"years": "{years} Jahre",
"all": "Alle",
"paid": "Bezahlt",
"unpaid": "Unbezahlte",
"unpaid": "Unbezahlt",
"viewed": "Gesehen",
"overdue": "Überfällig",
"completed": "Abgeschlossen",
"customer": "KUNDEN",
"paid_status": "BEZAHLT-STATUS",
"paid_status": "ZAHLUNGSSTATUS",
"ref_no": "REF. - NR.",
"number": "ANZAHL",
"number": "NUMMER",
"amount_due": "OFFENER BETRAG",
"partially_paid": "Teilzahlung",
"total": "Gesamt",
@ -336,7 +344,7 @@
"add_tax": "Steuersatz hinzufügen",
"amount": "Summe",
"action": "Aktion",
"notes": "Hinweise",
"notes": "Notizen",
"view": "Anzeigen",
"send_invoice": "Rechnung senden",
"resend_invoice": "Rechnung erneut senden",
@ -356,7 +364,7 @@
"update_invoice": "Rechnung ändern",
"add_new_tax": "Neuen Steuersatz hinzufügen",
"no_invoices": "Keine Rechnungen vorhanden!",
"list_of_invoices": "Dieser Abschnitt enthält die Liste der Rechnungen.",
"list_of_invoices": "Dieser Bereich zeigt alle Rechnungen.",
"select_invoice": "Wählen Sie eine Rechnung",
"no_matching_invoices": "Es gibt keine entsprechenden Rechnungen!",
"mark_as_sent_successfully": "Rechnung gekennzeichnet als erfolgreich gesendet",
@ -397,7 +405,7 @@
"amount": "Summe",
"action": "Aktion",
"credit_number": "Kreditkarten-Nummer",
"notes": "Hinweise",
"notes": "Notizen",
"confirm_delete": "Wollen Sie diese Gutschrift löschen?",
"item": {
"title": "Titel",
@ -434,10 +442,12 @@
"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.",
"list_of_payments": "Dieser Bereich zeigt alle Zahlungen.",
"select_payment_mode": "Wählen Sie den Zahlungsmodus",
"confirm_mark_as_sent": "Dieser Kostenvoranschlag wird als gesendet markiert",
"confirm_mark_as_sent": "Dieses Angebot wird als gesendet markiert",
"confirm_send_payment": "Diese Zahlung wird per E-Mail an den Kunden gesendet",
"send_payment_successfully": "Zahlung erfolgreich gesendet",
"user_email_does_not_exist": "Benutzer-E-Mail existiert nicht",
@ -449,37 +459,38 @@
"invalid_amount_message": "Zahlungsbetrag ist ungültig"
},
"expenses": {
"title": "Aufwendungen/Ausgaben",
"expenses_list": "Liste der Ausgaben",
"title": "Ausgaben",
"expenses_list": "Ausgabenübersicht",
"select_a_customer": "Wählen Sie einen Kunden",
"expense_title": "Titel",
"customer": "Kundin",
"customer": "Kunde",
"contact": "Kontakt",
"category": "Kategorie",
"from_date": "Von Datum",
"to_date": "bis Datum",
"expense_date": "Datum",
"description": "Beschreibung",
"receipt": "Eingang",
"receipt": "Rechnung",
"amount": "Summe",
"action": "Aktion",
"not_selected": "Nicht ausgewählt",
"note": "Hinweis",
"category_id": "Kategorie-Id",
"date": "Aufwandsdatum",
"add_expense": "Aufwendung hinzufügen",
"add_new_expense": "Neue Aufwendung hinzufügen",
"save_expense": "Aufwendung speichern",
"update_expense": "Aufwendung aktualisieren",
"date": "Ausgabedatum",
"add_expense": "Ausgabe hinzufügen",
"add_new_expense": "Neue Ausgabe hinzufügen",
"save_expense": "Ausgabe speichern",
"update_expense": "Ausgabe aktualisieren",
"download_receipt": "Quittung herunterladen",
"edit_expense": "Aufwendung ändern",
"new_expense": "Neue Aufwendung",
"expense": "Aufwendung | Aufwendungen",
"edit_expense": "Ausgabe bearbeiten",
"new_expense": "Neue Ausgabe",
"expense": "Ausgabe | Ausgaben",
"no_expenses": "Noch keine Ausgaben!",
"list_of_expenses": "Dieser Abschnitt enthält die Liste der Ausgaben.",
"list_of_expenses": "Dieser Bereich enthält alle Ausgaben.",
"confirm_delete": "Sie können diese Ausgabe nicht wiederherstellen. | Sie können diese Ausgaben nicht wiederherstellen.",
"created_message": "Aufwand erfolgreich erstellt",
"updated_message": "Aufwand erfolgreich aktualisiert",
"deleted_message": "Aufwand erfolgreich gelöscht | Aufwand erfolgreich gelöscht",
"created_message": "Ausgabe erfolgreich erstellt",
"updated_message": "Ausgabe erfolgreich aktualisiert",
"deleted_message": "Ausgabe erfolgreich gelöscht | Ausgaben erfolgreich gelöscht",
"categories": {
"categories_list": "Liste der Kategorien",
"title": "Titel",
@ -523,7 +534,7 @@
"new_user": "Neuer Benutzer",
"edit_user": "Benutzer bearbeiten",
"no_users": "Noch keine Benutzer!",
"list_of_users": "Dieser Abschnitt enthält die Liste der Benutzer.",
"list_of_users": "Dieser Bereich zeigt alle Benutzer.",
"email": "E-Mail",
"phone": "Telefon",
"password": "Passwort",
@ -575,17 +586,17 @@
"status": "Status"
},
"estimates": {
"estimate": "Kostenvoranschlag",
"estimate_date": "Datum Kostenvoranschlag",
"estimate": "Angebot",
"estimate_date": "Angebotsdatum",
"due_date": "Fälligkeit",
"estimate_number": "Kostenvoranschlag-Nr.",
"estimate_number": "Angebotsnummer",
"ref_number": "Ref-Nummer",
"amount": "Summe",
"contact_name": "Ansprechpartner",
"status": "Status"
},
"expenses": {
"expenses": "Aufwendungen",
"expenses": "Ausgaben",
"category": "Kategorie",
"date": "Datum",
"amount": "Summe",
@ -598,7 +609,7 @@
"menu_title": {
"account_settings": "Konto-Einstellungen",
"company_information": "Informationen zum Unternehmen",
"customization": "Anpassung",
"customization": "Personalisierung",
"preferences": "Einstellungen",
"notifications": "Benachrichtigungen",
"tax_types": "Steuersätze",
@ -608,7 +619,7 @@
"file_disk": "Dateispeicher",
"custom_fields": "Benutzerdefinierte Felder",
"payment_modes": "Zahlungsarten",
"notes": "Hinweise"
"notes": "Notizen"
},
"title": "Einstellungen",
"setting": "Einstellung | Einstellungen",
@ -662,7 +673,7 @@
"company_info": "Firmeninfo",
"company_name": "Name des Unternehmens",
"company_logo": "Firmenlogo",
"section_description": "Informationen zu Ihrem Unternehmen, die auf Rechnungen, Kostenvoranschlägen und anderen von Crater erstellten Dokumenten angezeigt werden.",
"section_description": "Informationen zu Ihrem Unternehmen, die auf Rechnungen, Angeboten und anderen von Crater erstellten Dokumenten angezeigt werden.",
"phone": "Telefon",
"country": "Land",
"state": "Bundesland",
@ -678,7 +689,7 @@
"add_custom_field": "Benutzerdefiniertes Feld hinzufügen",
"edit_custom_field": "Benutzerdefiniertes Feld bearbeiten",
"field_name": "Feldname",
"label": "Etikette",
"label": "Bezeichnung",
"type": "Art",
"name": "Name",
"required": "Erforderlich",
@ -692,7 +703,7 @@
"suffix": "Vorzeichen",
"yes": "Ja",
"no": "Nein",
"order": "Auftrag",
"order": "Reihenfolge",
"custom_field_confirm_delete": "Sie können dieses benutzerdefinierte Feld nicht wiederherstellen",
"already_in_use": "Benutzerdefiniertes Feld wird bereits verwendet",
"deleted_message": "Benutzerdefiniertes Feld erfolgreich gelöscht",
@ -709,7 +720,7 @@
"added_message": "Benutzerdefiniertes Feld erfolgreich hinzugefügt"
},
"customization": {
"customization": "Anpassung",
"customization": "Personalisierung",
"save": "Speichern",
"addresses": {
"title": "Adressen",
@ -729,8 +740,8 @@
"state": "Bundesland",
"city": "Stadt",
"company_name": "Name des Unternehmens",
"address_street_1": "Strasse",
"address_street_2": "Zusatz Strasse",
"address_street_1": "Straße und Hausnummer",
"address_street_2": "Adresszusatz",
"phone": "Telefon",
"zip_code": "PLZ",
"address_setting_updated": "Adresse-Einstellung erfolgreich aktualisiert"
@ -738,12 +749,15 @@
"updated_message": "Unternehmensinformationen wurden erfolgreich aktualisiert",
"invoices": {
"title": "Rechnungen",
"notes": "Hinweise",
"notes": "Notizen",
"invoice_prefix": "Rechnung Präfix",
"invoice_number_length": "Rechnungsnummerlänge",
"default_invoice_email_body": "Standard Rechnung E-Mail Inhalt",
"invoice_settings": "Rechnungseinstellungen",
"autogenerate_invoice_number": "Rechnungsnummer automatisch generieren",
"invoice_setting_description": "Deaktivieren Sie diese Option, wenn Sie Rechnungsnummern nicht jedes Mal automatisch generieren möchten, wenn Sie eine neue Rechnung erstellen.",
"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": "Rechnungspräfix eingeben",
"terms_and_conditions": "Allgemeine Geschäftsbedingungen",
"company_address_format": "Firmenadressformat",
@ -752,14 +766,17 @@
"invoice_setting_updated": "Rechnungseinstellung erfolgreich aktualisiert"
},
"estimates": {
"title": "Kostenvoranschläge",
"estimate_prefix": "Kostenvoranschlag Präfix",
"title": "Angebote",
"estimate_prefix": "Angebotspräfix",
"estimate_number_length": "Angebotsnummerlänge",
"default_estimate_email_body": "Rechnung - E-Mail Text",
"estimate_settings": "Einstellungen Kostenvoranschlag",
"autogenerate_estimate_number": "Kostenvoranschlagsnummer automatisch generieren",
"estimate_setting_description": "Deaktivieren Sie diese Option, wenn Sie nicht jedes Mal, wenn Sie einen neue Kostenvoranschlag erstellen, automatisch eine Schätzung generieren möchten.",
"enter_estimate_prefix": "Geben Sie das Kostenvoranschlag Präfix ein",
"estimate_setting_updated": "Einstellungen Kostenvoranschläge erfolgreich aktualisiert",
"estimate_settings": "Einstellungen Angebot",
"autogenerate_estimate_number": "Angebotsnummer automatisch generieren",
"estimate_setting_description": "Deaktivieren Sie diese Option, wenn Sie nicht jedes Mal, wenn Sie ein neues Angebot erstellen, automatisch eine Angebotsnummer generieren möchten.",
"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": "Geben Sie das Angebotspräfix ein",
"estimate_setting_updated": "Angebotseinstellungen erfolgreich aktualisiert",
"company_address_format": "Firmenadresse Format",
"billing_address_format": "Rechnungsadressen Format",
"shipping_address_format": "Versandadressen Format"
@ -768,10 +785,13 @@
"title": "Zahlungen",
"description": "Transaktionsmodi für Zahlungen",
"payment_prefix": "Zahlung Präfix",
"payment_number_length": "Zahlungsnummerlänge",
"default_payment_email_body": "Zahlung - E-Mail Text",
"payment_settings": "Zahlung Einstellungen",
"autogenerate_payment_number": "Zahlungsnummer automatisch generieren",
"payment_setting_description": "Deaktivieren Sie diese Option, wenn Sie nicht jedes Mal, wenn Sie eine neue Zahlung erstellen, automatisch Zahlungsnummern generieren möchten.",
"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": "Zahlungspräfix eingeben",
"payment_setting_updated": "Zahlungseinstellung erfolgreich aktualisiert",
"payment_modes": "Zahlungsarten",
@ -799,8 +819,8 @@
"deleted_message": "Artikeleinheit erfolgreich gelöscht"
},
"notes": {
"title": "Hinweise",
"description": "Sparen Sie Zeit, indem Sie Notizen erstellen und diese auf Ihren Rechnungen, Kostenvoranschlägen und Zahlungen wiederverwenden.",
"title": "Notizen",
"description": "Sparen Sie Zeit, indem Sie Notizen erstellen und diese auf Ihren Rechnungen, Angeboten und Zahlungen wiederverwenden.",
"notes": "Hinweise",
"type": "Art",
"add_note": "Notiz hinzufügen",
@ -837,8 +857,8 @@
"description": "Welche E-Mail-Benachrichtigungen möchten Sie erhalten wenn sich etwas ändert?",
"invoice_viewed": "Rechnung angezeigt",
"invoice_viewed_desc": "Wenn Ihr Kunde die gesendete Rechnung anzeigt bekommt.",
"estimate_viewed": "Kostenvoranschlag angesehen",
"estimate_viewed_desc": "Wenn Ihr Kunde den gesendeten Kostenvoranschlag anzeigt bekommt.",
"estimate_viewed": "Angebot angesehen",
"estimate_viewed_desc": "Wenn Ihr Kunde das gesendete Angebot anzeigt bekommt.",
"save": "Speichern",
"email_save_message": "Email erfolgreich gespeichert",
"please_enter_email": "Bitte E-Mail eingeben"
@ -863,7 +883,7 @@
"already_in_use": "Steuersatz wird bereits verwendet"
},
"expense_category": {
"title": "Kategorien Kosten",
"title": "Ausgabenkategorien",
"action": "Aktion",
"description": "Für das Hinzufügen von Ausgabeneinträgen sind Kategorien erforderlich. Sie können diese Kategorien nach Ihren Wünschen hinzufügen oder entfernen.",
"add_new_category": "Neue Kategorie hinzufügen",
@ -911,6 +931,7 @@
"download_zip_file": "Laden Sie die ZIP-Datei herunter",
"unzipping_package": "Paket entpacken",
"copying_files": "Dateien kopieren",
"deleting_files": "Deleting Unused files",
"running_migrations": "Ausführen von Migrationen",
"finishing_update": "Update beenden",
"update_failed": "Update fehlgeschlagen",
@ -971,23 +992,24 @@
"do_spaces_bucket": "Do Spaces Bucket",
"do_spaces_endpoint": "Do Spaces Endpoint",
"do_spaces_root": "Do Spaces Root",
"dropbox_type": "Dropbox Type",
"dropbox_type": "Dropbox Typ",
"dropbox_token": "Dropbox Token",
"dropbox_key": "Dropbox Key",
"dropbox_key": "Dropbox Schlüssel",
"dropbox_secret": "Dropbox Secret",
"dropbox_app": "Dropbox App",
"dropbox_root": "Dropbox Root",
"default_driver": "Standard-Treiber",
"is_default": "Standard",
"set_default_disk": "Als Standard festlegen",
"set_default_disk_confirm": "This disk will be set as default and all the new PDFs will be saved on this disk",
"success_set_default_disk": "Speicher wurde als Standard festgelegt",
"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.",
"disk_setting_description": " Aktivieren Sie dies, um eine Kopie von jeder Rechnung, jedem Angebot & jeder Zahlung 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": "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",
"edit_file_disk": "Speicherort editieren",
"success_create": "Speicher erfolgreich hinzugefügt",
"success_update": "Speicher erfolgreich bearbeitet",
"error": "Hinzufügen des Speichers gescheitert",
@ -1129,11 +1151,12 @@
"address_maxlength": "Die Adresse sollte nicht länger als 255 Zeichen sein.",
"ref_number_maxlength": "Ref Number sollte nicht länger als 255 Zeichen sein.",
"prefix_maxlength": "Das Präfix sollte nicht länger als 5 Zeichen sein.",
"something_went_wrong": "Da ist etwas schief gelaufen"
"something_went_wrong": "Da ist etwas schief gelaufen",
"number_length_minvalue": "Nummernlänge sollte größer als 0 sein"
},
"pdf_estimate_label": "Kostenvoranschlag",
"pdf_estimate_number": "Kostenvoran. Nummer",
"pdf_estimate_date": "Datum Kostenvoranschlag",
"pdf_estimate_label": "Angebot",
"pdf_estimate_number": "Angebotsnummer",
"pdf_estimate_date": "Angebotsdatum",
"pdf_estimate_expire_date": "Ablaufdatum",
"pdf_invoice_label": "Rechnung",
"pdf_invoice_number": "Rechnungsnummer",
@ -1147,6 +1170,7 @@
"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",
@ -1155,6 +1179,9 @@
"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",
@ -1163,8 +1190,8 @@
"pdf_tax_report_label": "Umsatzsteuer BERICHT",
"pdf_total_tax_label": "Gesamte Umsatzsteuer",
"pdf_tax_types_label": "Steuersätze",
"pdf_expenses_label": "Gesamtausgaben",
"pdf_bill_to": "Rechnungsempfänger,",
"pdf_ship_to": "Versand an,",
"pdf_expenses_label": "Ausgaben",
"pdf_bill_to": "Rechnungsempfänger:",
"pdf_ship_to": "Versand an:",
"pdf_received_from": "Erhalten von:"
}

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",
@ -741,10 +751,13 @@
"title": "Invoices",
"notes": "Notes",
"invoice_prefix": "Invoice Prefix",
"invoice_number_length": "Invoice number length",
"default_invoice_email_body": "Default Invoice Email Body",
"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",
@ -755,10 +768,13 @@
"estimates": {
"title": "Estimates",
"estimate_prefix": "Estimate Prefix",
"estimate_number_length": "Estimate number length",
"default_estimate_email_body": "Default Estimate Email Body",
"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",
@ -769,10 +785,13 @@
"title": "Payments",
"description": "Modes of transaction for payments",
"payment_prefix": "Payment Prefix",
"payment_number_length": "Payment number lenght",
"default_payment_email_body": "Default Payment Email Body",
"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",
@ -1132,7 +1151,8 @@
"address_maxlength": "Address should not be greater than 255 characters.",
"ref_number_maxlength": "Ref Number should not be greater than 255 characters.",
"prefix_maxlength": "Prefix should not be greater than 5 characters.",
"something_went_wrong": "something went wrong"
"something_went_wrong": "something went wrong",
"number_length_minvalue": "Number lenght should be greater than 0"
},
"pdf_estimate_label": "Estimate",
"pdf_estimate_number": "Estimate Number",
@ -1150,6 +1170,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 +1179,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

@ -5,7 +5,7 @@
"items": "Artículos",
"invoices": "Facturas",
"expenses": "Gastos",
"estimates": "Presupuestos",
"estimates": "Presupuesto",
"payments": "Pagos",
"reports": "Informes",
"settings": "Configuraciones",
@ -30,7 +30,7 @@
"sort_by": "Ordenar por",
"ascending": "Ascendente",
"descending": "Descendente",
"subject": "Sujeta",
"subject": "Asunto",
"body": "Cuerpo",
"message": "Mensaje",
"send": "Enviar",
@ -86,7 +86,8 @@
"retry": "Procesar de nuevo",
"choose_note": "Elegir nota",
"no_note_found": "No se encontró ninguna nota",
"insert_note": "Insertar una nota"
"insert_note": "Insertar una nota",
"copied_pdf_url_clipboard": "Copied PDF url to clipboard!"
},
"dashboard": {
"select_year": "Seleccionar año",
@ -177,6 +178,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 +203,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",
@ -270,6 +274,7 @@
"required": "Se requiere campo"
},
"accepted": "Aceptado",
"rejected": "Rejected",
"sent": "Enviado",
"draft": "Borrador",
"declined": "Rechazado",
@ -316,6 +321,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.",
@ -434,6 +442,8 @@
"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",
@ -463,6 +473,7 @@
"receipt": "Recibo",
"amount": "Cantidad",
"action": "Acción",
"not_selected": "Not selected",
"note": "Nota",
"category_id": "Categoria ID",
"date": "Fecha de gastos",
@ -740,10 +751,13 @@
"title": "Facturas",
"notes": "Notas",
"invoice_prefix": "Prefijo de las facturas",
"invoice_number_length": "Invoice number length",
"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.",
"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": "Introduzca el prefijo de factura",
"terms_and_conditions": "Términos y Condiciones",
"company_address_format": "Formato de dirección de la empresa",
@ -754,10 +768,13 @@
"estimates": {
"title": "Estimaciones",
"estimate_prefix": "Prefijo de los presupuestos",
"estimate_number_length": "Estimate number length",
"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.",
"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": "Introduzca el prefijo de presupuesto",
"estimate_setting_updated": "Configuración de presupuestos actualizada correctamente",
"company_address_format": "Formato de dirección de la empresa",
@ -768,10 +785,13 @@
"title": "Pagos",
"description": "Modos de transacción de pagos",
"payment_prefix": "Prefijo de los pagos",
"payment_number_length": "Payment number lenght",
"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.",
"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": "Introduzca el prefijo de pago",
"payment_setting_updated": "Configuración de pagos actualizada correctamente",
"payment_modes": "Modos de pago",
@ -911,6 +931,7 @@
"download_zip_file": "Descargar archivo ZIP",
"unzipping_package": "Descomprimir paquete",
"copying_files": "Copiando documentos",
"deleting_files": "Deleting Unused files",
"running_migrations": "Ejecutar migraciones",
"finishing_update": "Actualización final",
"update_failed": "Actualización fallida",
@ -980,6 +1001,7 @@
"default_driver": "Controlador por defecto",
"is_default": "ES PREDETERMINADO",
"set_default_disk": "Establecer disco predeterminado",
"set_default_disk_confirm": "This disk will be set as default and all the new PDFs will be saved on this disk",
"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.",
@ -1129,7 +1151,8 @@
"address_maxlength": "La dirección no debe tener más de 255 caracteres.",
"ref_number_maxlength": "El número de referencia no debe tener más de 255 caracteres.",
"prefix_maxlength": "El prefijo no debe tener más de 5 caracteres.",
"something_went_wrong": "Algo fue mal"
"something_went_wrong": "Algo fue mal",
"number_length_minvalue": "Number lenght should be greater than 0"
},
"pdf_estimate_label": "Presupuestar",
"pdf_estimate_number": "Número de Presupuesto",
@ -1147,6 +1170,7 @@
"pdf_amount_label": "Cantidad",
"pdf_subtotal": "Subtotal",
"pdf_total": "Total",
"pdf_payment_label": "Payment",
"pdf_payment_receipt_label": "RECIBO DE PAGO",
"pdf_payment_date": "Fecha de pago",
"pdf_payment_number": "Numero de pago",
@ -1155,6 +1179,9 @@
"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",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -86,7 +86,8 @@
"retry": "Retry",
"choose_note": "Choose Note",
"no_note_found": "No Note Found",
"insert_note": "Insert Note"
"insert_note": "Insert Note",
"copied_pdf_url_clipboard": "Copied PDF url to clipboard!"
},
"dashboard": {
"select_year": "Select year",
@ -177,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",
@ -200,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",
@ -270,6 +274,7 @@
"required": "Field is required"
},
"accepted": "Accepted",
"rejected": "Rejected",
"sent": "Sent",
"draft": "Draft",
"declined": "Declined",
@ -316,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.",
@ -434,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",
@ -463,6 +473,7 @@
"receipt": "Receipt",
"amount": "Amount",
"action": "Action",
"not_selected": "Not selected",
"note": "Note",
"category_id": "Category Id",
"date": "Date",
@ -740,10 +751,13 @@
"title": "Invoices",
"notes": "Notes",
"invoice_prefix": "Invoice Prefix",
"invoice_number_length": "Invoice number length",
"default_invoice_email_body": "Default Invoice Email Body",
"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",
@ -754,10 +768,13 @@
"estimates": {
"title": "Estimates",
"estimate_prefix": "Estimate Prefix",
"estimate_number_length": "Estimate number length",
"default_estimate_email_body": "Default Estimate Email Body",
"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",
@ -768,10 +785,13 @@
"title": "Payments",
"description": "Modes of transaction for payments",
"payment_prefix": "Payment Prefix",
"payment_number_length": "Payment number lenght",
"default_payment_email_body": "Default Payment Email Body",
"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",
@ -911,6 +931,7 @@
"download_zip_file": "Download ZIP file",
"unzipping_package": "Unzipping Package",
"copying_files": "Copying Files",
"deleting_files": "Deleting Unused files",
"running_migrations": "Running Migrations",
"finishing_update": "Finishing Update",
"update_failed": "Update Failed",
@ -1130,7 +1151,8 @@
"address_maxlength": "Address should not be greater than 255 characters.",
"ref_number_maxlength": "Ref Number should not be greater than 255 characters.",
"prefix_maxlength": "Prefix should not be greater than 5 characters.",
"something_went_wrong": "something went wrong"
"something_went_wrong": "something went wrong",
"number_length_minvalue": "Number lenght should be greater than 0"
},
"pdf_estimate_label": "Estimate",
"pdf_estimate_number": "Estimate Number",
@ -1148,6 +1170,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 +1179,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

@ -5,29 +5,38 @@ import fr from './fr.json'
import es from './es.json'
import ar from './ar.json'
import de from './de.json'
import ja from './ja.json'
import pt_BR from './pt-br.json'
import it from './it.json'
import sr from './sr.json'
import nl from './nl.json'
import ko from './ko.json'
import lv from './lv.json'
import sv from './sv.json'
import sk from './sk.json'
import vi from './vi.json'
Vue.use(VueI18n)
const i18n = new VueI18n({
locale: 'en',
fallbackLocale: 'en',
messages: {
en,
fr,
es,
ar,
de,
ja,
pt_BR,
it,
sr,
nl,
ko,
lv,
sv,
sk,
vi,
},
})

View File

@ -1,28 +1,28 @@
{
"navigation": {
"dashboard": "Dashboard",
"dashboard": "Pannello di controllo",
"customers": "Clienti",
"items": "Commesse",
"invoices": "Fatture",
"expenses": "Spese",
"estimates": "Preventivi",
"payments": "Pagamenti",
"reports": "Reports",
"reports": "Rapporti",
"settings": "Configurazione",
"logout": "Logout",
"users": "Users"
"logout": "Disconnessione",
"users": "Utenti"
},
"general": {
"add_company": "Add Company",
"add_company": "Aggiungi azienda",
"view_pdf": "Vedi PDF",
"copy_pdf_url": "Copy PDF Url",
"copy_pdf_url": "Copia URL PDF",
"download_pdf": "Scarica PDF",
"save": "Salva",
"create": "Create",
"create": "Crea",
"cancel": "Elimina",
"update": "Aggiorna",
"deselect": "Deseleziona",
"download": "Download",
"download": "Scarica",
"from_date": "Dalla Data",
"to_date": "Alla Data",
"from": "Da",
@ -33,7 +33,7 @@
"subject": "Oggetto",
"body": "Corpo",
"message": "Messaggio",
"send": "Send",
"send": "Invia",
"go_back": "Torna indietro",
"back_to_login": "Torna al Login?",
"home": "Home",
@ -43,7 +43,7 @@
"view": "Visualizza",
"add_new_item": "Aggiungi nuova Commessa",
"clear_all": "Pulisci tutto",
"showing": "Showing",
"showing": "Visualizzo",
"of": "di",
"actions": "Azioni",
"subtotal": "SUBTOTALE",
@ -66,11 +66,11 @@
"powered_by": "Prodotto da",
"bytefury": "Bytefury",
"select_a_status": "Seleziona uno Stato",
"select_a_tax": "Seleziona una Tassa",
"select_a_tax": "Seleziona imposta",
"search": "Cerca",
"are_you_sure": "Sei sicuro/a?",
"list_is_empty": "La lista è vuota.",
"no_tax_found": "Nessuna Tassa trovata!",
"no_tax_found": "Nessuna imposta trovata!",
"four_zero_four": "404",
"you_got_lost": "Hoops! Ti sei perso",
"go_home": "Vai alla Home",
@ -83,10 +83,11 @@
"street_1": "Indirizzo 1",
"street_2": "Indirizzo 2",
"action_failed": "Errore",
"retry": "Retry",
"choose_note": "Choose Note",
"no_note_found": "No Note Found",
"insert_note": "Insert Note"
"retry": "Riprova",
"choose_note": "Scegli Nota",
"no_note_found": "Nessuna Nota Trovata",
"insert_note": "Inserisci Nota",
"copied_pdf_url_clipboard": "Copied PDF url to clipboard!"
},
"dashboard": {
"select_year": "Seleziona anno",
@ -130,13 +131,13 @@
"name": "Nome",
"description": "Descrizione",
"percent": "Percento",
"compound_tax": "Tassa composta"
"compound_tax": "Imposta composta"
},
"global_search": {
"search": "Search...",
"search": "Cerca...",
"customers": "Clienti",
"users": "Users",
"no_results_found": "No Results Found"
"users": "Utenti",
"no_results_found": "Nessun Risultato Trovato"
},
"customers": {
"title": "Clienti",
@ -144,8 +145,8 @@
"contacts_list": "Lista clienti",
"name": "Nome",
"mail": "Mail | Mails",
"statement": "Statement",
"display_name": "Mostra nome",
"statement": "Dichiarazione",
"display_name": "Nome Visibile",
"primary_contact_name": "Riferimento",
"contact_name": "Nome Contatto",
"amount_due": "Ammontare dovuto",
@ -153,10 +154,10 @@
"address": "Indirizzo",
"phone": "Telefono",
"website": "Sito web",
"overview": "Overview",
"enable_portal": "Enable Portal",
"overview": "Panoramica",
"enable_portal": "Abilita Portale",
"country": "Paese",
"state": "Stato",
"state": "Provincia",
"city": "Città",
"zip_code": "Codice Postale",
"added_on": "Aggiunto il",
@ -177,6 +178,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 +203,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",
@ -253,7 +257,7 @@
"convert_to_invoice": "Converti in Fattura",
"mark_as_sent": "Segna come Inviata",
"send_estimate": "Invia preventivo",
"resend_estimate": "Resend Estimate",
"resend_estimate": "Reinvia Preventivo",
"record_payment": "Registra Pagamento",
"add_estimate": "Aggiungi Preventivo",
"save_estimate": "Salva Preventivo",
@ -270,6 +274,7 @@
"required": "Campo obbligatorio"
},
"accepted": "Accettato",
"rejected": "Rejected",
"sent": "Inviato",
"draft": "Bozza",
"declined": "Rifiutato",
@ -315,7 +320,10 @@
"years": "{years} Anno",
"all": "Tutti",
"paid": "Pagato",
"unpaid": "Insoluto",
"unpaid": "Insoluta",
"viewed": "Viewed",
"overdue": "Overdue",
"completed": "Completed",
"customer": "CLIENTE",
"paid_status": "STATO DI PAGAMENTO",
"ref_no": "RIF N.",
@ -339,7 +347,7 @@
"notes": "Note",
"view": "Vedi",
"send_invoice": "Invia Fattura",
"resend_invoice": "Resend Invoice",
"resend_invoice": "Reinvia Fattura",
"invoice_template": "Modello Fattura",
"template": "Modello",
"mark_as_sent": "Segna come inviata",
@ -434,6 +442,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 +473,7 @@
"receipt": "Ricevuta",
"amount": "Ammontare",
"action": "Azione",
"not_selected": "Not selected",
"note": "Nota",
"category_id": "Id categoria",
"date": "Data Spesa",
@ -498,43 +509,43 @@
"password": "Password",
"forgot_password": "Password dimenticata?",
"or_signIn_with": "o fai login con",
"login": "Login",
"login": "Accedi",
"register": "Registrati",
"reset_password": "Resetta Password",
"password_reset_successfully": "Password Resettata con successo",
"enter_email": "Inserisci email",
"enter_password": "Inserisci Password",
"retype_password": "Ridigita Password",
"login_placeholder": "mail@example.com"
"login_placeholder": "mail@esempio.com"
},
"users": {
"title": "Users",
"users_list": "Users List",
"title": "Utenti",
"users_list": "Lista Utenti",
"name": "Nome",
"description": "Descrizione",
"added_on": "Aggiunto il",
"date_of_creation": "Data di creazione",
"action": "Azione",
"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.",
"add_user": "Aggiungi Utente",
"save_user": "Salva Utente",
"update_user": "Aggiorna Utente",
"user": "Utente | Utenti",
"add_new_user": "Aggiungi Nuovo Utente",
"new_user": "Nuovo Utente",
"edit_user": "Modifica Utente",
"no_users": "Ancora nessun utente!",
"list_of_users": "Questa sezione conterrà l'elenco degli utenti.",
"email": "Email",
"phone": "Telefono",
"password": "Password",
"user_attached_message": "Non puoi eliminare una Commessa che è già attiva",
"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": "Non sarai in grado di recuperare questo utente | Non sarai in grado di recuperare questi utenti",
"created_message": "Utente creato correttamente",
"updated_message": "Utente aggiornato correttamente",
"deleted_message": "Utente eliminato con successo | Utenti eliminati con successo"
},
"reports": {
"title": "Report",
"title": "Segnala",
"from_date": "Da",
"to_date": "A",
"status": "Stato",
@ -543,7 +554,7 @@
"download_pdf": "Scarica PDF",
"view_pdf": "Vedi PDF",
"update_report": "Aggiorna Report",
"report": "Report | Reports",
"report": "Segnalazione | Segnalazioni",
"profit_loss": {
"profit_loss": "Guadagni & Perdite",
"to_date": "A",
@ -601,13 +612,13 @@
"customization": "Personalizzazione",
"preferences": "Opzioni",
"notifications": "Notifiche",
"tax_types": "Tupi di Tasse",
"tax_types": "Tipi di Imposte",
"expense_category": "Categorie di spesa",
"update_app": "Aggiorna App",
"backup": "Backup",
"file_disk": "File Disk",
"file_disk": "Disco File",
"custom_fields": "Campi personalizzati",
"payment_modes": "Payment Modes",
"payment_modes": "Modalità di Pagamento",
"notes": "Note"
},
"title": "Impostazioni",
@ -615,7 +626,7 @@
"general": "Generale",
"language": "Lingua",
"primary_currency": "Valuta Principale",
"timezone": "Time Zone",
"timezone": "Fuso Orario",
"date_format": "Formato data",
"currencies": {
"title": "Valute",
@ -636,17 +647,17 @@
"add_currency": "Aggiungi Valùta"
},
"mail": {
"host": "Mail Host",
"host": "Host Mail",
"port": "Mail - Porta",
"driver": "Mail Driver",
"secret": "Secret",
"mailgun_secret": "Mailgun Secret",
"mailgun_domain": "Domain",
"mailgun_endpoint": "Mailgun Endpoint",
"ses_secret": "SES Secret",
"ses_key": "SES Key",
"password": "Mail Password",
"username": "Mail Username",
"driver": "Driver Mail",
"secret": "Segreto",
"mailgun_secret": "Segreto Mailgun",
"mailgun_domain": "Dominio",
"mailgun_endpoint": "Endpoint Mailgun",
"ses_secret": "Segreto SES",
"ses_key": "Chiave SES",
"password": "Password Email",
"username": "Nome Utente Email",
"mail_config": "Configurazione Mail",
"from_name": "Nome Mittente Mail",
"from_mail": "Indirizzo Mittente Mail",
@ -665,7 +676,7 @@
"section_description": "Informazioni sulla tua azienda che saranno mostrate in fattura, preventivi ed altri documenti creati dell'applicazione.",
"phone": "Telefono",
"country": "Paese",
"state": "Stato",
"state": "Provincia",
"city": "Città",
"address": "Indirizzo",
"zip": "CAP",
@ -674,7 +685,7 @@
},
"custom_fields": {
"title": "Campi personalizzati",
"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": "Personalizza le tue fatture, preventivi e ricevute di pagamento con i tuoi campi. Assicurati di utilizzare i campi aggiunti qui sotto nei campi della pagina Personalizzazione delle impostazioni.",
"add_custom_field": "Aggiungi campo personalizzato",
"edit_custom_field": "Modifica campo personalizzato",
"field_name": "Nome campo",
@ -726,7 +737,7 @@
"website": "Sito web",
"name": "Nome",
"country": "Paese",
"state": "Stato",
"state": "Provincia",
"city": "Città",
"company_name": "Nome Azienda",
"address_street_1": "Indirizzo 1",
@ -740,41 +751,50 @@
"title": "Fatture",
"notes": "Note",
"invoice_prefix": "Prefisso Fattura",
"default_invoice_email_body": "Default Invoice Email Body",
"invoice_number_length": "Invoice number length",
"default_invoice_email_body": "Corpo Email Fattura Predefinito",
"invoice_settings": "Impostazioni fattura",
"autogenerate_invoice_number": "Auto genera numero di fattura",
"invoice_setting_description": "Disabilita, se non vuoi auto-generare i numeri delle fatture ogni volta che crei una nuova fattura.",
"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": "Inserisci prefisso fattura",
"terms_and_conditions": "Termini e Condizioni",
"company_address_format": "Company Address Format",
"shipping_address_format": "Shipping Address Format",
"billing_address_format": "Billing Address Format",
"company_address_format": "Formato Indirizzo Azienda",
"shipping_address_format": "Formato Indirizzo Di Spedizione",
"billing_address_format": "Formato Indirizzo Fatturazione",
"invoice_setting_updated": "Impostazioni fatture aggiornate con successo"
},
"estimates": {
"title": "Preventivi",
"estimate_prefix": "Prefisso Preventivi",
"default_estimate_email_body": "Default Estimate Email Body",
"estimate_number_length": "Estimate number length",
"default_estimate_email_body": "Corpo Email Preventivo Predefinito",
"estimate_settings": "Impostazioni Preventivi",
"autogenerate_estimate_number": "Auto-genera Numero di preventivo",
"estimate_setting_description": "Disabilita, se non vuoi autogenerare il numero di preventivo ogni volta che ne viene creato uno nuovo.",
"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": "Inserisci prefisso preventivo",
"estimate_setting_updated": "Impostazioni preventivi aggiornate con successo",
"company_address_format": "Company Address Format",
"billing_address_format": "Billing Address Format",
"shipping_address_format": "Shipping Address Format"
"company_address_format": "Formato Indirizzo Azienda",
"billing_address_format": "Formato Indirizzo Fatturazione",
"shipping_address_format": "Formato Indirizzo Spedizione"
},
"payments": {
"title": "Pagamenti",
"description": "Modes of transaction for payments",
"description": "Modalità di pagamento",
"payment_prefix": "Prefisso Pagamento",
"default_payment_email_body": "Default Payment Email Body",
"payment_number_length": "Payment number lenght",
"default_payment_email_body": "Corpo Email Pagamento Predefinito",
"payment_settings": "Impostazioni Pagamento",
"autogenerate_payment_number": "Auto genera il numero di Pagamento",
"payment_setting_description": "Disabilita, se non vuoi autogenerare il numero di pagamento ogni volta che ne viene creato uno nuovo.",
"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": "Inserisci prefisso di pagamento",
"payment_setting_updated": "Impostazioni di pagamento aggiornate con successo",
"payment_modes": "Payment Modes",
"payment_modes": "Modalità di pagamento",
"add_payment_mode": "Aggiungi modalità di pagamento",
"edit_payment_mode": "Modifica modalità di pagamento",
"mode_name": "Nome modalità",
@ -782,9 +802,9 @@
"payment_mode_updated": "Modalità di pagamento aggiornata",
"payment_mode_confirm_delete": "Non potrai ripristinare la modalità di pagamento",
"already_in_use": "Modalità di pagamento già in uso",
"deleted_message": "Payment Mode deleted successfully",
"company_address_format": "Company Address Format",
"from_customer_address_format": "From Customer Address Format"
"deleted_message": "Modalità di pagamento eliminata con successo",
"company_address_format": "Formato Indirizzo Azienda",
"from_customer_address_format": "Dal Formato Indirizzo Cliente"
},
"items": {
"title": "Commesse",
@ -800,18 +820,18 @@
},
"notes": {
"title": "Note",
"description": "Save time by creating notes and reusing them on your invoices, estimates & payments.",
"description": "Risparmia tempo creando note e riutilizzandole sulle tue fatture, preventivi e pagamenti.",
"notes": "Note",
"type": "genere",
"add_note": "Add Note",
"add_new_note": "Add New Note",
"add_note": "Aggiungi Nota",
"add_new_note": "Aggiungi nuova nota",
"name": "Nome",
"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": "Modifica nota",
"note_added": "Nota aggiunta correttamente",
"note_updated": "Nota aggiornata correttamente",
"note_confirm_delete": "Non sarà possibile recuperare questa nota",
"already_in_use": "Nota già in uso",
"deleted_message": "Nota eliminata con successo"
}
},
"account_settings": {
@ -844,7 +864,7 @@
"please_enter_email": "Inserisci Email"
},
"tax_types": {
"title": "Tipi di Imposta",
"title": "Tipi di Imposte",
"add_tax": "Aggiungi Imposta",
"edit_tax": "Modifica imposta",
"description": "Puoi aggiongere e rimuovere imposte a piacimento. Vengono supportate Tasse differenti per prodotti/servizi specifici esattamento come per le fatture.",
@ -879,8 +899,8 @@
},
"preferences": {
"currency": "Valùta",
"default_language": "Default Language",
"time_zone": "Time Zone",
"default_language": "Lingua predefinita",
"time_zone": "Fuso Orario",
"fiscal_year": "Anno finanziario",
"date_format": "Formato Data",
"discount_setting": "Impostazione Sconto",
@ -892,7 +912,7 @@
"updated_message": "Preferenze aggiornate con successo",
"select_language": "seleziona lingua",
"select_time_zone": "Seleziona Time Zone",
"select_date_format": "Select Date Format",
"select_date_format": "Seleziona Formato Data",
"select_financial_year": "Seleziona anno finanziario"
},
"update_app": {
@ -901,7 +921,7 @@
"check_update": "Controllo aggiornamenti",
"avail_update": "Aggiornamento disponibile",
"next_version": "Versione successiva",
"requirements": "Requirements",
"requirements": "Requisiti",
"update": "Aggiorna ora",
"update_progress": "Aggiornamento in corso...",
"progress_text": "Sarà necessario qualche minuto. Per favore non aggiornare la pagina e non chiudere la finestra prima che l'aggiornamento sia completato",
@ -911,6 +931,7 @@
"download_zip_file": "Scarica il file ZIP",
"unzipping_package": "Pacchetto di decompressione",
"copying_files": "Copia dei file",
"deleting_files": "Deleting Unused files",
"running_migrations": "Esecuzione delle migrazioni",
"finishing_update": "Aggiornamento di finitura",
"update_failed": "Aggiornamento non riuscito",
@ -918,83 +939,84 @@
},
"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",
"description": "Il backup è un file zip che contiene tutti i file nelle cartelle specificate con un dump del vostro database",
"new_backup": "Nuovo Backup",
"create_backup": "Crea Backup",
"select_backup_type": "Scegli tipo di backup",
"backup_confirm_delete": "Non sarà possibile recuperare questo backup",
"path": "percorso",
"new_disk": "Nuovo Disco",
"created_at": "creato il",
"size": "dimensioni",
"dropbox": "dropbox",
"local": "local",
"healthy": "healthy",
"amount_of_backups": "amount of backups",
"newest_backups": "newest backups",
"used_storage": "used storage",
"select_disk": "Select Disk",
"local": "locale",
"healthy": "sano",
"amount_of_backups": "quantità di backup",
"newest_backups": "backup più recenti",
"used_storage": "spazio utilizzato",
"select_disk": "Seleziona Disco",
"action": "Azione",
"deleted_message": "Backup deleted successfully",
"created_message": "Backup created successfully",
"invalid_disk_credentials": "Invalid credential of selected disk"
"deleted_message": "Backup eliminato con successo",
"created_message": "Backup creato con successo",
"invalid_disk_credentials": "Credenziali del disco selezionato non valide"
},
"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 File | Dischi File",
"description": "Per impostazione predefinita, Crater utilizzerà il disco locale per salvare backup, avatar e altri file di immagine. Puoi configurare più di un driver disco come DigitalOcean, S3 e Dropbox in base alle tue preferenze.",
"created_at": "creato il",
"dropbox": "dropbox",
"name": "Nome",
"driver": "Driver",
"disk_type": "genere",
"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",
"disk_name": "Nome Disco",
"new_disk": "Aggiungi Nuovo Disco",
"filesystem_driver": "Driver Filesystem",
"local_driver": "driver locale",
"local_root": "radice locale",
"public_driver": "Driver Pubblico",
"public_root": "Root Pubblica",
"public_url": "Url Pubblico",
"public_visibility": "Visibilità Pubblica",
"media_driver": "Driver Media",
"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",
"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",
"aws_driver": "Driver AWS",
"aws_key": "Chiave AWS",
"aws_secret": "Segreto AWS",
"aws_region": "Regione AWS",
"aws_bucket": "Bucket AWS",
"aws_root": "Root AWS",
"do_spaces_type": "tipo Do Spaces",
"do_spaces_key": "chiave Do Spaces",
"do_spaces_secret": "segreto Do Spaces",
"do_spaces_region": "regione Do Spaces",
"do_spaces_bucket": "bucket Do Spaces",
"do_spaces_endpoint": "endpoint Do Spaces",
"do_spaces_root": "root Do Spaces",
"dropbox_type": "Tipo Dropbox",
"dropbox_token": "Token Dropbox",
"dropbox_key": "Chiave Dropbox",
"dropbox_secret": "Segreto Dropbox",
"dropbox_app": "App Dropbox",
"dropbox_root": "Root Dropbox",
"default_driver": "Driver Predefinito",
"is_default": "È DEFAULT",
"set_default_disk": "Imposta Disco Predefinito",
"set_default_disk_confirm": "This disk will be set as default and all the new PDFs will be saved on this disk",
"success_set_default_disk": "Disco impostato come predefinito correttamente",
"save_pdf_to_disk": "Salva i PDF su disco",
"disk_setting_description": " Abilita questa opzione, se vuoi salvare automaticamente una copia di ogni PDF Fattura, Preventivo e Ricevuta di Pagamento sul tuo disco predefinito. Attivare questa opzione diminuirà il tempo di caricamento durante la visualizzazione dei PDF.",
"select_disk": "Seleziona Disco",
"disk_settings": "Impostazioni Disco",
"confirm_delete": "I file e le cartelle esistenti nel disco specificato non saranno toccati, ma la configurazione del disco sarà eliminata dal Crater",
"action": "Azione",
"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": "Modifica Disco File",
"success_create": "Disco aggiunto correttamente",
"success_update": "Disco aggiornato correttamente",
"error": "Aggiunta del disco fallita",
"deleted_message": "Disco file eliminato con successo",
"disk_variables_save_successfully": "Disco Configurato Con successo",
"disk_variables_save_error": "Configurazione disco fallita.",
"invalid_disk_credentials": "Credenziali del disco selezionato non valide"
}
},
"wizard": {
@ -1013,7 +1035,7 @@
"preferences": "Impostazioni",
"preferences_desc": "Impostazioni di default del sistema.",
"country": "Paese",
"state": "Stato",
"state": "Provincia",
"city": "Città",
"address": "Indirizzo",
"street": "Indirizzo1 | Indirizzo2",
@ -1022,25 +1044,25 @@
"go_back": "Torna indietro",
"currency": "Valùta",
"language": "Lingua",
"time_zone": "Time Zone",
"time_zone": "Fuso Orario",
"fiscal_year": "Anno Finanziario",
"date_format": "Formato Date",
"from_address": "Indirizzo - Da",
"username": "Username",
"username": "Nome utente",
"next": "Successivo",
"continue": "Continua",
"skip": "Salta",
"database": {
"database": "URL del sito & database",
"connection": "Connessione Database",
"host": "Database Host",
"host": "Host Database",
"port": "Database - Porta",
"password": "Database Password",
"app_url": "App URL",
"app_domain": "App Domain",
"username": "Database Username",
"password": "Password Database",
"app_url": "URL dell'App",
"app_domain": "Dominio App",
"username": "Nome Utente del Database",
"db_name": "Database Nome",
"db_path": "Database Path",
"db_path": "Percorso del database",
"desc": "Crea un database sul tuo server e setta le credenziali usando il form qui sotto."
},
"permissions": {
@ -1050,17 +1072,17 @@
"permission_desc": "Qui sotto la lista dei permessi richiesti per far funzionare correttamente l'App. Se il controllo dei permessi fallisce, assicurati di aggiornare/modificare i permessi sulle cartelle."
},
"mail": {
"host": "Mail Host",
"host": "Host Mail",
"port": "Mail - Porta",
"driver": "Mail Driver",
"secret": "Secret",
"mailgun_secret": "Mailgun Secret",
"mailgun_domain": "Domain",
"mailgun_endpoint": "Mailgun Endpoint",
"ses_secret": "SES Secret",
"ses_key": "SES Key",
"password": "Mail Password",
"username": "Mail Username",
"driver": "Driver Mail",
"secret": "Segreto",
"mailgun_secret": "Segreto Mailgun",
"mailgun_domain": "Dominio",
"mailgun_endpoint": "Endpoint Mailgun",
"ses_secret": "Segreto SES",
"ses_key": "Chiave SES",
"password": "Password Email",
"username": "Nome Utente Email",
"mail_config": "Configurazione Mail",
"from_name": "Nome mittente mail",
"from_mail": "Indirizzo mittente mail",
@ -1074,11 +1096,11 @@
"system_req_desc": "Crater ha alcuni requisiti di sistema. Assicurati che il server ha la versione di php richiesta e tutte le estensioni necessarie."
},
"errors": {
"migrate_failed": "Migrate Failed",
"database_variables_save_error": "Cannot write configuration to .env file. Please check its file permissions",
"mail_variables_save_error": "Email configuration failed.",
"connection_failed": "Database connection failed",
"database_should_be_empty": "Database should be empty"
"migrate_failed": "Migrazione Fallita",
"database_variables_save_error": "Impossibile scrivere la configurazione nel file .env. Si prega di controllare i permessi dei file",
"mail_variables_save_error": "Configurazione email fallita.",
"connection_failed": "Connessione al Database fallita",
"database_should_be_empty": "Il database dovrebbe essere vuoto"
},
"success": {
"mail_variables_save_successfully": "Email configurata con successo",
@ -1129,42 +1151,47 @@
"address_maxlength": "L'Indirizzo non può eccedere i 255 caratteri.",
"ref_number_maxlength": "Il Numero di Riferimento non può superare i 255 caratteri.",
"prefix_maxlength": "Il Prefisso non può superare i 5 caratteri.",
"something_went_wrong": "Si è verificato un errore"
"something_went_wrong": "Si è verificato un errore",
"number_length_minvalue": "Number lenght should be greater than 0"
},
"pdf_estimate_label": "Preventivo",
"pdf_estimate_number": "Preventivo Numero",
"pdf_estimate_date": "Data preventivo",
"pdf_estimate_expire_date": "Expiry date",
"pdf_estimate_expire_date": "Data di scadenza",
"pdf_invoice_label": "Fattura",
"pdf_invoice_number": "Numero Fattura",
"pdf_invoice_date": "Data fattura",
"pdf_invoice_due_date": "Due date",
"pdf_invoice_due_date": "Data di pagamento",
"pdf_notes": "Note",
"pdf_items_label": "Commesse",
"pdf_quantity_label": "Quantità",
"pdf_price_label": "Prezzo",
"pdf_discount_label": "Sconto",
"pdf_amount_label": "Ammontare",
"pdf_subtotal": "Subtotal",
"pdf_subtotal": "Parziale",
"pdf_total": "Totale",
"pdf_payment_receipt_label": "PAYMENT RECEIPT",
"pdf_payment_date": "Payment Date",
"pdf_payment_label": "Payment",
"pdf_payment_receipt_label": "RICEVUTA DI PAGAMENTO",
"pdf_payment_date": "Data di pagamento",
"pdf_payment_number": "Numero di pagamento",
"pdf_payment_mode": "Modalità di Pagamento",
"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": "Importo Ricevuto",
"pdf_expense_report_label": "RELAZIONE SPESE",
"pdf_total_expenses_label": "TOTALE SPESE",
"pdf_profit_loss_label": "RELAZIONE PROFITTO E PERDITE",
"pdf_sales_customers_label": "Sales Customer Report",
"pdf_sales_items_label": "Sales Item Report",
"pdf_tax_summery_label": "Tax Summary Report",
"pdf_income_label": "REDDITO",
"pdf_net_profit_label": "PROFITTO NETTO",
"pdf_customer_sales_report": "Relazione Vendite: Per Cliente",
"pdf_total_sales_label": "TOTALE VENDITE",
"pdf_item_sales_label": "Relazione Vendite: Per Articolo",
"pdf_tax_report_label": "RELAZIONE FISCALE",
"pdf_total_tax_label": "TOTALE IMPOSTA",
"pdf_tax_types_label": "Tipi di Imposta",
"pdf_expenses_label": "Uscite",
"pdf_bill_to": "Fattura a,",
"pdf_ship_to": "Invia a,",
"pdf_received_from": "Received from:"
"pdf_received_from": "Ricevuto da:"
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -86,7 +86,8 @@
"retry": "Atkārtot",
"choose_note": "Izvēlieties piezīmi",
"no_note_found": "Piezīmes nav atrastas",
"insert_note": "Ievietot piezīmi"
"insert_note": "Ievietot piezīmi",
"copied_pdf_url_clipboard": "Copied PDF url to clipboard!"
},
"dashboard": {
"select_year": "Izvēlieties gadu",
@ -177,6 +178,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 +203,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 +274,7 @@
"required": "Šis lauks ir obligāts"
},
"accepted": "Apstiprināts",
"rejected": "Rejected",
"sent": "Nosūtīts",
"draft": "Melnraksts",
"declined": "Noraidīts",
@ -316,6 +321,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 +442,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 +473,7 @@
"receipt": "Čeks",
"amount": "Summa",
"action": "Darbība",
"not_selected": "Not selected",
"note": "Piezīme",
"category_id": "Kategorijas Id",
"date": "Datums",
@ -740,10 +751,13 @@
"title": "Rēķini",
"notes": "Piezīmes",
"invoice_prefix": "Rēķina prefikss",
"invoice_number_length": "Invoice number length",
"default_invoice_email_body": "Default Invoice Email Body",
"invoice_settings": "Invoice Settings",
"autogenerate_invoice_number": "Automātiski ģenerēt rēķina numuru",
"invoice_setting_description": "Atspējojiet, ja nevēlaties automātiski ģenerēt rēķinu numurus katru reizi, kad izveidojat jaunu rēķinu.",
"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": "Ievadiet rēķina prefiksu",
"terms_and_conditions": "Lietošanas noteikumi",
"company_address_format": "Uzņēmuma adreses formāts",
@ -754,10 +768,13 @@
"estimates": {
"title": "Aprēķini",
"estimate_prefix": "Aprēķinu prefikss",
"estimate_number_length": "Estimate number length",
"default_estimate_email_body": "Noklusējamais Aprēķina e-pasta saturs",
"estimate_settings": "Aprēķinu iestatījumi",
"autogenerate_estimate_number": "Automātiski ģenerēt Aprēķina numuru",
"estimate_setting_description": "Atspējojiet, ja nevēlaties automātiski ģenerēt Aprēķinu numurus katru reizi, kad izveidojat jaunu Aprēķinu.",
"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": "Ievadiet Aprēķina prefiksu",
"estimate_setting_updated": "Aprēķina iestatījumi ir veiksmīgi atjaunināti",
"company_address_format": "Uzņēmuma adreses formāts",
@ -768,10 +785,13 @@
"title": "Maksājumi",
"description": "Pārskaitījumu veidi, maksājumiem",
"payment_prefix": "Maksājuma prefikss",
"payment_number_length": "Payment number lenght",
"default_payment_email_body": "Noklusējamais Maksājuma e-pasta saturs",
"payment_settings": "Maksājumu iestatījumi",
"autogenerate_payment_number": "Automātiski ģenerēt Maksājuma numuru",
"payment_setting_description": "Atspējojiet, ja nevēlaties automātiski ģenerēt Maksājuma numurus katru reizi, kad izveidojat jaunu Maksājumu.",
"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": "Ievadiet Maksājuma prefiksu",
"payment_setting_updated": "Maksājumu iestatījumi ir veiksmīgi atjaunināti",
"payment_modes": "Apmaksas veidi",
@ -911,6 +931,7 @@
"download_zip_file": "Lejupielādēt ZIP failu",
"unzipping_package": "Atarhivē Zip failu",
"copying_files": "Notiek failu kopēšana",
"deleting_files": "Deleting Unused files",
"running_migrations": "Notiek migrācijas",
"finishing_update": "Pabeidz atjauninājumu",
"update_failed": "Atjaunināšana neizdevās",
@ -980,6 +1001,7 @@
"default_driver": "Default Driver",
"is_default": "IR NOKLUSĒJAMS",
"set_default_disk": "Iestatiet noklusējuma disku",
"set_default_disk_confirm": "This disk will be set as default and all the new PDFs will be saved on this disk",
"success_set_default_disk": "Disks ir veiksmīgi iestatīts kā noklusējums",
"save_pdf_to_disk": "Saglabāt PDF uz diska",
"disk_setting_description": " Iespējot šo, ja vēlaties lai katru rēķina, aprēķina un maksājuma izdrukas PDF kopiju saglabātu diskā. Šī opcija samazinās ielādēšanas laiku, kad apskatīsiet PDF.",
@ -1129,7 +1151,8 @@
"address_maxlength": "Address should not be greater than 255 characters.",
"ref_number_maxlength": "Ref Number should not be greater than 255 characters.",
"prefix_maxlength": "Prefix should not be greater than 5 characters.",
"something_went_wrong": "something went wrong"
"something_went_wrong": "something went wrong",
"number_length_minvalue": "Number lenght should be greater than 0"
},
"pdf_estimate_label": "Aprēķins",
"pdf_estimate_number": "Aprēķina numurs",
@ -1147,6 +1170,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 +1179,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

@ -86,7 +86,8 @@
"retry": "Retr",
"choose_note": "Kies notitie",
"no_note_found": "Geen notitie gevonden",
"insert_note": "Notitie invoegen"
"insert_note": "Notitie invoegen",
"copied_pdf_url_clipboard": "Copied PDF url to clipboard!"
},
"dashboard": {
"select_year": "Selecteer jaar",
@ -177,6 +178,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",
@ -200,6 +203,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",
@ -254,7 +258,7 @@
"mark_as_sent": "Markeren als verzonden",
"send_estimate": "Verzend offerte",
"resend_estimate": "Offerte opnieuw verzenden",
"record_payment": "Bestaling registreren",
"record_payment": "Betaling registreren",
"add_estimate": "Offerte toevoegen",
"save_estimate": "Bewaar offerte",
"confirm_conversion": "Deze offerte wordt gebruikt om een nieuwe factuur te maken.",
@ -270,6 +274,7 @@
"required": "Veld is vereist"
},
"accepted": "Geaccepteerd",
"rejected": "Rejected",
"sent": "Verzonden",
"draft": "Concept",
"declined": "Geweigerd",
@ -316,6 +321,9 @@
"all": "Allemaal",
"paid": "Betaald",
"unpaid": "Onbetaald",
"viewed": "Viewed",
"overdue": "Overdue",
"completed": "Completed",
"customer": "Klant",
"paid_status": "Betaling",
"ref_no": "REF NR.",
@ -347,7 +355,7 @@
"invoice_mark_as_sent": "Deze factuur wordt gemarkeerd als verzonden",
"confirm_send": "Deze factuur wordt via e-mail naar de klant gestuurd",
"invoice_date": "Factuur datum",
"record_payment": "Bestaling registreren",
"record_payment": "Betaling registreren",
"add_new_invoice": "Nieuwe factuur toevoegen",
"update_expense": "Onkosten bijwerken",
"edit_invoice": "Factuur bewerken",
@ -434,6 +442,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",
@ -463,6 +473,7 @@
"receipt": "Bon",
"amount": "Bedrag",
"action": "Actie",
"not_selected": "Not selected",
"note": "Notitie",
"category_id": "Categorie ID",
"date": "Uitgavendatum",
@ -740,10 +751,13 @@
"title": "Facturen",
"notes": "Opmerkingen",
"invoice_prefix": "Factuurvoorvoegsel",
"invoice_number_length": "Invoice number length",
"default_invoice_email_body": "Standaard factuur email text",
"invoice_settings": "Factuurinstellingen",
"autogenerate_invoice_number": "Factuurnummer automatisch genereren",
"invoice_setting_description": "Schakel dit uit als u niet automatisch factuurnummers wilt genereren telkens wanneer u een nieuwe factuur maakt.",
"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": "Voer het factuurvoorvoegsel in",
"terms_and_conditions": "Voorwaarden",
"company_address_format": "Bedrijfsadres format",
@ -754,10 +768,13 @@
"estimates": {
"title": "Offertes",
"estimate_prefix": "Voorvoegsel schatten",
"estimate_number_length": "Estimate number length",
"default_estimate_email_body": "Standaard offerte email text",
"estimate_settings": "Instellingen schatten",
"autogenerate_estimate_number": "Automatisch geschat nummer genereren",
"estimate_setting_description": "Schakel dit uit als u niet automatisch offertesaantallen wilt genereren telkens wanneer u een nieuwe offerte maakt.",
"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": "Voer het prefixnummer in",
"estimate_setting_updated": "Instelling Offerte succesvol bijgewerkt",
"company_address_format": "Bedrijfsadres format",
@ -766,12 +783,15 @@
},
"payments": {
"title": "Betalingen",
"description": "Modes of transaction for payments",
"description": "Manieren om te betalen",
"payment_prefix": "Betalingsvoorvoegsel",
"default_payment_email_body": "Default Payment Email Body",
"payment_number_length": "Payment number lenght",
"default_payment_email_body": "Standaard format betalingsmail",
"payment_settings": "Betalingsinstellingen",
"autogenerate_payment_number": "Betalingsnummer automatisch genereren",
"payment_setting_description": "Schakel dit uit als u niet elke keer dat u een nieuwe betaling aanmaakt, automatisch betalingsnummers wilt genereren.",
"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": "Voer het betalingsvoorvoegsel in",
"payment_setting_updated": "Betalingsinstelling geüpdatet",
"payment_modes": "Betaalmethodes",
@ -911,6 +931,7 @@
"download_zip_file": "Download ZIP-bestand",
"unzipping_package": "Pakket uitpakken",
"copying_files": "Bestanden kopiëren",
"deleting_files": "Deleting Unused files",
"running_migrations": "Migraties uitvoeren",
"finishing_update": "Afwerking Update",
"update_failed": "Update mislukt",
@ -949,7 +970,7 @@
"disk_type": "Type",
"disk_name": "Naam van de schijf",
"new_disk": "Nieuwe schijf toevoegen",
"filesystem_driver": "Filesystem Driver",
"filesystem_driver": "Bestandssysteem locatie",
"local_driver": "lokaal besturingsprogramma",
"local_root": "local Root",
"public_driver": "Publiek besturingsprogramma",
@ -980,6 +1001,7 @@
"default_driver": "Standaard stuurprogramma",
"is_default": "IS STANDAARD",
"set_default_disk": "Standaardschijf instellen",
"set_default_disk_confirm": "This disk will be set as default and all the new PDFs will be saved on this disk",
"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.",
@ -1129,7 +1151,8 @@
"address_maxlength": "Adres mag niet groter zijn dan 255 tekens.",
"ref_number_maxlength": "Ref-nummer mag niet groter zijn dan 255 tekens.",
"prefix_maxlength": "Het voorvoegsel mag niet meer dan 5 tekens bevatten.",
"something_went_wrong": "Er is iets fout gegaan"
"something_went_wrong": "Er is iets fout gegaan",
"number_length_minvalue": "Number lenght should be greater than 0"
},
"pdf_estimate_label": "Offerte",
"pdf_estimate_number": "Offerte nummer",
@ -1147,6 +1170,7 @@
"pdf_amount_label": "Bedrag",
"pdf_subtotal": "Subtotaal",
"pdf_total": "Totaal",
"pdf_payment_label": "Payment",
"pdf_payment_receipt_label": "Betalingsafschrift",
"pdf_payment_date": "Betalingsdatum",
"pdf_payment_number": "Betalingsnummer",
@ -1155,6 +1179,9 @@
"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",

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

@ -10,15 +10,15 @@
"reports": "Relatórios",
"settings": "Configurações",
"logout": "Encerrar sessão",
"users": "Users"
"users": "Usuários"
},
"general": {
"add_company": "Add Company",
"add_company": "Adicionar Empresa",
"view_pdf": "Ver PDF",
"copy_pdf_url": "Copy PDF Url",
"copy_pdf_url": "Copiar URL do PDF",
"download_pdf": "Baixar PDF",
"save": "Salvar",
"create": "Create",
"create": "Criar",
"cancel": "Cancelar",
"update": "Atualizar",
"deselect": "Desmarcar",
@ -33,10 +33,10 @@
"subject": "Sujeita",
"body": "Corpo",
"message": "Mensagem",
"send": "Send",
"send": "Enviar",
"go_back": "Voltar",
"back_to_login": "Voltar ao Login",
"home": "Home",
"back_to_login": "Voltar ao Login?",
"home": "Painel",
"filter": "Filtrar",
"delete": "Excluir",
"edit": "Editar",
@ -59,7 +59,7 @@
"sent": "Enviado",
"all": "Todos",
"select_all": "Selecionar tudo",
"choose_file": "Escolha um arquivo.",
"choose_file": "Clique aqui para escolher um arquivo",
"choose_template": "Escolha um modelo",
"choose": "Escolher",
"remove": "Excluir",
@ -84,14 +84,15 @@
"street_2": "Rua # 2",
"action_failed": "Ação: Falhou",
"retry": "Atualização falhou",
"choose_note": "Choose Note",
"no_note_found": "No Note Found",
"insert_note": "Insert Note"
"choose_note": "Escolher Nota",
"no_note_found": "Nenhuma Nota Encontrada",
"insert_note": "Inserir Nota",
"copied_pdf_url_clipboard": "Copied PDF url to clipboard!"
},
"dashboard": {
"select_year": "Selecione Ano",
"cards": {
"due_amount": "Montante devido",
"due_amount": "Valor devido",
"customers": "Clientes",
"invoices": "Faturas",
"estimates": "Orçamentos"
@ -111,7 +112,7 @@
},
"recent_invoices_card": {
"title": "Faturas vencidas",
"due_on": "vencido em",
"due_on": "Vencido em",
"customer": "Cliente",
"amount_due": "Valor Devido",
"actions": "Ações",
@ -130,21 +131,21 @@
"name": "Nome",
"description": "Descrição",
"percent": "Porcentagem",
"compound_tax": "Imposto compuesto"
"compound_tax": "Imposto Composto"
},
"global_search": {
"search": "Search...",
"search": "Buscar...",
"customers": "Clientes",
"users": "Users",
"no_results_found": "No Results Found"
"users": "Usuários",
"no_results_found": "Nenhum Resultado Encontrado"
},
"customers": {
"title": "Clientes",
"add_customer": "Adicionar cliente",
"contacts_list": "Lista de clientes",
"name": "Nome",
"mail": "Mail | Mails",
"statement": "Statement",
"mail": "Email | Emails",
"statement": "Declaração",
"display_name": "Nome de exibição",
"primary_contact_name": "Nome do contato principal",
"contact_name": "Nome de Contato",
@ -153,13 +154,13 @@
"address": "Endereço",
"phone": "Telefone",
"website": "Site",
"overview": "Overview",
"enable_portal": "Enable Portal",
"overview": "Visão Geral",
"enable_portal": "Habilitar Portal",
"country": "Pais",
"state": "Estado",
"city": "Cidade",
"zip_code": "Código postal",
"added_on": "Adicionado",
"zip_code": "CEP",
"added_on": "Adicionado em",
"action": "Ação",
"password": "Senha",
"street_number": "Número",
@ -169,14 +170,16 @@
"save_customer": "Salvar cliente",
"update_customer": "Atualizar cliente",
"customer": "Cliente | Clientes",
"new_customer": "Novo cliente",
"edit_customer": "Editar cliente",
"basic_info": "Informação basica",
"new_customer": "Novo Cliente",
"edit_customer": "Editar Cliente",
"basic_info": "Informação sica",
"billing_address": "Endereço de cobrança",
"shipping_address": "Endereço de entrega",
"copy_billing_address": "Cópia de faturamento",
"copy_billing_address": "Copiar Endereço 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",
@ -186,7 +189,7 @@
"no_matching_customers": "Não há clientes correspondentes!",
"phone_number": "Número de telefone",
"create_date": "Criar Data",
"confirm_delete": "Você não poderá recuperar este cliente e todas as faturas, estimativas e pagamentos relacionados. | Você não poderá recuperar esses clientes e todas as faturas, estimativas e pagamentos relacionados.",
"confirm_delete": "Você não poderá recuperar este cliente e todas as faturas, orçamentos e pagamentos relacionados. | Você não poderá recuperar esses clientes e todas as faturas, estimativas e pagamentos relacionados.",
"created_message": "Cliente criado com sucesso",
"updated_message": "Cliente atualizado com sucesso",
"deleted_message": "Cliente excluído com sucesso | Clientes excluídos com sucesso"
@ -200,6 +203,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",
@ -208,11 +212,11 @@
"add_new_item": "Adicionar novo item",
"new_item": "Novo item",
"edit_item": "Editar item",
"no_items": "Ainda não existe itens",
"no_items": "Ainda não existe itens!",
"list_of_items": "Esta seção conterá a lista de itens.",
"select_a_unit": "Seleciona unidade",
"select_a_unit": "selecionar unidade",
"taxes": "Impostos",
"item_attached_message": "Não é possível excluir um item que já está em uso.",
"item_attached_message": "Não é possível excluir um item que já está em uso",
"confirm_delete": "Você não poderá recuperar este item | Você não poderá recuperar esses itens",
"created_message": "Item criado com sucesso",
"updated_message": "Item atualizado com sucesso",
@ -222,9 +226,9 @@
"title": "Orçamentos",
"estimate": "Orçamento | Orçamentos",
"estimates_list": "Lista de orçamentos",
"days": "{dias} dias",
"months": "{meses} Mês",
"years": "{Anos} Ano",
"days": "{days} Dias",
"months": "{months} Mês",
"years": "{years} Ano",
"all": "Todos",
"paid": "Pago",
"unpaid": "Não pago",
@ -245,7 +249,7 @@
"expiry_date": "Data de expiração",
"status": "Status",
"add_tax": "Adicionar Imposto",
"amount": "Montante",
"amount": "Valor",
"action": "Ação",
"notes": "Observações",
"tax": "Imposto",
@ -253,12 +257,12 @@
"convert_to_invoice": "Converter em fatura",
"mark_as_sent": "Marcar como enviado",
"send_estimate": "Enviar orçamento",
"resend_estimate": "Resend Estimate",
"resend_estimate": "Reenviar Orçamento",
"record_payment": "Registro de pago",
"add_estimate": "Adicionar orçamento",
"save_estimate": "Salvar Orçamento",
"confirm_conversion": "Deseja converter este orçamento em uma fatura?",
"conversion_message": "Converção realizada com sucesso",
"confirm_conversion": "Esse orçamento será usado para criar uma nova Fatura.",
"conversion_message": "Fatura criada com sucesso",
"confirm_send_estimate": "Este orçamento será enviado por email ao cliente",
"confirm_mark_as_sent": "Este orçamento será marcado como enviado",
"confirm_mark_as_accepted": "Este orçamento será marcado como Aceito",
@ -270,6 +274,7 @@
"required": "Campo obrigatório"
},
"accepted": "Aceito",
"rejected": "Rejected",
"sent": "Enviado",
"draft": "Rascunho",
"declined": "Rejeitado",
@ -277,10 +282,10 @@
"add_new_estimate": "Adicionar novo orçamento",
"update_Estimate": "Atualizar orçamento",
"edit_estimate": "Editar orçamento",
"items": "artículos",
"items": "itens",
"Estimate": "Orçamento | Orçamentos",
"add_new_tax": "Adicionar novo imposto",
"no_estimates": "Ainda não há orcamentos",
"no_estimates": "Ainda não há orçamentos ainda!",
"list_of_estimates": "Esta seção contém a lista de orçamentos.",
"mark_as_rejected": "Marcar como rejeitado",
"mark_as_accepted": "Marcar como aceito",
@ -291,7 +296,7 @@
"updated_message": "Orçamento atualizado com sucesso",
"deleted_message": "Orçamento excluído com sucesso | Orçamentos excluídos com sucesso",
"user_email_does_not_exist": "Email de usuário não existe",
"something_went_wrong": "Algo deu errado",
"something_went_wrong": "algo deu errado",
"item": {
"title": "Titulo do item",
"description": "Descrição",
@ -302,26 +307,29 @@
"total_discount": "Desconto total",
"sub_total": "Subtotal",
"tax": "Imposto",
"amount": "Montante",
"amount": "Valor",
"select_an_item": "Escreva ou clique para selecionar um item",
"type_item_description": "Tipo Item Descrição (opcional)"
"type_item_description": "Descrição do Item (opcional)"
}
},
"invoices": {
"title": "Faturas",
"invoices_list": "Lista de faturas",
"days": "{dias} dias",
"months": "{meses} Mês",
"years": "{anos} Ano",
"days": "{days} dias",
"months": "{months} Mês",
"years": "{years} Ano",
"all": "Todas",
"paid": "Paga",
"unpaid": "Não Paga",
"viewed": "Viewed",
"overdue": "Overdue",
"completed": "Completed",
"customer": "CLIENTE",
"paid_status": "STATUS PAGAMENTO",
"ref_no": "REFERÊNCIA",
"ref_no": "REF NO.",
"number": "NÚMERO",
"amount_due": "VALOR DEVIDO",
"partially_paid": "Parcialmente pago",
"partially_paid": "Parcialmente Pago",
"total": "Total",
"discount": "Desconto",
"sub_total": "Subtotal",
@ -329,17 +337,17 @@
"invoice_number": "Número da fatura",
"ref_number": "Referência",
"contact": "Contato",
"add_item": "Adicionar um item",
"add_item": "Adicionar um Item",
"date": "Data",
"due_date": "Data de Vencimento",
"status": "Status",
"add_tax": "Adicionar imposto",
"amount": "Montante",
"amount": "Valor",
"action": "Ação",
"notes": "Observações",
"view": "Ver",
"send_invoice": "Enviar Fatura",
"resend_invoice": "Resend Invoice",
"resend_invoice": "Reenviar Fatura",
"invoice_template": "Modelo da Fatura",
"template": "Modelo",
"mark_as_sent": "Marcar como enviada",
@ -372,20 +380,20 @@
"discount": "Desconto",
"total": "Total",
"total_discount": "Desconto Total",
"sub_total": "SubTotal",
"sub_total": "Subtotal",
"tax": "Imposto",
"amount": "Montante",
"amount": "Valor",
"select_an_item": "Digite ou clique para selecionar um item",
"type_item_description": "Tipo Descrição do item (opcional)"
"type_item_description": "Descrição do item (opcional)"
},
"payment_attached_message": "Uma das faturas selecionadas já possui um pagamento anexado. Certifique-se de excluir os pagamentos anexados primeiro, a fim de prosseguir com a remoção",
"payment_attached_message": "Uma das faturas selecionadas já possui um pagamento anexado. Certifique-se de excluir os pagamentos anexados primeiro, para continuar com a exclusão",
"confirm_delete": "Você não poderá recuperar esta fatura | Você não poderá recuperar essas faturas",
"created_message": "Fatura criada com sucesso",
"updated_message": "Fatura atualizada com sucesso",
"deleted_message": "Fatura excluída com sucesso | Faturas excluídas com sucesso",
"marked_as_sent_message": "Fatura marcada como enviada com sucesso",
"user_email_does_not_exist": "O email do usuário não existe",
"something_went_wrong": "Algo deu errado",
"something_went_wrong": "algo deu errado",
"invalid_due_amount_message": "O valor total da fatura não pode ser menor que o valor total pago para esta fatura. Atualize a fatura ou exclua os pagamentos associados para continuar."
},
"credit_notes": {
@ -394,7 +402,7 @@
"credit_notes": "Notas de credito",
"contact": "Contato",
"date": "Data",
"amount": "Montante",
"amount": "Valor",
"action": "Ação",
"credit_number": "Número de crédito",
"notes": "Observações",
@ -407,7 +415,7 @@
"discount": "Desconto",
"total": "Total",
"total_discount": "Desconto Total",
"sub_total": "SubTotal",
"sub_total": "Subtotal",
"tax": "Imposto"
}
},
@ -417,9 +425,9 @@
"record_payment": "Gravar Pagamento",
"customer": "Cliente",
"date": "Data",
"amount": "Montante",
"amount": "Valor",
"action": "Ação",
"payment_number": "Número do Pagamento",
"payment_number": "Número de Pagamento",
"payment_mode": "Forma de Pagamento",
"invoice": "Fatura",
"note": "Observação",
@ -429,19 +437,21 @@
"view_payment": "Ver Pagamento",
"add_new_payment": "Adicionar novo Pagamento",
"send_payment_receipt": "Enviar recibo de pagamento",
"send_payment": "Mande o pagamento",
"send_payment": "Enviar Pagamento",
"save_payment": "Salvar Pagamento",
"update_payment": "Atualizar Pagamento",
"payment": "Pagamento | Pagamentos",
"no_payments": "Ainda sem pagamentos!",
"no_payments": "Não há pagamentos ainda!",
"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",
"confirm_mark_as_sent": "Este orçamento será marcado 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 pagamento será enviado por e-mail para o cliente",
"send_payment_successfully": "Pagamento enviado com sucesso",
"user_email_does_not_exist": "O email do usuário não existe",
"something_went_wrong": "Algo deu errado",
"something_went_wrong": "algo deu errado",
"confirm_delete": "Você não poderá recuperar este Pagamento | Você não poderá recuperar esses Pagamentos",
"created_message": "Pagamento criado com sucesso",
"updated_message": "Pagamento atualizado com sucesso",
@ -460,9 +470,10 @@
"to_date": "Até a Data",
"expense_date": "Data",
"description": "Descrição",
"receipt": "Receita",
"amount": "Montante",
"receipt": "Recibo",
"amount": "Valor",
"action": "Ação",
"not_selected": "Not selected",
"note": "Observação",
"category_id": "Categoria",
"date": "Data da Despesa",
@ -485,7 +496,7 @@
"title": "Título",
"name": "Nome",
"description": "Descrição",
"amount": "Montante",
"amount": "Valor",
"actions": "Ações",
"add_category": "Adicionar Categoria",
"new_category": "Nova Categoria",
@ -499,8 +510,8 @@
"forgot_password": "Esqueceu a senha?",
"or_signIn_with": "ou Entre com",
"login": "Entrar",
"register": "Registre-se",
"reset_password": "Resetar Senha",
"register": "Cadastre-se",
"reset_password": "Redefinir Senha",
"password_reset_successfully": "Senha redefinida com sucesso",
"enter_email": "Digite email",
"enter_password": "Digite a senha",
@ -508,30 +519,30 @@
"login_placeholder": "mail@exemplo.com"
},
"users": {
"title": "Users",
"users_list": "Users List",
"title": "Usuários",
"users_list": "Lista de Usuários",
"name": "Nome",
"description": "Descrição",
"added_on": "Adicionado",
"date_of_creation": "Data de criação",
"action": "Ação",
"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.",
"add_user": "Adicionar Usuário",
"save_user": "Salvar Usuário",
"update_user": "Atualizar Usuário",
"user": "Usuário | Usuários",
"add_new_user": "Adicionar Novo Usuário",
"new_user": "Novo Usuário",
"edit_user": "Editar Usuário",
"no_users": "Nenhum usuário ainda!",
"list_of_users": "Esta seção conterá a lista de usuários.",
"email": "Email",
"phone": "Telefone",
"password": "Senha",
"user_attached_message": "Não é possível excluir um item que já está em 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"
"user_attached_message": "Não é possível excluir um item que já está em uso",
"confirm_delete": "Você não poderá recuperar este Usuário | Você não poderá recuperar esses Usuários",
"created_message": "Usuário criado com sucesso",
"updated_message": "Usuário atualizado com sucesso",
"deleted_message": "Usuário excluído com sucesso | Usuários excluídos com sucesso"
},
"reports": {
"title": "Relatório",
@ -545,7 +556,7 @@
"update_report": "Atualizar Relatório",
"report": "Relatório | Relatórios",
"profit_loss": {
"profit_loss": "Perda de lucro",
"profit_loss": "Lucro & Perda",
"to_date": "Até a Data",
"from_date": "A partir da Data",
"date_range": "Selecionar período"
@ -570,7 +581,7 @@
"invoice": "Fatura",
"invoice_date": "Data da Fatura",
"due_date": "Data de Vencimento",
"amount": "Montante",
"amount": "Valor",
"contact_name": "Nome de Contato",
"status": "Status"
},
@ -580,7 +591,7 @@
"due_date": "Data de Vencimento",
"estimate_number": "Número do Orçamento",
"ref_number": "Referência",
"amount": "Montante",
"amount": "Valor",
"contact_name": "Nome de Contato",
"status": "Status"
},
@ -588,7 +599,7 @@
"expenses": "Despesas",
"category": "Categoria",
"date": "Data",
"amount": "Montante",
"amount": "Valor",
"to_date": "Até a Data",
"from_date": "A partir da Data",
"date_range": "Selecionar período"
@ -605,16 +616,16 @@
"expense_category": "Categorias de Despesas",
"update_app": "Atualizar Aplicativo",
"backup": "Backup",
"file_disk": "File Disk",
"file_disk": "Disco de Arquivos",
"custom_fields": "Os campos personalizados",
"payment_modes": "Payment Modes",
"payment_modes": "Meios de Pagamento",
"notes": "Observações"
},
"title": "Configurações",
"setting": "Configuração | Configurações",
"general": "Geral",
"language": "Idioma",
"primary_currency": "Moéda Principal",
"primary_currency": "Moeda Principal",
"timezone": "Fuso horário",
"date_format": "Formato de data",
"currencies": {
@ -640,16 +651,16 @@
"port": "Porta de Email",
"driver": "Driver do email",
"secret": "Segredo",
"mailgun_secret": "Mailgun Segredo",
"mailgun_secret": "Segredo Mailgun",
"mailgun_domain": "Domínio",
"mailgun_endpoint": "Endpoint do Mailgun",
"ses_secret": "SES Segredo",
"ses_key": "SES Chave",
"ses_secret": "Segredo SES",
"ses_key": "Chave SES",
"password": "Senha do Email",
"username": "Nome de Usuário do Email",
"mail_config": "Configuração de Email",
"from_name": "Do Nome de Email",
"from_mail": "Do Endereço de Email",
"from_name": "Nome do Remetente",
"from_mail": "Endereço Email do Remetente",
"encryption": "Criptografia de Email",
"mail_config_desc": "Abaixo está o formulário para configurar o driver de email para enviar emails do aplicativo. Você também pode configurar provedores de terceiros como Sendgrid, SES etc."
},
@ -674,7 +685,7 @@
},
"custom_fields": {
"title": "Os 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": "Personalize as suas faturas, Orçamentos & Recibos de Pagamento com seus próprios campos. Certifique-se de usar os campos abaixo adicionados nos formatos de endereço na página de Configurações de Personalização.",
"add_custom_field": "Adicionar campo personalizado",
"edit_custom_field": "Editar campo personalizado",
"field_name": "Nome do campo",
@ -682,7 +693,7 @@
"type": "Tipo",
"name": "Nome",
"required": "Requeridas",
"placeholder": "Placeholder",
"placeholder": "Dica de Preenchimento",
"help_text": "Texto de ajuda",
"default_value": "Valor padrão",
"prefix": "Prefixo",
@ -690,7 +701,7 @@
"model": "Modelo",
"help_text_description": "Digite algum texto para ajudar os usuários a entender a finalidade desse campo personalizado.",
"suffix": "Sufixo",
"yes": "sim",
"yes": "Sim",
"no": "Não",
"order": "Ordem",
"custom_field_confirm_delete": "Você não poderá recuperar este campo personalizado",
@ -701,7 +712,7 @@
"add_another_option": "Adicione outra opção",
"sort_in_alphabetical_order": "Classificar em ordem alfabética",
"add_options_in_bulk": "Adicionar opções em massa",
"use_predefined_options": "Use Predefined Options",
"use_predefined_options": "Usar Opções Predefinidas",
"select_custom_date": "Selecionar data personalizada",
"select_relative_date": "Selecionar data relativa",
"ticked_by_default": "Marcado por padrão",
@ -709,11 +720,11 @@
"added_message": "Campo personalizado adicionado com sucesso"
},
"customization": {
"customization": "Personalizar",
"customization": "personalização",
"save": "Salvar",
"addresses": {
"title": "Endereço",
"section_description": "Você pode definir o endereço de cobrança do cliente e o formato do endereço de entrega do cliente (exibido apenas em PDF).",
"section_description": "Você pode definir o endereço de cobrança do cliente e o formato do endereço de entrega do cliente (exibido apenas em PDF). ",
"customer_billing_address": "Endereço de Cobrança do Cliente",
"customer_shipping_address": "Endereço de Entrega do Cliente",
"company_address": "Endereço da Empresa",
@ -740,41 +751,50 @@
"title": "Faturas",
"notes": "Notas",
"invoice_prefix": "Fatura Prefixo",
"default_invoice_email_body": "Default Invoice Email Body",
"invoice_settings": "Configrações da Fatura",
"invoice_number_length": "Invoice number length",
"default_invoice_email_body": "Corpo Padrão de Email de Fatura",
"invoice_settings": "Configurações de Fatura",
"autogenerate_invoice_number": "Gerar automaticamente o número da Fatura",
"invoice_setting_description": "Desative isso, se você não deseja gerar automaticamente números da Fatura sempre que criar uma nova.",
"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": "Digite o prefixo da Fatura",
"terms_and_conditions": "Termos e Condições",
"company_address_format": "Company Address Format",
"shipping_address_format": "Shipping Address Format",
"billing_address_format": "Billing Address Format",
"company_address_format": "Formato de Endereço de Empresa",
"shipping_address_format": "Formato de Endereço de Envio",
"billing_address_format": "Formato de Endereço de Faturamento",
"invoice_setting_updated": "Configuração da Fatura atualizada com sucesso"
},
"estimates": {
"title": "Orçamentos",
"estimate_prefix": "Orçamento Prefixo",
"default_estimate_email_body": "Default Estimate Email Body",
"estimate_number_length": "Estimate number length",
"default_estimate_email_body": "Corpo Padrão de Email de Orçamento",
"estimate_settings": "Configurações do Orçamento",
"autogenerate_estimate_number": "Gerar automaticamente o número do Orçamento",
"estimate_setting_description": "Desative isso, se você não deseja gerar automaticamente números do Orçamento sempre que criar um novo.",
"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": "Digite o prefixo do Orçamento",
"estimate_setting_updated": "Configuração do Orçamento atualizada com sucesso",
"company_address_format": "Company Address Format",
"billing_address_format": "Billing Address Format",
"shipping_address_format": "Shipping Address Format"
"estimate_setting_updated": "Configuração de Orçamento atualizada com sucesso",
"company_address_format": "Formato de Endereço de Empresa",
"billing_address_format": "Formato de Endereço de Faturamento",
"shipping_address_format": "Formato de Endereço de Envio"
},
"payments": {
"title": "Pagamentos",
"description": "Modes of transaction for payments",
"description": "Modos de transação para pagamentos",
"payment_prefix": "Pagamento Prefixo",
"default_payment_email_body": "Default Payment Email Body",
"payment_number_length": "Payment number lenght",
"default_payment_email_body": "Corpo Padrão de Email de Pagamento",
"payment_settings": "Configurações de Pagamento",
"autogenerate_payment_number": "Gerar automaticamente número do Pagamento",
"payment_setting_description": "Desative isso, se você não deseja gerar automaticamente números do Pagamento sempre que criar um novo.",
"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": "Digite o Prefixo do Pagamento",
"payment_setting_updated": "Configurações de Pagamento atualizada com sucesso",
"payment_modes": "Payment Modes",
"payment_modes": "Meios de Pagamento",
"add_payment_mode": "Adicionar modo de pagamento",
"edit_payment_mode": "Editar modo de pagamento",
"mode_name": "Nome do modo",
@ -783,35 +803,35 @@
"payment_mode_confirm_delete": "Você não poderá recuperar este modo de pagamento",
"already_in_use": "O modo de pagamento já está em uso",
"deleted_message": "Modo de pagamento excluído com sucesso",
"company_address_format": "Company Address Format",
"from_customer_address_format": "From Customer Address Format"
"company_address_format": "Formato de Endereço de Empresa",
"from_customer_address_format": "Formato de Endereço de Cliente Remetente"
},
"items": {
"title": "Itens",
"units": "unidades",
"units": "Unidades",
"add_item_unit": "Adicionar unidade de item",
"edit_item_unit": "Editar unidade de item",
"unit_name": "Nome da unidade",
"item_unit_added": "Item Unit Added",
"item_unit_updated": "Item Unit Updated",
"item_unit_added": "Unidade de Item Adicionada",
"item_unit_updated": "Unidade de Item Atualizada",
"item_unit_confirm_delete": "Você não poderá recuperar esta unidade de item",
"already_in_use": "A unidade do item já está em uso",
"deleted_message": "Unidade de item excluída com sucesso"
},
"notes": {
"title": "Observações",
"description": "Save time by creating notes and reusing them on your invoices, estimates & payments.",
"notes": "Observações",
"description": "Economize tempo criando notas e reutilizando-as nas suas faturas, orçamentos e pagamentos.",
"notes": "Notas",
"type": "Tipo",
"add_note": "Add Note",
"add_new_note": "Add New Note",
"add_note": "Adicionar Nota",
"add_new_note": "Adicionar Nova Nota",
"name": "Nome",
"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 adicionada com sucesso",
"note_updated": "Nota atualizada com sucesso",
"note_confirm_delete": "Você não poderá recuperar essa nota",
"already_in_use": "A nota já está em uso",
"deleted_message": "Nota excluída com sucesso"
}
},
"account_settings": {
@ -855,7 +875,7 @@
"compound_tax": "Imposto Composto",
"percent": "Porcentagem",
"action": "Ação",
"tax_setting_description": "Habilite isso se desejar adicionar Impostos a itens da Fatura Idividualmente. Por padrão, os impostos são adicionados diretamente à Fatura.",
"tax_setting_description": "Habilite isso se desejar adicionar Impostos a itens da Fatura Individualmente. Por padrão, os impostos são adicionados diretamente à Fatura.",
"created_message": "Tipo de Imposto criado com sucesso",
"updated_message": "Tipo de Imposto Atualizado com sucesso",
"deleted_message": "Tipo de Imposto Deletado com sucesso",
@ -879,7 +899,7 @@
},
"preferences": {
"currency": "Moeda",
"default_language": "Default Language",
"default_language": "Idioma padrão",
"time_zone": "Fuso Horário",
"fiscal_year": "Ano Financeiro",
"date_format": "Formato da Data",
@ -892,16 +912,16 @@
"updated_message": "Preferências atualizadas com sucesso",
"select_language": "Selecione um Idioma",
"select_time_zone": "Selecione um fuso horário",
"select_date_format": "Select Date Format",
"select_date_format": "Selecionar um Formato de Data",
"select_financial_year": "Selecione o ano financeiro"
},
"update_app": {
"title": "Atualizar Aplicativo",
"description": "Você pode atualizar facilmente o Crater, verifique se hà novas atualizações, clicando no botão abaixo",
"description": "Você pode atualizar facilmente o Crater, verifique se há novas atualizações, clicando no botão abaixo",
"check_update": "Verifique se há atualizações",
"avail_update": "Nova atualização disponível",
"next_version": "Próxima versão",
"requirements": "Requirements",
"requirements": "Requisitos",
"update": "Atualizar agora",
"update_progress": "Atualização em progresso...",
"progress_text": "Levará apenas alguns minutos. Não atualize a tela ou feche a janela antes que a atualização seja concluída",
@ -911,90 +931,92 @@
"download_zip_file": "Baixar arquivo ZIP",
"unzipping_package": "Descompactando o pacote",
"copying_files": "Copiando arquivos",
"deleting_files": "Deleting Unused files",
"running_migrations": "Executando migrações",
"finishing_update": "Atualização de acabamento",
"finishing_update": "Acabando a Atualização",
"update_failed": "Atualização falhou",
"update_failed_text": "Desculpa! Sua atualização falhou em: {step} step"
"update_failed_text": "Desculpa! Sua atualização falhou no passo: {step}"
},
"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": "Caminho",
"description": "O backup é um arquivo zip que contém todos os arquivos nas pastas que você especificou juntamente com um arquivo de backup de sua base de dados",
"new_backup": "Adicionar Novo Backup",
"create_backup": "Criar Backup",
"select_backup_type": "Selecionar Tipo de Backup",
"backup_confirm_delete": "Você não poderá recuperar este backup",
"path": "caminho",
"new_disk": "Novo disco",
"created_at": "Criado em",
"size": "Tamanho",
"dropbox": "DropBox",
"created_at": "criado em",
"size": "tamanho",
"dropbox": "dropbox",
"local": "local",
"healthy": "healthy",
"amount_of_backups": "Quantidade de backups",
"newest_backups": "Backups mais recentes",
"used_storage": "used storage",
"select_disk": "Select Disk",
"healthy": "sem erros",
"amount_of_backups": "quantidade de backups",
"newest_backups": "backups mais recentes",
"used_storage": "armazenamento utilizado",
"select_disk": "Selecionar Disco",
"action": "Ação",
"deleted_message": "Backup deleted successfully",
"created_message": "Backup created successfully",
"invalid_disk_credentials": "Invalid credential of selected disk"
"deleted_message": "Backup excluído com sucesso",
"created_message": "Backup criado com sucesso",
"invalid_disk_credentials": "Credencial inválida para o disco selecionado"
},
"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": "Criado em",
"dropbox": "DropBox",
"title": "Disco de Arquivo | Discos de Arquivo",
"description": "Por padrão, o Crater usará o seu disco local para salvar os backups, avatar e outros arquivos de imagem. Você pode configurar mais de um drivers de disco como DigitalOcean, S3 e Dropbox de acordo com sua preferência.",
"created_at": "criado em",
"dropbox": "dropbox",
"name": "Nome",
"driver": "Driver",
"disk_type": "Tipo",
"disk_name": "Nome do disco",
"new_disk": "Adicionar novo disco",
"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",
"filesystem_driver": "Driver de Sistema de Arquivo",
"local_driver": "Driver local",
"local_root": "Root local",
"public_driver": "Driver Público",
"public_root": "Root Público",
"public_url": "URL Pública",
"public_visibility": "Visibilidade Pública",
"media_driver": "Driver de Mídia",
"media_root": "Root de Mídia",
"aws_driver": "Driver AWS",
"aws_key": "Chave AWS",
"aws_secret": "Segredo AWS",
"aws_region": "Região AWS",
"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",
"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",
"aws_bucket": "Bucket AWS",
"aws_root": "Root AWS",
"do_spaces_type": "Tipo de Spaces Do",
"do_spaces_key": "Chave de Spaces Do",
"do_spaces_secret": "Segredo de Spaces Do",
"do_spaces_region": "Região de Spaces Do",
"do_spaces_bucket": "Bucket de Spaces Do",
"do_spaces_endpoint": "Endpoint de Spaces Do",
"do_spaces_root": "Root de Spaces Do",
"dropbox_type": "Tipo de Dropbox",
"dropbox_token": "Token Dropbox",
"dropbox_key": "Chave Dropbox",
"dropbox_secret": "Segredo Dropbox",
"dropbox_app": "Aplicativo Dropbox",
"dropbox_root": "Root Dropbox",
"default_driver": "Driver Padrão",
"is_default": "ESTÁ PADRÃO",
"set_default_disk": "Definir Disco Padrão",
"set_default_disk_confirm": "This disk will be set as default and all the new PDFs will be saved on this disk",
"success_set_default_disk": "Disco definido como padrão com sucesso",
"save_pdf_to_disk": "Salvar PDFs no Disco",
"disk_setting_description": " Ative isso, se você deseja salvar uma cópia de cada fatura, Orçamento e Pagamento PDF em seu disco padrão automaticamente. Virar esta opção irá diminuir o tempo de carregamento ao visualizar os PDFs.",
"select_disk": "Selecionar Disco",
"disk_settings": "Configurações de Disco",
"confirm_delete": "Seus arquivos e pastas existentes no disco especificado não serão afetados, mas sua configuração de disco será excluída do Crater",
"action": "Ação",
"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 Arquivos",
"success_create": "Disco adicionado com sucesso",
"success_update": "Disco atualizado com sucesso",
"error": "Falha na adição de disco",
"deleted_message": "Disco de arquivo excluído com sucesso",
"disk_variables_save_successfully": "Disco configurado com sucesso",
"disk_variables_save_error": "Configuração do disco falhou.",
"invalid_disk_credentials": "Credencial inválida para o disco selecionado"
}
},
"wizard": {
@ -1009,10 +1031,10 @@
"company_info_desc": "Esta informação será exibida nas Faturas. Observe que você pode editar isso mais tarde na página de configurações.",
"company_name": "Nome da Empresa",
"company_logo": "Logotipo da Empresa",
"logo_preview": "Previsualizar Logotipo",
"logo_preview": "Pré-visualizar Logotipo",
"preferences": "Preferências",
"preferences_desc": "Preferências padrão para o sistema.",
"country": "Pais",
"country": "País",
"state": "Estado",
"city": "Cidade",
"address": "Endereço",
@ -1037,10 +1059,10 @@
"port": "Porta da Base de Dados",
"password": "Senha da Base de Dados",
"app_url": "URL do Aplicativo",
"app_domain": "App Domain",
"app_domain": "Domínio do Aplicativo",
"username": "Usuário da Base de Dados",
"db_name": "Nome da Base de Dados",
"db_path": "Database Path",
"db_path": "Pasta do Banco de Dados",
"desc": "Crie um Banco de Dados no seu servidor e defina as credenciais usando o formulário abaixo."
},
"permissions": {
@ -1088,24 +1110,24 @@
"layout_login": {
"copyright_crater": "Copyright @ Crater - 2020",
"super_simple_invoicing": "Faturamento super simples",
"for_freelancer": "Para Freelancers &",
"for_freelancer": "para Freelancers &",
"small_businesses": "Pequenos Negócios ",
"crater_help": "Crater ajuda a rastrear despesas, registrar pagamentos e gerar belas",
"invoices_and_estimates": "Faturas e Orçamentos com capacidade de escolher vários modelos."
"invoices_and_estimates": "faturas e orçamentos com possibilidade de escolher vários modelos."
},
"validation": {
"invalid_phone": "Número de telefone inválido",
"invalid_url": "url inválidas (ex: http://www.crater.com)",
"invalid_domain_url": "url inválidas (ex: crater.com)",
"invalid_url": "URL inválida (ex: http://www.crater.com)",
"invalid_domain_url": "URL inválida (ex: crater.com)",
"required": "Campo obrigatório",
"email_incorrect": "E-mail incorreto",
"email_already_taken": "O email já foi recebido.",
"email_incorrect": "E-mail incorreto.",
"email_already_taken": "O email já está em uso.",
"email_does_not_exist": "O usuário com determinado email não existe",
"item_unit_already_taken": "This item unit name has already been taken",
"payment_mode_already_taken": "This payment mode name has already been taken",
"item_unit_already_taken": "Este nome de unidade de item já está em uso",
"payment_mode_already_taken": "Este meio de pagamento já foi utilizado",
"send_reset_link": "Enviar link de redefinição",
"not_yet": "Ainda não? Envie novamente",
"password_min_length": "A senha deve conter {count} caracteres",
"password_min_length": "A senha deve ter {count} caracteres",
"name_min_length": "O nome deve ter pelo menos {count} letras.",
"enter_valid_tax_rate": "Insira uma taxa de imposto válida",
"numbers_only": "Apenas Números.",
@ -1119,52 +1141,57 @@
"quantity_maxlength": "A quantidade não deve exceder 20 dígitos.",
"price_maxlength": "O preço não deve ser superior a 20 dígitos.",
"price_minvalue": "O preço deve ser maior que 0.",
"amount_maxlength": "Montante não deve ser superior a 20 dígitos.",
"amount_minvalue": "Montante deve ser maior que zero",
"amount_maxlength": "Valor não deve ter mais de 20 dígitos.",
"amount_minvalue": "O valor deve ser maior que 0.",
"description_maxlength": "A descrição não deve ter mais que 255 caracteres.",
"subject_maxlength": "Subject should not be greater than 100 characters.",
"message_maxlength": "Message should not be greater than 255 characters.",
"subject_maxlength": "O assunto não deve ter mais que 100 caracteres.",
"message_maxlength": "A mensagem não deve ter mais que 255 caracteres.",
"maximum_options_error": "Máximo de {max} opções selecionadas. Primeiro remova uma opção selecionada para selecionar outra.",
"notes_maxlength": "As anotações não devem ter mais que 255 caracteres.",
"address_maxlength": "O endereço não deve ter mais que 255 caracteres.",
"ref_number_maxlength": "O número de referência não deve ter mais que 255 caracteres.",
"prefix_maxlength": "O prefixo não deve ter mais que 5 caracteres.",
"something_went_wrong": "Algo deu errado"
"something_went_wrong": "algo deu errado",
"number_length_minvalue": "Number lenght should be greater than 0"
},
"pdf_estimate_label": "Orçamento",
"pdf_estimate_number": "Numero do Orçamento",
"pdf_estimate_date": "Data do Orçamento",
"pdf_estimate_expire_date": "Expiry date",
"pdf_estimate_expire_date": "Data de expiração",
"pdf_invoice_label": "Fatura",
"pdf_invoice_number": "Número da fatura",
"pdf_invoice_date": "Data da Fatura",
"pdf_invoice_due_date": "Due date",
"pdf_invoice_due_date": "Data de Vencimento",
"pdf_notes": "Observações",
"pdf_items_label": "Itens",
"pdf_quantity_label": "Quantidade",
"pdf_price_label": "Preço",
"pdf_discount_label": "Desconto",
"pdf_amount_label": "Montante",
"pdf_amount_label": "Valor",
"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 PAGAMENTO",
"pdf_payment_date": "Data de Pagamento",
"pdf_payment_number": "Número do Pagamento",
"pdf_payment_mode": "Forma de Pagamento",
"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": "Valor Recebido",
"pdf_expense_report_label": "RELATÓRIO DE DESPESAS",
"pdf_total_expenses_label": "TOTAL DESPESAS",
"pdf_profit_loss_label": "RELATÓRIO LUCRO & PERDA",
"pdf_sales_customers_label": "Sales Customer Report",
"pdf_sales_items_label": "Sales Item Report",
"pdf_tax_summery_label": "Tax Summary Report",
"pdf_income_label": "RENDA",
"pdf_net_profit_label": "LUCRO LÍQUIDO",
"pdf_customer_sales_report": "Relatório de Vendas: Por Cliente",
"pdf_total_sales_label": "VENDAS TOTAIS",
"pdf_item_sales_label": "Relatório de Vendas: Por Item",
"pdf_tax_report_label": "RELATÓRIO DE IMPOSTOS",
"pdf_total_tax_label": "IMPOSTOS TOTAIS",
"pdf_tax_types_label": "Tipos de Impostos",
"pdf_expenses_label": "Despesas",
"pdf_bill_to": "Cobrar a,",
"pdf_ship_to": "Envie a,",
"pdf_received_from": "Received from:"
"pdf_received_from": "Remetente:"
}

File diff suppressed because it is too large Load Diff

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",
@ -741,10 +751,13 @@
"title": "Fakture",
"notes": "Napomene",
"invoice_prefix": "Prefiks faktura",
"invoice_number_length": "Invoice number length",
"default_invoice_email_body": "Podrazumevan sadržaj email-a za Fakture",
"invoice_settings": "Podešavanje za fakture",
"autogenerate_invoice_number": "Automatski-generiši broj fakture",
"invoice_setting_description": "Onemogući ovo, Ako Vi ne želite da automatski-generišete broj fakture kada pravite novu fakturu.",
"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": "Unesite prefiks fakture",
"terms_and_conditions": "Uslovi Korišćenja",
"company_address_format": "Format adrese firme",
@ -755,10 +768,13 @@
"estimates": {
"title": "Profakture",
"estimate_prefix": "Prefiks profaktura",
"estimate_number_length": "Estimate number length",
"default_estimate_email_body": "Podrazumevan sadržaj email-a za Profakture",
"estimate_settings": "Podešavanje za profakture",
"autogenerate_estimate_number": "Automatski-generiši broj profakture",
"estimate_setting_description": "Onemogući ovo, Ako Vi ne želite da automatski-generišete broj profakture kada pravite novu profakturu.",
"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": "Unesite prefiks profakture",
"estimate_setting_updated": "Podešavanje za profakture je uspešno sačuvano",
"company_address_format": "Format adrese firme",
@ -769,10 +785,13 @@
"title": "Uplate",
"description": "Način plaćanja",
"payment_prefix": "Prefiks uplata",
"payment_number_length": "Payment number lenght",
"default_payment_email_body": "Podrazumevan sadržaj email-a za potvrdu o plaćanju (račun)",
"payment_settings": "Podešavanje za plaćanja",
"autogenerate_payment_number": "Automatski-generiši broj uplate",
"payment_setting_description": "Onemogući ovo, Ako ne želite da automatski-generišete broj uplate kada pravite novu uplatu.",
"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": "Unesite prefiks uplate",
"payment_setting_updated": "Podešavanje za plaćanja je uspešno sačuvano",
"payment_modes": "Način Plaćanja",
@ -1132,7 +1151,8 @@
"address_maxlength": "Adresa ne može da ima više od 255 karaktera",
"ref_number_maxlength": "Poziv na broj ne može da ima više od 225 karaktera",
"prefix_maxlength": "Prefiks ne može da ima više od 5 karaktera",
"something_went_wrong": "nešto je krenulo naopako"
"something_went_wrong": "nešto je krenulo naopako",
"number_length_minvalue": "Number lenght should be greater than 0"
},
"pdf_estimate_label": "Profaktura",
"pdf_estimate_number": "Broj Profakture",
@ -1150,6 +1170,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 +1179,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",
@ -741,10 +751,13 @@
"title": "Fakturor",
"notes": "Noteringar",
"invoice_prefix": "Prefix för fakturor",
"invoice_number_length": "Invoice number length",
"default_invoice_email_body": "Standardtext för faktura",
"invoice_settings": "Fakturainställningar",
"autogenerate_invoice_number": "Generera fakturanummer automatiskt",
"invoice_setting_description": "Inaktivera detta dom du inte vill att det automatiskt ska genereras ett nytt fakturanummer vid skapande av faktura.",
"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": "Skriv prefix för faktura",
"terms_and_conditions": "Villkor",
"company_address_format": "Formatering av företagsadress",
@ -755,10 +768,13 @@
"estimates": {
"title": "Kostnadsförslag",
"estimate_prefix": "Prefix för kostnadsförslag",
"estimate_number_length": "Estimate number length",
"default_estimate_email_body": "Standardtext för kostnadsförslag",
"estimate_settings": "Kostnadsförslagsinställningar",
"autogenerate_estimate_number": "Generera kostnadsförslagsnummer automatiskt",
"estimate_setting_description": "Inaktivera detta dom du inte vill att det automatiskt ska genereras ett nytt kostnadsförslagsnummer vid skapande av kostnadsförslag.",
"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": "Skriv prefix för kostnadsförslag",
"estimate_setting_updated": "Kostnadsförslagsinställningar uppdaterades",
"company_address_format": "Formatering av företagsadress",
@ -769,10 +785,13 @@
"title": "Betalningar",
"description": "Överföringstyper för betalningar",
"payment_prefix": "Prefix för betalningar",
"payment_number_length": "Payment number lenght",
"default_payment_email_body": "Standardtext för betalningar",
"payment_settings": "Betalningsinställningar",
"autogenerate_payment_number": "Generera betalningsnummer automatiskt",
"payment_setting_description": "Inaktivera detta dom du inte vill att det automatiskt ska genereras ett nytt betalningssnummer vid skapande av betalning.",
"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": "Skriv prefix för kostnadsförslag",
"payment_setting_updated": "Betalningsinställningar uppdaterades",
"payment_modes": "Betalningssätt",
@ -912,6 +931,7 @@
"download_zip_file": "Ladda ner ZIP-fil",
"unzipping_package": "Zippar upp paket",
"copying_files": "Kopierar filer",
"deleting_files": "Deleting Unused files",
"running_migrations": "Kör migreringar",
"finishing_update": "Avslutar uppdateringen",
"update_failed": "Uppdatering misslyckades",
@ -1131,7 +1151,8 @@
"address_maxlength": "Adress kan inte vara större än 255 tecken.",
"ref_number_maxlength": "Referensnummer kan inte vara större än 255 tecken.",
"prefix_maxlength": "Prefix kan inte vara större än 5 tecken.",
"something_went_wrong": "något blev fel"
"something_went_wrong": "något blev fel",
"number_length_minvalue": "Number lenght should be greater than 0"
},
"pdf_estimate_label": "Kostnadsförslag",
"pdf_estimate_number": "Kostnadsförslagsnummer",
@ -1149,6 +1170,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 +1179,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",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -26,6 +26,7 @@ import estimateTemplate from './modules/estimate-template'
import invoiceTemplate from './modules/invoice-template'
import search from './modules/search'
import notes from './modules/notes'
import notification from './modules/notification'
Vue.use(Vuex)
@ -76,5 +77,6 @@ export default new Vuex.Store({
invoiceTemplate,
search,
notes,
notification,
},
})

View File

@ -13,7 +13,6 @@ export const login = ({ commit }, data) => {
commit('user/' + userTypes.RESET_CURRENT_USER, null, { root: true })
commit(rootTypes.UPDATE_APP_LOADING_STATUS, false, { root: true })
window.toastr['success']('Login Successful')
resolve(response)
})
.catch((err) => {
@ -28,7 +27,7 @@ export const setLogoutFalse = ({ state, commit }) => {
commit(types.SET_LOGOUT, false)
}
export const logout = ({ state, commit }) => {
export const logout = ({ state, commit, dispatch }) => {
return new Promise((resolve, reject) => {
if (state.isLoggedOut) {
resolve()
@ -40,7 +39,14 @@ export const logout = ({ state, commit }) => {
.get('/auth/logout')
.then(() => {
router.push('/login')
window.toastr['success']('Logged out!', 'Success')
dispatch(
'notification/showNotification',
{
type: 'success',
message: 'Logged out successfully.',
},
{ root: true }
)
})
.catch((err) => {
router.push('/login')

View File

@ -0,0 +1,27 @@
import * as types from './mutation-types'
export const showNotification = ({ commit, dispatch, state }, payload) => {
commit(types.SHOW_NOTIFICATION, true)
if (payload.type) {
commit(types.SET_NOTIFICATION_TYPE, payload.type)
}
if (payload.title) {
commit(types.SET_TITLE, payload.title)
}
if (payload.autoHide) {
commit(types.SET_AUTO_HIDE, payload.autoHide)
}
if (payload.message) {
commit(types.SET_MESSAGE, payload.message)
}
}
export const hideNotification = ({ commit, dispatch, state }) => {
commit(types.RESET_DATA)
commit(types.HIDE_NOTIFICATION, false)
}
export const resetNotificationData = ({ commit, dispatch, state }) => {
commit(types.RESET_DATA)
}

View File

@ -0,0 +1,5 @@
export const notificationActive = (state) => state.active
export const notificationTitle = (state) => state.title
export const notificationMessage = (state) => state.message
export const notificationAutoHide = (state) => state.autoHide
export const notificationType = (state) => state.type

View File

@ -0,0 +1,23 @@
import mutations from './mutations'
import * as actions from './actions'
import * as getters from './getters'
const initialState = {
active: false,
autoHide: true,
title: '',
message: '',
type: '',
}
export default {
namespaced: true,
state: initialState,
getters: getters,
actions: actions,
mutations: mutations,
}

View File

@ -0,0 +1,7 @@
export const SHOW_NOTIFICATION = 'SHOW_NOTIFICATION'
export const HIDE_NOTIFICATION = 'HIDE_NOTIFICATION'
export const SET_TITLE = 'SET_TITLE'
export const SET_AUTO_HIDE = 'SET_AUTO_HIDE'
export const SET_MESSAGE = 'SET_MESSAGE'
export const SET_NOTIFICATION_TYPE = 'SET_NOTIFICATION_TYPE'
export const RESET_DATA = 'RESET_DATA'

View File

@ -0,0 +1,33 @@
import * as types from './mutation-types'
export default {
[types.SHOW_NOTIFICATION](state, data) {
state.active = data
},
[types.HIDE_NOTIFICATION](state, data) {
state.active = data
},
[types.SET_TITLE](state, data) {
state.title = data
},
[types.SET_AUTO_HIDE](state, data) {
state.autoHide = data
},
[types.SET_MESSAGE](state, data) {
state.message = data
},
[types.SET_NOTIFICATION_TYPE](state, data) {
state.type = data
},
[types.RESET_DATA](state) {
state.active = false
state.description = ''
state.title = ''
},
}

View File

@ -45,9 +45,8 @@
</template>
<script type="text/babel">
import { async } from 'q'
const { required, email } = require('vuelidate/lib/validators')
import { mapActions } from 'vuex'
export default {
data() {
return {
@ -67,6 +66,7 @@ export default {
},
},
methods: {
...mapActions('notification', ['showNotification']),
async validateBeforeSubmit(e) {
this.$v.formData.$touch()
if (!this.$v.formData.$invalid) {
@ -78,7 +78,10 @@ export default {
)
if (res.data) {
toastr['success']('Mail sent successfuly!', 'Success')
this.showNotification({
type: 'success',
message: 'Mail sent successfuly!',
})
}
this.isSent = true

View File

@ -145,6 +145,7 @@ export default {
},
methods: {
...mapActions('auth', ['login']),
...mapActions('notification', ['showNotification']),
async validateBeforeSubmit() {
axios.defaults.withCredentials = true
@ -158,6 +159,10 @@ export default {
try {
await this.login(this.loginData)
this.$router.push('/admin/dashboard')
this.showNotification({
type: 'success',
message: 'Logged in successfully.',
})
this.isLoading = false
} catch (error) {
this.isLoading = false

View File

@ -92,6 +92,7 @@ const {
sameAs,
minLength,
} = require('vuelidate/lib/validators')
import { mapActions } from 'vuex'
export default {
data() {
@ -120,6 +121,7 @@ export default {
},
},
methods: {
...mapActions('notification', ['showNotification']),
async validateBeforeSubmit(e) {
this.$v.formData.$touch()
@ -135,18 +137,18 @@ export default {
let res = await axios.post('/api/v1/auth/reset/password', data)
this.isLoading = false
if (res.data) {
toastr['success'](
this.$t('login.password_reset_successfully'),
'Success'
)
this.showNotification({
type: 'success',
message: this.$t('login.password_reset_successfully'),
})
this.$router.push('/login')
}
} catch (err) {
if (err.response && err.response.status === 403) {
toastr['error'](
err.response.data,
this.$t('validation.email_incorrect')
)
this.showNotification({
type: 'error',
message: this.$t('validation.email_incorrect'),
})
this.isLoading = false
}
}

View File

@ -1,26 +1,26 @@
<template>
<base-page class="customer-create">
<form v-if="!initLoad" @submit.prevent="submitCustomerData">
<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/customers"
:title="$tc('customers.customer', 2)"
to="/admin/customers"
/>
<sw-breadcrumb-item
v-if="$route.name === 'customers.edit'"
to="#"
:title="$t('customers.edit_customer')"
to="#"
active
/>
<sw-breadcrumb-item
v-else
to="#"
:title="$t('customers.new_customer')"
to="#"
active
/>
</sw-breadcrumb>
@ -56,8 +56,8 @@
>
<sw-input-group
:label="$t('customers.display_name')"
class="md:col-span-3"
:error="displayNameError"
class="md:col-span-3"
required
>
<sw-input
@ -85,8 +85,8 @@
<sw-input-group
:label="$t('customers.email')"
class="md:col-span-3"
:error="emailError"
class="md:col-span-3"
>
<sw-input
:invalid="$v.formData.email.$error"
@ -243,8 +243,8 @@
<sw-input-group :label="$t('customers.zip_code')">
<sw-input
tabindex="14"
v-model.trim="billing.zip"
tabindex="14"
type="text"
name="zip"
/>
@ -406,16 +406,16 @@
class="grid col-span-5 lg:col-span-4 gap-y-6 gap-x-4 md:grid-cols-6"
>
<sw-input-group
class="md:col-span-3"
v-for="(field, index) in customFields"
:label="field.label"
:required="field.is_required ? true : false"
:key="index"
class="md:col-span-3"
>
<component
:type="field.type.label"
:field="field"
:isEdit="isEdit"
:is-edit="isEdit"
:is="field.type + 'Field'"
:invalid-fields="invalidFields"
:tabindex="23 + index"
@ -694,7 +694,7 @@ export default {
'updateCustomer',
'fetchViewCustomer',
]),
...mapActions('notification', ['showNotification']),
...mapActions('customFields', ['fetchCustomFields']),
currencyNameWithCode({ name, code }) {
@ -786,10 +786,16 @@ export default {
this.$router.push(
`/admin/customers/${response.data.customer.id}/view`
)
window.toastr['success'](this.$t('customers.updated_message'))
this.showNotification({
type: 'success',
message: this.$t('customers.updated_message'),
})
}
if (response.data.error) {
window.toastr['error'](this.$t('validation.email_already_taken'))
this.showNotification({
type: 'error',
message: this.$t('validation.email_already_taken'),
})
}
} else {
response = await this.addCustomer(this.formData)
@ -797,7 +803,10 @@ export default {
this.$router.push(
`/admin/customers/${response.data.customer.id}/view`
)
window.toastr['success'](this.$t('customers.created_message'))
this.showNotification({
type: 'success',
message: this.$t('customers.created_message'),
})
}
}
@ -806,7 +815,10 @@ export default {
} catch (error) {
this.isLoading = false
if (err.response.data.errors.email) {
window.toastr['error'](this.$t('validation.email_already_taken'))
this.showNotification({
type: 'error',
message: this.$t('validation.email_already_taken'),
})
}
}
},

View File

@ -195,7 +195,11 @@
<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 +212,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>
@ -354,6 +358,7 @@ export default {
'deleteMultipleCustomers',
'setSelectAllState',
]),
...mapActions('notification', ['showNotification']),
refreshTable() {
this.$refs.table.refresh()
},
@ -398,43 +403,60 @@ export default {
},
async removeCustomer(id) {
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$tc('customers.confirm_delete'),
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (willDelete) => {
if (willDelete) {
icon: 'error',
iconHtml: `<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-red-600"fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let res = await this.deleteCustomer({ ids: [id] })
if (res.data.success) {
window.toastr['success'](this.$tc('customers.deleted_message', 1))
this.showNotification({
type: 'success',
message: this.$tc('customers.deleted_message', 1),
})
this.$refs.table.refresh()
return true
}
window.toastr['error'](res.data.message)
this.showNotification({
type: 'error',
message: this.$tc(res.data.message),
})
return true
}
})
},
async removeMultipleCustomers() {
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$tc('customers.confirm_delete', 2),
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (willDelete) => {
if (willDelete) {
icon: 'error',
iconHtml: `<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-red-600"fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let request = await this.deleteMultipleCustomers()
if (request.data.success) {
window.toastr['success'](this.$tc('customers.deleted_message', 2))
this.showNotification({
type: 'success',
message: this.$tc('customers.deleted_message', 2),
})
this.refreshTable()
} else if (request.data.error) {
window.toastr['error'](request.data.message)
this.showNotification({
type: 'error',
message: request.data.message,
})
}
}
})

View File

@ -3,8 +3,8 @@
<sw-page-header :title="pageTitle">
<template slot="actions">
<sw-button
tag-name="router-link"
:to="`/admin/customers/${$route.params.id}/edit`"
tag-name="router-link"
class="mr-3"
variant="primary-outline"
>
@ -15,29 +15,29 @@
{{ $t('customers.new_transaction') }}
</sw-button>
<sw-dropdown-item
tag-name="router-link"
:to="`/admin/estimates/create?customer=${$route.params.id}`"
tag-name="router-link"
>
<document-icon class="h-5 mr-3 text-gray-600" />
{{ $t('estimates.new_estimate') }}
</sw-dropdown-item>
<sw-dropdown-item
tag-name="router-link"
:to="`/admin/invoices/create?customer=${$route.params.id}`"
tag-name="router-link"
>
<document-text-icon class="h-5 mr-3 text-gray-600" />
{{ $t('invoices.new_invoice') }}
</sw-dropdown-item>
<sw-dropdown-item
tag-name="router-link"
:to="`/admin/payments/create?customer=${$route.params.id}`"
tag-name="router-link"
>
<credit-card-icon class="h-5 mr-3 text-gray-600" />
{{ $t('payments.new_payment') }}
</sw-dropdown-item>
<sw-dropdown-item
tag-name="router-link"
:to="`/admin/expenses/create?customer=${$route.params.id}`"
tag-name="router-link"
>
<calculator-icon class="h-5 mr-3 text-gray-600" />
{{ $t('expenses.new_expense') }}
@ -112,25 +112,48 @@ export default {
'selectCustomer',
'deleteMultipleCustomers',
]),
...mapActions('notification', ['showNotification']),
async removeCustomer(id) {
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$tc('customers.confirm_delete'),
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (willDelete) => {
if (willDelete) {
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
class="w-6 h-6"
focusable="false"
data-prefix="fas"
data-icon="trash"
class="svg-inline--fa fa-trash fa-w-14"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 448 512"
>
<path
fill="#55547A"
d="M432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zM53.2 467a48 48 0 0 0 47.9 45h245.8a48 48 0 0 0 47.9-45L416 128H32z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let data = [id]
this.selectCustomer(data)
let res = await this.deleteMultipleCustomers()
if (res.data.success) {
window.toastr['success'](this.$tc('customers.deleted_message'))
this.showNotification({
type: 'success',
message: this.$tc('customers.deleted_message'),
})
this.$router.push('/admin/customers')
return true
} else if (request.data.error) {
window.toastr['error'](res.data.message)
this.showNotification({
type: 'error',
message: res.data.message,
})
}
}
})

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>
@ -96,16 +98,16 @@
<sw-dropdown slot-scope="row">
<dot-icon slot="activator" />
<sw-dropdown-item
tag-name="router-link"
:to="`invoices/${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="`invoices/${row.id}/view`"
tag-name="router-link"
>
<eye-icon class="h-5 mr-3 text-gray-600" />
{{ $t('invoices.view') }}
@ -225,16 +227,16 @@
<dot-icon slot="activator" />
<sw-dropdown-item
tag-name="router-link"
:to="`estimates/${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="`estimates/${row.id}/view`"
tag-name="router-link"
>
<eye-icon class="h-5 mr-3 text-gray-600" />
{{ $t('general.view') }}
@ -348,6 +350,8 @@ export default {
'convertToInvoice',
]),
...mapActions('notification', ['showNotification']),
...mapActions('estimate', {
sendEstimateEmail: 'sendEmail',
markEstimateAsSent: 'markAsSent',
@ -360,25 +364,32 @@ export default {
async removeEstimate(id) {
this.id = id
window
.swal({
title: this.$t('general.are_you_sure'),
text: this.$tc('estimates.confirm_delete', 1),
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true,
})
.then(async (willDelete) => {
if (willDelete) {
let res = await this.deleteEstimate({ ids: [this.id] })
if (res.data.success) {
window.toastr['success'](this.$tc('estimates.deleted_message', 1))
this.refreshEstTable()
} else if (res.data.error) {
window.toastr['error'](res.data.message)
}
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$tc('estimates.confirm_delete', 1),
icon: 'error',
iconHtml: `<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-red-600"fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let res = await this.deleteEstimate({ ids: [this.id] })
if (res.data.success) {
this.showNotification({
type: 'success',
message: this.$tc('estimates.deleted_message', 1),
})
this.refreshEstTable()
} else if (res.data.error) {
this.showNotification({
type: 'error',
message: res.data.message,
})
}
})
}
})
},
refreshInvTable() {
@ -390,229 +401,355 @@ export default {
},
async convertInToinvoice(id) {
window
.swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_conversion'),
icon: '/assets/icon/file-alt-solid.svg',
buttons: true,
dangerMode: true,
})
.then(async (willDelete) => {
if (willDelete) {
let res = await this.convertToInvoice(id)
this.selectAllField = false
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_conversion'),
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
viewBox="0 0 384 512"
class="w-6 h-6"
data-prefix="fas"
data-icon="file-alt"
class="svg-inline--fa fa-file-alt fa-w-12"
role="img"
xmlns="http://www.w3.org/2000/svg"
>
<path
fill="#55547A"
d="M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm64 236c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12v8zm0-64c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12v8zm0-72v8c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12zm96-114.1v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let res = await this.convertToInvoice(id)
this.selectAllField = false
if (res.data) {
window.toastr['success'](this.$t('estimates.conversion_message'))
this.$router.push(`invoices/${res.data.invoice.id}/edit`)
} else if (res.data.error) {
window.toastr['error'](res.data.message)
}
if (res.data) {
this.showNotification({
type: 'success',
message: this.$t('estimates.conversion_message'),
})
this.$router.push(`invoices/${res.data.invoice.id}/edit`)
} else if (res.data.error) {
this.showNotification({
type: 'error',
message: res.data.message,
})
}
})
}
})
},
async onMarkAsSent(id) {
window
.swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_mark_as_sent'),
icon: '/assets/icon/check-circle-solid.svg',
buttons: true,
dangerMode: true,
})
.then(async (willMarkAsSent) => {
if (willMarkAsSent) {
const data = {
id: id,
status: 'SENT',
}
let response = await this.markEstimateAsSent(data)
this.refreshEstTable()
if (response.data) {
window.toastr['success'](
this.$tc('estimates.mark_as_sent_successfully')
)
}
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_mark_as_sent'),
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
class="w-6 h-6"
focusable="false"
data-prefix="fas"
data-icon="check-circle"
class="svg-inline--fa fa-check-circle fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#55547A"
d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
const data = {
id: id,
status: 'SENT',
}
})
let response = await this.markEstimateAsSent(data)
this.refreshEstTable()
if (response.data) {
this.showNotification({
type: 'success',
message: this.$tc('estimates.mark_as_sent_successfully'),
})
}
}
})
},
async removeInvoice(id) {
this.id = id
window
.swal({
title: this.$t('general.are_you_sure'),
text: this.$tc('invoices.confirm_delete'),
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true,
})
.then(async (willDelete) => {
if (willDelete) {
let res = await this.deleteInvoice({ ids: [this.id] })
if (res.data.success) {
window.toastr['success'](this.$tc('invoices.deleted_message'))
this.refreshInvTable()
} else if (res.data.error) {
window.toastr['error'](res.data.message)
}
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$tc('invoices.confirm_delete'),
icon: 'error',
iconHtml: `<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-red-600"fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let res = await this.deleteInvoice({ ids: [this.id] })
if (res.data.success) {
this.showNotification({
type: 'success',
message: this.$tc('invoices.deleted_message'),
})
this.refreshInvTable()
} else if (res.data.error) {
this.showNotification({
type: 'error',
message: res.data.message,
})
}
})
}
})
},
async sendInvoice(id) {
window
.swal({
title: this.$t('general.are_you_sure'),
text: this.$t('invoices.confirm_send'),
icon: '/assets/icon/paper-plane-solid.svg',
buttons: true,
dangerMode: true,
})
.then(async (willSendInvoice) => {
if (willSendInvoice) {
const data = {
id: id,
}
let response = await this.sendEmail(data)
this.refreshInvTable()
if (response.data.success) {
window.toastr['success'](
this.$tc('invoices.send_invoice_successfully')
)
return true
}
if (response.data.error === 'user_email_does_not_exist') {
window.toastr['error'](
this.$tc('invoices.user_email_does_not_exist')
)
return false
}
window.toastr['error'](this.$tc('invoices.something_went_wrong'))
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('invoices.confirm_send'),
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
focusable="false"
class="w-6 h-6"
data-prefix="fas"
data-icon="paper-plane"
class="svg-inline--fa fa-paper-plane fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#55547A"
d="M476 3.2L12.5 270.6c-18.1 10.4-15.8 35.6 2.2 43.2L121 358.4l287.3-253.2c5.5-4.9 13.3 2.6 8.6 8.3L176 407v80.5c0 23.6 28.5 32.9 42.5 15.8L282 426l124.6 52.2c14.2 6 30.4-2.9 33-18.2l72-432C515 7.8 493.3-6.8 476 3.2z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
const data = {
id: id,
}
})
let response = await this.sendEmail(data)
this.refreshInvTable()
if (response.data.success) {
this.showNotification({
type: 'success',
message: this.$tc('invoices.send_invoice_successfully'),
})
return true
}
if (response.data.error === 'user_email_does_not_exist') {
this.showNotification({
type: 'error',
message: this.$tc('invoices.user_email_does_not_exist'),
})
return false
}
this.showNotification({
type: 'error',
message: this.$tc('invoices.something_went_wrong'),
})
}
})
},
async sentInvoice(id) {
window
.swal({
title: this.$t('general.are_you_sure'),
text: this.$t('invoices.invoice_mark_as_sent'),
icon: '/assets/icon/check-circle-solid.svg',
buttons: true,
dangerMode: true,
})
.then(async (willMarkAsSend) => {
if (willMarkAsSend) {
const data = {
id: id,
status: 'SENT',
}
let response = await this.markAsSent(data)
this.refreshInvTable()
if (response.data) {
window.toastr['success'](
this.$tc('invoices.mark_as_sent_successfully')
)
}
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('invoices.invoice_mark_as_sent'),
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
class="w-6 h-6"
focusable="false"
data-prefix="fas"
data-icon="check-circle"
class="svg-inline--fa fa-check-circle fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#55547A"
d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
const data = {
id: id,
status: 'SENT',
}
})
let response = await this.markAsSent(data)
this.refreshInvTable()
if (response.data) {
this.showNotification({
type: 'success',
message: this.$tc('invoices.mark_as_sent_successfully'),
})
}
}
})
},
async onMarkAsAccepted(id) {
window
.swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_mark_as_accepted'),
icon: '/assets/icon/check-circle-solid.svg',
buttons: true,
dangerMode: true,
})
.then(async (markedAsRejected) => {
if (markedAsRejected) {
const data = {
id: id,
}
let response = await this.markAsAccepted(data)
this.refreshEstTable()
if (response.data) {
this.refreshEstTable()
window.toastr['success'](
this.$tc('estimates.marked_as_accepted_message')
)
}
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_mark_as_accepted'),
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
class="w-6 h-6"
focusable="false"
data-prefix="fas"
data-icon="check-circle"
class="svg-inline--fa fa-check-circle fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#55547A"
d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
const data = {
id: id,
}
})
let response = await this.markAsAccepted(data)
this.refreshEstTable()
if (response.data) {
this.refreshEstTable()
this.showNotification({
type: 'success',
message: this.$tc('estimates.marked_as_accepted_message'),
})
}
}
})
},
async onMarkAsRejected(id) {
window
.swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_mark_as_rejected'),
icon: '/assets/icon/times-circle-solid.svg',
buttons: true,
dangerMode: true,
})
.then(async (markedAsRejected) => {
if (markedAsRejected) {
const data = {
id: id,
}
let response = await this.markAsRejected(data)
this.refreshEstTable()
if (response.data) {
this.refreshEstTable()
window.toastr['success'](
this.$tc('estimates.marked_as_rejected_message')
)
}
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_mark_as_rejected'),
icon: 'error',
iconHtml: `<svg
aria-hidden="true"
class="w-6 h-6"
focusable="false"
data-prefix="fas"
data-icon="check-circle"
class="svg-inline--fa fa-check-circle fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#DC2626"
d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
const data = {
id: id,
}
})
let response = await this.markAsRejected(data)
this.refreshEstTable()
if (response.data) {
this.refreshEstTable()
this.showNotification({
type: 'success',
message: this.$tc('estimates.marked_as_rejected_message'),
})
}
}
})
},
async sendEstimate(id) {
window
.swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_send_estimate'),
icon: '/assets/icon/paper-plane-solid.svg',
buttons: true,
dangerMode: true,
})
.then(async (willSendEstimate) => {
if (willSendEstimate) {
const data = {
id: id,
}
let response = await this.sendEstimateEmail(data)
this.refreshEstTable()
if (response.data.success) {
window.toastr['success'](
this.$tc('estimates.send_estimate_successfully')
)
return true
}
if (response.data.error === 'user_email_does_not_exist') {
window.toastr['error'](
this.$tc('estimates.user_email_does_not_exist')
)
return true
}
window.toastr['error'](this.$tc('estimates.something_went_wrong'))
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_send_estimate'),
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
focusable="false"
class="w-6 h-6"
data-prefix="fas"
data-icon="paper-plane"
class="svg-inline--fa fa-paper-plane fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#55547A"
d="M476 3.2L12.5 270.6c-18.1 10.4-15.8 35.6 2.2 43.2L121 358.4l287.3-253.2c5.5-4.9 13.3 2.6 8.6 8.3L176 407v80.5c0 23.6 28.5 32.9 42.5 15.8L282 426l124.6 52.2c14.2 6 30.4-2.9 33-18.2l72-432C515 7.8 493.3-6.8 476 3.2z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
const data = {
id: id,
}
})
let response = await this.sendEstimateEmail(data)
this.refreshEstTable()
if (response.data.success) {
this.showNotification({
type: 'success',
message: this.$tc('estimates.send_estimate_successfully'),
})
return true
}
if (response.data.error === 'user_email_does_not_exist') {
this.showNotification({
type: 'error',
message: this.$tc('estimates.user_email_does_not_exist'),
})
return true
}
this.showNotification({
type: 'error',
message: this.$tc('estimates.something_went_wrong'),
})
}
})
},
},
}

View File

@ -469,7 +469,6 @@ export default {
isLoadingEstimate: false,
isLoadingData: false,
isLoading: false,
maxDiscount: 0,
estimateNumAttribute: null,
estimatePrefix: null,
EstimateFields: [
@ -721,6 +720,8 @@ export default {
...mapActions('customFields', ['fetchCustomFields']),
...mapActions('notification', ['showNotification']),
selectFixed() {
if (this.newEstimate.discount_type === 'fixed') {
return
@ -922,7 +923,10 @@ export default {
.then((res) => {
if (res.data) {
this.$router.push(`/admin/estimates/${res.data.estimate.id}/view`)
window.toastr['success'](this.$t('estimates.created_message'))
this.showNotification({
type: 'success',
message: this.$t('estimates.created_message'),
})
}
this.isLoading = false
@ -938,7 +942,10 @@ export default {
this.isLoading = false
if (res.data) {
this.$router.push(`/admin/estimates/${res.data.estimate.id}/view`)
window.toastr['success'](this.$t('estimates.updated_message'))
this.showNotification({
type: 'success',
message: this.$t('estimates.updated_message'),
})
}
})
.catch((err) => {

View File

@ -2,11 +2,11 @@
<base-page>
<sw-page-header :title="$t('estimates.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('estimates.estimate', 2)"
to="#"
active
/>
</sw-breadcrumb>
@ -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>
@ -277,12 +277,12 @@
>
<template slot-scope="row">
<span> {{ $t('estimates.action') }} </span>
<sw-dropdown containerClass="w-56">
<sw-dropdown container-class="w-56">
<dot-icon slot="activator" />
<sw-dropdown-item
tag-name="router-link"
:to="`estimates/${row.id}/edit`"
tag-name="router-link"
>
<pencil-icon class="h-5 mr-3 text-gray-600" />
{{ $t('general.edit') }}
@ -294,8 +294,8 @@
</sw-dropdown-item>
<sw-dropdown-item
tag-name="router-link"
:to="`estimates/${row.id}/view`"
tag-name="router-link"
>
<eye-icon class="h-5 mr-3 text-gray-600" />
{{ $t('general.view') }}
@ -481,6 +481,8 @@ export default {
...mapActions('modal', ['openModal']),
...mapActions('notification', ['showNotification']),
refreshTable() {
this.$refs.table.refresh()
},
@ -536,14 +538,30 @@ export default {
},
async onMarkAsAccepted(id) {
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_mark_as_accepted'),
icon: '/assets/icon/check-circle-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (markedAsRejected) => {
if (markedAsRejected) {
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
class="w-6 h-6"
focusable="false"
data-prefix="fas"
data-icon="check-circle"
class="svg-inline--fa fa-check-circle fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#55547A"
d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
const data = {
id: id,
status: 'ACCEPTED',
@ -553,23 +571,40 @@ export default {
if (response.data) {
this.$refs.table.refresh()
window.toastr['success'](
this.$tc('estimates.marked_as_accepted_message')
)
this.showNotification({
type: 'success',
message: this.$tc('estimates.marked_as_accepted_message'),
})
}
}
})
},
async onMarkAsRejected(id) {
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_mark_as_rejected'),
icon: '/assets/icon/times-circle-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (markedAsRejected) => {
if (markedAsRejected) {
icon: 'error',
iconHtml: `<svg
aria-hidden="true"
focusable="false"
class="w-6 h-6"
data-prefix="fas"
data-icon="times-circle"
class="svg-inline--fa fa-times-circle fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#DC2626"
d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm121.6 313.1c4.7 4.7 4.7 12.3 0 17L338 377.6c-4.7 4.7-12.3 4.7-17 0L256 312l-65.1 65.6c-4.7 4.7-12.3 4.7-17 0L134.4 338c-4.7-4.7-4.7-12.3 0-17l65.6-65-65.6-65.1c-4.7-4.7-4.7-12.3 0-17l39.6-39.6c4.7-4.7 12.3-4.7 17 0l65 65.7 65.1-65.6c4.7-4.7 12.3-4.7 17 0l39.6 39.6c4.7 4.7 4.7 12.3 0 17L312 256l65.6 65.1z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
const data = {
id: id,
status: 'REJECTED',
@ -579,9 +614,10 @@ export default {
if (response.data) {
this.$refs.table.refresh()
window.toastr['success'](
this.$tc('estimates.marked_as_rejected_message')
)
this.showNotification({
type: 'success',
message: this.$tc('estimates.marked_as_rejected_message'),
})
}
}
})
@ -624,65 +660,104 @@ export default {
async removeEstimate(id) {
this.id = id
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$tc('estimates.confirm_delete', 1),
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (willDelete) => {
if (willDelete) {
icon: 'error',
iconHtml: `<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-red-600"fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let res = await this.deleteEstimate({ ids: [this.id] })
if (res.data.success) {
this.$refs.table.refresh()
this.resetSelectedEstimates()
window.toastr['success'](this.$tc('estimates.deleted_message', 1))
this.showNotification({
type: 'success',
message: this.$tc('estimates.deleted_message', 1),
})
} else if (res.data.error) {
window.toastr['error'](res.data.message)
this.showNotification({
type: 'error',
message: res.data.message,
})
}
}
})
},
async convertInToinvoice(id) {
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_conversion'),
icon: '/assets/icon/file-alt-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (willConvertInToinvoice) => {
if (willConvertInToinvoice) {
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
viewBox="0 0 384 512"
class="w-6 h-6"
data-prefix="fas"
data-icon="file-alt"
class="svg-inline--fa fa-file-alt fa-w-12"
role="img"
xmlns="http://www.w3.org/2000/svg"
>
<path
fill="#55547A"
d="M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm64 236c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12v8zm0-64c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12v8zm0-72v8c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12zm96-114.1v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let res = await this.convertToInvoice(id)
if (res.data) {
window.toastr['success'](this.$t('estimates.conversion_message'))
this.showNotification({
type: 'success',
message: this.$t('estimates.conversion_message'),
})
this.$router.push(`invoices/${res.data.invoice.id}/edit`)
} else if (res.data.error) {
window.toastr['error'](res.data.message)
this.showNotification({
type: 'error',
message: res.data.message,
})
}
}
})
},
async removeMultipleEstimates() {
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$tc('estimates.confirm_delete', 2),
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (willDelete) => {
if (willDelete) {
icon: 'error',
iconHtml: `<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-red-600"fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let res = await this.deleteMultipleEstimates()
if (res.data.success) {
this.$refs.table.refresh()
this.resetSelectedEstimates()
window.toastr['success'](this.$tc('estimates.deleted_message', 2))
this.showNotification({
type: 'success',
message: this.$tc('estimates.deleted_message', 2),
})
} else if (res.data.error) {
window.toastr['error'](res.data.message)
this.showNotification({
type: 'error',
message: res.data.message,
})
}
}
})
@ -699,14 +774,30 @@ export default {
},
async onMarkAsSent(id) {
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_mark_as_sent'),
icon: '/assets/icon/check-circle-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (willMarkAsSent) => {
if (willMarkAsSent) {
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
class="w-6 h-6"
focusable="false"
data-prefix="fas"
data-icon="check-circle"
class="svg-inline--fa fa-check-circle fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#55547A"
d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
const data = {
id: id,
status: 'SENT',
@ -716,9 +807,10 @@ export default {
this.refreshTable()
if (response.data) {
window.toastr['success'](
this.$tc('estimates.mark_as_sent_successfully')
)
this.showNotification({
type: 'success',
message: this.$tc('estimates.mark_as_sent_successfully'),
})
}
}
})

View File

@ -302,7 +302,7 @@ export default {
set: function (newValue) {
if (parseFloat(newValue) > 0) {
this.item.price = Math.round(newValue * 100)
this.maxDiscount = this.item.price
this.maxDiscount = this.item.price * this.item.quantity
} else {
this.item.price = newValue
}

View File

@ -172,7 +172,7 @@
:color="$utils.getBadgeStatusColor(estimate.status).color"
class="px-1 text-xs"
>
{{ estimate.status }}
{{ $utils.getStatusTranslation(estimate.status) }}
</sw-badge>
</div>
@ -310,6 +310,8 @@ export default {
...mapActions('modal', ['openModal']),
...mapActions('notification', ['showNotification']),
hasActiveUrl(id) {
return this.$route.params.id == id
},
@ -342,8 +344,10 @@ export default {
let pdfUrl = `${window.location.origin}/estimates/pdf/${this.estimate.unique_hash}`
let response = this.$utils.copyTextToClipboard(pdfUrl)
window.toastr['success'](this.$tc('general.copied_pdf_url_clipboard'))
this.showNotification({
type: 'success',
message: this.$tc('general.copied_pdf_url_clipboard'),
})
},
async onSearched() {
let data = ''
@ -386,30 +390,45 @@ export default {
return true
},
async onMarkAsSent() {
window
.swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_mark_as_sent'),
icon: '/assets/icon/check-circle-solid.svg',
buttons: true,
dangerMode: true,
})
.then(async (value) => {
if (value) {
this.isMarkAsSent = true
let response = await this.markAsSent({
id: this.estimate.id,
status: 'SENT',
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_mark_as_sent'),
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
class="w-6 h-6"
focusable="false"
data-prefix="fas"
data-icon="check-circle"
class="svg-inline--fa fa-check-circle fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#55547A"
d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
this.isMarkAsSent = true
let response = await this.markAsSent({
id: this.estimate.id,
status: 'SENT',
})
this.isMarkAsSent = false
if (response.data) {
this.estimate.status = 'SENT'
this.showNotification({
type: 'success',
message: this.$tc('estimates.mark_as_sent_successfully'),
})
this.isMarkAsSent = false
if (response.data) {
this.estimate.status = 'SENT'
window.toastr['success'](
this.$tc('estimates.mark_as_sent_successfully')
)
}
}
})
}
})
},
async onSendEstimate(id) {
this.openModal({
@ -423,29 +442,38 @@ export default {
let pdfUrl = `${window.location.origin}/estimates/pdf/${this.estimate.unique_hash}`
let response = this.$utils.copyTextToClipboard(pdfUrl)
window.toastr['success'](this.$tc('general.copied_pdf_url_clipboard'))
this.showNotification({
type: 'success',
message: this.$tc('general.copied_pdf_url_clipboard'),
})
},
async removeEstimate(id) {
window
.swal({
title: this.$t('general.are_you_sure'),
text: 'you will not be able to recover this estimate!',
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true,
})
.then(async (value) => {
if (value) {
let request = await this.deleteEstimate({ ids: [id] })
if (request.data.success) {
window.toastr['success'](this.$tc('estimates.deleted_message', 1))
this.$router.push('/admin/estimates')
} else if (request.data.error) {
window.toastr['error'](request.data.message)
}
this.$swal({
title: this.$t('general.are_you_sure'),
text: 'you will not be able to recover this estimate!',
icon: 'error',
iconHtml: `<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-red-600"fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let request = await this.deleteEstimate({ ids: [id] })
if (request.data.success) {
this.showNotification({
type: 'success',
message: this.$tc('estimates.deleted_message', 1),
})
this.$router.push('/admin/estimates')
} else if (request.data.error) {
this.showNotification({
type: 'error',
message: request.data.message,
})
}
})
}
})
},
},
}

View File

@ -417,6 +417,8 @@ export default {
...mapActions('customer', ['fetchCustomers']),
...mapActions('notification', ['showNotification']),
openCategoryModal() {
this.openModal({
title: this.$t('settings.expense_category.add_category'),
@ -532,22 +534,34 @@ export default {
if (response.data.success) {
this.isLoading = false
window.toastr['success'](this.$t('expenses.updated_message'))
this.showNotification({
type: 'success',
message: this.$t('expenses.updated_message'),
})
this.$router.push('/admin/expenses')
return true
}
window.toastr['error'](response.data.error)
this.showNotification({
type: 'error',
message: response.data.error,
})
} else {
this.isLoading = true
let response = await this.addExpense(data)
this.isLoading = false
if (response.data.success) {
window.toastr['success'](this.$t('expenses.created_message'))
this.showNotification({
type: 'success',
message: this.$t('expenses.created_message'),
})
this.$router.push('/admin/expenses')
return true
}
window.toastr['success'](response.data.success)
this.showNotification({
type: 'success',
message: response.data.success,
})
}
},
},

View File

@ -3,9 +3,9 @@
<!-- Page Header -->
<sw-page-header :title="$t('expenses.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('expenses.expense', 2)" active />
<sw-breadcrumb-item :title="$tc('expenses.expense', 2)" to="#" active />
</sw-breadcrumb>
<template slot="actions">
@ -208,7 +208,9 @@
>
<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>
@ -248,8 +250,8 @@
<dot-icon slot="activator" />
<sw-dropdown-item
tag-name="router-link"
:to="`expenses/${row.id}/edit`"
tag-name="router-link"
>
<pencil-icon class="h-5 mr-3 text-gray-600" />
{{ $t('general.edit') }}
@ -374,6 +376,8 @@ export default {
...mapActions('category', ['fetchCategories']),
...mapActions('notification', ['showNotification']),
async fetchData({ page, filter, sort }) {
let data = {
user_id: this.filters.user ? this.filters.user.id : null,
@ -454,43 +458,61 @@ export default {
},
async removeExpense(id) {
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$tc('expenses.confirm_delete'),
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (willDelete) => {
if (willDelete) {
icon: 'error',
iconHtml: `<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-red-600"fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let res = await this.deleteExpense({ ids: [id] })
if (res.data.success) {
window.toastr['success'](this.$tc('expenses.deleted_message', 1))
this.showNotification({
type: 'success',
message: this.$tc('expenses.deleted_message', 1),
})
this.refreshTable()
return true
} else if (res.data.error) {
window.toastr['error'](res.data.message)
this.showNotification({
type: 'success',
message: res.data.message,
})
}
}
})
},
async removeMultipleExpenses() {
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$tc('expenses.confirm_delete', 2),
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (willDelete) => {
if (willDelete) {
icon: 'error',
iconHtml: `<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-red-600"fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let request = await this.deleteMultipleExpenses()
if (request.data.success) {
window.toastr['success'](this.$tc('expenses.deleted_message', 2))
this.showNotification({
type: 'success',
message: this.$tc('expenses.deleted_message', 2),
})
this.$refs.table.refresh()
} else if (request.data.error) {
window.toastr['error'](request.data.message)
this.showNotification({
type: 'error',
message: request.data.message,
})
}
}
})

View File

@ -15,7 +15,7 @@
to="/admin/invoices"
/>
<sw-breadcrumb-item
v-if="$route.name === 'invoice.edit'"
v-if="$route.name === 'invoices.edit'"
:title="$t('invoices.edit_invoice')"
to="#"
active
@ -460,7 +460,7 @@ export default {
taxPerItem: null,
discountPerItem: null,
isLoadingInvoice: false,
isLoadingData: false,
isLoadingData: true,
isLoading: false,
maxDiscount: 0,
invoicePrefix: null,
@ -722,6 +722,8 @@ export default {
...mapActions('customFields', ['fetchCustomFields']),
...mapActions('notification', ['showNotification']),
selectFixed() {
if (this.newInvoice.discount_type === 'fixed') {
return
@ -832,10 +834,9 @@ export default {
if (res2.data) {
let customFields = res2.data.customFields.data
this.setEditCustomFields(fields, customFields)
await this.setEditCustomFields(fields, customFields)
}
}
this.isLoadingInvoice = false
})
.catch((error) => {
@ -918,8 +919,10 @@ export default {
.then((res) => {
if (res.data) {
this.$router.push(`/admin/invoices/${res.data.invoice.id}/view`)
window.toastr['success'](this.$t('invoices.created_message'))
this.showNotification({
type: 'success',
message: this.$t('invoices.created_message'),
})
}
this.isLoading = false
@ -935,13 +938,17 @@ export default {
this.isLoading = false
if (res.data.success) {
this.$router.push(`/admin/invoices/${res.data.invoice.id}/view`)
window.toastr['success'](this.$t('invoices.updated_message'))
this.showNotification({
type: 'success',
message: this.$t('invoices.updated_message'),
})
}
if (res.data.error === 'invalid_due_amount') {
window.toastr['error'](
this.$t('invoices.invalid_due_amount_message')
)
this.showNotification({
type: 'error',
message: this.$t('invoices.invalid_due_amount_message'),
})
}
})
.catch((err) => {

View File

@ -2,8 +2,8 @@
<base-page>
<sw-page-header :title="$t('invoices.title')">
<sw-breadcrumb slot="breadcrumbs">
<sw-breadcrumb-item to="dashboard" :title="$t('general.home')" />
<sw-breadcrumb-item to="#" :title="$tc('invoices.invoice', 2)" active />
<sw-breadcrumb-item :title="$t('general.home')" to="dashboard" />
<sw-breadcrumb-item :title="$tc('invoices.invoice', 2)" to="#" active />
</sw-breadcrumb>
<template slot="actions">
@ -93,8 +93,8 @@
<label
class="absolute text-sm leading-snug text-black cursor-pointer"
@click="clearFilter"
style="top: 10px; right: 15px"
@click="clearFilter"
>{{ $t('general.clear_all') }}</label
>
</sw-filter-wrapper>
@ -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,9 @@
: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>
@ -289,16 +291,16 @@
<dot-icon slot="activator" />
<sw-dropdown-item
tag-name="router-link"
:to="`invoices/${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="`invoices/${row.id}/view`"
tag-name="router-link"
>
<eye-icon class="h-5 mr-3 text-gray-600" />
{{ $t('invoices.view') }}
@ -334,8 +336,8 @@
row.status === 'VIEWED' ||
row.status === 'OVERDUE'
"
tag-name="router-link"
:to="`/admin/payments/${row.id}/create`"
tag-name="router-link"
>
<credit-card-icon class="h-5 mr-3 text-gray-600" />
{{ $t('payments.record_payment') }}
@ -510,6 +512,8 @@ export default {
...mapActions('modal', ['openModal']),
...mapActions('notification', ['showNotification']),
async sendInvoice(invoice) {
this.openModal({
title: this.$t('invoices.send_invoice'),
@ -521,14 +525,30 @@ export default {
},
async markInvoiceAsSent(id) {
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('invoices.invoice_mark_as_sent'),
icon: '/assets/icon/check-circle-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (value) => {
if (value) {
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
class="w-6 h-6"
focusable="false"
data-prefix="fas"
data-icon="check-circle"
class="svg-inline--fa fa-check-circle fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#55547A"
d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
const data = {
id: id,
status: 'SENT',
@ -536,29 +556,49 @@ export default {
let response = await this.markAsSent(data)
this.refreshTable()
if (response.data) {
window.toastr['success'](
this.$tc('invoices.mark_as_sent_successfully')
)
this.showNotification({
type: 'success',
message: this.$tc('invoices.mark_as_sent_successfully'),
})
}
}
})
},
async onCloneInvoice(id) {
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('invoices.confirm_clone'),
icon: '/assets/icon/check-circle-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (value) => {
if (value) {
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
class="w-6 h-6"
focusable="false"
data-prefix="fas"
data-icon="check-circle"
class="svg-inline--fa fa-check-circle fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#55547A"
d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let response = await this.cloneInvoice({ id })
this.refreshTable()
if (response.data) {
window.toastr['success'](this.$tc('invoices.cloned_successfully'))
this.showNotification({
type: 'success',
message: this.$tc('invoices.cloned_successfully'),
})
this.$router.push(
`/admin/invoices/${response.data.invoice.id}/edit`
)
@ -665,31 +705,43 @@ export default {
async removeInvoice(id) {
this.id = id
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$tc('invoices.confirm_delete'),
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (value) => {
if (value) {
icon: 'error',
iconHtml: `<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-red-600"fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let res = await this.deleteInvoice({ ids: [id] })
if (res.data.success) {
window.toastr['success'](this.$tc('invoices.deleted_message'))
this.showNotification({
type: 'success',
message: this.$tc('invoices.deleted_message'),
})
this.$refs.table.refresh()
return true
}
if (res.data.error === 'payment_attached') {
window.toastr['error'](
this.$t('invoices.payment_attached_message'),
this.$t('general.action_failed')
)
this.showNotification({
type: 'error',
message:
(this.$t('invoices.payment_attached_message'),
this.$t('general.action_failed')),
})
return true
}
window.toastr['error'](res.data.error)
this.showNotification({
type: 'error',
message: res.data.error,
})
return true
}
this.resetSelectedInvoices()
@ -697,30 +749,41 @@ export default {
},
async removeMultipleInvoices() {
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$tc('invoices.confirm_delete', 2),
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (value) => {
if (value) {
icon: 'error',
iconHtml: `<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-red-600"fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let res = await this.deleteMultipleInvoices()
if (res.data.error === 'payment_attached') {
window.toastr['error'](
this.$t('invoices.payment_attached_message'),
this.$t('general.action_failed')
)
this.showNotification({
type: 'error',
message:
(this.$t('invoices.payment_attached_message'),
this.$t('general.action_failed')),
})
return true
}
if (res.data) {
this.$refs.table.refresh()
this.resetSelectedInvoices()
window.toastr['success'](this.$tc('invoices.deleted_message', 2))
this.showNotification({
type: 'success',
message: this.$tc('invoices.deleted_message', 2),
})
} else if (res.data.error) {
window.toastr['error'](res.data.message)
this.showNotification({
type: 'error',
message: res.data.message,
})
}
}
})

View File

@ -301,7 +301,7 @@ export default {
set: function (newValue) {
if (parseFloat(newValue) > 0) {
this.item.price = Math.round(newValue * 100)
this.maxDiscount = this.item.price
this.maxDiscount = this.item.price * this.item.quantity
} else {
this.item.price = newValue
}

View File

@ -189,7 +189,7 @@
:font-size="$utils.getBadgeStatusColor(invoice.status).fontSize"
class="px-1 text-xs"
>
{{ invoice.status }}
{{ $utils.getStatusTranslation(invoice.status) }}
</sw-badge>
</div>
@ -323,6 +323,7 @@ export default {
]),
...mapActions('modal', ['openModal']),
...mapActions('notification', ['showNotification']),
hasActiveUrl(id) {
return this.$route.params.id == id
@ -393,30 +394,45 @@ export default {
return true
},
async onMarkAsSent() {
window
.swal({
title: this.$t('general.are_you_sure'),
text: this.$t('invoices.invoice_mark_as_sent'),
icon: '/assets/icon/check-circle-solid.svg',
buttons: true,
dangerMode: true,
})
.then(async (value) => {
if (value) {
this.isMarkingAsSent = true
let response = await this.markAsSent({
id: this.invoice.id,
status: 'SENT',
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$t('invoices.invoice_mark_as_sent'),
icon: 'question',
iconHtml: `<svg
aria-hidden="true"
class="w-6 h-6"
focusable="false"
data-prefix="fas"
data-icon="check-circle"
class="svg-inline--fa fa-check-circle fa-w-16"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
fill="#55547A"
d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"
></path>
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
this.isMarkingAsSent = true
let response = await this.markAsSent({
id: this.invoice.id,
status: 'SENT',
})
this.isMarkingAsSent = false
if (response.data) {
this.invoice.status = 'SENT'
this.showNotification({
type: 'success',
message: this.$tc('invoices.marked_as_sent_message'),
})
this.isMarkingAsSent = false
if (response.data) {
this.invoice.status = 'SENT'
window.toastr['success'](
this.$tc('invoices.marked_as_sent_message')
)
}
}
})
}
})
},
async onSendInvoice() {
this.openModal({
@ -430,29 +446,38 @@ export default {
let pdfUrl = `${window.location.origin}/invoices/pdf/${this.invoice.unique_hash}`
let response = this.$utils.copyTextToClipboard(pdfUrl)
window.toastr['success'](this.$t('general.copied_pdf_url_clipboard'))
this.showNotification({
type: 'success',
message: this.$t('general.copied_pdf_url_clipboard'),
})
},
async removeInvoice(id) {
window
.swal({
title: this.$t('general.are_you_sure'),
text: 'you will not be able to recover this invoice!',
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true,
})
.then(async (value) => {
if (value) {
let request = await this.deleteInvoice({ ids: [id] })
if (request.data.success) {
window.toastr['success'](this.$tc('invoices.deleted_message', 1))
this.$router.push('/admin/invoices')
} else if (request.data.error) {
window.toastr['error'](request.data.message)
}
this.$swal({
title: this.$t('general.are_you_sure'),
text: 'you will not be able to recover this invoice!',
icon: 'error',
iconHtml: `<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-red-600"fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let request = await this.deleteInvoice({ ids: [id] })
if (request.data.success) {
this.showNotification({
type: 'success',
message: this.$tc('invoices.deleted_message', 1),
})
this.$router.push('/admin/invoices')
} else if (request.data.error) {
this.showNotification({
type: 'error',
message: request.data.message,
})
}
})
}
})
},
},
}

View File

@ -312,6 +312,8 @@ export default {
...mapActions('modal', ['openModal']),
...mapActions('notification', ['showNotification']),
async setTaxPerItem() {
let response = await this.fetchCompanySettings(['tax_per_item'])
@ -385,15 +387,24 @@ export default {
this.isLoading = false
if (!this.isEdit) {
window.toastr['success'](this.$tc('items.created_message'))
this.showNotification({
type: 'success',
message: this.$tc('items.created_message'),
})
this.$router.push('/admin/items')
return true
} else {
window.toastr['success'](this.$tc('items.updated_message'))
this.showNotification({
type: 'success',
message: this.$tc('items.updated_message'),
})
this.$router.push('/admin/items')
return true
}
window.toastr['error'](response.data.error)
this.showNotification({
type: 'error',
message: response.data.error,
})
}
},

View File

@ -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>
@ -348,6 +348,8 @@ export default {
'fetchItemUnits',
]),
...mapActions('notification', ['showNotification']),
refreshTable() {
this.$refs.table.refresh()
},
@ -397,52 +399,71 @@ export default {
async removeItems(id) {
this.id = id
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$tc('items.confirm_delete'),
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (willDelete) => {
if (willDelete) {
icon: 'error',
iconHtml: `<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-red-600"fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let res = await this.deleteItem({ ids: [id] })
if (res.data.success) {
window.toastr['success'](this.$tc('items.deleted_message', 1))
this.showNotification({
type: 'success',
message: this.$tc('items.deleted_message'),
})
this.$refs.table.refresh()
return true
}
if (res.data.error === 'item_attached') {
window.toastr['error'](
this.$tc('items.item_attached_message'),
this.$t('general.action_failed')
)
this.showNotification({
type: 'error',
message:
(this.$tc('items.item_attached_message'),
this.$t('general.action_failed')),
})
return true
}
window.toastr['error'](res.data.message)
this.showNotification({
type: 'error',
message: res.data.message,
})
return true
}
})
},
async removeMultipleItems() {
swal({
this.$swal({
title: this.$t('general.are_you_sure'),
text: this.$tc('items.confirm_delete', 2),
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true,
}).then(async (willDelete) => {
if (willDelete) {
icon: 'error',
iconHtml: `<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-red-600"fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>`,
showCancelButton: true,
showConfirmButton: true,
}).then(async (result) => {
if (result.value) {
let res = await this.deleteMultipleItems()
if (res.data.success || res.data.items) {
window.toastr['success'](this.$tc('items.deleted_message', 2))
this.showNotification({
type: 'success',
message: this.$tc('items.deleted_message', 2),
})
this.$refs.table.refresh()
} else if (res.data.error) {
window.toastr['error'](res.data.message)
this.showNotification({
type: 'error',
message: res.data.message,
})
}
}
})

View File

@ -1,6 +1,7 @@
<template>
<div v-if="isAppLoaded" class="h-full">
<base-modal />
<base-notification />
<site-header />
<div class="flex h-screen pt-16 pb-10 overflow-hidden">
<site-sidebar />
@ -20,6 +21,7 @@ import SiteSidebar from './partials/TheSiteSidebar.vue'
import BaseModal from '../../components/base/modal/BaseModal'
import { RefreshIcon } from '@vue-hero-icons/solid'
import { mapActions, mapGetters } from 'vuex'
import BaseNotification from '../../components/base/BaseNotification.vue'
export default {
components: {
@ -28,6 +30,7 @@ export default {
SiteFooter,
BaseModal,
RefreshIcon,
BaseNotification,
},
computed: {

View File

@ -1,5 +1,6 @@
<template>
<div class="grid h-full grid-cols-12 overflow-y-hidden bg-gray-100">
<base-notification />
<div
class="flex items-center justify-center w-full max-w-sm col-span-12 p-4 mx-auto text-gray-900 md:p-8 md:col-span-6 lg:col-span-4 flex-2 md:pb-48 md:pt-40"
>

View File

@ -423,6 +423,8 @@ export default {
...mapActions('customer', ['fetchCustomers']),
...mapActions('notification', ['showNotification']),
invoiceWithAmount({ invoice_number, due_amount }) {
return `${invoice_number} (${this.$utils.formatGraphMoney(
due_amount,
@ -561,25 +563,38 @@ export default {
this.$router.push(
`/admin/payments/${response.data.payment.id}/view`
)
window.toastr['success'](this.$t('payments.updated_message'))
this.showNotification({
type: 'success',
message: this.$t('payments.updated_message'),
})
return true
}
if (response.data.error === 'invalid_amount') {
window.toastr['error'](this.$t('invalid_amount_message'))
this.showNotification({
type: 'error',
message: this.$t('invalid_amount_message'),
})
return false
}
window.toastr['error'](response.data.error)
this.showNotification({
type: 'error',
message: response.data.error,
})
} catch (err) {
this.isLoading = false
if (err.response.data.errors.payment_number) {
window.toastr['error'](err.response.data.errors.payment_number)
this.showNotification({
type: 'error',
message: err.response.data.errors.payment_number,
})
return true
}
window.toastr['error'](err.response.data.message)
this.showNotification({
type: 'error',
message: err.response.data.message,
})
}
} else {
let data = {
@ -599,26 +614,39 @@ export default {
this.$router.push(
`/admin/payments/${response.data.payment.id}/view`
)
window.toastr['success'](this.$t('payments.created_message'))
this.showNotification({
type: 'success',
message: this.$t('payments.created_message'),
})
this.isLoading = true
return true
}
if (response.data.error === 'invalid_amount') {
window.toastr['error'](this.$t('invalid_amount_message'))
this.showNotification({
type: 'error',
message: this.$t('invalid_amount_message'),
})
return false
}
window.toastr['error'](response.data.error)
this.showNotification({
type: 'error',
message: response.data.error,
})
} catch (err) {
this.isLoading = false
if (err.response.data.errors.payment_number) {
window.toastr['error'](err.response.data.errors.payment_number)
this.showNotification({
type: 'error',
message: err.response.data.errors.payment_number,
})
return true
}
window.toastr['error'](err.response.data.message)
this.showNotification({
type: 'error',
message: err.response.data.message,
})
}
}
},

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