Compare commits

...

50 Commits

Author SHA1 Message Date
a0a46d306e fix merge conflicts 2020-04-20 11:32:44 +05:30
8f0af3dcd6 Merge branch 'master' of https://github.com/bytefury/crater 2020-04-20 11:23:00 +05:30
53860378b9 Update nl.json 2020-04-18 19:56:03 +02:00
e8e44c5dc8 Merge pull request #180 from alessandrofuda/master
IT Italian translation
2020-04-18 13:38:21 +05:30
ac33164342 Merge branch '3.1.0' into 'master'
add listener 310

See merge request mohit.panjvani/crater-web!202
2020-04-18 07:29:08 +00:00
5c7c0d84ea Merge branch 'refactor-crater-3.0.0' into 'master'
Refactor line-chart

See merge request mohit.panjvani/crater-web!203
2020-04-18 07:15:52 +00:00
7ca725ac37 refactor line-chart 2020-04-17 19:53:08 +05:30
510a4b3dbb add listener 310 2020-04-17 19:05:10 +05:30
25114009e3 remove unused components and update eslint + prettier config 2020-03-30 11:40:45 +05:30
79c16d74ce IT Italian translation 2020-03-20 18:18:27 +01:00
742e1e445a Merge branch 'expense-refactor' into 'master'
add customer in expense

See merge request mohit.panjvani/crater-web!172
2020-03-20 07:12:39 +00:00
386f96d60e Merge branch 'version301' into 'master'
add new minor version update 3.0.1

See merge request mohit.panjvani/crater-web!169
2020-03-20 07:12:27 +00:00
82d85af672 refactor and merge backend 2020-03-18 18:21:53 +05:30
4d1b267688 Merge branch 'expense-refactor' of https://gitlab.com/mohit.panjvani/crater-web into expense-refactor 2020-03-18 17:41:15 +05:30
bc99ad63a6 add user to expense 2020-03-18 17:40:03 +05:30
4bb44f8c93 add customer filter on index 2020-03-18 17:19:09 +05:30
c72265ed50 add languages 2020-03-17 19:38:59 +05:30
b8958c9eb6 add customer in expense 2020-03-17 19:20:42 +05:30
e33e314cb7 new frontend build 2020-03-09 15:20:59 +05:30
84cebee9da Merge branch 'master' of https://github.com/bytefury/crater 2020-03-09 15:19:54 +05:30
34d3cf7ae8 Merge branch 'item-refactor' into 'master'
refactor item search problem

See merge request mohit.panjvani/crater-web!171
2020-03-09 09:49:26 +00:00
93d0da836a Merge pull request #172 from digitalsign/master
Change project name in composer.json
2020-02-26 14:35:21 +05:30
fd51276948 Change project name in composer.json 2020-02-26 13:31:57 +08:00
d6274854ba refactor search problem 2020-02-19 19:10:43 +05:30
ea4bd1a31d Merge pull request #154 from lukasmu/bugfix/expenses-note
Fixed small bug that might occur when an expense is updated
2020-02-09 12:01:43 +05:30
286e047963 Merge pull request #129 from deanhouseholder/master
Detect if no .env file exists and add it on composer commands.
2020-02-09 12:01:25 +05:30
be16f48f3d Merge pull request #153 from MakerLab-Dev/patch-3
Improved error handling
2020-02-09 12:00:23 +05:30
ebea1e0813 add new minor version update 3.0.1 2020-02-07 17:20:32 +05:30
cc8d08f829 Merge pull request #142 from miraro3/master
Added Kyrgyzstani som
2020-02-07 16:42:15 +05:30
aacffc22eb fix merge conflict 2020-02-03 21:15:07 +05:30
d71ca4ffb9 Fixed small bug that might occur when an expense is updated
Previoulsy a string with contents "null" is transmitted and saved to the database when updating an expense with an empty note. This fix prevents that.
Please note that this fix still needs to be compiled with npm.
2020-02-01 14:52:07 +01:00
186004f7f8 fix merge conflicts 2020-01-31 14:28:16 +05:30
c2eb22d666 Merge pull request #137 from MakerLab-Dev/patch-1
cross-env should only be in devDependencies
2020-01-31 01:26:32 +05:30
af189b15b6 Small fix 2020-01-30 20:48:16 +01:00
1c19be85c3 Improved error handling 2020-01-30 20:47:51 +01:00
4bb4362d23 Removed unnecessary notification
Removed unnecessary notification as the improved error handler will show it
2020-01-30 20:45:39 +01:00
f6f66b3ae6 Merge pull request #152 from mdpoulter/email-subject
More descriptive email fields.
2020-01-31 00:21:29 +05:30
b4ccecbcf1 Merge pull request #149 from proea/master
Fix for "Empty PDF rendered in Docker #69"
2020-01-31 00:11:51 +05:30
92f1f196bb Update Dockerfile 2020-01-27 22:38:47 +03:00
ee14070a7b Update Dockerfile
slight change
2020-01-27 22:37:41 +03:00
8ce7e14a02 Add name in From field. 2020-01-27 20:37:25 +02:00
3401ca049e Make viewed emails more descriptive. 2020-01-27 14:47:02 +02:00
5dcc7b9efd Add more descriptive subject lines. 2020-01-27 14:45:40 +02:00
3baeb72892 more typos 2020-01-27 08:12:40 +01:00
406d098172 Update Dockerfile
Generation does not work due to:
iconv(): Wrong charset, conversion from `UTF-8' to `UTF-8//IGNORE' is not allowed

Installing the library gnu-libiconv will solve the problem
2020-01-26 23:18:15 +03:00
84f8d281a7 fix typos 2020-01-23 08:40:10 +01:00
fb49332de9 Add Dutch translation 2020-01-22 11:07:40 +01:00
f68e86e4cf Added Kyrgyzstani som 2020-01-20 22:37:03 +01:00
0990ce4678 cross-env should only be in devDependencies 2020-01-18 16:29:48 +01:00
353c2479f1 Detect if no .env file exists and add it on composer commands. 2020-01-06 10:55:34 -07:00
50 changed files with 2858 additions and 5350 deletions

View File

@ -2,9 +2,17 @@
"root": true,
"extends": [
"plugin:vue/recommended",
"standard"
"eslint:recommended",
"prettier/vue",
"plugin:prettier/recommended"
],
"rules": {
"vue/max-attributes-per-line" : 3
"vue/max-attributes-per-line": ["error", {
"singleline": 10,
"multiline": {
"max": 1,
"allowFirstLine": false
}
}]
}
}

5
.prettierrc.json Normal file
View File

@ -0,0 +1,5 @@
{
"semi": false,
"singleQuote": true,
"tabWidth": 2
}

View File

@ -23,9 +23,11 @@ FROM php:7.3.12-fpm-alpine
# Use the default production configuration
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
RUN apk add --no-cache libpng-dev libxml2-dev oniguruma-dev libzip-dev && \
RUN apk add --no-cache libpng-dev libxml2-dev oniguruma-dev libzip-dev gnu-libiconv && \
docker-php-ext-install bcmath ctype json gd mbstring pdo pdo_mysql tokenizer xml zip
ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php
# Set container's working dir
WORKDIR /app
@ -49,4 +51,3 @@ RUN touch database/database.sqlite && \
EXPOSE 9000
CMD ["php-fpm", "--nodaemonize"]

View File

