Merge branch 'master' of github.com:akaunting/akaunting into 2.1-dev
This commit is contained in:
@ -34,6 +34,7 @@ abstract class BulkAction
|
||||
'export' => [
|
||||
'name' => 'general.export',
|
||||
'message' => 'bulk_actions.message.export',
|
||||
'type' => 'download'
|
||||
],
|
||||
];
|
||||
|
||||
|
@ -15,11 +15,15 @@ class Items extends BulkAction
|
||||
'enable' => [
|
||||
'name' => 'general.enable',
|
||||
'message' => 'bulk_actions.message.enable',
|
||||
'path' => ['group' => 'common', 'type' => 'items'],
|
||||
'type' => '*',
|
||||
'permission' => 'update-common-items',
|
||||
],
|
||||
'disable' => [
|
||||
'name' => 'general.disable',
|
||||
'message' => 'bulk_actions.message.disable',
|
||||
'path' => ['group' => 'common', 'type' => 'items'],
|
||||
'type' => '*',
|
||||
'permission' => 'update-common-items',
|
||||
],
|
||||
'delete' => [
|
||||
@ -30,6 +34,7 @@ class Items extends BulkAction
|
||||
'export' => [
|
||||
'name' => 'general.export',
|
||||
'message' => 'bulk_actions.message.export',
|
||||
'type' => 'download',
|
||||
],
|
||||
];
|
||||
|
||||
|
@ -33,6 +33,7 @@ class Bills extends BulkAction
|
||||
'export' => [
|
||||
'name' => 'general.export',
|
||||
'message' => 'bulk_actions.message.export',
|
||||
'type' => 'download',
|
||||
],
|
||||
];
|
||||
|
||||
|
@ -14,6 +14,7 @@ class Payments extends BulkAction
|
||||
'export' => [
|
||||
'name' => 'general.export',
|
||||
'message' => 'bulk_actions.message.export',
|
||||
'type' => 'download',
|
||||
],
|
||||
'delete' => [
|
||||
'name' => 'general.delete',
|
||||
|
@ -29,6 +29,7 @@ class Vendors extends BulkAction
|
||||
'export' => [
|
||||
'name' => 'general.export',
|
||||
'message' => 'bulk_actions.message.export',
|
||||
'type' => 'download',
|
||||
],
|
||||
];
|
||||
|
||||
|
@ -29,6 +29,7 @@ class Customers extends BulkAction
|
||||
'export' => [
|
||||
'name' => 'general.export',
|
||||
'message' => 'bulk_actions.message.export',
|
||||
'type' => 'download',
|
||||
],
|
||||
];
|
||||
|
||||
|
@ -39,6 +39,7 @@ class Invoices extends BulkAction
|
||||
'export' => [
|
||||
'name' => 'general.export',
|
||||
'message' => 'bulk_actions.message.export',
|
||||
'type' => 'download',
|
||||
],
|
||||
];
|
||||
|
||||
|
@ -19,6 +19,7 @@ class Revenues extends BulkAction
|
||||
'export' => [
|
||||
'name' => 'general.export',
|
||||
'message' => 'bulk_actions.message.export',
|
||||
'type' => 'download',
|
||||
],
|
||||
];
|
||||
|
||||
|
22
app/Events/Common/BulkActionsAdding.php
Normal file
22
app/Events/Common/BulkActionsAdding.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Events\Common;
|
||||
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class BulkActionsAdding
|
||||
{
|
||||
use SerializesModels;
|
||||
|
||||
public $bulk_action;
|
||||
|
||||
/**
|
||||
* Create a new event instance.
|
||||
*
|
||||
* @param $bulk_action
|
||||
*/
|
||||
public function __construct($bulk_action)
|
||||
{
|
||||
$this->bulk_action = $bulk_action;
|
||||
}
|
||||
}
|
22
app/Events/Common/CompanyCreated.php
Normal file
22
app/Events/Common/CompanyCreated.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Events\Common;
|
||||
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class CompanyCreated
|
||||
{
|
||||
use SerializesModels;
|
||||
|
||||
public $company;
|
||||
|
||||
/**
|
||||
* Create a new event instance.
|
||||
*
|
||||
* @param $company
|
||||
*/
|
||||
public function __construct($company)
|
||||
{
|
||||
$this->company = $company;
|
||||
}
|
||||
}
|
22
app/Events/Common/CompanyCreating.php
Normal file
22
app/Events/Common/CompanyCreating.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Events\Common;
|
||||
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class CompanyCreating
|
||||
{
|
||||
use SerializesModels;
|
||||
|
||||
public $request;
|
||||
|
||||
/**
|
||||
* Create a new event instance.
|
||||
*
|
||||
* @param $request
|
||||
*/
|
||||
public function __construct($request)
|
||||
{
|
||||
$this->request = $request;
|
||||
}
|
||||
}
|
26
app/Events/Common/CompanyUpdated.php
Normal file
26
app/Events/Common/CompanyUpdated.php
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Events\Common;
|
||||
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class CompanyUpdated
|
||||
{
|
||||
use SerializesModels;
|
||||
|
||||
public $company;
|
||||
|
||||
public $request;
|
||||
|
||||
/**
|
||||
* Create a new event instance.
|
||||
*
|
||||
* @param $company
|
||||
* @param $request
|
||||
*/
|
||||
public function __construct($company, $request)
|
||||
{
|
||||
$this->company = $company;
|
||||
$this->request = $request;
|
||||
}
|
||||
}
|
26
app/Events/Common/CompanyUpdating.php
Normal file
26
app/Events/Common/CompanyUpdating.php
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Events\Common;
|
||||
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class CompanyUpdating
|
||||
{
|
||||
use SerializesModels;
|
||||
|
||||
public $company;
|
||||
|
||||
public $request;
|
||||
|
||||
/**
|
||||
* Create a new event instance.
|
||||
*
|
||||
* @param $company
|
||||
* @param $request
|
||||
*/
|
||||
public function __construct($company, $request)
|
||||
{
|
||||
$this->company = $company;
|
||||
$this->request = $request;
|
||||
}
|
||||
}
|
@ -52,9 +52,9 @@ class Kernel extends HttpKernel
|
||||
'api.auth',
|
||||
'auth.disabled',
|
||||
'throttle:60,1',
|
||||
'bindings',
|
||||
'api.company',
|
||||
'permission:read-api',
|
||||
'api.company',
|
||||
'bindings',
|
||||
'company.settings',
|
||||
'company.currencies',
|
||||
'language',
|
||||
|
@ -3,6 +3,7 @@
|
||||
namespace App\Http\ViewComposers;
|
||||
|
||||
use Akaunting\Module\Module;
|
||||
use App\Events\Common\BulkActionsAdding;
|
||||
use Date;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\View\View;
|
||||
@ -67,10 +68,19 @@ class Index
|
||||
$class_name = 'App\BulkActions\\' . $file_name;
|
||||
}
|
||||
|
||||
if (!class_exists($class_name)) {
|
||||
return;
|
||||
if (class_exists($class_name)) {
|
||||
event(new BulkActionsAdding(app($class_name)));
|
||||
|
||||
$bulk_actions = app($class_name)->actions;
|
||||
} else {
|
||||
$b = new \stdClass();
|
||||
$b->actions = [];
|
||||
|
||||
event(new BulkActionsAdding($b));
|
||||
|
||||
$bulk_actions = $b->actions;
|
||||
}
|
||||
|
||||
$view->with(['bulk_actions' => app($class_name)->actions]);
|
||||
$view->with(['bulk_actions' => $bulk_actions]);
|
||||
}
|
||||
}
|
||||
|
@ -3,6 +3,8 @@
|
||||
namespace App\Jobs\Common;
|
||||
|
||||
use App\Abstracts\Job;
|
||||
use App\Events\Common\CompanyCreated;
|
||||
use App\Events\Common\CompanyCreating;
|
||||
use App\Models\Common\Company;
|
||||
use Artisan;
|
||||
|
||||
@ -29,6 +31,8 @@ class CreateCompany extends Job
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
event(new CompanyCreating($this->request));
|
||||
|
||||
\DB::transaction(function () {
|
||||
$this->company = Company::create($this->request->all());
|
||||
|
||||
@ -41,6 +45,8 @@ class CreateCompany extends Job
|
||||
$this->updateSettings();
|
||||
});
|
||||
|
||||
event(new CompanyCreated($this->company));
|
||||
|
||||
return $this->company;
|
||||
}
|
||||
|
||||
|
@ -3,6 +3,8 @@
|
||||
namespace App\Jobs\Common;
|
||||
|
||||
use App\Abstracts\Job;
|
||||
use App\Events\Common\CompanyUpdated;
|
||||
use App\Events\Common\CompanyUpdating;
|
||||
use App\Models\Common\Company;
|
||||
use App\Traits\Users;
|
||||
|
||||
@ -35,6 +37,8 @@ class UpdateCompany extends Job
|
||||
{
|
||||
$this->authorize();
|
||||
|
||||
event(new CompanyUpdating($this->company, $this->request));
|
||||
|
||||
\DB::transaction(function () {
|
||||
$this->company->update($this->request->all());
|
||||
|
||||
@ -77,6 +81,8 @@ class UpdateCompany extends Job
|
||||
setting()->forgetAll();
|
||||
});
|
||||
|
||||
event(new CompanyUpdated($this->company, $this->request));
|
||||
|
||||
return $this->company;
|
||||
}
|
||||
|
||||
|
@ -57,7 +57,7 @@ class UpdateBill extends Job
|
||||
$this->bill->paid_amount = $this->bill->paid;
|
||||
event(new PaidAmountCalculated($this->bill));
|
||||
|
||||
if ($this->request['amount'] > $this->bill->paid_amount) {
|
||||
if ($this->request['amount'] > $this->bill->paid_amount && $this->bill->paid_amount > 0) {
|
||||
$this->request['status'] = 'partial';
|
||||
}
|
||||
|
||||
|
@ -57,7 +57,7 @@ class UpdateInvoice extends Job
|
||||
$this->invoice->paid_amount = $this->invoice->paid;
|
||||
event(new PaidAmountCalculated($this->invoice));
|
||||
|
||||
if ($this->request['amount'] > $this->invoice->paid_amount) {
|
||||
if ($this->request['amount'] > $this->invoice->paid_amount && $this->invoice->paid_amount > 0) {
|
||||
$this->request['status'] = 'partial';
|
||||
}
|
||||
|
||||
|
29
app/Listeners/Update/V20/Version2023.php
Normal file
29
app/Listeners/Update/V20/Version2023.php
Normal file
@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace App\Listeners\Update\V20;
|
||||
|
||||
use App\Abstracts\Listeners\Update as Listener;
|
||||
use App\Events\Install\UpdateFinished as Event;
|
||||
use Illuminate\Support\Facades\Artisan;
|
||||
|
||||
class Version2023 extends Listener
|
||||
{
|
||||
const ALIAS = 'core';
|
||||
|
||||
const VERSION = '2.0.23';
|
||||
|
||||
/**
|
||||
* Handle the event.
|
||||
*
|
||||
* @param $event
|
||||
* @return void
|
||||
*/
|
||||
public function handle(Event $event)
|
||||
{
|
||||
if ($this->skipThisUpdate($event)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Artisan::call('migrate', ['--force' => true]);
|
||||
}
|
||||
}
|
@ -23,6 +23,7 @@ class Event extends Provider
|
||||
'App\Listeners\Update\V20\Version2014',
|
||||
'App\Listeners\Update\V20\Version2017',
|
||||
'App\Listeners\Update\V20\Version2020',
|
||||
'App\Listeners\Update\V20\Version2023',
|
||||
],
|
||||
'Illuminate\Auth\Events\Login' => [
|
||||
'App\Listeners\Auth\Login',
|
||||
|
@ -76,6 +76,7 @@
|
||||
"Modules\\": "modules/",
|
||||
"Akaunting\\Module\\Commands\\": "overrides/akaunting/module/Commands/",
|
||||
"Illuminate\\Translation\\": "overrides/Illuminate/Translation/",
|
||||
"Illuminate\\View\\": "overrides/Illuminate/View/",
|
||||
"Symfony\\Component\\Process\\": "overrides/symfony/process/"
|
||||
},
|
||||
"exclude-from-classmap": [
|
||||
@ -84,6 +85,7 @@
|
||||
"vendor/akaunting/module/src/Commands/EnableCommand.php",
|
||||
"vendor/akaunting/module/src/Commands/InstallCommand.php",
|
||||
"vendor/laravel/framework/src/Illuminate/Translation/MessageSelector.php",
|
||||
"vendor/laravel/framework/src/Illuminate/View/Concerns/ManagesStacks.php",
|
||||
"vendor/symfony/process/PhpExecutableFinder.php"
|
||||
],
|
||||
"files": [
|
||||
|
683
composer.lock
generated
683
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -10,15 +10,15 @@ return [
|
||||
|
||||
'minor' => '0',
|
||||
|
||||
'patch' => '21',
|
||||
'patch' => '23',
|
||||
|
||||
'build' => '',
|
||||
|
||||
'status' => 'Stable',
|
||||
|
||||
'date' => '04-September-2020',
|
||||
'date' => '23-September-2020',
|
||||
|
||||
'time' => '14:00',
|
||||
'time' => '12:00',
|
||||
|
||||
'zone' => 'GMT +3',
|
||||
|
||||
|
@ -102,17 +102,22 @@ class Settings extends Controller
|
||||
*/
|
||||
public function destroy(DRequest $request)
|
||||
{
|
||||
$payment_method = $this->dispatch(new DeletePaymentMethod($request));
|
||||
$response = $this->ajaxDispatch(new DeletePaymentMethod($request));
|
||||
|
||||
$message = trans('messages.success.deleted', ['type' => $payment_method['name']]);
|
||||
if ($response['success']) {
|
||||
//$response['redirect'] = route('offline-payments.settings.edit');
|
||||
|
||||
$response['message'] = trans('messages.success.deleted', ['type' => $response['data']['name']]);
|
||||
|
||||
//flash($message)->success();
|
||||
} else {
|
||||
//$response['redirect'] = route('offline-payments.settings.edit');
|
||||
|
||||
return response()->json([
|
||||
'errors' => false,
|
||||
'success' => true,
|
||||
'message' => $message,
|
||||
'redirect' => route('offline-payments.settings.edit'),
|
||||
]);
|
||||
$message = $response['message'];
|
||||
|
||||
//flash($message)->error();
|
||||
}
|
||||
|
||||
return response()->json($response);
|
||||
}
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ namespace Modules\OfflinePayments\Jobs;
|
||||
|
||||
use App\Abstracts\Job;
|
||||
use App\Utilities\Modules;
|
||||
use App\Models\Banking\Transaction;
|
||||
|
||||
class DeletePaymentMethod extends Job
|
||||
{
|
||||
@ -26,6 +27,8 @@ class DeletePaymentMethod extends Job
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$this->authorize();
|
||||
|
||||
$methods = json_decode(setting('offline-payments.methods'), true);
|
||||
|
||||
$payment_method = [];
|
||||
@ -50,4 +53,31 @@ class DeletePaymentMethod extends Job
|
||||
|
||||
return $payment_method;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if this action is applicable.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function authorize()
|
||||
{
|
||||
if ($relationships = $this->getRelationships()) {
|
||||
$message = trans('messages.warning.deleted', ['name' => $this->request->get('code'), 'text' => implode(', ', $relationships)]);
|
||||
|
||||
throw new \Exception($message);
|
||||
}
|
||||
}
|
||||
|
||||
public function getRelationships()
|
||||
{
|
||||
$counter = [];
|
||||
|
||||
if (!$c = Transaction::where('payment_method', $this->request->get('code'))->get()->count()) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$counter[] = $c . ' ' . strtolower(trans_choice('general.transactions', ($c > 1) ? 2 : 1));
|
||||
|
||||
return $counter;
|
||||
}
|
||||
}
|
||||
|
@ -100,9 +100,10 @@ const app = new Vue({
|
||||
|
||||
document.getElementById('method-' + this.confirm.code).remove();
|
||||
|
||||
this.confirm.show = false;
|
||||
}
|
||||
|
||||
this.confirm.show = false;
|
||||
|
||||
this.$notify({
|
||||
message: response.data.message,
|
||||
timeout: 5000,
|
||||
|
File diff suppressed because one or more lines are too long
201
overrides/Illuminate/View/Concers/ManagesStacks.php
Normal file
201
overrides/Illuminate/View/Concers/ManagesStacks.php
Normal file
@ -0,0 +1,201 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\View\Concerns;
|
||||
|
||||
use InvalidArgumentException;
|
||||
|
||||
trait ManagesStacks
|
||||
{
|
||||
/**
|
||||
* All of the finished, captured push sections.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $pushes = [];
|
||||
|
||||
/**
|
||||
* All of the finished, captured prepend sections.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $prepends = [];
|
||||
|
||||
/**
|
||||
* The stack of in-progress push sections.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $pushStack = [];
|
||||
|
||||
/**
|
||||
* Start injecting content into a push section.
|
||||
*
|
||||
* @param string $section
|
||||
* @param string $content
|
||||
* @return void
|
||||
*/
|
||||
public function startPush($section, $content = '')
|
||||
{
|
||||
if ($content === '') {
|
||||
if (ob_start()) {
|
||||
$this->pushStack[] = $section;
|
||||
}
|
||||
} else {
|
||||
$this->extendPush($section, $content);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop injecting content into a push section.
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function stopPush()
|
||||
{
|
||||
if (empty($this->pushStack)) {
|
||||
throw new InvalidArgumentException('Cannot end a push stack without first starting one.');
|
||||
}
|
||||
|
||||
return tap(array_pop($this->pushStack), function ($last) {
|
||||
$this->extendPush($last, ob_get_clean());
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Append content to a given push section.
|
||||
*
|
||||
* @param string $section
|
||||
* @param string $content
|
||||
* @return void
|
||||
*/
|
||||
protected function extendPush($section, $content)
|
||||
{
|
||||
if (! isset($this->pushes[$section])) {
|
||||
$this->pushes[$section] = [];
|
||||
}
|
||||
|
||||
if (! isset($this->pushes[$section][$this->renderCount])) {
|
||||
$this->pushes[$section][$this->renderCount] = $content;
|
||||
} else {
|
||||
$this->pushes[$section][$this->renderCount] .= $content;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Start prepending content into a push section.
|
||||
*
|
||||
* @param string $section
|
||||
* @param string $content
|
||||
* @return void
|
||||
*/
|
||||
public function startPrepend($section, $content = '')
|
||||
{
|
||||
if ($content === '') {
|
||||
if (ob_start()) {
|
||||
$this->pushStack[] = $section;
|
||||
}
|
||||
} else {
|
||||
$this->extendPrepend($section, $content);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop prepending content into a push section.
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function stopPrepend()
|
||||
{
|
||||
if (empty($this->pushStack)) {
|
||||
throw new InvalidArgumentException('Cannot end a prepend operation without first starting one.');
|
||||
}
|
||||
|
||||
return tap(array_pop($this->pushStack), function ($last) {
|
||||
$this->extendPrepend($last, ob_get_clean());
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepend content to a given stack.
|
||||
*
|
||||
* @param string $section
|
||||
* @param string $content
|
||||
* @return void
|
||||
*/
|
||||
protected function extendPrepend($section, $content)
|
||||
{
|
||||
if (! isset($this->prepends[$section])) {
|
||||
$this->prepends[$section] = [];
|
||||
}
|
||||
|
||||
if (! isset($this->prepends[$section][$this->renderCount])) {
|
||||
$this->prepends[$section][$this->renderCount] = $content;
|
||||
} else {
|
||||
$this->prepends[$section][$this->renderCount] = $content.$this->prepends[$section][$this->renderCount];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the string contents of a push section.
|
||||
*
|
||||
* @param string $section
|
||||
* @param string $default
|
||||
* @return string
|
||||
*/
|
||||
public function yieldPushContent($section, $default = '')
|
||||
{
|
||||
if (! isset($this->pushes[$section]) && ! isset($this->prepends[$section])) {
|
||||
return $default;
|
||||
}
|
||||
|
||||
$output = '';
|
||||
|
||||
if (isset($this->prepends[$section])) {
|
||||
$output .= implode(array_reverse($this->prepends[$section]));
|
||||
}
|
||||
|
||||
if (isset($this->pushes[$section])) {
|
||||
$output .= implode($this->pushes[$section]);
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush all of the stacks.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function flushStacks()
|
||||
{
|
||||
$this->pushes = [];
|
||||
$this->prepends = [];
|
||||
$this->pushStack = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush stack by key.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function flushStack($key = null)
|
||||
{
|
||||
$properties = [
|
||||
'pushes',
|
||||
'prepends',
|
||||
'pushStack',
|
||||
];
|
||||
|
||||
foreach ($properties as $property) {
|
||||
if (!array_key_exists($key, $this->$property)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
unset($this->$property[$key]);
|
||||
}
|
||||
}
|
||||
}
|
@ -43,6 +43,7 @@
|
||||
"vue-chartjs": "^3.4.0",
|
||||
"vue-clipboard2": "^0.3.1",
|
||||
"vue-flatpickr-component": "^8.1.3",
|
||||
"vue-image-lightbox": "^7.1.3",
|
||||
"vue-router": "^3.1.3",
|
||||
"vue2-transitions": "^0.3.0"
|
||||
},
|
||||
|
15
public/css/custom.css
vendored
15
public/css/custom.css
vendored
@ -829,3 +829,18 @@ table .align-items-center td span.badge {
|
||||
.form-group .custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
|
||||
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")
|
||||
}
|
||||
|
||||
/*--lightbox Start--*/
|
||||
.vue-lb-info {
|
||||
position: initial !important;
|
||||
padding-top: 8px !important;
|
||||
background-color: #3c3f72 !important;
|
||||
color: #ffffff;
|
||||
border-bottom-left-radius: 0.375rem;
|
||||
border-bottom-right-radius: 0.375rem;
|
||||
}
|
||||
|
||||
.vue-lb-modal-image {
|
||||
border: 1px solid #3c3f72;
|
||||
}
|
||||
/*--lightbox Finish--*/
|
||||
|
@ -18,7 +18,7 @@
|
||||
</el-carousel-item>
|
||||
|
||||
<el-carousel-item v-for="(screenshot, index) in screenshots" :key="index">
|
||||
<img class="d-block w-100 carousel-frame" height="365px" :src="screenshot.path_string" :alt="screenshot.alt_attribute">
|
||||
<img @click="openGallery(index)" class="d-block w-100 carousel-frame" height="365px" :src="screenshot.path_string" :alt="screenshot.alt_attribute">
|
||||
<div class="carousel-description py-2" v-if="screenshot.description">
|
||||
{{ screenshot.description }}
|
||||
</div>
|
||||
@ -27,12 +27,26 @@
|
||||
</div>
|
||||
</el-carousel-item>
|
||||
</el-carousel>
|
||||
|
||||
<LightBox
|
||||
ref="lightbox"
|
||||
:media="media"
|
||||
:show-caption="true"
|
||||
:show-light-box="false"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Vue from 'vue';
|
||||
import {Image, Carousel, CarouselItem} from 'element-ui';
|
||||
|
||||
import LightBox from 'vue-image-lightbox';
|
||||
import 'vue-image-lightbox/dist/vue-image-lightbox.min.css';
|
||||
import VueLazyLoad from 'vue-lazyload';
|
||||
|
||||
Vue.use(VueLazyLoad);
|
||||
|
||||
export default {
|
||||
name: "akaunting-carousel",
|
||||
|
||||
@ -40,6 +54,7 @@ export default {
|
||||
[Image.name]: Image,
|
||||
[Carousel.name]: Carousel,
|
||||
[CarouselItem.name]: CarouselItem,
|
||||
LightBox
|
||||
},
|
||||
|
||||
props: {
|
||||
@ -108,6 +123,36 @@ export default {
|
||||
default: 'horizontal',
|
||||
description: "display direction (horizontal/vertical)"
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
let media = [];
|
||||
|
||||
if (this.screenshots.length) {
|
||||
let name = this.name;
|
||||
|
||||
this.screenshots.forEach(function(screenshot) {
|
||||
media.push({ // For image
|
||||
thumb: screenshot.path_string,
|
||||
src: screenshot.path_string,
|
||||
caption: (screenshot.description.length) ? screenshot.description : name,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
this.media = media;
|
||||
},
|
||||
|
||||
data: function () {
|
||||
return {
|
||||
media: [],
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
openGallery(index) {
|
||||
this.$refs.lightbox.showImage(index)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
@ -11,7 +11,7 @@
|
||||
formClasses
|
||||
]"
|
||||
:error="formError">
|
||||
<el-select v-model="real_model" @input="change" disabled filterable v-if="disabled"
|
||||
<el-select v-model="real_model" @input="change" disabled filterable v-if="disabled && !multiple"
|
||||
remote
|
||||
reserve-keyword
|
||||
:placeholder="placeholder"
|
||||
@ -165,6 +165,83 @@
|
||||
</el-option>
|
||||
</el-select>
|
||||
|
||||
<el-select v-model="real_model" @input="change" filterable v-if="disabled && multiple && !collapse" multiple disabled
|
||||
remote
|
||||
reserve-keyword
|
||||
:placeholder="placeholder"
|
||||
:remote-method="remoteMethod"
|
||||
:loading="loading">
|
||||
<div v-if="addNew.status && options.length != 0" class="el-select-dropdown__wrap" slot="empty">
|
||||
<p class="el-select-dropdown__empty">
|
||||
{{ noMatchingDataText }}
|
||||
</p>
|
||||
<ul class="el-scrollbar__view el-select-dropdown__list">
|
||||
<li class="el-select-dropdown__item el-select__footer">
|
||||
<div @click="onAddItem">
|
||||
<i class="fas fa-plus"></i>
|
||||
<span>
|
||||
{{ add_new_text }}
|
||||
</span>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div v-else-if="addNew.status && options.length == 0" slot="empty">
|
||||
<p class="el-select-dropdown__empty">
|
||||
{{ noDataText }}
|
||||
</p>
|
||||
<ul class="el-scrollbar__view el-select-dropdown__list">
|
||||
<li class="el-select-dropdown__item el-select__footer">
|
||||
<div @click="onAddItem">
|
||||
<i class="fas fa-plus"></i>
|
||||
<span>
|
||||
{{ add_new_text }}
|
||||
</span>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<template slot="prefix">
|
||||
<span class="el-input__suffix-inner el-select-icon">
|
||||
<i :class="'select-icon-position el-input__icon fa fa-' + icon"></i>
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<el-option v-if="!group" v-for="(label, value) in selectOptions"
|
||||
:key="value"
|
||||
:label="label"
|
||||
:value="value">
|
||||
<span class="float-left">{{ label }}</span>
|
||||
<span class="badge badge-pill badge-success float-right mt-2" v-if="new_options[value]">{{ new_text }}</span>
|
||||
</el-option>
|
||||
|
||||
<el-option-group
|
||||
v-if="group"
|
||||
v-for="(options, name) in selectOptions"
|
||||
:key="name"
|
||||
:label="name">
|
||||
<el-option
|
||||
v-for="(label, value) in options"
|
||||
:key="value"
|
||||
:label="label"
|
||||
:value="value">
|
||||
<span class="float-left">{{ label }}</span>
|
||||
<span class="badge badge-pill badge-success float-right mt-2" v-if="new_options[value]">{{ new_text }}</span>
|
||||
</el-option>
|
||||
</el-option-group>
|
||||
|
||||
<el-option v-if="addNew.status && options.length != 0" class="el-select__footer" :disabled="true" :value="add_new">
|
||||
<div @click="onAddItem">
|
||||
<i class="fas fa-plus"></i>
|
||||
<span>
|
||||
{{ add_new_text }}
|
||||
</span>
|
||||
</div>
|
||||
</el-option>
|
||||
</el-select>
|
||||
|
||||
<el-select v-model="real_model" @input="change" filterable v-if="!disabled && multiple && !collapse" multiple
|
||||
remote
|
||||
reserve-keyword
|
||||
@ -618,7 +695,7 @@ export default {
|
||||
this.$emit('interface', this.real_model);
|
||||
|
||||
setTimeout(function() {
|
||||
this.change();
|
||||
//this.change(); for invoice item
|
||||
}.bind(this), 800);
|
||||
},
|
||||
|
||||
|
69
resources/assets/js/plugins/bulk-action.js
vendored
69
resources/assets/js/plugins/bulk-action.js
vendored
@ -12,6 +12,8 @@ export default class BulkAction {
|
||||
this['value'] = '*';
|
||||
// Select action message
|
||||
this['message'] = '';
|
||||
// Action type
|
||||
this['type'] = '';
|
||||
// Bulk action view status
|
||||
this['show'] = false;
|
||||
// Bulk action modal status
|
||||
@ -63,6 +65,18 @@ export default class BulkAction {
|
||||
this.message = '';
|
||||
}
|
||||
|
||||
this.path = document.getElementsByName("bulk_action_path")[0].getAttribute('value');
|
||||
|
||||
if (event.target.options[event.target.options.selectedIndex].dataset.path) {
|
||||
this.path = event.target.options[event.target.options.selectedIndex].dataset.path;
|
||||
}
|
||||
|
||||
this.type = '*';
|
||||
|
||||
if (event.target.options[event.target.options.selectedIndex].dataset.type) {
|
||||
this.type = event.target.options[event.target.options.selectedIndex].dataset.type;
|
||||
}
|
||||
|
||||
return this.message;
|
||||
}
|
||||
|
||||
@ -72,40 +86,26 @@ export default class BulkAction {
|
||||
return;
|
||||
}
|
||||
|
||||
var path = document.getElementsByName("bulk_action_path")[0].getAttribute('value');
|
||||
|
||||
this.loading = true;
|
||||
|
||||
if (this.value != 'export') {
|
||||
window.axios.post(path, {
|
||||
'handle': this.value,
|
||||
'selected': this.selected
|
||||
})
|
||||
.then(response => {
|
||||
if (response.data.redirect) {
|
||||
window.location.reload(false);
|
||||
// bwfore version 2.0.23
|
||||
if (this.value == 'export') {
|
||||
this.type = 'download';
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
//this.loading = false;
|
||||
//this.modal = false;
|
||||
|
||||
//window.location.reload(false);
|
||||
})
|
||||
.finally(function () {
|
||||
//window.location.reload(false);
|
||||
});
|
||||
} else {
|
||||
window.axios({
|
||||
url: path,
|
||||
switch (this.type) {
|
||||
case 'download':
|
||||
let download_promise = Promise.resolve(window.axios({
|
||||
url: this.path,
|
||||
method: 'POST',
|
||||
data:{
|
||||
'handle': this.value,
|
||||
'selected': this.selected
|
||||
},
|
||||
responseType: 'blob',
|
||||
}).then((response) => {
|
||||
console.log(response.data);
|
||||
}));
|
||||
|
||||
download_promise.then((response) => {
|
||||
const blob = new Blob([response.data], {type: response.data.type});
|
||||
const url = window.URL.createObjectURL(blob);
|
||||
const link = document.createElement('a');
|
||||
@ -138,6 +138,27 @@ export default class BulkAction {
|
||||
this.value = '*';
|
||||
this.clear();
|
||||
});
|
||||
break;
|
||||
default:
|
||||
let type_promise = Promise.resolve(window.axios.post(this.path, {
|
||||
'handle': this.value,
|
||||
'selected': this.selected
|
||||
}));
|
||||
|
||||
type_promise.then(response => {
|
||||
if (response.data.redirect) {
|
||||
window.location.reload(false);
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
//this.loading = false;
|
||||
//this.modal = false;
|
||||
|
||||
//window.location.reload(false);
|
||||
})
|
||||
.finally(function () {
|
||||
//window.location.reload(false);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
6
resources/assets/js/views/purchases/bills.js
vendored
6
resources/assets/js/views/purchases/bills.js
vendored
@ -46,7 +46,7 @@ const app = new Vue({
|
||||
edit: {
|
||||
status: false,
|
||||
currency: false,
|
||||
items: false,
|
||||
items: 0,
|
||||
},
|
||||
}
|
||||
},
|
||||
@ -291,8 +291,8 @@ const app = new Vue({
|
||||
},
|
||||
|
||||
onSelectItem(item, index) {
|
||||
if (this.edit.status && !this.edit.items) {
|
||||
this.edit.items = true;
|
||||
if (this.edit.status && this.edit.items < this.form.items.length) {
|
||||
this.edit.items += 1;
|
||||
|
||||
return;
|
||||
}
|
||||
|
6
resources/assets/js/views/sales/invoices.js
vendored
6
resources/assets/js/views/sales/invoices.js
vendored
@ -46,7 +46,7 @@ const app = new Vue({
|
||||
edit: {
|
||||
status: false,
|
||||
currency: false,
|
||||
items: false,
|
||||
items: 0,
|
||||
},
|
||||
}
|
||||
},
|
||||
@ -291,8 +291,8 @@ const app = new Vue({
|
||||
},
|
||||
|
||||
onSelectItem(item, index) {
|
||||
if (this.edit.status && !this.edit.items) {
|
||||
this.edit.items = true;
|
||||
if (this.edit.status && this.edit.items < this.form.items.length) {
|
||||
this.edit.items += 1;
|
||||
|
||||
return;
|
||||
}
|
||||
|
41
resources/lang/fi-FI/auth.php
Normal file
41
resources/lang/fi-FI/auth.php
Normal file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'profile' => 'Profiili',
|
||||
'logout' => 'Kirjaudu ulos',
|
||||
'login' => 'Kirjaudu sisään',
|
||||
'login_to' => 'Kirjaudu sisään aloittaaksesi istunnon',
|
||||
'remember_me' => 'Muista minut',
|
||||
'forgot_password' => 'Unohdin salasanani',
|
||||
'reset_password' => 'Palauta salasana',
|
||||
'enter_email' => 'Anna sähköpostiosoitteesi',
|
||||
'current_email' => 'Nykyinen sähköpostiosoitteesi',
|
||||
'reset' => 'Palauta',
|
||||
'never' => 'ei koskaan',
|
||||
'landing_page' => 'Sisääntulosivu',
|
||||
|
||||
'password' => [
|
||||
'current' => 'Salasana',
|
||||
'current_confirm' => 'Vahvista salasana',
|
||||
'new' => 'Uusi salasana',
|
||||
'new_confirm' => 'Vahvista uusi salasana',
|
||||
],
|
||||
|
||||
'error' => [
|
||||
'self_delete' => 'Virhe: Et voi poistaa itseäsi!',
|
||||
'self_disable' => 'Virhe: Et voi poistaa käytöstä itseäsi!',
|
||||
'no_company' => 'Virhe: Ei käyttäjätiliisi liitettyä yritystä. Ota yhteyttä järjestelmän ylläpitäjään.',
|
||||
],
|
||||
|
||||
'failed' => 'Antamaasi sähköpostiosoitetta ja/tai salasanaa ei löydy.',
|
||||
'disabled' => 'Tämä käyttäjätili on poistettu käytöstä. Ota yhteyttä järjestelmän ylläpitäjään.',
|
||||
'throttle' => 'Liian monta kirjautumisyritystä. Yritä uudelleen :seconds sekunnin kuluttua.',
|
||||
|
||||
'notification' => [
|
||||
'message_1' => 'Saat tämän sähköpostiviestin, koska olemme saaneet salasanan palauttamispyynnön tilillesi.',
|
||||
'message_2' => 'Mikäli et pyytänyt salasanan palauttamista, lisätoimia ei tarvita.',
|
||||
'button' => 'Palauta salasana',
|
||||
],
|
||||
|
||||
];
|
69
resources/lang/fi-FI/bills.php
Normal file
69
resources/lang/fi-FI/bills.php
Normal file
@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'bill_number' => 'Laskunumero',
|
||||
'bill_date' => 'Laskun päiväys',
|
||||
'total_price' => 'Kokonaishinta',
|
||||
'due_date' => 'Eräpäivä',
|
||||
'order_number' => 'Tilausnumero',
|
||||
'bill_from' => 'Saaja',
|
||||
|
||||
'quantity' => 'Määrä',
|
||||
'price' => 'Hinta',
|
||||
'sub_total' => 'Välisumma',
|
||||
'discount' => 'Alennus',
|
||||
'item_discount' => 'Rivialennus',
|
||||
'tax_total' => 'Vero yhteensä',
|
||||
'total' => 'Yhteensä',
|
||||
|
||||
'item_name' => 'Tuotteen nimi|Tuotteiden nimet',
|
||||
|
||||
'show_discount' => ':discount% alennus',
|
||||
'add_discount' => 'Lisää alennus',
|
||||
'discount_desc' => 'välisummasta',
|
||||
|
||||
'payment_due' => 'Maksu erääntyy',
|
||||
'amount_due' => 'Maksettava summa',
|
||||
'paid' => 'Maksettu',
|
||||
'histories' => 'Historia',
|
||||
'payments' => 'Maksut',
|
||||
'add_payment' => 'Lisää maksu',
|
||||
'mark_paid' => 'Merkitse maksetuksi',
|
||||
'mark_received' => 'Merkitse vastaanotetuksi',
|
||||
'mark_cancelled' => 'Merkitse peruutetuksi',
|
||||
'download_pdf' => 'Lataa PDF',
|
||||
'send_mail' => 'Lähetä sähköposti',
|
||||
'create_bill' => 'Luo lasku',
|
||||
'receive_bill' => 'Vastaanota lasku',
|
||||
'make_payment' => 'Tee maksu',
|
||||
|
||||
'statuses' => [
|
||||
'draft' => 'Luonnos',
|
||||
'received' => 'Vastaanotettu',
|
||||
'partial' => 'Osittainen',
|
||||
'paid' => 'Maksettu',
|
||||
'overdue' => 'Erääntynyt',
|
||||
'unpaid' => 'Maksamatta',
|
||||
'cancelled' => 'Peruutettu',
|
||||
],
|
||||
|
||||
'messages' => [
|
||||
'marked_received' => 'Lasku merkitty vastaanotetuksi!',
|
||||
'marked_paid' => 'Lasku merkitty maksetuksi!',
|
||||
'marked_cancelled' => 'Lasku merkitty peruutetuksi!',
|
||||
'draft' => 'Tämä lasku on <b>LUONNOS</b> ja se sisällytetään kaavioihin, kun se on vastaanotettu.',
|
||||
|
||||
'status' => [
|
||||
'created' => 'Luotu :date',
|
||||
'receive' => [
|
||||
'draft' => 'Ei lähetetty',
|
||||
'received' => 'Vastaanotettu :date',
|
||||
],
|
||||
'paid' => [
|
||||
'await' => 'Odottaa maksua',
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
];
|
23
resources/lang/fi-FI/bulk_actions.php
Normal file
23
resources/lang/fi-FI/bulk_actions.php
Normal file
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'bulk_actions' => 'Massatoimenpiteet|Massatoimenpiteet',
|
||||
'selected' => 'valittu',
|
||||
'no_action' => 'Ei toimintoa saatavilla',
|
||||
|
||||
'message' => [
|
||||
'duplicate' => 'OIetko varma, että haluat <b>monistaa</b> valitun tietueen?',
|
||||
'delete' => 'Oletko varma, että haluat <b>poistaa</b> valitun tietueen? Oletko varma, että <b>haluat poistaa</b> valitut tietueet?',
|
||||
'export' => 'Oletko varma, että haluat <b>viedä</b> valitun tietueen? Oletko varma, että haluat <b>viedä</b> valitut tietueet?',
|
||||
'enable' => 'OIetko varma, että haluat <b>ottaa käyttöön</b> valitun tietueen?|Oletko varma, että haluat <b>ottaa käyttöön</b> valitut tietueet?',
|
||||
'disable' => 'OIetko varma, että haluat <b>poistaa käytöstä</b> valitun tietueen?|Oletko varma, että haluat <b>poistaa käytöstä</b> valitut tietueet?',
|
||||
'paid' => 'Oletko varma, että haluat merkitä valitun laskun <b>maksetuksi</b>?|Oletko varma, että haluat merkitä valitut laskut <b>maksetuiksi</b>?',
|
||||
'sent' => 'Oletko varma, että haluat merkitä valitun laskun <b>lähetetyksi</b>?|Oletko varma, että haluat merkitä valitut laskut <b>lähetetyiksi</b>?',
|
||||
'received' => 'Oletko varma, että haluat merkitä valitun laskun <b>vastaanotetuksi</b>?|Oletko varma, että haluat merkitä valitut laskut <b>vastaanotetuiksi</b>?',
|
||||
'cancelled' => 'Oletko varma, että haluat <b>peruuttaa<b> valitun laskun?|Oletko varma, että haluat <b>peruuttaa<b> valitut laskut?',
|
||||
'reconcile' => 'Oletko varma, että haluat <b>täsmäyttää<b> valitun tietueen?|Oletko varma, että haluat <b>täsmäyttää<b> valitut tietueet?',
|
||||
'unreconcile' => 'Oletko varma, että haluat <b>peruuttaa<b> valitun tietueen <b>täsmäytyksen</b>?|Oletko varma, että haluat <b>peruuttaa<b> valittujen tietueiden <b>täsmäytyksen</b>?',
|
||||
],
|
||||
|
||||
];
|
14
resources/lang/fi-FI/companies.php
Normal file
14
resources/lang/fi-FI/companies.php
Normal file
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'domain' => 'Verkkotunnus',
|
||||
'logo' => 'Logo',
|
||||
|
||||
'error' => [
|
||||
'not_user_company' => 'Virhe: Sinulla ei ole oikeutta vaihtaa tätä yritystä!',
|
||||
'delete_active' => 'Virhe: Aktiivista yritystä ei voi poistaa. Vaihda ensin toiseen yritykseen!',
|
||||
'disable_active' => 'Virhe: Aktiivista yritystä ei voi poistaa käytöstä. Vaihda ensin toiseen yritykseen!',
|
||||
],
|
||||
|
||||
];
|
@ -3,16 +3,16 @@
|
||||
return [
|
||||
|
||||
'code' => 'Koodi',
|
||||
'rate' => 'Arvioi',
|
||||
'rate' => 'Kurssi',
|
||||
'default' => 'Oletusvaluutta',
|
||||
'decimal_mark' => 'Desimaali Merkki',
|
||||
'thousands_separator' => 'Tuhaterotin',
|
||||
'precision' => 'Tarkkuus',
|
||||
'symbol' => [
|
||||
'symbol' => 'Symboli',
|
||||
'position' => 'Valuuttasymbolin paikka',
|
||||
'before' => 'Määrä Ennen',
|
||||
'after' => 'Määrä Jälkeen',
|
||||
'position' => 'Valuuttasymbolin sijainti',
|
||||
'before' => 'Ennen summaa',
|
||||
'after' => 'Summan jälkeen',
|
||||
]
|
||||
|
||||
];
|
||||
|
@ -2,11 +2,11 @@
|
||||
|
||||
return [
|
||||
|
||||
'can_login' => 'Voi Kirjautua?',
|
||||
'can_login' => 'Voiko kirjautua?',
|
||||
'user_created' => 'Käyttäjä luotu',
|
||||
|
||||
'error' => [
|
||||
'email' => 'Sähköposti on jo varattu.',
|
||||
'email' => 'Sähköpostiosoite on jo käytössä.',
|
||||
],
|
||||
|
||||
];
|
||||
|
11
resources/lang/fi-FI/dashboards.php
Normal file
11
resources/lang/fi-FI/dashboards.php
Normal file
@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'error' => [
|
||||
'not_user_dashboard' => 'Virhe: Tämän ohjausnäkymän muuttaminen ei ole sallittua!',
|
||||
'delete_last' => 'Virhe: Viimeistä ohjausnäkymääei voi poistaa. Luo ensin uusi ohjausnäkymä!',
|
||||
'disable_last' => 'Virhe: Viimeistä ohjausnäkymää ei voi poistaa käytöstä. Luo ensin uusi ohjausnäkymä!',
|
||||
],
|
||||
|
||||
];
|
34
resources/lang/fi-FI/demo.php
Normal file
34
resources/lang/fi-FI/demo.php
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'accounts' => [
|
||||
'cash' => 'Käteinen',
|
||||
],
|
||||
|
||||
'categories' => [
|
||||
'deposit' => 'Talletus',
|
||||
'sales' => 'Myyntitapahtumat',
|
||||
],
|
||||
|
||||
'currencies' => [
|
||||
'usd' => 'Yhdysvaltain dollari',
|
||||
'eur' => 'Euro',
|
||||
'gbp' => 'Englannin punta',
|
||||
'try' => 'Turkin liira',
|
||||
],
|
||||
|
||||
'offline_payments' => [
|
||||
'cash' => 'Käteinen',
|
||||
'bank' => 'Tilisiirto',
|
||||
],
|
||||
|
||||
'reports' => [
|
||||
'income' => 'Kuukausittaisten tulojen yhteenveto luokittain.',
|
||||
'expense' => 'Kuukausittaisten menojen yhteenveto luokittain.',
|
||||
'income_expense' => 'Kuukausittaiset tulot vs. menot luokittain.',
|
||||
'tax' => 'Neljännesvuosittainen veroyhteenveto.',
|
||||
'profit_loss' => 'Neljännesvuosittainen tuloslaskelma luokittain.',
|
||||
],
|
||||
|
||||
];
|
50
resources/lang/fi-FI/email_templates.php
Normal file
50
resources/lang/fi-FI/email_templates.php
Normal file
@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'invoice_new_customer' => [
|
||||
'subject' => '{invoice_number} lasku luotu',
|
||||
'body' => 'Hyvä {customer_name},<br /><br />Olemme luoneet sinulle laskun numerolla <strong>{invoice_number}</strong>.<br /><br />Voit nähdä laskun tiedot ja jatkaa maksutapahtumaa seuraavasta linkistä: <a href="{invoice_guest_link}">{invoice_number}</a>.<br /><br />Otathan yhteyttä, mikäli sinulla on kysyttävää.<br /><br />Terveisin,<br />{company_name}',
|
||||
],
|
||||
|
||||
'invoice_remind_customer' => [
|
||||
'subject' => '{invoice_number} lasku erääntynyt',
|
||||
'body' => 'Hyvä {customer_name},<br /><br />Tämä on ilmoitus erääntyneestä laskusta numerolla <strong>{invoice_number}</strong>.<br /><br />Laskun kokonaissumma on {invoice_total} ja se erääntyi <strong>{invoice_due_date}</strong>.<br /><br />Voit nähdä laskun tiedot ja jatkaa maksutapahtumaa seuraavasta linkistä: <a href="{invoice_guest_link}">{invoice_number}</a>.<br /><br />Terveisin,<br />{company_name}',
|
||||
],
|
||||
|
||||
'invoice_remind_admin' => [
|
||||
'subject' => '{invoice_number} lasku erääntynyt',
|
||||
'body' => 'Hei,<br /><br />{customer_name} on saanut erääntymisilmoituksen laskusta numerolla <strong>{invoice_number}</strong>.<br /><br />Laskun kokonaissumma on {invoice_total} ja se erääntyi <strong>{invoice_due_date}</strong>.<br /><br />Voit nähdä laskun tiedot seuraavasta linkistä: <a href="{invoice_admin_link}">{invoice_number}</a>.<br /><br />Terveisin,<br />{company_name}',
|
||||
],
|
||||
|
||||
'invoice_recur_customer' => [
|
||||
'subject' => '{invoice_number} toistuva lasku luotu',
|
||||
'body' => 'Hyvä {customer_name},<br /><br />Maksuerävalintoihisi perustuen, olemme laatineet sinulle laskun numerolla: <strong>{invoice_number}</strong>.<br /><br />Voit nähdä laskun tiedot ja jatkaa maksutapahtumaa seuraavasta linkistä: <a href="{invoice_guest_link}">{invoice_number}</a>.<br /><br />Otathan yhteyttä, mikäli sinulla on kysyttävää.<br /><br />Terveisin,<br />{company_name}',
|
||||
],
|
||||
|
||||
'invoice_recur_admin' => [
|
||||
'subject' => '{invoice_number} toistuva lasku luotu',
|
||||
'body' => 'Hei,<br /><br />Käyttäjän {customer_name} maksuerävalintoihin perustuen, lasku numerolla <strong>{invoice_number}</strong> on luotu automaattisesti.<br /><br />Voit nähdä laskun tiedot seuraavasta linkistä: <a href="{invoice_admin_link}">{invoice_number}</a>.<br /><br />Terveisin,<br />{company_name}',
|
||||
],
|
||||
|
||||
'invoice_payment_customer' => [
|
||||
'subject' => 'Maksu vastaanotettu laskulle {invoice_number}',
|
||||
'body' => 'Hyvä {customer_name},<br /><br />Kiitos maksusta. Maksun tiedot löytyvät alta:<br /><br />-----------------------------------------------------<br />Summa: <strong>{transaction_total}</strong><br />Päivämäärä: <strong>{transaction_paid_date}</strong><br />Laskun numero: <strong>{invoice_number}</strong><br />-----------------------------------------------------------------<br /><br />Voit aina nähdä laskun tiedot seuraavasta linkistä: <a href="{invoice_guest_link}">{invoice_number}</a>.<br /><br />Otathan yhteyttä, mikäli sinulla on kysyttävää.<br /><br />Terveisin,<br />{company_name}',
|
||||
],
|
||||
|
||||
'invoice_payment_admin' => [
|
||||
'subject' => 'Maksu vastaanotettu laskulle {invoice_number}',
|
||||
'body' => 'Hei,<br /><br />{customer_name} suoritti maksun laskulle numero <strong>{invoice_number}</strong>.<br /><br />Voit nähdä laskun tiedot seuraavasta linkistä: <a href="{invoice_admin_link}">{invoice_number}</a>.<br /><br />Terveisin,<br />{company_name}',
|
||||
],
|
||||
|
||||
'bill_remind_admin' => [
|
||||
'subject' => '{bill_number} laskun muistutusilmoitus',
|
||||
'body' => 'Hei,<br /><br />Tämä on muistutusilmoitus laskusta <strong>{bill_number}</strong>, {vendor_name}.<br /><br />Laskun summa on yhteensä {bill_total} ja se erääntyy <strong>{bill_due_date}</strong>.<br /><br />Voit nähdä laskun tiedot seuraavasta linkistä: <a href="{bill_admin_link}">{bill_number}</a>.<br /><br />Terveisin,<br />{company_name}',
|
||||
],
|
||||
|
||||
'bill_recur_admin' => [
|
||||
'subject' => '{bill_number} toistuva lasku luotu',
|
||||
'body' => 'Hei,<br /><br />Toimittajan {vendor_name} maksuerävalintoihin perustuen, lasku numerolla <strong>{bill_number}</strong> on luotu automaattisesti.<br /><br />Voit nähdä laskun tiedot seuraavasta linkistä: <a href="{bill_admin_link}">{bill_number}</a>.<br /><br />Terveisin,<br />{company_name}',
|
||||
],
|
||||
|
||||
];
|
23
resources/lang/fi-FI/errors.php
Normal file
23
resources/lang/fi-FI/errors.php
Normal file
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'title' => [
|
||||
'403' => 'Hups! Pääsy kielletty',
|
||||
'404' => 'Hups! Sivua ei löydy',
|
||||
'500' => 'Hups! Jotain meni pieleen',
|
||||
],
|
||||
|
||||
'header' => [
|
||||
'403' => '403 Kielletty',
|
||||
'404' => '404 Sivua ei löydy',
|
||||
'500' => '500 Sisäinen palvelinvirhe',
|
||||
],
|
||||
|
||||
'message' => [
|
||||
'403' => 'Et voi käyttää tätä sivua.',
|
||||
'404' => 'Emme löytäneet sivua, jota olit etsimässä.',
|
||||
'500' => 'Teemme parhaamme korjataksemme sen pikimmiten.',
|
||||
],
|
||||
|
||||
];
|
@ -3,8 +3,8 @@
|
||||
return [
|
||||
|
||||
'version' => 'Versio',
|
||||
'powered' => 'Ohjelmistona Akaunting',
|
||||
'powered' => 'Toteutettu ohjelmistolla Akaunting',
|
||||
'link' => 'https://akaunting.com',
|
||||
'software' => 'Ilmainen kirjanpito-ohjelma',
|
||||
'software' => 'Ilmainen kirjanpito-ohjelmisto',
|
||||
|
||||
];
|
||||
|
9
resources/lang/fi-FI/import.php
Normal file
9
resources/lang/fi-FI/import.php
Normal file
@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'import' => 'Tuo',
|
||||
'title' => 'Tuo :type',
|
||||
'message' => 'Sallitut tiedostotyypit: XLS, XLSX. Ole hyvä ja <a target="_blank" href=":link"><strong>lataa</strong></a> esimerkkitiedosto.',
|
||||
|
||||
];
|
8
resources/lang/fi-FI/items.php
Normal file
8
resources/lang/fi-FI/items.php
Normal file
@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'sales_price' => 'Myyntihinta',
|
||||
'purchase_price' => 'Ostohinta',
|
||||
|
||||
];
|
11
resources/lang/fi-FI/maintenance.php
Normal file
11
resources/lang/fi-FI/maintenance.php
Normal file
@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'title' => 'Huoltotila',
|
||||
|
||||
'message' => 'Järjestelmä on huoltotilassa. Yritä myöhemmin uudelleen!',
|
||||
|
||||
'last-updated' => 'Tämä viesti on päivitetty viimeksi :timestamp.',
|
||||
|
||||
];
|
123
resources/lang/fi-FI/validation.php
Normal file
123
resources/lang/fi-FI/validation.php
Normal file
@ -0,0 +1,123 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines contain the default error messages used by
|
||||
| the validator class. Some of these rules have multiple versions such
|
||||
| as the size rules. Feel free to tweak each of these messages here.
|
||||
|
|
||||
*/
|
||||
|
||||
'accepted' => 'Kenttä :attribute tulee hyväksyä.',
|
||||
'active_url' => 'Kentän :attribute tulee olla validi URL-osoite.',
|
||||
'after' => 'Kentän :attribute päiväyksen tulee olla jälkeen :date.',
|
||||
'after_or_equal' => 'Kentän :attribute päiväyksen tulee olla sama ja jälkeen :date',
|
||||
'alpha' => 'Kenttä :attribute voi sisältää vain kirjaimia.',
|
||||
'alpha_dash' => 'Kenttä :attribute voi sisältää vain kirjaimia, numeroita ja viivoja.',
|
||||
'alpha_num' => 'Kenttä :attribute voi sisältää vain kirjaimia ja numeroita.',
|
||||
'array' => 'Kenttä :attribute tulee olla taulukko.',
|
||||
'before' => 'Kentän :attribute päiväyksen tulee olla ennen :date.',
|
||||
'before_or_equal' => 'Kentän :attribute päiväyksen tulee olla sama tai ennen kuin :date.',
|
||||
'between' => [
|
||||
'numeric' => 'Kentän :attribute tulee olla välillä :min - :max.',
|
||||
'file' => 'Tiedoston :attribute tulee olla :min - :max kilotavua.',
|
||||
'string' => 'Kentän :attribute tulee olla :min - :max merkkiä pitkä.',
|
||||
'array' => 'Kentän :attribute tulee sisältää välillä :min - :max arvoa.',
|
||||
],
|
||||
'boolean' => 'Kentän :attribute arvon tulee olla tosi tai epätosi.',
|
||||
'confirmed' => 'Kentän :attribute vahvistus ei täsmää.',
|
||||
'date' => 'Kentän :attribute arvo ei ole kelvollinen päivämäärä.',
|
||||
'date_format' => 'Kentän :attribute arvo ei vastaa muotoa :format.',
|
||||
'different' => 'Kenttien :attribute ja :other tulee olla eriarvoisia.',
|
||||
'digits' => 'Kentän :attribute arvon on oltava :digits numeroa.',
|
||||
'digits_between' => 'Kentän :attribute arvon tulee olla :min - :max numeroa.',
|
||||
'dimensions' => 'Kentän :attribute kuvalla on virheelliset mitat.',
|
||||
'distinct' => 'Kentän :attribute arvo ei ole uniikki.',
|
||||
'email' => 'Kentän :attribute arvo ei ole validi sähköpostiosoite.',
|
||||
'ends_with' => 'Kentän :attribute arvon tulee päättyä johonkin seuraavista: :values',
|
||||
'exists' => 'Kentän :attribute valittu arvo on virheellinen.',
|
||||
'file' => 'Kentän :attribute arvon tulee olla tiedosto.',
|
||||
'filled' => 'Kenttä :attribute on pakollinen.',
|
||||
'image' => 'Kentän :attribute arvon tulee olla kuva.',
|
||||
'in' => 'Kentän :attribute arvo on virheellinen.',
|
||||
'in_array' => 'Kentän :attribute arvo ei sisälly kentän :other arvoon.',
|
||||
'integer' => 'Kentän :attribute arvon tulee olla numero.',
|
||||
'ip' => 'Kentän :attribute arvon tulee olla validi IP-osoite.',
|
||||
'json' => 'Kentän :attribute arvon tulee olla validia JSON:ia.',
|
||||
'max' => [
|
||||
'numeric' => 'Kentän arvon :attribute tulee olla enintään :max.',
|
||||
'file' => 'Tiedoston :attribute tulee olla enintään :max kilobittiä.',
|
||||
'string' => 'Kentän :attribute arvon tulee olla enintään :max merkkiä pitkä.',
|
||||
'array' => 'Kentän :attribute ei tule sisältää enempää kuin :max arvoa.',
|
||||
],
|
||||
'mimes' => 'Kentän :attribute arvon tulee olla tiedostotyyppiä: :values.',
|
||||
'mimetypes' => 'Kentän :attribute arvon tulee olla tiedostotyyppiä: :values.',
|
||||
'min' => [
|
||||
'numeric' => 'Kentän :attribute arvon tulee olla vähintään :min.',
|
||||
'file' => 'Tiedoston :attribute tulee olla vähintään :min kilobittiä.',
|
||||
'string' => 'Kentän :attribute arvon tulee olla vähintään :min merkkiä.',
|
||||
'array' => 'Kentän :attribute tulee sisältää vähintään :min arvoa.',
|
||||
],
|
||||
'not_in' => 'Kentän :attribute arvo on virheellinen.',
|
||||
'numeric' => 'Kentän :attribute arvon tulee olla numero.',
|
||||
'present' => 'Kenttä :attribute vaaditaan.',
|
||||
'regex' => 'Kentän :attribute arvo on väärää muotoa.',
|
||||
'required' => 'Kenttä :attribute vaaditaan.',
|
||||
'required_if' => 'Kenttä :attribute vaaditaan kun :other on :value.',
|
||||
'required_unless' => 'Kenttä :attribute vaaditaan jos :other ei sisälly arvoihin :values.',
|
||||
'required_with' => 'Kenttä :attribute vaaditaan kun arvo :values on annettu.',
|
||||
'required_with_all' => 'Kenttä :attribute vaaditaan kun arvo :values on annettu.',
|
||||
'required_without' => 'Kenttä :attribute vaaditaan kun arvoa :values ei ole annettu.',
|
||||
'required_without_all' => 'Kenttä :attribute vaaditaan kun mitään arvoista :values ei ole annettu.',
|
||||
'same' => 'Kenttien :attribute ja :other on oltava samanarvoiset.',
|
||||
'size' => [
|
||||
'numeric' => 'Kentän :attribute arvon tulee olla kokoa :size.',
|
||||
'file' => 'Tiedoston :attribute tulee olla kokoa :size kilobittiä.',
|
||||
'string' => 'Kentän :attribute arvon tulee olla kokoa :size merkkiä.',
|
||||
'array' => 'Kentän :attribute tulee sisältää :size arvoa.',
|
||||
],
|
||||
'string' => 'Kentän :attribute arvon tulee olla tekstiä.',
|
||||
'timezone' => 'Kentän :attribute arvon tulee olla validi aikavyöhyketunniste.',
|
||||
'unique' => 'Kentän :attribute arvo ei ole uniikki.',
|
||||
'uploaded' => 'Tiedoston :attribute lataus epäonnistui.',
|
||||
'url' => 'Kentän :attribute arvon tulee olla validi URL-osoite.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Custom Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify custom validation messages for attributes using the
|
||||
| convention "attribute.rule" to name the lines. This makes it quick to
|
||||
| specify a specific custom language line for a given attribute rule.
|
||||
|
|
||||
*/
|
||||
|
||||
'custom' => [
|
||||
'attribute-name' => [
|
||||
'rule-name' => 'kohandatud-teade',
|
||||
],
|
||||
'invalid_currency' => 'Kentän :attribute koodi on virheellinen.',
|
||||
'invalid_amount' => 'Määrä :attribute on virheellinen.',
|
||||
'invalid_extension' => 'Tiedostotunniste on virheellinen.',
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Custom Validation Attributes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used to swap attribute place-holders
|
||||
| with something more reader friendly such as E-Mail Address instead
|
||||
| of "email". This simply helps us make messages a little cleaner.
|
||||
|
|
||||
*/
|
||||
|
||||
'attributes' => [],
|
||||
|
||||
];
|
@ -49,7 +49,7 @@
|
||||
@endif
|
||||
|
||||
@permission('read-common-companies')
|
||||
{{ Form::multiSelectRemoteGroup('companies', trans_choice('general.companies', 2), 'user', $companies, $user->company_ids, ['required' => 'required', 'remote_action' => route('companies.autocomplete'), 'remote_type' => 'company']) }}
|
||||
{{ Form::multiSelectRemoteGroup('companies', trans_choice('general.companies', 2), 'user', $companies, $user->company_ids, ['required' => 'required', 'disabled' => (in_array('customer', $user->roles()->pluck('name')->toArray())) ? 'true' : 'false', 'remote_action' => route('companies.autocomplete'), 'remote_type' => 'company']) }}
|
||||
@endpermission
|
||||
|
||||
@permission('read-auth-roles')
|
||||
|
@ -48,6 +48,16 @@
|
||||
@if(!empty($action['message']))
|
||||
data-message="{{ trans_choice($action['message'], 2, ['type' => $text]) }}"
|
||||
@endif
|
||||
@if(isset($action['path']) && !empty($action['path']))
|
||||
data-path="{{ route('bulk-actions.action', $action['path']) }}"
|
||||
@else
|
||||
data-path=""
|
||||
@endif
|
||||
@if(isset($action['type']) && !empty($action['type']))
|
||||
data-type="{{ $action['type'] }}"
|
||||
@else
|
||||
data-type=""
|
||||
@endif
|
||||
>{{ trans($action['name']) }}</option>
|
||||
@endif
|
||||
@endforeach
|
||||
|
@ -55,7 +55,10 @@
|
||||
|
||||
remote-action="{{ $attributes['remote_action'] }}"
|
||||
remote-type="'{{ $attributes['remote_type'] }}"
|
||||
|
||||
@if (!empty($attributes['currecny_code']))
|
||||
currency-code="{{ $attributes['currecny_code'] }}"
|
||||
@endif
|
||||
|
||||
loading-text="{{ trans('general.loading') }}"
|
||||
no-data-text="{{ trans('general.no_data') }}"
|
||||
|
Reference in New Issue
Block a user