Compare commits

..

2 Commits

Author SHA1 Message Date
e64fabf453 Merge b5f067d3a9 into ca867f0d7a 2024-06-15 22:36:20 +02:00
b5f067d3a9 feat: don't require all fields for invoice booking.
simplify field requirements and allow for a more flexible invoice
generation.
2024-06-15 21:41:00 +02:00
13 changed files with 8 additions and 35 deletions

View File

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

View File

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

View File

@ -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"
}, },

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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