@ -5,6 +5,7 @@ use Illuminate\Database\Eloquent\Model;
use Spatie\MediaLibrary\HasMedia\HasMedia;
use Spatie\MediaLibrary\HasMedia\HasMediaTrait;
use Crater\ExpenseCategory;
use Crater\User;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
@ -16,6 +17,7 @@ class Expense extends Model implements HasMedia
'expense_category_id',
'amount',
'company_id',
'user_id',
'expense_date',
'notes',
'attachment_receipt'
@ -32,6 +34,11 @@ class Expense extends Model implements HasMedia
return $this->belongsTo(ExpenseCategory::class, 'expense_category_id');
}
public function user()
{
return $this->belongsTo(User::class);
}
public function getFormattedExpenseDateAttribute($value)
{
$dateFormat = CompanySetting::getSetting('carbon_date_format', $this->company_id);
@ -81,6 +88,11 @@ class Expense extends Model implements HasMedia
return $query->where('expenses.expense_category_id', $categoryId);
}
public function scopeWhereUser($query, $user_id)
{
return $query->where('expenses.user_id', $user_id);
}
public function scopeApplyFilters($query, array $filters)
{
$filters = collect($filters);
@ -89,6 +101,10 @@ class Expense extends Model implements HasMedia
$query->whereCategory($filters->get('expense_category_id'));
}
if ($filters->get('user_id')) {
$query->whereUser($filters->get('user_id'));
}
if ($filters->get('from_date') && $filters->get('to_date')) {
$start = Carbon::createFromFormat('d/m/Y', $filters->get('from_date'));
$end = Carbon::createFromFormat('d/m/Y', $filters->get('to_date'));

View File

@ -1,4 +1,5 @@
<?php
namespace Crater\Http\Controllers;
use Illuminate\Http\Request;
@ -143,13 +144,17 @@ class CompanyController extends Controller
$currency = CompanySetting::getSetting('currency', $request->header('company'));
$fiscal_year = CompanySetting::getSetting('fiscal_year', $request->header('company'));
$languages = [
$languages = [ // alphabetical order
["code" => "pt_BR", "name" => "Brazilian Portuguese"],
["code" => "en", "name" => "English"],
["code" => "fr", "name" => "French"],
["code" => "de", "name" => "German"],
["code" => "it", "name" => "Italian"],
["code" => "es", "name" => "Spanish"],
["code" => "ar", "name" => "العربية"],
["code" => "de", "name" => "German"],
["code" => "pt_BR", "name" => "Brazilian Portuguese"],
["code" => "nl", "name" => "Dutch"]
];
return response()->json([

View File

@ -175,12 +175,6 @@ class EstimatesController extends Controller
]);
}
if (!config('mail.from.name')) {
return response()->json([
'error' => 'from_email_does_not_exist'
]);
}
\Mail::to($email)->send(new EstimatePdf($data));
}
@ -343,12 +337,6 @@ class EstimatesController extends Controller
]);
}
if (!config('mail.from.name')) {
return response()->json([
'error' => 'from_email_does_not_exist'
]);
}
\Mail::to($email)->send(new EstimatePdf($data));
if ($estimate->status == Estimate::STATUS_DRAFT) {

View File

@ -24,9 +24,11 @@ class ExpensesController extends Controller
$limit = $request->has('limit') ? $request->limit : 10;
$expenses = Expense::with('category')
->leftJoin('users', 'users.id', '=', 'expenses.user_id')
->join('expense_categories', 'expense_categories.id', '=', 'expenses.expense_category_id')
->applyFilters($request->only([
'expense_category_id',
'user_id',
'search',
'from_date',
'to_date',
@ -34,11 +36,16 @@ class ExpensesController extends Controller
'orderBy'
]))
->whereCompany($request->header('company'))
->select('expenses.*', 'expense_categories.name')
->select('expenses.*', 'expense_categories.name', 'users.name as user_name')
->paginate($limit);
$customers = User::customer()
->whereCompany($request->header('company'))
->get();
return response()->json([
'expenses' => $expenses,
'customers' => $customers,
'currency' => Currency::findOrFail(
CompanySetting::getSetting('currency', $request->header('company'))
)
@ -53,9 +60,13 @@ class ExpensesController extends Controller
public function create(Request $request)
{
$categories = ExpenseCategory::whereCompany($request->header('company'))->get();
$customers = User::customer()
->whereCompany($request->header('company'))
->get();
return response()->json([
'categories' => $categories
'categories' => $categories,
'customers' => $customers
]);
}
@ -72,6 +83,7 @@ class ExpensesController extends Controller
$expense = new Expense();
$expense->notes = $request->notes;
$expense->expense_category_id = $request->expense_category_id;
$expense->user_id = $request->user_id;
$expense->amount = $request->amount;
$expense->company_id = $request->header('company');
$expense->expense_date = $expense_date;
@ -107,7 +119,9 @@ class ExpensesController extends Controller
public function edit(Request $request,$id)
{
$categories = ExpenseCategory::whereCompany($request->header('company'))->get();
$customers = User::where('role', 'customer')->whereCompany($request->header('company'))->get();
$customers = User::customer()
->whereCompany($request->header('company'))
->get();
$expense = Expense::with('category')->where('id', $id)->first();
return response()->json([
@ -132,6 +146,7 @@ class ExpensesController extends Controller
$expense->notes = $request->notes;
$expense->expense_category_id = $request->expense_category_id;
$expense->amount = $request->amount;
$expense->user_id = $request->user_id;
$expense->expense_date = $expense_date;
$expense->save();

View File

@ -12,7 +12,7 @@ use Crater\Invoice;
use Crater\InvoiceItem;
use Carbon\Carbon;
use Crater\Item;
use Crater\Mail\invoicePdf;
use Crater\Mail\InvoicePdf;
use function MongoDB\BSON\toJSON;
use Illuminate\Support\Facades\Log;
use Crater\User;
@ -175,13 +175,7 @@ class InvoicesController extends Controller
]);
}
if (!config('mail.from.name')) {
return response()->json([
'error' => 'from_email_does_not_exist'
]);
}
\Mail::to($email)->send(new invoicePdf($data));
\Mail::to($email)->send(new InvoicePdf($data));
}
$invoice = Invoice::with(['items', 'user', 'invoiceTemplate', 'taxes'])->find($invoice->id);
@ -410,13 +404,7 @@ class InvoicesController extends Controller
]);
}
if (!config('mail.from.name')) {
return response()->json([
'error' => 'from_email_does_not_exist'
]);
}
\Mail::to($email)->send(new invoicePdf($data));
\Mail::to($email)->send(new InvoicePdf($data));
if ($invoice->status == Invoice::STATUS_DRAFT) {
$invoice->status = Invoice::STATUS_SENT;

View File

@ -50,7 +50,8 @@ class OnboardingController extends Controller
["code"=>"es", "name" => "Spanish"],
["code"=>"ar", "name" => "العربية"],
["code"=>"de", "name" => "German"],
["code"=>"pt-br", "name" => "Portuguese (Brazilian)"]
["code"=>"pt-br", "name" => "Portuguese (Brazilian)"],
["code"=>"it", "name" => "Italian"],
];
$fiscal_years = [
['key' => 'january-december' , 'value' => '1-12'],

View File

@ -305,10 +305,6 @@ class PaymentController extends Controller
$data['user'] = User::find($userId)->toArray();
$data['company'] = Company::find($payment->company_id);
$email = $data['user']['email'];
$notificationEmail = CompanySetting::getSetting(
'notification_email',
$request->header('company')
);
if (!$email) {
return response()->json([
@ -316,13 +312,7 @@ class PaymentController extends Controller
]);
}
if (!$notificationEmail) {
return response()->json([
'error' => 'notification_email_does_not_exist'
]);
}
\Mail::to($email)->send(new PaymentPdf($data, $notificationEmail));
\Mail::to($email)->send(new PaymentPdf($data));
return response()->json([
'success' => true

View File

@ -0,0 +1,51 @@
<?php
namespace Crater\Listeners\Updates\v3;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Database\Schema\Blueprint;
use Crater\Events\UpdateFinished;
use Crater\Listeners\Updates\Listener;
use Crater\Setting;
use Crater\Currency;
class Version301 extends Listener
{
const VERSION = '3.0.1';
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param object $event
* @return void
*/
public function handle(UpdateFinished $event)
{
if ($this->isListenerFired($event)) {
return;
}
Currency::create([
'name' => 'Kyrgyzstani som',
'code' => 'KGS',
'symbol' => 'С̲ ',
'precision' => '2',
'thousand_separator' => '.',
'decimal_separator' => ','
]);
// Update Crater app version
Setting::setSetting('version', static::VERSION);
}
}

View File

@ -0,0 +1,36 @@
<?php
namespace Crater\Listeners\Updates\v3;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Crater\Listeners\Updates\Listener;
use Illuminate\Database\Schema\Blueprint;
use Crater\Events\UpdateFinished;
class Version310
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param object $event
* @return void
*/
public function handle(UpdateFinished $event)
{
\Schema::table('expenses', function (Blueprint $table) {
$table->integer('user_id')->unsigned()->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
}

View File

@ -29,6 +29,9 @@ class EstimatePdf extends Mailable
*/
public function build()
{
return $this->markdown('emails.send.estimate', ['data', $this->data]);
$company = $this->data['company']['name'];
return $this->subject("Estimate from $company")
->markdown('emails.send.estimate', ['data', $this->data]);
}
}

View File

@ -31,6 +31,8 @@ class EstimateViewed extends Mailable
public function build()
{
$email = $this->data['user']['email'];
return $this->from($email)->markdown('emails.viewed.estimate', ['data', $this->data]);
$name = $this->data['user']['name'];
return $this->from($email, $name)
->markdown('emails.viewed.estimate', ['data', $this->data]);
}
}

View File

@ -6,7 +6,7 @@ use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class invoicePdf extends Mailable
class InvoicePdf extends Mailable
{
use Queueable, SerializesModels;
@ -29,6 +29,9 @@ class invoicePdf extends Mailable
*/
public function build()
{
return $this->markdown('emails.send.invoice', ['data', $this->data]);
$company = $this->data['company']['name'];
return $this->subject("Invoice from $company")
->markdown('emails.send.invoice', ['data', $this->data]);
}
}

View File

@ -31,6 +31,8 @@ class InvoiceViewed extends Mailable
public function build()
{
$email = $this->data['user']['email'];
return $this->from($email)->markdown('emails.viewed.invoice', ['data', $this->data]);
$name = $this->data['user']['name'];
return $this->from($email, $name)
->markdown('emails.viewed.invoice', ['data', $this->data]);
}
}

View File

@ -13,17 +13,14 @@ class PaymentPdf extends Mailable
public $data = [];
public $notificationEmail = '';
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($data, $notificationEmail)
public function __construct($data)
{
$this->data = $data;
$this->notificationEmail = $notificationEmail;
}
/**
@ -33,6 +30,9 @@ class PaymentPdf extends Mailable
*/
public function build()
{
return $this->from($this->notificationEmail)->markdown('emails.send.payment', ['data', $this->data]);
$company = $this->data['company']['name'];
return $this->subject("Payment from $company")
->markdown('emails.send.payment', ['data', $this->data]);
}
}

View File

@ -11,6 +11,8 @@ use Crater\Listeners\Updates\v2\Version201;
use Crater\Listeners\Updates\v2\Version202;
use Crater\Listeners\Updates\v2\Version210;
use Crater\Listeners\Updates\v3\Version300;
use Crater\Listeners\Updates\v3\Version301;
use Crater\Listeners\Updates\v3\Version310;
class EventServiceProvider extends ServiceProvider
{
@ -27,6 +29,8 @@ class EventServiceProvider extends ServiceProvider
Version202::class,
Version210::class,
Version300::class,
Version301::class,
Version310::class,
],
Registered::class => [
SendEmailVerificationNotification::class,

View File

@ -9,6 +9,7 @@ use carbon\carbon;
use Crater\MemberLoan;
use Crater\Address;
use Crater\Payment;
use Crater\Expense;
use Crater\Company;
use Crater\Notifications\MailResetPasswordNotification;
use Spatie\MediaLibrary\HasMedia\HasMedia;
@ -105,6 +106,11 @@ class User extends Authenticatable implements HasMedia
return $this->hasMany(Address::class);
}
public function expenses()
{
return $this->hasMany(Expense::class);
}
public function billingAddress()
{
return $this->hasOne(Address::class)->where('type', Address::BILLING_TYPE);

View File

@ -1,6 +1,6 @@
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"name": "bytefury/crater",
"description": "Free & Open Source Invoice App for Freelancers & Small Businesses. https://craterapp.com",
"keywords": [
"framework",
"laravel"
@ -53,11 +53,20 @@
"minimum-stability": "dev",
"prefer-stable": true,
"scripts": {
"initial-setup": [
"test -f .env || (cp .env.example .env; php artisan key:generate 2>/dev/null; exit 0)"
],
"pre-install-cmd": [
"@initial-setup"
],
"pre-update-cmd": [
"@initial-setup"
],
"post-root-package-install": [
"php -r \"file_exists('.env') || copy('.env.example', '.env');\""
"@initial-setup"
],
"post-create-project-cmd": [
"php artisan key:generate --ansi"
"@initial-setup"
],
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",

View File

@ -23,6 +23,8 @@ class CreateExpensesTable extends Migration
$table->foreign('expense_category_id')->references('id')->on('expense_categories')->onDelete('cascade');
$table->integer('company_id')->unsigned()->nullable();
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
$table->integer('user_id')->unsigned()->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamps();
});
}

View File

@ -532,6 +532,14 @@ class CurrenciesTableSeeder extends Seeder
'thousand_separator' => '.',
'decimal_separator' => ','
],
[
'name' => 'Kyrgyzstani som',
'code' => 'KGS',
'symbol' => 'С̲ ',
'precision' => '2',
'thousand_separator' => '.',
'decimal_separator' => ','
],
];
foreach ($currencies as $currency) {

5530
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -8,19 +8,16 @@
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
},
"devDependencies": {
"babel-eslint": "^8.2.3",
"browser-sync": "^2.26.7",
"browser-sync-webpack-plugin": "^2.0.1",
"babel-eslint": "^8.2.6",
"cross-env": "^5.1",
"css-loader": "^0.28.8",
"eslint": "^4.14.0",
"eslint-config-standard": "^11.0.0-beta.0",
"eslint-plugin-import": "^2.11.0",
"eslint-plugin-node": "^5.2.1",
"eslint-plugin-promise": "^3.6.0",
"eslint-plugin-standard": "^3.0.1",
"eslint-plugin-vue": "^4.0.1",
"eslint": "^4.19.1",
"eslint-config-prettier": "^6.10.1",
"eslint-loader": "^3.0.3",
"eslint-plugin-prettier": "^3.1.2",
"eslint-plugin-vue": "^4.7.1",
"laravel-mix": "^5.0.0",
"prettier": "^2.0.2",
"resolve-url-loader": "3.1.0",
"sass": "^1.22.9",
"sass-loader": "7.*",
@ -35,18 +32,12 @@
"axios": "^0.19",
"bootstrap": "^4.1.0",
"chart.js": "^2.7.3",
"cross-env": "^5.1.4",
"easy-pie-chart": "^2.1.7",
"fs": "0.0.1-security",
"guid": "0.0.12",
"lodash": "^4.17.13",
"moment": "^2.18.1",
"npm": "^6.4.1",
"popper.js": "^1.12.9",
"sweet-modal-vue": "^2.0.0",
"sweetalert": "^2.1.2",
"toastr": "^2.1.4",
"upgrade": "^1.1.0",
"v-money": "^0.8.1",
"v-tooltip": "^2.0.2",
"vue": "^2.5.17",

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,4 +1,4 @@
{
"/assets/js/app.js": "/assets/js/app.js?id=397e57d36ef22a2e14fc",
"/assets/css/crater.css": "/assets/css/crater.css?id=616996a79c1df69d18de"
"/assets/js/app.js": "/assets/js/app.js?id=08d4f6357dbe7738effa",
"/assets/css/crater.css": "/assets/css/crater.css?id=a00ceebbb86dd82a024b"
}

View File

@ -88,17 +88,27 @@ window.axios.interceptors.request.use(function (config) {
global.axios.interceptors.response.use(undefined, function (err) {
// Do something with request error
return new Promise((resolve, reject) => {
console.log(err.response)
if (err.response.data.error === 'invalid_credentials') {
window.toastr['error']('Invalid Credentials')
}
if (err.response.data && (err.response.statusText === 'Unauthorized' || err.response.data === ' Unauthorized.')) {
store.dispatch('auth/logout', true)
if (!err.response) {
window.toastr['error']('Network error: Please check your internet connection or wait until servers are back online')
console.log('Network error: Please check your internet connection.')
} else {
throw err
console.log(err.response)
if (err.response.data && (err.response.statusText === 'Unauthorized' || err.response.data === ' Unauthorized.')) {
// Unauthorized and log out
window.toastr['error']((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])
}
})
} else {
// Unknown error
window.toastr['error']((err.response.data.message) ? err.response.data.message : 'Unknown error occurred')
}
}
return Promise.reject(err)
})
/**

View File

@ -1,69 +0,0 @@
<template>
<div class="graph-container">
<canvas
id="graph"
ref="graph"
/>
</div>
</template>
<script>
import Chart from 'chart.js'
export default {
props: {
labels: {
type: Array,
require: true,
default: Array
},
values: {
type: Array,
require: true,
default: Array
}
},
mounted () {
let context = this.$refs.graph.getContext('2d')
let options = {
responsive: true,
maintainAspectRatio: false,
legend: {
display: false
}
}
let data = {
labels: this.labels,
datasets: [
{
label: 'My First dataset',
backgroundColor: 'rgba(79, 196, 127,0.2)',
borderColor: 'rgba(79, 196, 127,1)',
borderWidth: 1,
hoverBackgroundColor: 'rgba(79, 196, 127,0.4)',
hoverBorderColor: 'rgba(79, 196, 127,1)',
data: this.values
}
]
}
this.myBarChart = new Chart(context, {
type: 'bar',
data: data,
options: options
})
},
beforeDestroy () {
this.myBarChart.destroy()
}
}
</script>
<style scoped>
.graph-container {
height: 300px;
}
</style>

View File

@ -1,71 +0,0 @@
<template>
<div class="graph-container">
<canvas
id="graph"
ref="graph"/>
</div>
</template>
<script>
import Chart from 'chart.js'
export default {
props: {
labels: {
type: Array,
require: true,
default: Array
},
values: {
type: Array,
require: true,
default: Array
},
bgColors: {
type: Array,
require: true,
default: Array
},
hoverBgColors: {
type: Array,
require: true,
default: Array
}
},
mounted () {
let context = this.$refs.graph.getContext('2d')
let options = {
responsive: true,
maintainAspectRatio: false
}
let data = {
labels: this.labels,
datasets: [
{
data: this.values,
backgroundColor: this.bgColors,
hoverBackgroundColor: this.hoverBgColors
}
]
}
this.myDoughnutChart = new Chart(context, {
type: 'doughnut',
data: data,
options: options
})
},
beforeDestroy () {
this.myDoughnutChart.destroy()
}
}
</script>
<style scoped>
.graph-container {
height: 300px;
}
</style>

View File

@ -1,8 +1,6 @@
<template>
<div class="graph-container">
<canvas
id="graph"
ref="graph" />
<canvas id="graph" ref="graph" />
</div>
</template>
@ -16,55 +14,53 @@ export default {
labels: {
type: Array,
require: true,
default: Array
default: Array,
},
values: {
type: Array,
require: true,
default: Array
default: Array,
},
invoices: {
type: Array,
require: true,
default: Array
default: Array,
},
expenses: {
type: Array,
require: true,
default: Array
default: Array,
},
receipts: {
type: Array,
require: true,
default: Array
default: Array,
},
income: {
type: Array,
require: true,
default: Array
default: Array,
},
formatMoney: {
type: Function,
require: false,
default: Function
default: Function,
},
FormatGraphMoney: {
type: Function,
require: false,
default: Function
}
default: Function,
},
},
computed: {
...mapGetters('currency', [
'defaultCurrency'
])
...mapGetters('currency', ['defaultCurrency']),
},
watch: {
labels(val) {
this.update()
}
},
},
mounted() {
@ -77,13 +73,16 @@ export default {
enabled: true,
callbacks: {
label: function (tooltipItem, data) {
return self.FormatGraphMoney(tooltipItem.value, self.defaultCurrency)
}
}
return self.FormatGraphMoney(
tooltipItem.value * 100,
self.defaultCurrency
)
},
},
},
legend: {
display: false
}
display: false,
},
}
let data = {
labels: this.labels,
@ -107,7 +106,7 @@ export default {
pointHoverBorderWidth: 2,
pointRadius: 4,
pointHitRadius: 10,
data: this.invoices
data: this.invoices.map((invoice) => invoice / 100),
},
{
label: 'Receipts',
@ -128,7 +127,7 @@ export default {
pointHoverBorderWidth: 2,
pointRadius: 4,
pointHitRadius: 10,
data: this.receipts
data: this.receipts.map((receipt) => receipt / 100),
},
{
label: 'Expenses',
@ -149,7 +148,7 @@ export default {
pointHoverBorderWidth: 2,
pointRadius: 4,
pointHitRadius: 10,
data: this.expenses
data: this.expenses.map((expense) => expense / 100),
},
{
label: 'Net Income',
@ -170,34 +169,40 @@ export default {
pointHoverBorderWidth: 2,
pointRadius: 4,
pointHitRadius: 10,
data: this.income
}
]
data: this.income.map((_i) => _i / 100),
},
],
}
this.myLineChart = new Chart(context, {
type: 'line',
data: data,
options: options
options: options,
})
},
methods: {
update() {
this.myLineChart.data.labels = this.labels
this.myLineChart.data.datasets[0].data = this.invoices
this.myLineChart.data.datasets[1].data = this.receipts
this.myLineChart.data.datasets[2].data = this.expenses
this.myLineChart.data.datasets[3].data = this.income
this.myLineChart.data.datasets[0].data = this.invoices.map(
(invoice) => invoice / 100
)
this.myLineChart.data.datasets[1].data = this.receipts.map(
(receipt) => receipt / 100
)
this.myLineChart.data.datasets[2].data = this.expenses.map(
(expense) => expense / 100
)
this.myLineChart.data.datasets[3].data = this.income.map((_i) => _i / 100)
this.myLineChart.update({
lazy: true
lazy: true,
})
},
beforeDestroy() {
this.myLineChart.destroy()
}
}
},
},
}
</script>

View File

@ -1,72 +0,0 @@
<template>
<div class="graph-container">
<canvas
id="graph"
ref="graph" />
</div>
</template>
<script>
import Chart from 'chart.js'
export default {
props: {
labels: {
type: Array,
require: true,
default: Array
},
values: {
type: Array,
require: true,
default: Array
},
bgColors: {
type: Array,
require: true,
default: Array
},
hoverBgColors: {
type: Array,
require: true,
default: Array
}
},
mounted () {
let context = this.$refs.graph.getContext('2d')
let options = {
responsive: true,
maintainAspectRatio: false
}
let data = {
labels: this.labels,
datasets: [
{
data: this.values,
backgroundColor: this.bgColors,
hoverBackgroundColor: this.hoverBgColors
}
]
}
this.pieChart = new Chart(context, {
type: 'pie',
data: data,
options: options
})
},
beforeDestroy () {
this.pieChart.destroy()
}
}
</script>
<style scoped>
.graph-container {
height: 300px;
}
</style>

View File

@ -1,95 +0,0 @@
<template>
<div class="graph-container easy-pie-chart">
<svg width="100%" height="100%" viewBox="0 0 34 34" class="donut">
<circle :stroke-width="strokeWidth" class="donut-segment" cx="17" cy="17" r="15.91549430918954" fill="transparent" :stroke="strokeColor" stroke-dasharray="100 0" />
<circle :stroke-width="strokeWidth" :stroke="color" :stroke-dasharray="successProgress" class="donut-segment" cx="17" cy="17" r="15.91549430918954" fill="transparent" />
<!-- <g class="chart-text">
<text :style="'fill:' + color" x="48%" y="50%" class="chart-number" >
{{ progress }}
</text>
<text :style="'fill:' + color" x="73%" y="50%" class="chart-label" >
%
</text>
</g> -->
</svg>
</div>
</template>
<script>
export default {
props: {
values: {
type: Number,
require: true,
default: 100
},
strokeWidth: {
type: Number,
require: false,
default: 1.2
},
strokeColor: {
type: String,
require: true,
default: '#eeeeee'
},
color: {
type: String,
require: true,
default: '#007dcc'
}
},
data () {
return {
progress: 0
}
},
watch: {
values (newvalue, oldvalue) {
if (newvalue !== oldvalue) {
this.setProgress()
}
}
},
computed: {
successProgress () {
return this.progress + ' ' + (100 - this.progress)
},
remainProgress () {
return 100 - this.progress + ' ' + this.progress
},
},
mounted () {
this.setProgress()
},
methods: {
setProgress () {
let self = this
for (let i = 0; i < this.values; i++) {
setTimeout(function () {
++self.progress
}, 15 * i)
}
}
}
}
</script>
<style scoped>
.chart-text {
font: 6px "Montserrat", Arial, sans-serif;
fill: #000;
-moz-transform: translateY(0.25em);
-ms-transform: translateY(0.25em);
-webkit-transform: translateY(0.25em);
transform: translateY(0.5em);
}
.chart-number {
font-size: 8px;
line-height: 1;
text-anchor: middle;
}
.chart-label {
font-size: 5px;
text-transform: uppercase;
text-anchor: middle;
}
</style>

View File

@ -412,6 +412,8 @@
"title": "النفقات",
"expenses_list": "قائمة النفقات",
"expense_title": "Title",
"select_a_customer": "حدد عميلاً",
"customer": "العميل",
"contact": "تواصل",
"category": "الفئة",
"from_date": "من تاريخ",

View File

@ -201,6 +201,7 @@
"action": "Aktion",
"add_expense": "Aufwendung hinzufügen",
"add_new_expense": "Neue Aufwendung hinzufügen",
"select_a_customer": "Wählen Sie einen Kunden aus",
"amount": "Summe",
"categories": {
"actions": "Aktionen",
@ -215,6 +216,7 @@
"title": "Titel"
},
"category": "Kategorie",
"customer": "Kunden",
"category_id": "Kategorie-Id",
"confirm_delete": "Sie können diese Ausgabe nicht wiederherstellen. | Sie können diese Ausgaben nicht wiederherstellen.",
"contact": "Kontakt",

View File

@ -426,7 +426,9 @@
"expenses": {
"title": "Expenses",
"expenses_list": "Expenses List",
"select_a_customer": "Select a customer",
"expense_title": "Title",
"customer": "Customer",
"contact": "Contact",
"category": "Category",
"from_date": "From Date",

View File

@ -412,6 +412,8 @@
"expenses_list": "Lista de gastos",
"expense_title": "Título",
"contact": "Contacto",
"customer": "Cliente",
"select_a_customer": "Selecciona un cliente",
"category": "Categoría",
"from_date": "Desde la fecha",
"to_date": "Hasta la fecha",

View File

@ -410,6 +410,8 @@
"expenses_list": "Liste des dépenses",
"expense_title": "Titre",
"contact": "Contact",
"customer": "Client Client",
"select_a_customer": "Sélectionnez un client",
"category": "Catégorie",
"from_date": "A partir de la date",
"to_date": "À ce jour",

View File

@ -6,6 +6,8 @@ import es from './es.json'
import ar from './ar.json'
import de from './de.json'
import pt_BR from './pt-br.json'
import it from './it.json'
import nl from './nl.json'
Vue.use(VueI18n)
@ -17,8 +19,10 @@ const i18n = new VueI18n({
es,
ar,
de,
pt_BR
}
pt_BR,
it,
nl,
},
})
export default i18n

View File

@ -0,0 +1,922 @@
{
"_comment": "Italian - IT translation - by Alessandro Fuda - Milan, Italy - 20/03/2020 - Coronavirus's times But towards spring :-) ",
"navigation": {
"dashboard": "Dashboard",
"customers": "Clienti",
"items": "Commesse",
"invoices": "Fatture",
"expenses": "Spese",
"estimates": "Preventivi",
"payments": "Pagamenti",
"reports": "Reports",
"settings": "Configurazione",
"logout": "Logout"
},
"general": {
"view_pdf": "Vedi PDF",
"download_pdf": "Download PDF",
"save": "Salva",
"cancel": "Elimina",
"update": "Aggiorna",
"deselect": "Deseleziona",
"download": "Download",
"from_date": "Dalla Data",
"to_date": "Alla Data",
"from": "Da",
"to": "A",
"sort_by": "Ordina per",
"ascending": "Crescente",
"descending": "Decrescente",
"subject": "Oggetto",
"message": "Messaggio",
"go_back": "Torna indietro",
"back_to_login": "Torna al Login?",
"home": "Home",
"filter": "Filtro",
"delete": "Elimina",
"edit": "Modifica",
"view": "Visualizza",
"add_new_item": "Aggiungi nuova Commessa",
"clear_all": "Pulisci tutto",
"showing": "Showing",
"of": "di",
"actions": "Azioni",
"subtotal": "SUBTOTALE",
"discount": "SCONTO",
"fixed": "Fissato",
"percentage": "Percentuale",
"tax": "TASSA",
"total_amount": "AMMONTARE TOTALE",
"bill_to": "Fattura a",
"ship_to": "Invia a",
"due": "Dovuto",
"draft": "Bozza",
"sent": "Inviata",
"all": "Tutte",
"select_all": "Seleziona tutto",
"choose_file": "Clicca per selezionare un file",
"choose_template": "Scegli un modello",
"choose": "Scegli",
"remove": "Rimuovi",
"powered_by": "Prodotto da",
"bytefury": "Bytefury",
"select_a_status": "Seleziona uno Stato",
"select_a_tax": "Seleziona una Tassa",
"search": "Cerca",
"are_you_sure": "Sei sicuro/a?",
"list_is_empty": "La lista è vuota.",
"no_tax_found": "Nessuna Tassa trovata!",
"four_zero_four": "404",
"you_got_lost": "Hoops! Ti sei perso",
"go_home": "Vai alla Home",
"test_mail_conf": "Configurazione della mail di test",
"send_mail_successfully": "Mail inviata con successo",
"setting_updated": "Configurazioni aggiornate con successo",
"select_state": "Seleziona lo Stato",
"select_country": "Seleziona Paese",
"select_city": "Seleziona Città",
"street_1": "Indirizzo 1",
"street_2": "Indirizzo 2",
"action_failed": "Errore"
},
"dashboard": {
"select_year": "Seleziona anno",
"cards": {
"due_amount": "Somma dovuta",
"customers": "Clienti",
"invoices": "Fatture",
"estimates": "Preventivi"
},
"chart_info": {
"total_sales": "Vendite",
"total_receipts": "Ricevute",
"total_expense": "Uscite",
"net_income": "Guadagno netto",
"year": "Seleziona anno"
},
"weekly_invoices": {
"title": "Fatture a settimana"
},
"monthly_chart": {
"title": "Entrate & Uscite"
},
"recent_invoices_card": {
"title": "Fatture insolute",
"due_on": "Data di scadenza",
"customer": "Cliente",
"amount_due": "Ammontare dovuto",
"actions": "Azioni",
"view_all": "Vedi tutto"
},
"recent_estimate_card": {
"title": "Preventivi recenti",
"date": "Data",
"customer": "Cliente",
"amount_due": "Ammontare dovuto",
"actions": "Azioni",
"view_all": "Vedi tutto"
}
},
"tax_types": {
"name": "Nome",
"description": "Descrizione",
"percent": "Percento",
"compound_tax": "Tassa composta"
},
"customers": {
"title": "Clienti",
"add_customer": "Aggiungi cliente",
"contacts_list": "Lista clienti",
"name": "Nome",
"display_name": "Mostra nome",
"primary_contact_name": "Riferimento",
"contact_name": "Nome Contatto",
"amount_due": "Ammontare dovuto",
"email": "Email",
"address": "Indirizzo",
"phone": "Telefono",
"website": "Sito web",
"country": "Paese",
"state": "Stato",
"city": "Città",
"zip_code": "Codice Postale",
"added_on": "Aggiunto il",
"action": "Azione",
"password": "Password",
"street_number": "Numero Civico",
"primary_currency": "Valùta Principale",
"add_new_customer": "Aggiungi nuovo Cliente",
"save_customer": "Salva Cliente",
"update_customer": "Aggiorna Cliente",
"customer": "Cliente | Clienti",
"new_customer": "Nuovo cliente",
"edit_customer": "Modifica Cliente",
"basic_info": "Informazioni",
"billing_address": "Indirizzo di Fatturazione",
"shipping_address": "Indirizzo di Spedizione",
"copy_billing_address": "Copia da Fatturazione",
"no_customers": "Ancora nessun Cliente!",
"no_customers_found": "Nessun cliente trovato!",
"list_of_customers": "Qui ci sarà la lista dei tuoi clienti",
"primary_display_name": "Mostra il Nome Principale",
"select_currency": "Selezione Valùta",
"select_a_customer": "Seleziona Cliente",
"type_or_click": "Scrivi o clicca per selezionare",
"confirm_delete": "Non potrai più recuperare il cliente cancellato | Non potrai più recuperare i clienti cancellati",
"created_message": "Cliente creato con successo",
"updated_message": "Cliente aggiornato con successo",
"deleted_message": "Cliente cancellato con successo | Clienti cancellati con successo"
},
"items": {
"title": "Commesse",
"items_list": "Lista Commesse",
"name": "Nome",
"unit": "Unità/Tipo",
"description": "Descrizione",
"added_on": "Aggiunto il",
"price": "Prezzo",
"date_of_creation": "Data di creazione",
"action": "Azione",
"add_item": "Aggiungi Commessa",
"save_item": "Salva",
"update_item": "Aggiorna",
"item": "Commessa | Commesse",
"add_new_item": "Aggiungi nuova Commessa",
"new_item": "Nuova Commessa",
"edit_item": "Modifica Commessa",
"no_items": "Ancora nessuna commessa!",
"list_of_items": "Qui ci sarà la lista delle commesse.",
"select_a_unit": "Seleziona",
"taxes": "Imposte",
"item_attached_message": "Non puoi eliminare una Commessa che è già attiva",
"confirm_delete": "Non potrai ripristinare la Commessa | Non potrai ripristinare le Commesse",
"created_message": "Commessa creata con successo",
"updated_message": "Commessa aggiornata con successo",
"deleted_message": "Commessa eliminata con successo | Commesse eliminate con successo"
},
"estimates": {
"title": "Preventivi",
"estimate": "Preventivo | Preventivi",
"estimates_list": "Lista Preventivi",
"days": "{days} Giorni",
"months": "{months} Mese",
"years": "{years} Anno",
"all": "Tutti",
"paid": "Pagato",
"unpaid": "Non pagato",
"customer": "CLIENTE",
"ref_no": "RIF N.",
"number": "NUMERO",
"amount_due": "AMMONTARE DOVUTO",
"partially_paid": "Pagamento Parziale",
"total": "Totale",
"discount": "Sconto",
"sub_total": "Sub Totale",
"estimate_number": "Preventivo Numero",
"ref_number": "Numero di Rif.",
"contact": "Contatto",
"add_item": "Aggiungi un item",
"date": "Data",
"due_date": "Data di pagamento",
"expiry_date": "Data di scadenza",
"status": "Status",
"add_tax": "Aggiungi Imposta",
"amount": "Ammontare",
"action": "Azione",
"notes": "Note",
"tax": "Imposta",
"estimate_template": "Modello",
"convert_to_invoice": "Converti in Fattura",
"mark_as_sent": "Segna come Inviata",
"send_estimate": "Invia preventivo",
"record_payment": "Registra Pagamento",
"add_estimate": "Aggiungi Preventivo",
"save_estimate": "Salva Preventivo",
"confirm_conversion": "Questo preventivo verrà usato per generare una nuova fattura.",
"conversion_message": "Fattura creata",
"confirm_send_estimate": "Questo preventivo verrà inviato al cliente via mail",
"confirm_mark_as_sent": "Questo preventivo verrà contrassegnato come inviato",
"confirm_mark_as_accepted": "Questo preventivo verrà contrassegnato come Accettato",
"confirm_mark_as_rejected": "Questo preventivo verrà contrassegnato come Rifiutato",
"no_matching_estimates": "Nessun preventivo trovato!",
"mark_as_sent_successfully": "Preventivo contrassegnato come inviato con successo",
"send_estimate_successfully": "Preventivo inviato con successo",
"errors": {
"required": "Campo obbligatorio"
},
"accepted": "Accettato",
"sent": "Inviato",
"draft": "Bozza",
"declined": "Rifiutato",
"new_estimate": "Nuovo Preventivo",
"add_new_estimate": "Crea Nuovo Preventivo",
"update_Estimate": "Aggiorna preventivo",
"edit_estimate": "Modifica Preventivo",
"items": "Commesse",
"Estimate": "Preventivo | Preventivi",
"add_new_tax": "Aggiungi una nuova tassa/imposta",
"no_estimates": "Ancora nessun preventivo!",
"list_of_estimates": "Questa sezione conterrà la lista dei preventivi.",
"mark_as_rejected": "Segna come Rifiutato",
"mark_as_accepted": "Segna come Accettato",
"marked_as_accepted_message": "Preventivo contrassegnato come accettato",
"marked_as_rejected_message": "Preventivo contrassegnato come rifiutato",
"confirm_delete": "Non potrai più recuperare questo preventivo | Non potrai più recuperare questi preventivi",
"created_message": "Preventivo creato con successo",
"updated_message": "Preventivo modificato con successo",
"deleted_message": "Preventivo eliminato con successo | Preventivi eliminati con successo",
"user_email_does_not_exist": "La Email utente non esiste",
"something_went_wrong": "Si è verificato un errore",
"item": {
"title": "Titolo Commessa",
"description": "Descrizione",
"quantity": "Quantità",
"price": "Prezzo",
"discount": "Sconto",
"total": "Totale",
"total_discount": "Sconto Totale",
"sub_total": "Sub Totale",
"tax": "Tasse",
"amount": "Ammontare",
"select_an_item": "Scrivi o clicca per selezionare un item",
"type_item_description": "Scrivi una Descrizione (opzionale)"
}
},
"invoices": {
"title": "Fatture",
"invoices_list": "Lista Fatture",
"days": "{days} Giorni",
"months": "{months} Mese",
"years": "{years} Anno",
"all": "Tutti",
"paid": "Pagato",
"unpaid": "Insoluto",
"customer": "CLIENTE",
"paid_status": "STATO DI PAGAMENTO",
"ref_no": "RIF N.",
"number": "NUMERO",
"amount_due": "AMMONTARE DOVUTO",
"partially_paid": "Parzialmente Pagata",
"total": "Totale",
"discount": "Sconto",
"sub_total": "Sub Totale",
"invoice": "Fattura | Fatture",
"invoice_number": "Numero Fattura",
"ref_number": "Rif Numero",
"contact": "Contatto",
"add_item": "Aggiungi Commessa/Item",
"date": "Data",
"due_date": "Data di pagamento",
"status": "Stato",
"add_tax": "Aggiungi Imposta",
"amount": "Ammontare",
"action": "Azione",
"notes": "Note",
"view": "Vedi",
"send_invoice": "Invia Fattura",
"invoice_template": "Modello Fattura",
"template": "Modello",
"mark_as_sent": "Segna come inviata",
"confirm_send_invoice": "Questa fattura sarà inviata via Mail al Cliente",
"invoice_mark_as_sent": "Questa fattura sarà contrassegnata come inviata",
"confirm_send": "Questa fattura sarà inviata via Mail al Cliente",
"invoice_date": "Data fattura",
"record_payment": "Registra Pagamento",
"add_new_invoice": "Aggiungi nuova Fattura",
"update_expense": "Aggiorna Costo",
"edit_invoice": "Modifica Fattura",
"new_invoice": "Nuova Fattura",
"save_invoice": "Salva fattura",
"update_invoice": "Aggiorna Fattura",
"add_new_tax": "Aggiungi tassa/imposta",
"no_invoices": "Ancora nessuna fattura!",
"list_of_invoices": "Questa sezione conterrà la lista delle Fatture.",
"select_invoice": "Seleziona Fattura",
"no_matching_invoices": "Nessuna fattura trovata!",
"mark_as_sent_successfully": "Fattura contassegnata come inviata con successo",
"send_invoice_successfully": "Fattura inviata con successo",
"cloned_successfully": "Fattura copiata con successo",
"clone_invoice": "Clona Fattura",
"confirm_clone": "Questa fattura verrà clonata in una nuova fattura",
"item": {
"title": "Titolo Commessa",
"description": "Descrizione",
"quantity": "Quantità",
"price": "Prezzo",
"discount": "Sconto",
"total": "Totale",
"total_discount": "Sconto Totale",
"sub_total": "Sub Totale",
"tax": "Tassa",
"amount": "Ammontare",
"select_an_item": "Scrivi o clicca per selezionare un item",
"type_item_description": "Scrivi una descrizione (opzionale)"
},
"payment_attached_message": "Una delle fatture selezionate ha già associato un pagamento. Assicurati di eliminare il pagamento associato prima di procedere con la rimozione",
"confirm_delete": "Non potrai recuperare la Fattura cancellata | Non potrai recuperare le Fatture cancellate",
"created_message": "Fattura creata con successo",
"updated_message": "Fattura aggiornata con successo",
"deleted_message": "Fattura cancellata con successo | Fatture cancellate con successo",
"marked_as_sent_message": "Fattura contrassegnata come inviata con successo",
"user_email_does_not_exist": "La Email utente non esiste",
"something_went_wrong": "Si è verificato un errore",
"invalid_due_amount_message": "L'ammontare totale della fattura non può essere inferiore all'ammontare totale pagato per questa fattura. Modifica la fattura o cancella i pagamenti associati per continuare."
},
"credit_notes": {
"title": "Note di Credito",
"credit_notes_list": "Lista Note di Credito",
"credit_notes": "Note di Credito",
"contact": "Contatta",
"date": "Data",
"amount": "Ammontare",
"action": "Azione",
"credit_number": "Numero Credito",
"notes": "Note",
"confirm_delete": "Vuoi cancellare questa nota di credito?",
"item": {
"title": "Titolo",
"description": "Descrizione",
"quantity": "Quantità",
"price": "Prezzo",
"discount": "Sconto",
"total": "Totale",
"total_discount": "Sconto Totale",
"sub_total": "Sub Totale",
"tax": "Tassa"
}
},
"payments": {
"title": "Pagamenti",
"payments_list": "Lista Pagamenti",
"record_payment": "Registra Pagamento",
"customer": "Cliente",
"date": "Data",
"amount": "Ammontare",
"action": "Azione",
"payment_number": "Numero di pagamento",
"payment_mode": "Modalità di Pagamento",
"invoice": "Fattura",
"note": "Note",
"add_payment": "Aggiungi Pagamento",
"new_payment": "Nuovo Pagamento",
"edit_payment": "Modifica Pagamento",
"view_payment": "Vedi Pagamento",
"add_new_payment": "Aggiungi nuovo pagamento",
"send_payment_receipt": "Invia ricevuta di pagamento",
"save_payment": "Salva pagamento",
"update_payment": "Aggiorna pagamento",
"payment": "Pagamento | Pagamenti",
"no_payments": "Ancora nessun pagamento!",
"no_matching_payments": "Non ci sono pagamenti!",
"list_of_payments": "Questa sezione conterrà la lista dei pagamenti.",
"select_payment_mode": "Seleziona modalità di pagamento",
"confirm_send_payment": "Questo pagamento verrà inviato via email al cliente",
"send_payment_successfully": "Pagamento inviato con successo",
"user_email_does_not_exist": "Email utente non esiste",
"something_went_wrong": "si è verificato un errore",
"confirm_delete": "Non potrai recuperare questo pagamento | Non potrai recuperare questi pagamenti",
"created_message": "Pagamento creato con successo",
"updated_message": "Pagamento aggiornato con successo",
"deleted_message": "Pagamento cancellato con successo | Pagamenti cancellati con successo",
"invalid_amount_message": "L'ammontare del pagamento non è valido"
},
"expenses": {
"title": "Spese",
"expenses_list": "Lista Costi",
"expense_title": "Titolo",
"contact": "Contatto",
"category": "Categoria",
"from_date": "Dalla Data",
"to_date": "Alla Data",
"expense_date": "Data",
"description": "Descrizione",
"receipt": "Ricevuta",
"amount": "Ammontare",
"action": "Azione",
"note": "Nota",
"category_id": "Id categoria",
"date": "Data Spesa",
"add_expense": "Aggiungi Spesa",
"add_new_expense": "Aggiungi nuova Spesa",
"save_expense": "Salva la Spesa",
"update_expense": "Aggiorna Spesa",
"download_receipt": "Scarica la Ricevuta",
"edit_expense": "Modifica Spesa",
"new_expense": "Nuova Spesa",
"expense": "Spesa | Spese",
"no_expenses": "Ancora nessuna spesa!",
"list_of_expenses": "Questa sezione conterrà la lista delle Spese.",
"confirm_delete": "Non potrai recuperare questa spesa | Non potrai recuperare queste spese",
"created_message": "Spesa creata con successo",
"updated_message": "Spesa modificata con successo",
"deleted_message": "Spesa cancellata con successo | Spese cancellate con successo",
"categories": {
"categories_list": "Lista categorie",
"title": "Titolo",
"name": "Nome",
"description": "Descrizione",
"amount": "Ammontare",
"actions": "Azioni",
"add_category": "Aggiungi Categoria",
"new_category": "Nuova Categoria",
"category": "Categoria | Categorie",
"select_a_category": "Seleziona Categoria"
}
},
"login": {
"email": "Email",
"password": "Password",
"forgot_password": "Password dimenticata?",
"or_signIn_with": "o fai login con",
"login": "Login",
"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"
},
"reports": {
"title": "Report",
"from_date": "Da",
"to_date": "A",
"status": "Status",
"paid": "Pagato",
"unpaid": "Non pagato",
"download_pdf": "Scarica PDF",
"view_pdf": "Vedi PDF",
"update_report": "Aggiorna Report",
"report": "Report | Reports",
"profit_loss": {
"profit_loss": "Guadagni & Perdite",
"to_date": "A",
"from_date": "Da",
"date_range": "Seleziona intervallo date"
},
"sales": {
"sales": "Vendite",
"date_range": "Seleziona intervallo date",
"to_date": "A",
"from_date": "Da",
"report_type": "Tipo di report"
},
"taxes": {
"taxes": "Tasse",
"to_date": "Alla data",
"from_date": "Dalla data",
"date_range": "Seleziona intervallo date"
},
"errors": {
"required": "Campo obbligatorio"
},
"invoices": {
"invoice": "Fattura",
"invoice_date": "Data fattura",
"due_date": "Data di pagamento",
"amount": "Ammontare",
"contact_name": "Nome contatto",
"status": "Status"
},
"estimates": {
"estimate": "Preventivo",
"estimate_date": "Data preventivo",
"due_date": "Data di pagamento",
"estimate_number": "Numero di preventivo",
"ref_number": "Numero di Rif.",
"amount": "Ammontare",
"contact_name": "Nome contatto",
"status": "Status"
},
"expenses": {
"expenses": "Spese",
"category": "Categoria",
"date": "Data",
"amount": "Ammontare",
"to_date": "Alla data",
"from_date": "Dalla data",
"date_range": "Seleziona intervallo date"
}
},
"settings": {
"menu_title": {
"account_settings": "Impostazioni Account",
"company_information": "Informazioni Azienda",
"customization": "Personalizzazione",
"preferences": "Opzioni",
"notifications": "Notifiche",
"tax_types": "Tupi di Tasse",
"expense_category": "Categorie di spesa",
"update_app": "Aggiorna App"
},
"title": "Impostazioni",
"setting": "Opzione | Impostazioni",
"general": "Generale",
"language": "Lingua",
"primary_currency": "Valuta Principale",
"timezone": "Time Zone",
"date_format": "Formato data",
"currencies": {
"title": "Valute",
"currency": "Valùta | Valute",
"currencies_list": "Lista valute",
"select_currency": "Seleziona Valùta",
"name": "Nome",
"code": "Codice",
"symbol": "Simbolo",
"precision": "Precisione",
"thousand_separator": "Separatore migliaia",
"decimal_separator": "Separatore decimali",
"position": "Posizione",
"position_of_symbol": "Posizione del Simbolo",
"right": "Destra",
"left": "Sinistra",
"action": "Azione",
"add_currency": "Aggiungi Valùta"
},
"mail": {
"host": "Mail Host",
"port": "Mail Port",
"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",
"mail_config": "Configurazione Mail",
"from_name": "Nome Mittente Mail",
"from_mail": "Indirizzo Mittente Mail",
"encryption": "Mail Encryption",
"mail_config_desc": "Form per Configurazione Driver Mail per invio mail dall'App. Puoi anche configurare providers di terze parti come Sendgrid, SES, etc.."
},
"pdf": {
"title": "Configurazione PDF",
"footer_text": "Testo Footer",
"pdf_layout": "Layout PDF"
},
"company_info": {
"company_info": "Info azienda",
"company_name": "Nome azienda",
"company_logo": "Logo azienda",
"section_description": "Informazioni sulla tua azienda che saranno mostrate in fattura, preventivi ed altri documenti creati dell'applicazione.",
"phone": "Telefono",
"country": "Paese",
"state": "Stato",
"city": "Città",
"address": "Indirizzo",
"zip": "CAP",
"save": "Salva",
"updated_message": "Informazioni Azienda aggiornate con successo."
},
"customization": {
"customization": "personalizzazione",
"save": "Salva",
"addresses": {
"title": "Indirizzi",
"section_description": "Puoi settare l'indirizzo di fatturazione del Cliente e/o il formato dell'indirizzo di spedizione (Mostrato solo sul PDF). ",
"customer_billing_address": "Indirizzo Fatturazione Cliente",
"customer_shipping_address": "Indirizzo spedizione Cliente",
"company_address": "Indirizzo Azienda",
"insert_fields": "Inserisci Campi",
"contact": "Contatto",
"address": "Indirizzo",
"display_name": "Mostra nome",
"primary_contact_name": "Nome contatto primario",
"email": "Email",
"website": "Sito web",
"name": "Nome",
"country": "Paese",
"state": "Stato",
"city": "Città",
"company_name": "Nome Azienda",
"address_street_1": "Indirizzo 1",
"address_street_2": "Indirizzo 2",
"phone": "Telefono",
"zip_code": "CAP/ZIP Code",
"address_setting_updated": "Indirizzo aggiornato con Successo"
},
"updated_message": "Info azienda aggiornate con successo",
"invoices": {
"title": "Fatture",
"notes": "Note",
"invoice_prefix": "Prefisso Fattura",
"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.",
"enter_invoice_prefix": "Inserisci prefisso fattura",
"terms_and_conditions": "Termini e Condizioni",
"invoice_setting_updated": "Impostazioni fatture aggiornate con successo"
},
"estimates": {
"title": "Preventivi",
"estimate_prefix": "Prefisso Preventivi",
"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.",
"enter_estimate_prefix": "Inserisci prefisso preventivo",
"estimate_setting_updated": "Impostazioni preventivi aggiornate con successo"
},
"payments": {
"title": "Pagamenti",
"payment_prefix": "Prefisso Pagamento",
"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.",
"enter_payment_prefix": "Inserisci prefisso di pagamento",
"payment_setting_updated": "Impostazioni di pagamento aggiornate con successo",
"payment_mode": "Modalità di pagamento",
"add_payment_mode": "Aggiungi modalità di pagamento",
"mode_name": "Nome modalità",
"payment_mode_added": "Modalità di pagamento aggiunta",
"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"
},
"items": {
"title": "Items",
"units": "unità",
"add_item_unit": "Aggiungi Unità Item",
"unit_name": "Nome",
"item_unit_added": "Unità aggiunta",
"item_unit_updated": "Unità aggiornata",
"item_unit_confirm_delete":"Non potrai ripristinare questa unità Item",
"already_in_use": "Unità Item già in uso",
"deleted_message": "Unità item eliminata con successo"
}
},
"account_settings": {
"profile_picture": "Immagine profilo",
"name": "Nome",
"email": "Email",
"password": "Password",
"confirm_password": "Conferma Password",
"account_settings": "Impostazioni Account",
"save": "Salva",
"section_description": "Puoi aggiornare nome email e password utilizzando il form qui sotto.",
"updated_message": "Impostazioni account aggiornate con successo"
},
"user_profile": {
"name": "Nome",
"email": "Email",
"password": "Password",
"confirm_password": "Conferma Password"
},
"notification": {
"title": "Notifica",
"email": "Invia notifiche a",
"description": "Quali notifiche email vorresti ricevere quando qualcosa cambia?",
"invoice_viewed": "Fattura visualizzata",
"invoice_viewed_desc": "Quando il cliente visualizza la fattura inviata via dashboard applicazione.",
"estimate_viewed": "Preventivo visualizzato",
"estimate_viewed_desc": "Quando il cliente visualizza il preventivo inviato dall'applicazione.",
"save": "Salva",
"email_save_message": "Email salvata con successo",
"please_enter_email": "Inserisci Email"
},
"tax_types": {
"title": "Tipi di Imposta",
"add_tax": "Aggiungi Imposta",
"description": "Puoi aggiongere e rimuovere imposte a piacimento. Vengono supportate Tasse differenti per prodotti/servizi specifici esattamento come per le fatture.",
"add_new_tax": "Aggiungi nuova imposta",
"tax_settings": "Impostazioni Imposte",
"tax_per_item": "Tassa per prodotto/servizio",
"tax_name": "Nome imposta",
"compound_tax": "Imposta composta",
"percent": "Percento",
"action": "Azione",
"tax_setting_description": "Abilita se vuoi aggiungere imposte specifiche per prodotti o servizi. Di default le imposte sono aggiunte direttamente alla fattura.",
"created_message": "Tipo di imposta creato con successo",
"updated_message": "Tipo di imposta aggiornato con successo",
"deleted_message": "Tipo di imposta eliminato con successo",
"confirm_delete": "Non potrai ripristinare questo tipo di imposta",
"already_in_use": "Imposta già in uso"
},
"expense_category": {
"title": "Categorie di spesa",
"action": "Azione",
"description": "Le categorie sono necessarie per aggiungere delle voci di spesa. Puoi aggiungere o eliminare queste categorie in base alle tue preferenze.",
"add_new_category": "Aggiungi nuova categoria",
"category_name": "Nome Categoria",
"category_description": "Descrizione",
"created_message": "Categoria di spesa creata con successo",
"deleted_message": "Categoria di spesa eliminata con successo",
"updated_message": "Categoria di spesa aggiornata con successo",
"confirm_delete": "Non potrai ripristinare questa categoria di spesa",
"already_in_use": "Categoria già in uso"
},
"preferences": {
"currency": "Valùta",
"language": "Lingua",
"time_zone": "Time Zone",
"fiscal_year": "Anno finanziario",
"date_format": "Formato Data",
"discount_setting": "Impostazione Sconto",
"discount_per_item": "Sconto Per Item ",
"discount_setting_description": "Abilita se vuoi aggiungere uno sconto ad uno specifica fattura. Di default, lo sconto è aggiunto direttamente in fattura.",
"save": "Salva",
"preference": "Preferenza | Preferenze",
"general_settings": "Impostazioni di default del sistema.",
"updated_message": "Preferenze aggiornate con successo",
"select_language": "seleziona lingua",
"select_time_zone": "Seleziona Time Zone",
"select_date_formate": "Seleziona Formato Data",
"select_financial_year": "Seleziona anno finanziario"
},
"update_app": {
"title": "Aggiorna App",
"description": "Puoi facilmente aggiornare l'app. Aggiorna cliccando sul bottone qui sotto",
"check_update": "Controllo aggiornamenti",
"avail_update": "Aggiornamento disponibile",
"next_version": "Versione successiva",
"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",
"update_success": "L'App è aggiornata! Attendi che la pagina venga ricaricata automaticamente.",
"latest_message": "Nessun aggiornamneto disponibile! Sei già alla versione più recente.",
"current_version": "Versione corrente"
}
},
"wizard": {
"account_info": "Informazioni Account",
"account_info_desc": "I dettagli qui sotto verranno usati per creare l'account principale dell'Amministratore. Puoi modificarli in qualsiasi momento dopo esserti loggato come Amministratore.",
"name": "Nome",
"email": "Email",
"password": "Password",
"confirm_password": "Conferma Password",
"save_cont": "Salva & Continua",
"company_info": "Informazioni Azienda",
"company_info_desc": "Questa informazione verrà mostrata nelle fatture. Puoi modificare queste informazione in un momento successivo dalla pagina delle impostazioni.",
"company_name": "Nome Azienda",
"company_logo": "Logo Azienda",
"logo_preview": "Anteprima Logo",
"preferences": "Impostazioni",
"preferences_desc": "Impostazioni di default del sistema.",
"country": "Paese",
"state": "Stato",
"city": "Città",
"address": "Indirizzo",
"street": "Indirizzo1 | Indirizzo2",
"phone": "Telefono",
"zip_code": "CAP/Zip Code",
"go_back": "Torna indietro",
"currency": "Valùta",
"language": "Lingua",
"time_zone": "Time Zone",
"fiscal_year": "Anno Finanziario",
"date_format": "Formato Date",
"from_address": "Indirizzo - Da",
"username": "Username",
"next": "Successivo",
"continue": "Continua",
"skip": "Salta",
"database": {
"database": "URL del sito & database",
"connection": "Connessione Database",
"host": "Database Host",
"port": "Database - Porta",
"password": "Database Password",
"app_url": "App URL",
"username": "Database Username",
"db_name": "Database Nome",
"desc": "Crea un database sul tuo server e setta le credenziali usando il form qui sotto."
},
"permissions": {
"permissions": "Permessi",
"permission_confirm_title": "Sei sicuro di voler continuare?",
"permission_confirm_desc": "Controllo sui permessi Cartelle, fallito",
"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",
"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",
"mail_config": "Configurazione Mail",
"from_name": "Nome mittente mail",
"from_mail": "Indirizzo mittente mail",
"encryption": "Tipo di cifratura Mail",
"mail_config_desc": "Form per configurazione del 'driver mail' per inviare emails dall'App. Puoi anche configurare servizi di terze parti come Sendgrid, SES, ecc.."
},
"req": {
"system_req": "Requisiti di Sistema",
"php_req_version": "Php (versione {version} richiesta)",
"check_req": "Controllo Requisiti",
"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"
},
"success": {
"mail_variables_save_successfully": "Email configurata con successo",
"database_variables_save_successfully": "Database configurato con successo."
}
},
"layout_login": {
"copyright_crater": "Copyright @ Crater - 2020",
"super_simple_invoicing": "Fatturazione super semplice",
"for_freelancer": "per Freelancers &",
"small_businesses": "Medio Piccoli Business ",
"crater_help": "Crater ti aiuta a tracciare le spese, registrare pagamenti e generare graziose",
"invoices_and_estimates": "fatture & preventivi con possibilità di scegliere tra diversi modelli."
},
"validation": {
"invalid_url": "URL non valido (es: http://www.crater.com)",
"required": "Campo obbligatorio",
"email_incorrect": "Email non corretta.",
"email_already_taken": "Email già in uso.",
"email_does_not_exist": "L'utente con questa email non esiste",
"item_unit_already_taken": "Questo nome item è già utilizzato",
"payment_mode_already_taken": "Questa modalità di pagamento è già stata inserita.",
"send_reset_link": "Invia Link di Reset",
"not_yet": "Non ancora? Invia di nuovo",
"password_min_length": "La password deve contenere {count} caratteri",
"name_min_length": "Il nome deve avere almeno {count} lettere.",
"enter_valid_tax_rate": "Inserisci un tasso di imposta valido",
"numbers_only": "Solo numeri.",
"characters_only": "Solo caratteri.",
"password_incorrect": "La Password deve essere identica",
"password_length": "La password deve essere lunga {count} caratteri.",
"qty_must_greater_than_zero": "La quantità deve essere maggiore di zero.",
"price_greater_than_zero": "Il prezzo deve essere maggiore di zero.",
"payment_greater_than_zero": "Il pagamento deve essere maggiore di zero.",
"payment_greater_than_due_amount": "Il pagamento inserito è maggiore di quello indicato in fattura.",
"quantity_maxlength": "La Quantità non può essere maggiore di 20 cifre.",
"price_maxlength": "Il prezzo non può contenere più di 20 cifre.",
"price_minvalue": "Il prezzo deve essere maggiore di 0.",
"amount_maxlength": "La somma non deve contenere più di 20 cifre.",
"amount_minvalue": "La somma deve essere maggiore di 0.",
"description_maxlength": "La Descrizione non deve superare i 255 caratteri.",
"subject_maxlength": "L'Oggetto non deve superare i 100 caratter.",
"message_maxlength": "Il messaggio non può superare i 255 caratteri.",
"maximum_options_error": "Massimo di {max} opzioni selezionate. Per selezionare un'altra opzione deseleziona prima una opzione.",
"notes_maxlength": "Le note non possono superare i 255 caratteri.",
"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"
}
}

View File

@ -0,0 +1,912 @@
{
"navigation": {
"dashboard": "Dashboard",
"customers": "Klanten",
"items": "Artikelen",
"invoices": "Facturen",
"expenses": "Uitgaven",
"estimates": "Offertes",
"payments": "Betalingen",
"reports": "Rapporten",
"settings": "Instellingen",
"logout": "Uitloggen"
},
"general": {
"view_pdf": "Bekijk PDF",
"download_pdf": "Download PDF",
"save": "Opslaan",
"cancel": "Annuleer",
"update": "Bewerk",
"download": "Download",
"from_date": "Van datum",
"to_date": "tot datum",
"from": "Van",
"to": "Naar",
"go_back": "Ga terug",
"back_to_login": "Terug naar inloggen?",
"home": "Home",
"filter": "Filter",
"delete": "Verwijder",
"edit": "Bewerk",
"view": "Bekijk",
"add_new_item": "Nieuw product",
"clear_all": "Alles wissen",
"showing": "Tonen",
"of": "van",
"actions": "Acties",
"subtotal": "SUBTOTAAL",
"discount": "KORTING",
"fixed": "Vast",
"percentage": "Percentage",
"tax": "BTW",
"total_amount": "TOTAAL BEDRAG",
"bill_to": "Factureren aan",
"ship_to": "Verzenden naar",
"due": "Verschuldigd",
"draft": "Concept",
"sent": "Verzonden",
"all": "Alles",
"select_all": "Selecteer Alles",
"choose_file": "Klik hier om een bestand te kiezen",
"choose_template": "Kies een template",
"choose": "Kies",
"remove": "Verwijder",
"powered_by": "Powered by",
"bytefury": "Bytefury",
"select_a_status": "Selecteer een status",
"select_a_tax": "Select een btw",
"search": "Zoek",
"are_you_sure": "Ben je zeker?",
"list_is_empty": "Lijst is leeg.",
"no_tax_found": "Geen btw gevonden!",
"four_zero_four": "404",
"you_got_lost": "Whoops! Je bent verloren!",
"go_home": "Ga naar de homepagina",
"setting_updated": "Instellingen zijn geüpdatet",
"select_state": "Selecteer staat",
"select_country": "Selecteer land",
"select_city": "Selecteer stad",
"street_1": "Straat 1",
"street_2": "Straat 2",
"action_failed": "Actie mislukt",
"sort_by": "sorteer op",
"ascending": "Oplopend",
"descending": "Aflopend",
"subject": "onderwerpen",
"message": "Bericht",
"test_mail_conf": "Test de e-mailconfiguratie",
"send_mail_successfully": "Mail is succesvol verzonden",
},
"dashboard": {
"select_year": "Selecteer jaar",
"cards": {
"due_amount": "Verschuldigd bedrag",
"customers": "Klanten",
"invoices": "Facturen",
"estimates": "Offertes"
},
"chart_info": {
"total_sales": "Verkopen",
"total_receipts": "Ontvangen",
"total_expense": "Uitgaven",
"net_income": "Netto inkomen",
"year": "Selecteer jaar"
},
"weekly_invoices": {
"title": "Wekelijkse facturen"
},
"monthly_chart": {
"title": "Verkopen & uitgaven"
},
"recent_invoices_card": {
"title": "Te betalen facturen",
"due_on": "Verschuldigd op",
"customer": "Klant",
"amount_due": "Verschuldigd bedrag",
"actions": "Acties",
"view_all": "Bekijk alle"
},
"recent_estimate_card": {
"title": "Recente offertes",
"date": "Datum",
"customer": "Klant",
"amount_due": "Verschuldigd Bedrag",
"actions": "Acties",
"view_all": "Bekijk alle"
}
},
"tax_types": {
"name": "Naam",
"description": "Omschrijving",
"percent": "Percentage",
"compound_tax": "Samengestelde Btw"
},
"customers": {
"title": "Klanten",
"add_customer": "Klant toevoegen",
"contacts_list": "Klanten lijst",
"name": "Naam",
"display_name": "Weergavenaam",
"primary_contact_name": "Primaire contactpersoon",
"contact_name": "Contact naam",
"amount_due": "Verschuldigd Bedrag",
"email": "E-mail",
"address": "Adres",
"phone": "Telefoon",
"website": "Website",
"country": "Land",
"state": "Staat",
"city": "Stad",
"zip_code": "Postcode",
"added_on": "Toegevoegd op",
"action": "Actie",
"password": "Wachtwoord",
"street_number": "Straat nummer",
"primary_currency": "Primaire valuta",
"add_new_customer": "Nieuwe klant toevoegen",
"save_customer": "Klant opslaan",
"update_customer": "Klant bewerken",
"customer": "Klant | Klanten",
"new_customer": "Nieuwe Klant",
"edit_customer": "Bewerk Klant",
"basic_info": "Basis info",
"billing_address": "Facturatieadres",
"shipping_address": "Verzendadres",
"copy_billing_address": "Kopieer van facturatie",
"no_customers": "Nog geen klanten!",
"no_customers_found": "Geen klanten gevonden!",
"list_of_customers": "Dit gedeelte bevat de lijst van klanten.",
"primary_display_name": "Primaire weergavenaam",
"select_currency": "Selecteer valuta",
"select_a_customer": "Selecteer een klant",
"type_or_click": "Typ of klik om te selecteren",
"confirm_delete": "Je zal niet in staat zijn om deze klant te herstellen | Je zal niet in staat zijn om deze klanten te herstellen",
"created_message": "Klant succesvol aangemaakt",
"updated_message": "Klant succesvol bijgewerkt",
"deleted_message": "Klant succesvol verwijderd | Klanten succesvol verwijderd"
},
"items": {
"title": "Artikelen",
"items_list": "Artikelen lijst",
"name": "Naam",
"unit": "Eenheid",
"description": "Beschrijving",
"added_on": "Toegevoegd op",
"price": "Prijs",
"date_of_creation": "Datum van aanmaak",
"action": "Actie",
"add_item": "Artikel toevoegen",
"save_item": "Artikel opslaan",
"update_item": "Artikel bewerken",
"item": "Artikel | Artikels",
"add_new_item": "Nieuw artikel toevoegen",
"new_item": "Nieuw artikel",
"edit_item": "Bewerk artikel",
"no_items": "Nog geen artikelen!",
"list_of_items": "Dit gedeelte zal de lijst met artikels bevatten.",
"select_a_unit": "kies een eenheid",
"item_attached_message": "Kan een artikel dat al in gebruik is niet verwijderen",
"confirm_delete": "U zult niet in staat zijn om dit artikel terug te krijgen. | U zult niet in staat zijn om deze artikels terug te krijgen.",
"created_message": "Artikel succesvol aangemaakt",
"updated_message": "Artikel succesvol bijgewerkt",
"deleted_message": "Artikel succesvol verwijderd | Artikels succesvol verwijderd",
"taxes": "Belastingen",
},
"estimates": {
"title": "Offertes",
"estimate": "Offerte | Offertes",
"estimates_list": "Offerte lijst",
"days": "{days} Dagen",
"months": "{months} Maanden",
"years": "{years} Jaren",
"all": "Alles",
"paid": "Betaald",
"unpaid": "Onbetaald",
"customer": "KLANT",
"ref_no": "REF NR.",
"number": "NUMMER",
"amount_due": "VERSCHULDIGD BEDRAG",
"partially_paid": "Gedeeltelijk betaald",
"total": "Totaal",
"discount": "Korting",
"sub_total": "Subtotaal",
"estimate_number": "Offerte Nummer",
"ref_number": "Ref. Nummer",
"contact": "Contact",
"add_item": "Voeg een item toe",
"date": "Datum",
"due_date": "Vervaldatum",
"expiry_date": "Vervaldatum",
"status": "Status",
"add_tax": "Btw toevoegen",
"amount": "Bedrag",
"action": "Actie",
"notes": "Notitie's",
"tax": "Btw",
"estimate_template": "Sjabloon",
"convert_to_invoice": "Omzetten naar factuur",
"mark_as_sent": "Markeer als verzonden",
"send_estimate": "Verzend offerte",
"record_payment": "Record Payment",
"add_estimate": "Offerte toevoegen",
"save_estimate": "Offerte opslaan",
"confirm_conversion": "Wil je deze offerte omzetten in een factuur?",
"conversion_message": "Factuur succesvol aangemaakt",
"confirm_send_estimate": "Deze offerte zal verzonden worden via email naar de klant",
"confirm_mark_as_sent": "Deze offerte zal gemarkeerd worden als verzonden",
"confirm_mark_as_accepted": "Deze offerte zal gemarkeerd worden als geaccepteerd",
"confirm_mark_as_rejected": "Deze offerte zal gemarkeerd worden als afgewezen",
"no_matching_estimates": "Er zijn geen overeenkomende offertes!",
"mark_as_sent_successfully": "Offerte succesvol gemarkeerd als verzonden",
"send_estimate_successfully": "Offerte succesvol verzonden",
"errors": {
"required": "Veld is verplicht"
},
"accepted": "Geaccepteerd",
"sent": "Verzonden",
"draft": "Concept",
"declined": "Geweigerd",
"new_estimate": "Nieuwe offerte",
"add_new_estimate": "Nieuwe offerte toevoegen",
"update_Estimate": "Offerte bijwerken",
"edit_estimate": "Bewerk offerte",
"items": "items",
"Estimate": "Offerte | Offertes",
"add_new_tax": "Nieuwe Btw toevoegen",
"no_estimates": "Nog geen offertes!",
"list_of_estimates": "Dit deel bevat de lijst met offertes.",
"mark_as_rejected": "Markeer als afgewezen",
"mark_as_accepted": "Markeer als geaccepteerd",
"marked_as_accepted_message": "Offerte gemarkeerd als geaccepteerd",
"marked_as_rejected_message": "Offerte gemarkeerd als afgewezen",
"confirm_delete": "U zult niet in staat zijn om deze offerte te herstellen. | U zult niet in staat zijn om deze offertes te herstellen.",
"created_message": "Offerte succesvol aangemaakt",
"updated_message": "Offerte succesvol bijgewerkt",
"deleted_message": "Offerte succesvol verwijderd | Offertes succesvol verwijderd",
"user_email_does_not_exist": "E-mail van de gebruiker bestaat niet",
"something_went_wrong": "er ging iets mis",
"item": {
"title": "Artikel titel",
"description": "Omschrijving",
"quantity": "Aantal",
"price": "Prijs",
"discount": "Korting",
"total": "Totaal",
"total_discount": "Totale korting",
"sub_total": "Subtotaal",
"tax": "Btw",
"amount": "Bedrag",
"select_an_item": "Typ of klik om te selecteren",
"type_item_description": "Type Artikel Omschrijving (optioneel)"
}
},
"invoices": {
"title": "Facturen",
"invoices_list": "Facturen Lijst",
"days": "{days} Dagen",
"months": "{months} Maanden",
"years": "{years} Jaren",
"all": "Alle",
"paid": "Betaald",
"unpaid": "Onbetaald",
"customer": "KLANT",
"paid_status": "BETAALD STATUS",
"ref_no": "REF NR.",
"number": "NUMMER",
"amount_due": "BEDRAG VERSCHULDIGD",
"partially_paid": "Gedeeltelijk betaald",
"total": "Totaal",
"discount": "Korting",
"sub_total": "Subtotaal",
"invoice": "Factuur | Facturen",
"invoice_number": "Factuurnummer",
"ref_number": "Ref. Nummer",
"contact": "Contact",
"add_item": "Artikel toevoegen",
"date": "Datum",
"due_date": "Vervaldatum",
"status": "Status",
"add_tax": "Add Btw",
"amount": "Bedrag",
"action": "Actie",
"notes": "Notie's",
"view": "Bekijk",
"send_invoice": "Verstuur Factuur",
"invoice_template": "Factuur Sjabloon",
"template": "Sjabloon",
"mark_as_sent": "Markeer als verzonden",
"confirm_send_invoice": "Deze factuur wordt per e-mail naar de klant gestuurd",
"invoice_mark_as_sent": "Deze factuur wordt gemarkeerd als verzonden",
"confirm_send": "Deze factuur wordt per e-mail naar de klant gestuurd",
"invoice_date": "Factuurdatum",
"record_payment": "Record Payment",
"add_new_invoice": "Nieuwe factuur toevoegen",
"update_expense": "Bewerk Uitgaven",
"edit_invoice": "Bewerk Factuur",
"new_invoice": "Nieuw Factuur",
"save_invoice": "Factuur opslaan",
"update_invoice": "Bewerk Factuur",
"add_new_tax": "Nieuwe Btw toevoegen",
"no_invoices": "Nog geen facturen!",
"list_of_invoices": "Dit gedeelte bevat de lijst met facturen.",
"select_invoice": "Selecteer factuur",
"no_matching_invoices": "Er zijn geen overeenkomstige facturen!",
"mark_as_sent_successfully": "Factuur succesvol gemarkeerd als verzonden",
"send_invoice_successfully": "Factuur succesvol verzonden",
"item": {
"title": "Artikel titel",
"description": "Omschrijving",
"quantity": "Aantal",
"price": "Prijs",
"discount": "Korting",
"total": "Totaal",
"total_discount": "Totale korting",
"sub_total": "Subtotaal",
"tax": "Btw",
"amount": "Bedrag",
"select_an_item": "Typ of klik om te selecteren",
"type_item_description": "Type Artikel omschrijving (optioneel)"
},
"payment_attached_message": "Een van de geselecteerde facturen is al aan een betaling gekoppeld. Zorg ervoor dat u de bijgevoegde betalingen eerst verwijderd om door te kunnen gaan met de verwijdering.",
"confirm_delete": "U zult deze factuur niet kunnen herstellen | U zult deze facturen niet kunnen herstellen",
"created_message": "Factuur succesvol aangemaakt ",
"updated_message": "Factuur succesvol bijgewerkt ",
"deleted_message": "Factuur succesvol verwijderd | Facturen succesvol verwijderd",
"marked_as_sent_message": "Factuur succesvol gemarkeerd als verzonden",
"user_email_does_not_exist": "E-mail van de gebruiker bestaat niet",
"something_went_wrong": "er ging iets mis",
"invalid_due_amount_message": "Het totale factuurbedrag kan niet lager zijn dan het totale betaalde bedrag voor deze factuur. Gelieve de factuur bij te werken of de bijhorende betalingen te verwijderen om verder te kunnen gaan.",
"cloned_successfully": "Factuur succesvol gekloond",
"clone_invoice": "Factuur klonen",
"confirm_clone": "Deze factuur wordt gekloond in een nieuwe factuur",
},
"credit_notes": {
"title": "Creditnota's",
"credit_notes_list": "Creditnota's lijst",
"credit_notes": "Creditnota's",
"contact": "Contact",
"date": "Datum",
"amount": "Bedrag",
"action": "Actie",
"credit_number": "Credit Nummer",
"notes": "Notie's",
"confirm_delete": "Wil je deze Creditnota verwijderen?",
"item": {
"title": "Artikel titel",
"description": "Omschrijving",
"quantity": "Aantal",
"price": "Prijs",
"discount": "Korting",
"total": "Totaal",
"total_discount": "Totale korting",
"sub_total": "Subtotaal",
"tax": "Btw"
}
},
"payments": {
"title": "Betalingen",
"payments_list": "Betalingen lijst",
"record_payment": "Record Betaling",
"customer": "Klant",
"date": "Datum",
"amount": "Bedrag",
"action": "Actie",
"payment_number": "betaling Nummer",
"payment_mode": "Betalingswijze",
"invoice": "Factuur",
"note": "Notitie",
"add_payment": "Betaling toevoegen",
"new_payment": "Nieuwe betaling",
"edit_payment": "Betaling bewerken",
"view_payment": "Betaling bekijken",
"add_new_payment": "Nieuwe betaling toevoegen",
"save_payment": "Betaling opslaan",
"update_payment": "Betaling bewerken",
"payment": "Betaling | Betalingen",
"no_payments": "Nog geen betalingen!",
"list_of_payments": "Dit gedeelte bevat de lijst met betalingen.",
"select_payment_mode": "Selecteer betalingswijze",
"confirm_delete": "U zult deze betaling niet kunnen herstellen | U zult deze betalingen niet kunnen herstellen",
"created_message": "Betaling succesvol aangemaakt",
"updated_message": "Betaling succesvol bijgewerkt",
"deleted_message": "Betaling succesvol verwijderd | Betalingen succesvol verwijderd",
"invalid_amount_message": "Betalingsbedrag is ongeldig",
"send_payment_receipt": "Betaalbewijs verzenden",
"confirm_send_payment": "Deze betaling wordt via e-mail naar de klant gestuurd",
"send_payment_successfully": "Betaling succesvol verzonden",
"user_email_does_not_exist": "E-mailadres van gebruiker bestaat niet",
"something_went_wrong": "Er is iets fout gegaan",
},
"expenses": {
"title": "Uitgaven",
"expenses_list": "Uitgaven lijst",
"expense_title": "Titel",
"contact": "Contact",
"category": "Categorie",
"from_date": "Van Datum",
"to_date": "Tot Datum",
"expense_date": "Datum",
"description": "Omschrijving",
"receipt": "Bewijs",
"amount": "Bedrag",
"action": "Actie",
"note": "Notitie",
"category_id": "Categorie Id",
"date": "Uitgave datum",
"add_expense": "Uitgave toevoegen",
"add_new_expense": "Nieuwe uitgave toevoegen",
"save_expense": "Uitgave opslaan",
"update_expense": "Uitgave bewerken",
"download_receipt": "Download Bewijs",
"edit_expense": "Bewerk uitgave",
"new_expense": "Nieuwe uitgave",
"expense": "Uitgave | Uitgaven",
"no_expenses": "Nog geen uitgaven!",
"list_of_expenses": "Dit gedeelte bevat de lijst met uitgaven.",
"confirm_delete": "U zult niet in staat zijn om deze uitgave te herstellen | U zult niet in staat zijn om deze uitgaven te herstellen",
"created_message": "Uitgave succesvol aangemaakt",
"updated_message": "Uitgave succesvol bijgewerkt",
"deleted_message": "Uitgave succesvol verwijderd | Uitgaven succesvol verwijderd",
"select_a_customer": "Selecteer een klant",
"customer": "Klanten",
"categories": {
"categories_list": "Categories Lijst",
"title": "Titel",
"name": "Naam",
"description": "Omschrijving",
"amount": "Bedrag",
"actions": "Acties",
"add_category": "Categorie toevoegen",
"new_category": "Nieuwe categorie",
"category": "Categorie | Categorieën",
"select_a_category": "Selecteer een categorie"
}
},
"login": {
"email": "E-mail",
"password": "Wachtwoord",
"forgot_password": "Wachtwoord vergeten?",
"or_signIn_with": "of aanmelden met",
"login": "Aanmelden",
"register": "Registreer",
"reset_password": "Wachtwoord resetten",
"password_reset_successfully": "Wachtwoord succesvol gereset",
"enter_email": "Voer e-mail in",
"enter_password": "Voer wachtwoord in",
"retype_password": "Herhaal wachtwoord",
"login_placeholder": "mail@example.com"
},
"reports": {
"title": "Rapport",
"from_date": "Van Datum",
"to_date": "Tot Datum",
"status": "Status",
"paid": "Betaald",
"unpaid": "Onbetaald",
"download_pdf": "Download PDF",
"view_pdf": "Bekijk PDF",
"update_report": "Bewerk Rapport",
"report": "Rapport | Rapporten",
"profit_loss": {
"profit_loss": "Winst & Verlies",
"to_date": "Tot Datum",
"from_date": "Van Datum",
"date_range": "Selecteer Datumbereik"
},
"sales": {
"sales": "Verkopen",
"date_range": "Selecteer Datumbereik",
"to_date": "Tot Datum",
"from_date": "Van Datum",
"report_type": "Rapport Type"
},
"taxes": {
"taxes": "BTW",
"to_date": "Tot Datum",
"from_date": "Van Datum",
"date_range": "Selecteer Datumbereik"
},
"errors": {
"required": "Veld is verplicht"
},
"invoices": {
"invoice": "Factuur",
"invoice_date": "Factuurdatum",
"due_date": "Vervaldatum",
"amount": "Bedrag",
"contact_name": "Naam contactpersoon",
"status": "Status"
},
"estimates": {
"estimate": "Offerte",
"estimate_date": "Offertedatum",
"due_date": "Vervaldatum",
"estimate_number": "Offerte nummer",
"ref_number": "Ref. Nummer",
"amount": "Bedrag",
"contact_name": "Naam contactpersoon",
"status": "Status"
},
"expenses": {
"expenses": "Uitgaven",
"category": "Categorie",
"date": "Datum",
"amount": "Bedrag",
"to_date": "Tot Datum",
"from_date": "Van Datum",
"date_range": "Selecteer Datumbereik"
}
},
"settings": {
"items": {
"title": "Artikelen",
"units": "eenheden",
"add_item_unit": "Itemeenheid toevoegen",
"unit_name": "Naam eenheid",
"item_unit_added": "Item Unit toegevoegd",
"item_unit_updated": "Artikeleenheid geüpdatet",
"item_unit_confirm_delete": "U kunt dit item niet terughalen",
"already_in_use": "Item Unit is al in gebruik",
"deleted_message": "Artikeleenheid succesvol verwijderd"
},
"menu_title": {
"account_settings": "Account Instellingen",
"company_information": "Bedrijfsinformatie",
"customization": "Customizatie",
"preferences": "Voorkeuren",
"notifications": "Notificaties",
"tax_types": "Btw Types",
"expense_category": "Uitgave Categories",
"update_app": "Bewerk App"
},
"title": "Instellingen",
"setting": "Instellingen | Instellingen",
"general": "Algemeen",
"language": "Taal",
"primary_currency": "Primaire valuta",
"timezone": "Tijdszone",
"date_format": "Datum formaat",
"currencies": {
"title": "Valuta's",
"currency": "Valuta | Valuta's",
"currencies_list": "Valuta's lijst",
"select_currency": "Selecteer Valuta",
"name": "Naam",
"code": "Code",
"symbol": "Symbool",
"precision": "Precisie",
"thousand_separator": "Thousand Separator",
"decimal_separator": "Decimal Separator",
"position": "Positie",
"position_of_symbol": "Positie van symbool",
"right": "Rechts",
"left": "Links",
"action": "Actie",
"add_currency": "Valuta toevoegen"
},
"mail": {
"host": "Mail Host",
"port": "Mail Port",
"driver": "Mail Driver",
"secret": "Geheim",
"mailgun_secret": "Mailgun Geheim",
"mailgun_domain": "Domein",
"mailgun_endpoint": "Mailgun Endpoint",
"ses_secret": "SES Secret",
"ses_key": "SES Key",
"password": "Mail Wachtwoord",
"username": "Mail Gebruikersnaam",
"mail_config": "Mail configuratie",
"from_name": "Van Mail Naam",
"from_mail": "Van Mail Adres",
"encryption": "Mail Encryptie",
"mail_config_desc": "Hieronder vindt u het formulier voor het configureren van het e-mailstuurprogramma voor het verzenden van e-mails vanuit de app. U kunt ook externe leveranciers zoals Sendgrid, SES etc. configureren."
},
"pdf": {
"title": "PDF Instellingen",
"footer_text": "Voettekst",
"pdf_layout": "PDF Layout"
},
"company_info": {
"company_info": "Bedrijfsinformatie",
"company_name": "Bedrijfsnaam",
"company_logo": "bedrijfslogo",
"section_description": "Informatie over uw bedrijf die zal worden weergegeven op facturen, offertes en andere documenten gemaakt door Crater.",
"phone": "Telefoon",
"country": "Land",
"state": "Staat",
"city": "Stad",
"address": "Adres",
"zip": "Postcode",
"save": "Opslaan",
"updated_message": "Bedrijfsinformatie succesvol bijgewerkt"
},
"customization": {
"customization": "Customizatie",
"save": "Opslaan",
"addresses": {
"title": "Adressen",
"section_description": "U kan het formaat Klant Factuuradres en Klant Leveradres instellen (Alleen weergegeven in PDF). ",
"customer_billing_address": "Factuuradres van de klant",
"customer_shipping_address": "Verzendadres van de klant",
"company_address": "Bedrijfsadres",
"insert_fields": "Velden invoegen",
"contact": "Contactpersoon",
"address": "Adres",
"display_name": "Weergavenaam",
"primary_contact_name": "Primair contactpersoon naam",
"email": "E-mail",
"website": "Website",
"name": "Naam",
"country": "Land",
"state": "Staat",
"city": "Stad",
"company_name": "Bedrijfsnaam",
"address_street_1": "Adres straat 1",
"address_street_2": "Adres straat 2",
"phone": "Telefoon",
"zip_code": "Postcode",
"address_setting_updated": "Adres instellingen succesvol bijgewerkt"
},
"updated_message": "Adres informatie succesvol bijgewerkt",
"invoices": {
"title": "Facturen",
"notes": "Notie's",
"invoice_prefix": "Factuur Prefix",
"invoice_settings": "Factuur instellingen",
"autogenerate_invoice_number": "Autogenereer Factuurnummer",
"invoice_setting_description": "Schakel dit uit, Als u niet elke keer dat u een nieuwe factuur aanmaakt automatisch factuurnummers wilt genereren.",
"enter_invoice_prefix": "Voer factuur prefix in",
"terms_and_conditions": "Algemene voorwaarden",
"invoice_setting_updated": "Factuur instellingen succesvol bijgewerkt"
},
"estimates": {
"title": "Offertes",
"estimate_prefix": "Offerte Prefix",
"estimate_settings": "Offerte instellingen",
"autogenerate_estimate_number": "Autogenereer offertenummer",
"estimate_setting_description": "Schakel dit uit, Als u niet elke keer dat u een nieuwe offerte aanmaakt automatisch offertenummers wilt genereren.",
"enter_estimate_prefix": "Voer offerte prefix in",
"estimate_setting_updated": "Offerte instellingen succesvol bijgewerkt"
},
"payments": {
"title": "Betalingen",
"payment_prefix": "Betaling Prefix",
"payment_settings": "Betalingsinstellingen",
"autogenerate_payment_number": "Autogenereer betalingsnummer",
"payment_setting_description": "Schakel dit uit, Als u niet elke keer dat u een nieuwe betaling aanmaakt automatisch betalingsnummers wilt genereren.",
"enter_payment_prefix": "Voer betaling prefix in",
"payment_setting_updated": "Betaling instellingen succesvol bijgewerkt",
"payment_mode": "Betalingsmiddel",
"add_payment_mode": "Betaalmodus toevoegen",
"mode_name": "Mode Name",
"payment_mode_added": "Betaalmethode toegevoegd",
"payment_mode_updated": "Betalingsmodus geüpdatet",
"payment_mode_confirm_delete": "U kunt deze betalingsmodus niet herstellen",
"already_in_use": "De betalingsmodus is al in gebruik",
"deleted_message": "Betaalmethode succesvol verwijderd"
}
},
"account_settings": {
"profile_picture": "Profielfoto",
"name": "Naam",
"email": "E-mail",
"password": "Wachtwoord",
"confirm_password": "Bevestig wachtwoord",
"account_settings": "Account Instellingen",
"save": "Opslaan",
"section_description": "U kunt uw naam, e-mail en wachtwoord updaten met behulp van het onderstaande formulier.",
"updated_message": "Account instellingen succesvol bijgewerkt"
},
"user_profile": {
"name": "Naam",
"email": "E-mail",
"password": "Wachtwoord",
"confirm_password": "Bevestig wachtwoord"
},
"notification": {
"title": "Notificatie",
"email": "Zend notificatie naar",
"description": "Welke e-mailmeldingen wilt u ontvangen als er iets verandert?",
"invoice_viewed": "Factuur bekeken",
"invoice_viewed_desc": "Wanneer uw klant de factuur bekijkt die via het Crater dashboard is verstuurd.",
"estimate_viewed": "Offerte bekeken",
"estimate_viewed_desc": "Wanneer uw klant de offerte bekijkt die via het Crater dashboard is verstuurd.",
"save": "Opslaan",
"email_save_message": "E-mail succesvol opgeslaan",
"please_enter_email": "Vul a.u.b. e-mail in"
},
"tax_types": {
"title": "Btw Types",
"add_tax": "Add Btw",
"description": "U kunt naar keuze btw toevoegen of verwijderen. Crater ondersteunt btw op individuele items en op de factuur.",
"add_new_tax": "Nieuwe Btw toevoegen",
"tax_settings": "Btw instellingen",
"tax_per_item": "Btw per artikel",
"tax_name": "Btw naam",
"compound_tax": "Samengestelde btw",
"percent": "Percentage",
"action": "Actie",
"tax_setting_description": "Schakel dit in als u btw wilt toevoegen aan individuele factuurposten. Standaard worden de belastingen direct aan de factuur toegevoegd.",
"created_message": "btw type succesvol aangemaakt",
"updated_message": "btw type succesvol bijgewerkt",
"deleted_message": "btw type succesvol verwijderd",
"confirm_delete": "U zult niet in staat zjin om dit btw type te herstellen",
"already_in_use": "Btw al in gebruik"
},
"expense_category": {
"title": "Uitgavencategorieën",
"action": "Actie",
"description": "Voor het toevoegen van uitgavenposten zijn categorieën vereist. U kunt deze categorieën naar keuze toevoegen of verwijderen.",
"add_new_category": "Nieuwe categorie toevoegen",
"category_name": "Categorienaam",
"category_description": "Omschrijving",
"created_message": "Uitgavencategorie succesvol aangemaakt",
"deleted_message": "Uitgavencategorie succesvol verwijderd",
"updated_message": "Uitgavencategorie succesvol bijgewerkt",
"confirm_delete": "U zult niet in staat zijn om deze uitgavencategorie te herstellen",
"already_in_use": "Categorie is al in gebruik"
},
"preferences": {
"currency": "Valuta",
"language": "Taal",
"time_zone": "Tijdzone",
"fiscal_year": "Boekjaar",
"date_format": "Datum Formaat",
"discount_setting": "Korting instelling",
"discount_per_item": "Korting per Artikel ",
"discount_setting_description": "Schakel dit in als u korting wilt toevoegen aan individuele factuurartikelen. Standaard wordt Korting direct aan de factuur toegevoegd.",
"save": "Opslaan",
"preference": "Voorkeur | Voorkeuren",
"general_settings": "Standaard voorkeuren voor het systeem.",
"updated_message": "Voorkeuren succesvol bijgewerkt",
"select_language": "selecteer taal",
"select_time_zone": "selecteer Tijdzone",
"select_date_formate": "selecteer Datum formaat",
"select_financial_year": "selecteer boekjaar"
},
"update_app": {
"title": "App bijwerken",
"description": "U kunt Crater eenvoudig updaten door te controleren of er een nieuwe update is door op onderstaande knop te klikken.",
"check_update": "Controleer op updates",
"avail_update": "Nieuwe update beschikbaar",
"next_version": "Volgende versie",
"update": "Update nu",
"update_progress": "Update in behandeling...",
"progress_text": "Het zal slechts een paar minuten duren. Gelieve het scherm niet te verversen of het venster te sluiten voordat de update is voltooid.",
"update_success": "App is geüpdatet! Wacht even terwijl uw browser automatisch wordt herladen..",
"latest_message": "Geen update beschikbaar! U zit op de laatste versie.",
"current_version": "Huidige versie"
}
},
"wizard": {
"account_info": "Account Informatie",
"account_info_desc": "Hieronder worden de gegevens gebruikt om de hoofdadministrator-account aan te maken. Ook kunt u de gegevens op elk moment na het inloggen wijzigen.",
"name": "Naam",
"email": "E-mail",
"password": "Wachtwoord",
"confirm_password": "Bevestig wachtwoord",
"save_cont": "Opslaan & doorgaan",
"company_info": "Bedrijfsinformatie",
"company_info_desc": "Deze informatie wordt op de facturen weergegeven. Merk op dat u dit later op de instellingenpagina kunt bewerken.",
"company_name": "Bedrijfsnaam",
"company_logo": "Bedrijfslogo",
"logo_preview": "Logo Voorbeeld",
"preferences": "Voorkeuren",
"preferences_desc": "Standaard voorkeuren voor het systeem.",
"country": "Land",
"state": "Staat",
"city": "Stad",
"address": "Adres",
"street": "Straat1 | Straatt2",
"phone": "Telefoon",
"zip_code": "Postcode",
"go_back": "Ga Terug",
"currency": "Valuta",
"language": "Taal",
"time_zone": "Tijdzone",
"fiscal_year": "Boekjaar",
"date_format": "Datum Formaat",
"from_address": "Van Adres",
"username": "Gebruikersnaam",
"next": "Volgende",
"continue": "Doorgaan",
"skip": "Sla over",
"database": {
"database": "Site URL & Database",
"connection": "Database Connectie",
"host": "Database Host",
"port": "Database Port",
"password": "Database Wachtwoord",
"app_url": "App URL",
"username": "Database Gebruikersnaam",
"db_name": "Database Naam",
"desc": "Maak een database aan op de server en vul de referenties in in het formulier."
},
"permissions": {
"permissions": "Rechten",
"permission_confirm_title": "Ben je zeker dat je wilt doorgaan?",
"permission_confirm_desc": "Toestemmingscheck van de map is mislukt",
"permission_desc": "Hieronder staat de lijst met mapmachtigingen die nodig zijn om de app te laten werken. Als de toestemmingscontrole mislukt, zorg er dan voor dat u uw mapmachtigingen bijwerkt."
},
"mail": {
"host": "Mail Host",
"port": "Mail Port",
"driver": "Mail Driver",
"secret": "Geheim",
"mailgun_secret": "Mailgun Geheim",
"mailgun_domain": "Domein",
"mailgun_endpoint": "Mailgun Endpoint",
"ses_secret": "SES Geheim",
"ses_key": "SES Sleutel",
"password": "Mail Wachtwoord",
"username": "Mail Gebruikersnaam",
"mail_config": "Mail Configuratie",
"from_name": "Van Mail Naam",
"from_mail": "Van Mail Adres",
"encryption": "Mail Encryptie",
"mail_config_desc": "Hieronder vindt u het formulier voor het configureren van het e-mailstuurprogramma voor het verzenden van e-mails vanuit de app. U kunt ook externe providers zoals Sendgrid, SES etc. configureren."
},
"req": {
"system_req": "Systeemvereisten",
"php_req_version": "Php (versie {version} verplicht)",
"check_req": "Controleer vereisten",
"system_req_desc": "Crater heeft een paar serververeisten. Zorg ervoor dat uw server de vereiste php-versie en alle hieronder vermelde extensies heeft."
},
"errors": {
"migrate_failed": "Migratie Mislukt",
"database_variables_save_error": "Niet in staat om verbinding te maken met de DB met de voorziene waarden.",
"mail_variables_save_error": "E-mail configuratie mislukt.",
"connection_failed": "Database connectie mislukt",
"database_should_be_empty": "Database moet leeg zijn"
},
"success": {
"mail_variables_save_successfully": "E-mail succesvol geconfigureerd",
"database_variables_save_successfully": "Database succesvol geconfigureerd."
}
},
"layout_login": {
"copyright_crater": "Copyright @ Crater - 2019",
"super_simple_invoicing": "Super eenvoudige facturatie",
"for_freelancer": "voor Freelancers &",
"small_businesses": "Kleine bedrijven ",
"crater_help": "Crater helpt u bij het bijhouden van de uitgaven, het registreren van betalingen & het genereren van mooie",
"invoices_and_estimates": "facturen & offertes met de mogelijkheid te kiezen uit meerdere sjablonen."
},
"validation": {
"invalid_url": "Ongeldige url (ex: http://www.crater.com)",
"required": "Veld is verplicht",
"email_incorrect": "Onjuist E-mail.",
"email_already_taken": "De e-mail is reeds ingenomen.",
"email_does_not_exist": "Gebruiker met opgegeven e-mail bestaat niet",
"send_reset_link": "Verstuur Reset Link",
"not_yet": "Nog niet? Verstuur opnieuw.",
"password_min_length": "Wachtwoord moet {count} karakters bevatten",
"name_min_length": "Naam moet tenminste {count} letters bevatten.",
"enter_valid_tax_rate": "Voer een geldig btw tarief in",
"numbers_only": "Alleen nummers.",
"characters_only": "Alleen karakters.",
"password_incorrect": "Wachtwoorden moeten identiek zijn",
"password_length": "Wachtwoord moet {count} karakters lang zijn.",
"qty_must_greater_than_zero": "Hoeveelheid moet groter zijn dan nul.",
"price_greater_than_zero": "Prijs moet groter zijn dan nul.",
"payment_greater_than_zero": "Betaling moet groter zijn dan nul.",
"payment_greater_than_due_amount": "Ingevoerde betaling is meer dan het verschuldigde bedrag van deze factuur.",
"quantity_maxlength": "De hoeveelheid mag niet groter zijn dan 20 cijfers.",
"price_maxlength": "De prijs mag niet hoger zijn dan 20 cijfers.",
"price_minvalue": "De prijs moet groter zijn dan 0.",
"amount_maxlength": "Het bedrag mag niet groter zijn dan 20 cijfers.",
"amount_minvalue": "Bedrag moet groter zijn dan 0.",
"description_maxlength": "De beschrijving mag niet groter zijn dan 255 tekens.",
"maximum_options_error": "Maximum van {max} opties geselecteerd. Verwijder eerst een geselecteerde optie om een andere te selecteren.",
"notes_maxlength": "Notities mogen niet groter zijn dan 255 tekens.",
"address_maxlength": "Het adres mag niet groter zijn dan 255 tekens.",
"ref_number_maxlength": "Ref. Nummer mag niet groter zijn dan 255 tekens.",
"prefix_maxlength": "prefix mag niet groter zijn dan 5 karakters.",
"item_unit_already_taken": "De naam van dit item is al in gebruik",
"payment_mode_already_taken": "Deze naam voor de betalingsmodus is al in gebruik",
"subject_maxlength": "Het onderwerp mag niet meer dan 100 tekens bevatten.",
"message_maxlength": "Bericht mag niet groter zijn dan 255 tekens.",
"something_went_wrong": "Er is iets fout gegaan"
}
}

View File

@ -414,6 +414,7 @@
"expense_title": "Título",
"contact": "Contato",
"category": "Categoria",
"customer": "Cliente",
"from_date": "A partir da Data",
"to_date": "Até a Data",
"expense_date": "Data",

View File

@ -21,13 +21,6 @@ export const login = ({ commit, dispatch, state }, data) => {
window.toastr['success']('Login Successful')
resolve(response)
}).catch(err => {
if (err.response.data.error === 'invalid_credentials') {
window.toastr['error']('Invalid Credentials')
} else {
// Something happened in setting up the request that triggered an Error
console.log('Error', err.message)
}
commit(types.AUTH_ERROR, err.response)
Ls.remove('auth.token')
reject(err)

View File

@ -46,7 +46,7 @@
</div>
</div>
<base-button type="submit" color="theme">{{ $t('login.login') }}</base-button>
<base-button :loading="isLoading" type="submit" color="theme">{{ $t('login.login') }}</base-button>
<!-- <div class="social-links">
@ -87,7 +87,8 @@ export default {
password: '',
remember: ''
},
submitted: false
submitted: false,
isLoading: false
}
},
validations: {
@ -98,7 +99,7 @@ export default {
},
password: {
required,
minLength: minLength(5)
minLength: minLength(8)
}
}
},
@ -113,7 +114,6 @@ export default {
}
this.isLoading = true
this.login(this.loginData).then((res) => {
this.$router.push('/admin/dashboard')
this.isLoading = false

View File

@ -112,6 +112,7 @@ export default {
]),
async searchItems (search) {
let data = {
search,
filter: {
name: search,
unit: '',

View File

@ -102,6 +102,19 @@
<span v-if="!$v.formData.amount.minValue" class="text-danger">{{ $t('validation.price_minvalue') }}</span>
</div>
</div>
<div class="form-group col-sm-6">
<label class="form-label">{{ $t('expenses.customer') }}</label>
<base-select
ref="baseSelect"
v-model="customer"
:options="customerList"
:searchable="true"
:show-labels="false"
:placeholder="$t('customers.select_a_customer')"
label="name"
track-by="id"
/>
</div>
<div class="form-group col-sm-6">
<label for="description">{{ $t('expenses.note') }}</label>
<base-text-area
@ -169,7 +182,8 @@ export default {
expense_category_id: null,
expense_date: new Date(),
amount: null,
notes: ''
notes: '',
user_id: null
},
money: {
decimal: '.',
@ -185,7 +199,9 @@ export default {
passData: [],
contacts: [],
previewReceipt: null,
fileSendUrl: '/api/expenses'
fileSendUrl: '/api/expenses',
customer: null,
customerList: []
}
},
validations: {
@ -297,6 +313,8 @@ export default {
},
async fetchInitialData () {
this.fetchCategories()
let fetchData = await this.fetchCreateExpense()
this.customerList = fetchData.data.customers
if (this.isEdit) {
let response = await this.fetchExpense(this.$route.params.id)
this.category = response.data.expense.category
@ -304,6 +322,9 @@ export default {
this.formData.expense_date = moment(this.formData.expense_date).toString()
this.formData.amount = (response.data.expense.amount)
this.fileSendUrl = `/api/expenses/${this.$route.params.id}`
if (response.data.expense.user_id) {
this.customer = this.customerList.find(customer => customer.id === response.data.expense.user_id)
}
}
},
async sendData () {
@ -321,7 +342,8 @@ export default {
data.append('expense_category_id', this.formData.expense_category_id)
data.append('expense_date', moment(this.formData.expense_date).format('DD/MM/YYYY'))
data.append('amount', (this.formData.amount))
data.append('notes', this.formData.notes)
data.append('notes', this.formData.notes ? this.formData.notes : '')
data.append('user_id', this.customer ? this.customer.id : '')
if (this.isEdit) {
this.isLoading = true

View File

@ -43,7 +43,19 @@
<transition name="fade">
<div v-show="showFilters" class="filter-section">
<div class="row">
<div class="col-md-4">
<div class="col-md-3">
<label>{{ $t('expenses.customer') }}</label>
<base-select
v-model="filters.user"
:options="customers"
:searchable="true"
:show-labels="false"
:placeholder="$t('expenses.select_a_customer')"
label="name"
@click="filter = ! filter"
/>
</div>
<div class="col-md-3">
<label>{{ $t('expenses.category') }}</label>
<base-select
v-model="filters.category"
@ -55,7 +67,7 @@
@click="filter = ! filter"
/>
</div>
<div class="col-md-4">
<div class="col-md-3">
<label>{{ $t('expenses.from_date') }}</label>
<base-date-picker
v-model="filters.from_date"
@ -63,7 +75,7 @@
calendar-button-icon="calendar"
/>
</div>
<div class="col-md-4">
<div class="col-md-3">
<label>{{ $t('expenses.to_date') }}</label>
<base-date-picker
v-model="filters.to_date"
@ -161,6 +173,11 @@
sort-as="name"
show="category.name"
/>
<table-column
:label="$t('expenses.customer')"
sort-as="user_name"
show="user_name"
/>
<table-column
:label="$t('expenses.date')"
sort-as="expense_date"
@ -237,10 +254,12 @@ export default {
showFilters: false,
filtersApplied: false,
isRequestOngoing: true,
customers: [],
filters: {
category: null,
from_date: '',
to_date: ''
to_date: '',
user: ''
}
}
},
@ -308,6 +327,7 @@ export default {
]),
async fetchData ({ page, filter, sort }) {
let data = {
user_id: this.filters.user ? this.filters.user.id : null,
expense_category_id: this.filters.category !== null ? this.filters.category.id : '',
from_date: this.filters.from_date === '' ? this.filters.from_date : moment(this.filters.from_date).format('DD/MM/YYYY'),
to_date: this.filters.to_date === '' ? this.filters.to_date : moment(this.filters.to_date).format('DD/MM/YYYY'),
@ -318,6 +338,7 @@ export default {
this.isRequestOngoing = true
let response = await this.fetchExpenses(data)
this.customers = response.data.customers
this.isRequestOngoing = false
return {
@ -340,7 +361,8 @@ export default {
this.filters = {
category: null,
from_date: '',
to_date: ''
to_date: '',
user: null
}
this.$nextTick(() => {

View File

@ -101,6 +101,7 @@ export default {
]),
async searchItems (search) {
let data = {
search,
filter: {
name: search,
unit: '',

View File

@ -1,6 +1,6 @@
@component('mail::message')
# Introduction
Customer viewed this Estimate.
{{ $data['user']['name'] }} viewed this Estimate.
@component('mail::button', ['url' => url('/admin/estimates/'.$data['estimate']['id'].'/view')])
Estimate

View File

@ -1,6 +1,6 @@
@component('mail::message')
# Introduction
Customer viewed this Invoice.
{{ $data['user']['name'] }} viewed this Invoice.
@component('mail::button', ['url' => url('/admin/invoices/'.$data['invoice']['id'].'/view')])
Invoice