import { readdir, readFile } from 'fs' import Vue from 'vue' import path from 'path' import Papa from 'papaparse' import moment from 'moment' import { appendTag, formatDate } from '../../libs/data_processing' export default { namespaced: true, state: { csv: {}, start: moment().subtract(1, 'months'), end: moment() }, getters: { csvs: (state) => { // return array of csv filename return Object.values(state.csv) }, rows: (state) => { // return all data stored in csv deleting duplicates rows return [ ...new Set(Object.values(state.csv).map(csv => csv.data) .reduce((acc, d) => acc.concat(d), []) )] }, rows_in: (state, getters) => (csv) => { // return rows in a specific csv file if (csv in getters.csvs) { return state.csv[csv].data } else { console.log('Unkown csv file - ', csv) } }, present: (state, getters) => { // is there any datas return getters.rows.length > 0 }, spending_rows: (state, getters) => { // return data with negatives 'Montant' return getters.rows.filter(x => x.Montant < 0) }, start: (state) => { // Start date return state.start.format(moment.HTML5_FMT.DATE) }, end: (state) => { // End date return state.end.format(moment.HTML5_FMT.DATE) }, date_filter_rows: (state, getters) => { // return rows filtered by date return getters.spending_rows.filter(x => { return (x.Date >= state.start) & (x.Date < state.end) }) }, tag_filter_rows: (state, getters) => (tags, invert) => { // return rows filtered by date then by tags if (tags) { return getters.date_filter_rows.filter(row => { if (invert) { return tags.some(t => { return row.tags.map(t => t.name.toLowerCase()) .indexOf(t.toLowerCase()) < 0 }) } else { return tags.every(t => { return row.tags.map(t => t.name.toLowerCase()) .indexOf(t.toLowerCase()) > -1 }) } }) } else { if (invert) { return [] } else { return getters.date_filter_rows } } }, libelle_filter_rows: (state, getters) => (words, invert) => { // return rows filtered by present of words in 'Libellé' if (!words) { return getters.date_filter_rows } if (invert) { return getters.date_filter_rows.filter(x => { return words.every(v => { return x.Libellé.indexOf(v) < 0 }) }) } else { return getters.date_filter_rows.filter(x => { return words.some(v => { return x.Libellé.indexOf(v) >= 0 }) }) } } }, mutations: { CLEAR_DATA: (state) => { state.csv = {} }, SET_DATA: (state, { filename, data }) => { Vue.set(state.csv, filename, data) }, SET_START: (state, { start }) => { state.start = start }, SET_END: (state, { end }) => { state.end = end } }, actions: { load_csvs (context) { // Clean state.csv then load csvs files context.commit('CLEAR_DATA') context.dispatch('find_csvs') }, find_csvs (context) { try { readdir(context.rootGetters['config/data_dir'], (err, list) => { if (err) { console.log(err) } else { var csvs = list.filter(x => { return x.split('.').pop() === 'csv' }) for (var i in csvs) { context.dispatch('load_csv', csvs[i]) } } }) } catch (e) { console.log(e) } }, load_csv (context, csv) { readFile(path.join(context.rootGetters['config/data_dir'], csv), 'Latin1', (err, content) => { if (err) { console.log(err) } else { var parseConfig = { header: true } var parsed = Papa.parse(content, parseConfig) context.dispatch('clean_store_data', { filename: csv, parsed: parsed }) } }) }, clean_store_data (context, { filename, parsed }) { var tags = Object.values(context.rootGetters['config/tags']) parsed.data = parsed.data.filter(x => x.Libellé !== undefined) parsed.data.forEach(row => { appendTag(row, tags, 'Libellé') formatDate(row, 'Date') }) parsed.filename = filename context.commit('SET_DATA', { filename: filename, data: parsed } ) }, set_start (context, start) { context.commit('SET_START', { start: moment(start) }) }, set_end (context, end) { context.commit('SET_END', { end: moment(end) }) } } }