Feat: Add summarize box
This commit is contained in:
parent
84512969ad
commit
e7d792e7ef
71
config/postes.yml
Normal file
71
config/postes.yml
Normal file
@ -0,0 +1,71 @@
|
||||
---
|
||||
postes:
|
||||
total:
|
||||
name: Tout
|
||||
variant: info
|
||||
icon: file-invoice-dollar
|
||||
|
||||
cash:
|
||||
name: Cash
|
||||
variant: info
|
||||
icon: money-bill-wave
|
||||
words:
|
||||
- RETRAIT
|
||||
|
||||
CB:
|
||||
name: CB
|
||||
variant: info
|
||||
icon: credit-card
|
||||
words:
|
||||
- PAIEMENT
|
||||
|
||||
other:
|
||||
name: Autre
|
||||
variant: info
|
||||
icon: directions
|
||||
invert: true
|
||||
words:
|
||||
- PAIEMENT
|
||||
- RETRAIT
|
||||
|
||||
autoroute:
|
||||
name: Autoroute
|
||||
variant: danger
|
||||
icon: road
|
||||
words:
|
||||
- AUTOROUTE
|
||||
- APRR
|
||||
|
||||
essence:
|
||||
name: Essence
|
||||
variant: danger
|
||||
icon: charging-station
|
||||
words:
|
||||
- CARBU
|
||||
- TOTAL
|
||||
- ESSFLO
|
||||
- STATION
|
||||
- AVIA
|
||||
|
||||
courses:
|
||||
name: Courses
|
||||
variant: warning
|
||||
icon: shopping-cart
|
||||
words:
|
||||
- BIOCOOP
|
||||
- LA VIE CLAIRE
|
||||
- MAISON VITALE
|
||||
- BOUCHERIE
|
||||
- SALAISON CHALAM
|
||||
- INTERMARCHE
|
||||
- LA FERME DU COIN
|
||||
|
||||
bio:
|
||||
name: Bio
|
||||
variant: success
|
||||
icon: shopping-basket
|
||||
words:
|
||||
- BIOCOOP
|
||||
- LA VIE CLAIRE
|
||||
- MAISON VITALE
|
||||
|
@ -1,9 +0,0 @@
|
||||
---
|
||||
postes:
|
||||
autoroute:
|
||||
- AUTOROUTE
|
||||
- APRR
|
||||
essence: [CARBU, TOTAL, ESSFLO, STATION, AVIA]
|
||||
bouffe: [BIOCOOP, LA VIE CLAIRE, MAISON VITALE, BOUCHERIE, SALAISON CHALAM, INTERMARCHE, LA FERME DU COIN]
|
||||
bio: [BIOCOOP, LA VIE CLAIRE, MAISON VITALE]
|
||||
|
78
src/components/box.vue
Normal file
78
src/components/box.vue
Normal file
@ -0,0 +1,78 @@
|
||||
<template>
|
||||
<b-card :bg-variant="poste.variant"
|
||||
text-variant="white"
|
||||
class="text-center">
|
||||
<p class="card-text">
|
||||
<font-awesome-icon :icon="poste.icon" />
|
||||
{{ poste.name }}
|
||||
</br>
|
||||
{{ total() }}€
|
||||
</p>
|
||||
</b-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapGetters } from 'vuex'
|
||||
export default {
|
||||
name: 'box',
|
||||
props: [
|
||||
'postename',
|
||||
'rows'
|
||||
],
|
||||
data () {
|
||||
return {
|
||||
empty_poste: {
|
||||
variant: '',
|
||||
icon: '',
|
||||
name: ''
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapGetters('config', [
|
||||
'postes'
|
||||
]),
|
||||
poste () {
|
||||
if (this.postes) {
|
||||
return this.postes[this.postename]
|
||||
} else {
|
||||
return this.empty_poste
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
filter_rows () {
|
||||
if (this.poste.words) {
|
||||
if (this.poste.invert) {
|
||||
return this.rows.filter(x => {
|
||||
return this.poste.words.every(v => {
|
||||
return x.Libellé.indexOf(v) < 0
|
||||
})
|
||||
})
|
||||
} else {
|
||||
return this.rows.filter(x => {
|
||||
return this.poste.words.some(v => {
|
||||
return x.Libellé.indexOf(v) >= 0
|
||||
})
|
||||
})
|
||||
}
|
||||
} else {
|
||||
return this.rows
|
||||
}
|
||||
},
|
||||
total () {
|
||||
return Math.round(
|
||||
-this.filter_rows()
|
||||
.map(x => parseFloat(x.Montant))
|
||||
.reduce((sum, x) => sum + x, 0)
|
||||
)
|
||||
},
|
||||
count () {
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
</style>
|
10
src/main.js
10
src/main.js
@ -9,12 +9,18 @@ import 'bootstrap-vue/dist/bootstrap-vue.css'
|
||||
|
||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||
import {
|
||||
faCar, faChargingStation, faUtensils, faFileInvoiceDollar
|
||||
faCar, faChargingStation, faRoad,
|
||||
faUtensils, faDirections,
|
||||
faFileInvoiceDollar, faMoneyBillWave, faCreditCard,
|
||||
faShoppingCart, faShoppingBasket
|
||||
} from '@fortawesome/free-solid-svg-icons'
|
||||
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
|
||||
|
||||
library.add(
|
||||
faCar, faChargingStation, faUtensils, faFileInvoiceDollar
|
||||
faCar, faChargingStation, faRoad,
|
||||
faUtensils, faDirections,
|
||||
faFileInvoiceDollar, faMoneyBillWave, faCreditCard,
|
||||
faShoppingCart, faShoppingBasket
|
||||
)
|
||||
|
||||
Vue.component('font-awesome-icon', FontAwesomeIcon)
|
||||
|
@ -1,15 +1,43 @@
|
||||
import { readFile } from 'fs'
|
||||
import path from 'path'
|
||||
import yaml from 'js-yaml'
|
||||
|
||||
export default {
|
||||
namespaced: true,
|
||||
state: {
|
||||
data_dir: '/home/lafrite/scripts/comptes/data/'
|
||||
data_dir: '/home/lafrite/scripts/comptes/data/',
|
||||
postes_filename: 'postes.yml',
|
||||
postes: {}
|
||||
},
|
||||
getters: {
|
||||
data_dir: (state) => {
|
||||
return state.data_dir
|
||||
},
|
||||
postes_filename: (state) => {
|
||||
return state.postes_filename
|
||||
},
|
||||
postes: (state) => {
|
||||
return state.postes
|
||||
}
|
||||
},
|
||||
mutations: {
|
||||
SET_POSTES: (state, { postes }) => {
|
||||
state.postes = postes
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
async load_postes (context) {
|
||||
readFile(path.join(context.getters.data_dir, context.getters.postes_filename), 'utf8', (err, content) => {
|
||||
if (err) {
|
||||
console.log(err)
|
||||
} else {
|
||||
var parseConfig = {
|
||||
header: true
|
||||
}
|
||||
var parsed = yaml.safeLoad(content, parseConfig)
|
||||
context.commit('SET_POSTES', { postes: parsed.postes })
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,3 @@
|
||||
import Vue from 'vue'
|
||||
import { readdir, readFile } from 'fs'
|
||||
import path from 'path'
|
||||
import Papa from 'papaparse'
|
||||
|
@ -12,12 +12,20 @@
|
||||
</b-row>
|
||||
</b-container>
|
||||
|
||||
<b-card-group deck class="mb-3">
|
||||
<box postename="total" :rows="filter_rows"></box>
|
||||
<box postename="cash" :rows="filter_rows"></box>
|
||||
<box postename="CB" :rows="filter_rows"></box>
|
||||
<box postename="other" :rows="filter_rows"></box>
|
||||
</b-card-group>
|
||||
|
||||
<b-table striped hover :items="filter_rows" :fields='fields'></b-table>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapGetters } from 'vuex'
|
||||
import box from '../components/box'
|
||||
|
||||
var today = new Date()
|
||||
var monthAgo = new Date()
|
||||
@ -26,6 +34,7 @@ monthAgo.setMonth(monthAgo.getMonth() - 1)
|
||||
export default {
|
||||
name: 'home',
|
||||
components: {
|
||||
box: box
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
@ -50,12 +59,14 @@ export default {
|
||||
}
|
||||
},
|
||||
mounted: function () {
|
||||
this.$store.dispatch('config/load_postes')
|
||||
this.$store.dispatch('datas/find_csv')
|
||||
},
|
||||
computed: {
|
||||
...mapGetters({
|
||||
'csvs': 'datas/csvs',
|
||||
'rows': 'datas/rows'
|
||||
'rows': 'datas/rows',
|
||||
'postes': 'config/postes'
|
||||
}),
|
||||
filter_rows () {
|
||||
return this.filter_date(this.filter_spending(this.rows))
|
||||
|
Loading…
Reference in New Issue
Block a user