Merge branch 'master' of github.com:akaunting/akaunting into 2.1-dev

This commit is contained in:
Cüneyt Şentürk
2020-09-23 14:25:40 +03:00
54 changed files with 1364 additions and 522 deletions

View File

@@ -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>

View File

@@ -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);
},

View File

@@ -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,72 +86,79 @@ 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);
}
})
.catch(error => {
//this.loading = false;
//this.modal = false;
// bwfore version 2.0.23
if (this.value == 'export') {
this.type = 'download';
}
//window.location.reload(false);
})
.finally(function () {
//window.location.reload(false);
});
} else {
window.axios({
url: path,
method: 'POST',
data:{
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',
}));
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');
link.href = url;
const contentDisposition = response.headers['content-disposition'];
let fileName = 'unknown';
if (contentDisposition) {
const fileNameMatch = contentDisposition.match(/filename=(.+)/);
if (fileNameMatch.length === 2) {
fileName = fileNameMatch[1];
}
}
link.setAttribute('download', fileName);
document.body.appendChild(link);
link.click();
link.remove();
window.URL.revokeObjectURL(url);
this.loading = false;
this.modal = false;
this.value = '*';
this.clear();
});
break;
default:
let type_promise = Promise.resolve(window.axios.post(this.path, {
'handle': this.value,
'selected': this.selected
},
responseType: 'blob',
}).then((response) => {
console.log(response.data);
const blob = new Blob([response.data], {type: response.data.type});
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
}));
link.href = url;
const contentDisposition = response.headers['content-disposition'];
let fileName = 'unknown';
if (contentDisposition) {
const fileNameMatch = contentDisposition.match(/filename=(.+)/);
if (fileNameMatch.length === 2) {
fileName = fileNameMatch[1];
type_promise.then(response => {
if (response.data.redirect) {
window.location.reload(false);
}
}
})
.catch(error => {
//this.loading = false;
//this.modal = false;
link.setAttribute('download', fileName);
document.body.appendChild(link);
link.click();
link.remove();
window.URL.revokeObjectURL(url);
this.loading = false;
this.modal = false;
this.value = '*';
this.clear();
});
//window.location.reload(false);
})
.finally(function () {
//window.location.reload(false);
});
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View 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',
],
];

View 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',
],
],
],
];

View 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>?',
],
];

View 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!',
],
];

View File

@@ -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',
]
];

View File

@@ -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ä.',
],
];

View 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ä!',
],
];

View 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.',
],
];

View 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}',
],
];

View 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.',
],
];

View File

@@ -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',
];

View 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.',
];

View File

@@ -0,0 +1,8 @@
<?php
return [
'sales_price' => 'Myyntihinta',
'purchase_price' => 'Ostohinta',
];

View 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.',
];

View 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' => [],
];

View File

@@ -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')

View File

@@ -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

View File

@@ -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') }}"