mirror of
https://github.com/mokuappio/serverless-invoices.git
synced 2025-10-28 16:31:07 -04:00
Compare commits
2 Commits
main
...
e64fabf453
| Author | SHA1 | Date | |
|---|---|---|---|
| e64fabf453 | |||
| b5f067d3a9 |
@ -9,7 +9,7 @@ It is open-source and easily extendable. You can use it as a starter kit for mor
|
|||||||
|
|
||||||
Run it locally or host it yourself.
|
Run it locally or host it yourself.
|
||||||
|
|
||||||
You can always use the latest free version at [invoices.elevate.ee](https://invoices.elevate.ee)
|
You can always use the latest free version at [invoices.mokuapp.io](https://invoices.mokuapp.io)
|
||||||
|
|
||||||
Built with [Vue.js](https://vuejs.org/) and [Bootstrap](https://getbootstrap.com/)
|
Built with [Vue.js](https://vuejs.org/) and [Bootstrap](https://getbootstrap.com/)
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ Built with [Vue.js](https://vuejs.org/) and [Bootstrap](https://getbootstrap.com
|
|||||||
- Multilingual
|
- Multilingual
|
||||||
- PWA support
|
- PWA support
|
||||||
- Ready-to-go backend adapters
|
- Ready-to-go backend adapters
|
||||||
- [Browser Storage](https://invoices.elevate.ee)
|
- [Browser Storage](https://invoices.mokuapp.io)
|
||||||
- [Wordpress](https://wordpress.org/plugins/beautiful-custom-invoices/)
|
- [Wordpress](https://wordpress.org/plugins/beautiful-custom-invoices/)
|
||||||
- Woocommerce (coming soon)
|
- Woocommerce (coming soon)
|
||||||
- Google Drive (coming soon)
|
- Google Drive (coming soon)
|
||||||
|
|||||||
@ -3,8 +3,6 @@
|
|||||||
"invoice_number": "No.",
|
"invoice_number": "No.",
|
||||||
"issued_at": "Issued at: ",
|
"issued_at": "Issued at: ",
|
||||||
"due_at": "Due at:",
|
"due_at": "Due at:",
|
||||||
"late_fee": "Late fee:",
|
|
||||||
"add_late_fee": "Add late fee",
|
|
||||||
"modal_issued_at_title": "Issued at",
|
"modal_issued_at_title": "Issued at",
|
||||||
"modal_due_at_title": "Due at"
|
"modal_due_at_title": "Due at"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,7 +16,6 @@
|
|||||||
"website": "Website"
|
"website": "Website"
|
||||||
},
|
},
|
||||||
"invoicing": {
|
"invoicing": {
|
||||||
"invoice_late_fee": "Late fee (%)",
|
|
||||||
"invoice_due_days": "Payment terms, days",
|
"invoice_due_days": "Payment terms, days",
|
||||||
"currency": "Default currency"
|
"currency": "Default currency"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
ref="button"
|
ref="button"
|
||||||
:tabindex="tabindex"
|
:tabindex="tabindex"
|
||||||
@click="toggleOpen">
|
@click="toggleOpen">
|
||||||
<span v-if="!value" class="d-print-none">{{ $t('client') }}</span>
|
<span v-if="!value">{{ $t('client') }}</span>
|
||||||
<span v-else>{{ value }}</span>
|
<span v-else>{{ value }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="search-popover__overlay" v-if="isOpen" @click="toggleOpen"></div>
|
<div class="search-popover__overlay" v-if="isOpen" @click="toggleOpen"></div>
|
||||||
|
|||||||
@ -37,15 +37,7 @@
|
|||||||
:inline="true"
|
:inline="true"
|
||||||
field="due_at"/>
|
field="due_at"/>
|
||||||
</BModal>
|
</BModal>
|
||||||
<span :class="{'d-print-none': !invoice.late_fee}">
|
|
||||||
<br>{{ $t('late_fee') }}
|
|
||||||
<AppEditable :value="invoice.late_fee | currency"
|
|
||||||
:errors="errors"
|
|
||||||
suffix="%"
|
|
||||||
field="late_fee"
|
|
||||||
:placeholder="$t('add_late_fee')"
|
|
||||||
@change="updateProp({ late_fee: $event })"/>
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
|
|||||||
@ -38,10 +38,6 @@
|
|||||||
|
|
||||||
<b-tab :title="$t('tabs.invoicing')">
|
<b-tab :title="$t('tabs.invoicing')">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<AppInput :value="team.invoice_late_fee" @change="updateProp({ invoice_late_fee: $event })"
|
|
||||||
type="number"
|
|
||||||
:label="$t('invoicing.invoice_late_fee')" field="invoice_late_fee" :errors="errors"
|
|
||||||
class="col-12"/>
|
|
||||||
<AppInput :value="team.invoice_due_days" @change="updateProp({ invoice_due_days: $event })"
|
<AppInput :value="team.invoice_due_days" @change="updateProp({ invoice_due_days: $event })"
|
||||||
type="number"
|
type="number"
|
||||||
:label="$t('invoicing.invoice_due_days')" field="invoice_due_days" :errors="errors"
|
:label="$t('invoicing.invoice_due_days')" field="invoice_due_days" :errors="errors"
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
class="pointer"
|
class="pointer"
|
||||||
@click="openModal"
|
@click="openModal"
|
||||||
:src="team.logo_url" style="width:100%; max-width:200px;">
|
:src="team.logo_url" style="width:100%; max-width:200px;">
|
||||||
<button class="btn btn-sm d-print-none" @click="openModal" v-else>
|
<button class="btn btn-sm" @click="openModal" v-else>
|
||||||
<i class="material-icons material-icons-round md-36">file_upload</i>
|
<i class="material-icons material-icons-round md-36">file_upload</i>
|
||||||
</button>
|
</button>
|
||||||
<AppError :errors="errors" field="logo_url"/>
|
<AppError :errors="errors" field="logo_url"/>
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
export default {
|
export default {
|
||||||
storageType: 'local',
|
storageType: 'local',
|
||||||
// base_url: wordpress.front_url,
|
// base_url: wordpress.front_url,
|
||||||
// base_url: process.env.BASE_URL
|
// base_url: `${window.location.origin}${process.env.BASE_URL}`
|
||||||
// api_url: wordpress.api_url,
|
// api_url: wordpress.api_url,
|
||||||
// api_nonce: wordpress.nonce,
|
// api_nonce: wordpress.nonce,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import VueI18Next from '@panter/vue-i18next';
|
|||||||
import Backend from 'i18next-http-backend';
|
import Backend from 'i18next-http-backend';
|
||||||
import LanguageDetector from 'i18next-browser-languagedetector';
|
import LanguageDetector from 'i18next-browser-languagedetector';
|
||||||
import app from '@/main';
|
import app from '@/main';
|
||||||
|
import config from '@/config/app.config';
|
||||||
|
|
||||||
Vue.use(VueI18Next);
|
Vue.use(VueI18Next);
|
||||||
|
|
||||||
@ -15,7 +16,7 @@ const initialized = i18next.init({
|
|||||||
fallbackLng: 'en',
|
fallbackLng: 'en',
|
||||||
whitelist: ['en', 'de', 'fr', 'et', 'fa', 'bn', 'es', 'pt_br', 'it', 'id', 'kr'],
|
whitelist: ['en', 'de', 'fr', 'et', 'fa', 'bn', 'es', 'pt_br', 'it', 'id', 'kr'],
|
||||||
backend: {
|
backend: {
|
||||||
loadPath: `${window.location.origin}/locales/{{lng}}/{{ns}}.json`,
|
loadPath: `${config.base_url || ''}/locales/{{lng}}/{{ns}}.json`,
|
||||||
},
|
},
|
||||||
detection: {
|
detection: {
|
||||||
order: ['querystring', 'path', 'localStorage', 'navigator'],
|
order: ['querystring', 'path', 'localStorage', 'navigator'],
|
||||||
|
|||||||
@ -44,19 +44,10 @@ class InvoiceService {
|
|||||||
number: 'Number',
|
number: 'Number',
|
||||||
client_id: 'Client',
|
client_id: 'Client',
|
||||||
client_name: 'Client name',
|
client_name: 'Client name',
|
||||||
client_address: 'Address',
|
|
||||||
client_postal_code: 'Postal code',
|
|
||||||
client_city: 'City',
|
|
||||||
client_email: 'Client\'s email',
|
client_email: 'Client\'s email',
|
||||||
client_country: 'Country',
|
|
||||||
from_name: 'Name',
|
from_name: 'Name',
|
||||||
from_address: 'Address',
|
|
||||||
from_postal_code: 'Postal code',
|
|
||||||
from_country: 'Country',
|
|
||||||
from_city: 'City',
|
|
||||||
from_website: 'Website',
|
from_website: 'Website',
|
||||||
from_email: 'Your email',
|
from_email: 'Your email',
|
||||||
from_phone: 'Your phone',
|
|
||||||
bank_name: 'Bank name',
|
bank_name: 'Bank name',
|
||||||
bank_account_no: 'Bank account details',
|
bank_account_no: 'Bank account details',
|
||||||
rows: {
|
rows: {
|
||||||
|
|||||||
@ -90,7 +90,6 @@ export default {
|
|||||||
},
|
},
|
||||||
async updateTeam({ dispatch }, payload) {
|
async updateTeam({ dispatch }, payload) {
|
||||||
const teamProps = pick(payload.props, {
|
const teamProps = pick(payload.props, {
|
||||||
late_fee: 'invoice_late_fee',
|
|
||||||
from_name: 'company_name',
|
from_name: 'company_name',
|
||||||
from_address: 'company_address',
|
from_address: 'company_address',
|
||||||
from_postal_code: 'company_postal_code',
|
from_postal_code: 'company_postal_code',
|
||||||
@ -180,7 +179,6 @@ export default {
|
|||||||
.add(team.invoice_due_days || 14, 'days')
|
.add(team.invoice_due_days || 14, 'days')
|
||||||
.format('YYYY-MM-DD'),
|
.format('YYYY-MM-DD'),
|
||||||
number: generateInvoiceNumber(getters.all),
|
number: generateInvoiceNumber(getters.all),
|
||||||
late_fee: team.invoice_late_fee || 0.5,
|
|
||||||
currency: team.currency || 'USD',
|
currency: team.currency || 'USD',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -17,7 +17,6 @@ export default class Invoice extends Model {
|
|||||||
issued_at: this.attr(''),
|
issued_at: this.attr(''),
|
||||||
is_compact: this.attr(false),
|
is_compact: this.attr(false),
|
||||||
due_at: this.attr(''),
|
due_at: this.attr(''),
|
||||||
late_fee: this.attr(''),
|
|
||||||
currency: this.attr(''),
|
currency: this.attr(''),
|
||||||
from_name: this.attr(''),
|
from_name: this.attr(''),
|
||||||
from_address: this.attr(''),
|
from_address: this.attr(''),
|
||||||
|
|||||||
@ -31,7 +31,6 @@ export default class Team extends Model {
|
|||||||
contact_email: this.attr(''),
|
contact_email: this.attr(''),
|
||||||
contact_phone: this.attr(''),
|
contact_phone: this.attr(''),
|
||||||
currency: this.attr(null),
|
currency: this.attr(null),
|
||||||
invoice_late_fee: this.attr(null),
|
|
||||||
invoice_due_days: this.attr(null),
|
invoice_due_days: this.attr(null),
|
||||||
fields: this.hasMany(TeamField, 'team_id'),
|
fields: this.hasMany(TeamField, 'team_id'),
|
||||||
updated_at: this.attr(''),
|
updated_at: this.attr(''),
|
||||||
|
|||||||
Reference in New Issue
Block a user