diff --git a/public/locales/en/team-form.json b/public/locales/en/team-form.json index 81e70e1..31781f1 100644 --- a/public/locales/en/team-form.json +++ b/public/locales/en/team-form.json @@ -26,5 +26,11 @@ "company_city": "City", "company_county": "County/State", "company_country": "Country" + }, + "tax_modal": { + "title": "Overwrite taxes for current invoice rows?", + "ok_title": "Overwrite", + "cancel_title": "Dismiss", + "taxes_updated": "Taxes updated" } } diff --git a/public/locales/et/team-form.json b/public/locales/et/team-form.json index 0ffd6d5..2a90dae 100644 --- a/public/locales/et/team-form.json +++ b/public/locales/et/team-form.json @@ -26,5 +26,11 @@ "company_city": "Linn", "company_county": "Maakond", "company_country": "Riik" + }, + "tax_modal": { + "title": "Kirjuta antud arve ridade maksud üle?", + "ok_title": "Kirjuta üle", + "cancel_title": "Sulge", + "taxes_updated": "Maksud uuendatud" } } diff --git a/src/components/team/TeamForm.vue b/src/components/team/TeamForm.vue index 6f21084..010e380 100644 --- a/src/components/team/TeamForm.vue +++ b/src/components/team/TeamForm.vue @@ -5,7 +5,7 @@

{{ $t('title') }}

@@ -62,7 +62,7 @@ - + @@ -96,6 +96,7 @@ export default { return { errors: new Errors(), loading: false, + taxesChanged: false, }; }, computed: { @@ -113,6 +114,25 @@ export default { }) .catch(err => this.errors.set(err.errors)); }, + async done() { + if (this.taxesChanged) { + await this.promptUpdateInvoiceRowTaxes(); + } + this.$emit('done'); + }, + async promptUpdateInvoiceRowTaxes() { + const confirmed = await this.$bvModal.msgBoxConfirm(this.$t('tax_modal.title'), { + okTitle: this.$t('tax_modal.ok_title'), + okVariant: 'primary', + cancelTitle: this.$t('tax_modal.cancel_title'), + cancelVariant: 'btn-link', + contentClass: 'bg-base dp--24', + }); + if (confirmed) { + await this.$store.dispatch('invoiceRows/overwriteTaxes'); + NotificationService.success(this.$t('tax_modal.taxes_updated')); + } + }, }, }; diff --git a/src/components/team/TeamTaxes.vue b/src/components/team/TeamTaxes.vue index 66837a8..059de78 100644 --- a/src/components/team/TeamTaxes.vue +++ b/src/components/team/TeamTaxes.vue @@ -48,6 +48,7 @@ export default { if (confirmed) { await this.$store.dispatch('taxes/deleteTax', field.id); try { + this.$emit('changed'); NotificationService.success(this.$t('notification_deleted')); } catch (err) { NotificationService.error(err.message); @@ -59,6 +60,7 @@ export default { props, taxId: tax.id, }); + this.$emit('changed'); }, }, }; diff --git a/src/store/invoice-rows.js b/src/store/invoice-rows.js index 3d49900..b0f404c 100644 --- a/src/store/invoice-rows.js +++ b/src/store/invoice-rows.js @@ -2,6 +2,16 @@ import InvoiceRow from '@/store/models/invoice-row'; import InvoiceRowTax from '@/store/models/invoice-row-tax'; import { flatten, uniqBy } from 'lodash'; +function addTaxes(taxes, row) { + taxes.forEach((tax) => { + const rowTax = new InvoiceRowTax(); + rowTax.label = tax.label; + rowTax.value = tax.value; + rowTax.row_id = row.id; + rowTax.$save(); + }); +} + export default { namespaced: true, state: {}, @@ -35,16 +45,21 @@ export default { if (client && client.has_tax) { const taxes = getters.taxes.length > 0 ? getters.taxes - : rootGetters['taxes/all']; - taxes.forEach((tax) => { - const rowTax = new InvoiceRowTax(); - rowTax.label = tax.label; - rowTax.value = tax.value; - rowTax.row_id = row.id; - rowTax.$save(); - }); + : rootGetters['taxes/allWithLabels']; + addTaxes(taxes, row); } }, + overwriteTaxes({ rootGetters, rootState }) { + const taxes = rootGetters['taxes/allWithLabels']; + const rows = InvoiceRow.query() + .where('invoice_id', rootState.invoices.invoiceId) + .get(); + + rows.forEach((row) => { + InvoiceRowTax.delete(tax => tax.row_id === row.id) + .then(() => addTaxes(taxes, row)); + }); + }, async removeRow(store, rowId) { await InvoiceRow.delete(rowId); }, diff --git a/src/store/taxes.js b/src/store/taxes.js index ff8fc9e..0a54110 100644 --- a/src/store/taxes.js +++ b/src/store/taxes.js @@ -40,5 +40,8 @@ export default { all() { return Tax.all(); }, + allWithLabels() { + return Tax.all().filter(tax => !!tax.label); + }, }, };