From cefb66b5492f5851dc74a607699258bde23da010 Mon Sep 17 00:00:00 2001
From: raxelsen <raxelsen@sipwise.com>
Date: Mon, 29 Jan 2018 14:36:30 +0100
Subject: [PATCH] TT#28056 List all company hours destinations

What has been done:
- TT#31193, CallForwarding: Create store mutation unit test
- TT#31191, CallForwarding: Implement API requests
- TT#31192, CallForwarding: Implement store
- TT#31175, CallForwarding: Implement vue component

Change-Id: I971e06cea0b930f57ede43b7a56c6766a790e651
---
 src/api/call-forward.js                       |  63 +++++-----
 src/components/pages/CallForward/Always.vue   |  63 +++++++++-
 .../pages/CallForward/CompanyHours.vue        |  93 +++++++++++++-
 .../CallForward/CscAddDestinationForm.vue     |  26 ++--
 .../pages/CallForward/CscDestination.vue      |  14 +--
 .../pages/CallForward/CscDestinations.vue     |   5 +-
 src/store/call-forward.js                     | 119 +++++++++++++-----
 t/store/call-forward.js                       |  30 +++++
 8 files changed, 313 insertions(+), 100 deletions(-)

diff --git a/src/api/call-forward.js b/src/api/call-forward.js
index 26386e12..68aad04d 100644
--- a/src/api/call-forward.js
+++ b/src/api/call-forward.js
@@ -84,31 +84,37 @@ export function getDestinationsets(id) {
     });
 }
 
-export function loadAlwaysEverybodyDestinations(subscriberId) {
+export function loadAlwaysDestinations(options) {
     return new Promise((resolve, reject)=>{
+        let cfuTimeset = null;
+        let cfnaTimeset = null;
+        let cfbTimeset = null;
         Promise.resolve().then(()=>{
-            return getMappings(subscriberId);
-        }).then((mappings) => {
+            return getMappings(options.subscriberId);
+        }).then((mappings)=>{
             let cfuPromises = [];
             let cfnaPromises = [];
             let cfbPromises = [];
             if(_.has(mappings, 'cfu') && _.isArray(mappings.cfu) && mappings.cfu.length > 0) {
                 mappings.cfu.forEach((cfuMapping)=>{
-                    if (cfuMapping.timeset_id === null && cfuMapping.sourceset_id === null) {
+                    if (cfuMapping.timeset === options.timeset && cfuMapping.sourceset_id === null) {
+                        cfuTimeset = cfuMapping.timeset_id;
                         cfuPromises.push(getDestinationsetById(cfuMapping.destinationset_id));
                     }
                 });
             }
             if(_.has(mappings, 'cfna') && _.isArray(mappings.cfna) && mappings.cfna.length > 0) {
                 mappings.cfna.forEach((cfnaMapping)=>{
-                    if (cfnaMapping.timeset_id === null && cfnaMapping.sourceset_id === null) {
+                    if (cfnaMapping.timeset === options.timeset && cfnaMapping.sourceset_id === null) {
+                        cfnaTimeset = cfnaMapping.timeset_id;
                         cfnaPromises.push(getDestinationsetById(cfnaMapping.destinationset_id));
                     }
                 });
             }
             if(_.has(mappings, 'cfb') && _.isArray(mappings.cfb) && mappings.cfb.length > 0) {
                 mappings.cfb.forEach((cfbMapping)=>{
-                    if (cfbMapping.timeset_id === null && cfbMapping.sourceset_id === null) {
+                    if (cfbMapping.timeset === options.timeset && cfbMapping.sourceset_id === null) {
+                        cfbTimeset = cfbMapping.timeset_id;
                         cfbPromises.push(getDestinationsetById(cfbMapping.destinationset_id));
                     }
                 });
@@ -119,9 +125,9 @@ export function loadAlwaysEverybodyDestinations(subscriberId) {
                 Promise.all(cfbPromises)
             ]);
         }).then((res)=>{
-            addGroupNames(res[0], 'cfu');
-            addGroupNames(res[1], 'cfna');
-            addGroupNames(res[2], 'cfb');
+            addGroupNamesAndTimeset({ group: res[0], groupName: 'cfu', timesetId: cfuTimeset });
+            addGroupNamesAndTimeset({ group: res[1], groupName: 'cfna', timesetId: cfnaTimeset });
+            addGroupNamesAndTimeset({ group: res[2], groupName: 'cfb', timesetId: cfbTimeset });
             resolve({
                 online: res[0],
                 offline: res[1],
@@ -133,11 +139,12 @@ export function loadAlwaysEverybodyDestinations(subscriberId) {
     });
 }
 
-export function addGroupNames(group, groupName) {
-    group.forEach(destinationset => {
-        destinationset.groupName = groupName;
+export function addGroupNamesAndTimeset(options) {
+    options.group.forEach(destinationset => {
+        destinationset.groupName = options.groupName;
+        destinationset.timesetId = options.timesetId;
     });
-    return group;
+    return options.group;
 }
 
 export function getDestinationsetById(id) {
@@ -247,18 +254,17 @@ export function addDestinationToEmptyGroup(options) {
             return addDestinationToDestinationset({
                 id: id, data: [options.data]
             });
-        //}).then(() => {
-        //    return getMappings(subscriberId);
-        //}).then((mappings) => {
-        //    return addNewMapping({
-        //        destinationsetId: destinationsetId,
-        //        group: options.groupName,
-        //        subscriberId: options.subscriberId,
-        //        mappings: mappings
-        //    });
         }).then(() => {
+            return getMappings(options.subscriberId);
+        }).then((mappings) => {
+            let updatedMappings = mappings[options.groupName];
+            updatedMappings.push({
+                destinationset_id: destinationsetId,
+                sourceset_id: null,
+                timeset_id: options.timesetId
+            });
             return addNewMapping({
-                destinationsetId: destinationsetId,
+                mappings: updatedMappings,
                 group: options.groupName,
                 subscriberId: options.subscriberId
             });
@@ -271,19 +277,12 @@ export function addDestinationToEmptyGroup(options) {
 }
 
 export function addNewMapping(options) {
-    let headers = {
-        'Content-Type': 'application/json-patch+json'
-    };
+    let headers = { 'Content-Type': 'application/json-patch+json' };
     return new Promise((resolve, reject) => {
-        let mappingsToSend = [{
-            destinationset_id: options.destinationsetId,
-            sourceset_id: null,
-            timeset_id: null
-        }];
         Vue.http.patch('/api/cfmappings/' + options.subscriberId, [{
             op: 'replace',
             path: '/' + options.group,
-            value: mappingsToSend
+            value: options.mappings
         }], { headers: headers }).then(result => {
             resolve(result);
         }).catch(err => {
diff --git a/src/components/pages/CallForward/Always.vue b/src/components/pages/CallForward/Always.vue
index d028176e..2325a689 100644
--- a/src/components/pages/CallForward/Always.vue
+++ b/src/components/pages/CallForward/Always.vue
@@ -4,16 +4,19 @@
             <csc-destinations :title="$t('pages.callForward.whenOnline')"
                 :group="destinations.online"
                 group-name="cfu"
+                timeset="null"
                 icon="signal_wifi_4_bar">
             </csc-destinations>
             <csc-destinations :title="$t('pages.callForward.whenBusy')"
                 :group="destinations.busy"
                 group-name="cfb"
+                timeset="null"
                 icon="record_voice_over">
             </csc-destinations>
             <csc-destinations :title="$t('pages.callForward.whenOffline')"
                 :group="destinations.offline"
                 group-name="cfna"
+                timeset="null"
                 icon="signal_wifi_off">
             </csc-destinations>
         </q-card>
@@ -21,11 +24,15 @@
 </template>
 
 <script>
+    import numberFormat from '../../../filters/number-format'
+    import { mapState } from 'vuex'
+    import { startLoading, stopLoading,
+        showGlobalError, showToast } from '../../../helpers/ui'
     import CscPage from '../../CscPage'
     import CscDestinations from './CscDestinations'
     import { QCard } from 'quasar-framework'
     export default {
-        mounted() {
+        created() {
             this.$store.dispatch('callForward/loadAlwaysEverybodyDestinations');
         },
         data () {
@@ -38,8 +45,58 @@
             CscDestinations
         },
         computed: {
-            destinations() {
-                return this.$store.state.callForward.alwaysEverybodyDestinations;
+            ...mapState('callForward', {
+                removeDestinationState: 'removeDestinationState',
+                addDestinationState: 'addDestinationState',
+                changeDestinationState: 'changeDestinationState',
+                destinations: 'alwaysEverybodyDestinations',
+                lastRemovedDestination: 'lastRemovedDestination',
+                lastAddedDestination: 'lastAddedDestination',
+                addDestinationError(state) {
+                    return state.addDestinationError ||
+                        this.$t('pages.callForward.addErrorMessage');
+                }
+            })
+        },
+        watch: {
+            removeDestinationState(state) {
+                if (state === 'requesting') {
+                    startLoading();
+                } else if (state === 'failed') {
+                    stopLoading();
+                    showGlobalError(this.removeDestinationError);
+                } else if (state === 'succeeded') {
+                    stopLoading();
+                    showToast(this.$t('pages.callForward.removeSuccessMessage', {
+                        destination: this.lastRemovedDestination
+                    }));
+                    this.$store.dispatch('callForward/loadAlwaysEverybodyDestinations');
+                }
+            },
+            addDestinationState(state) {
+                if (state === 'requesting') {
+                    startLoading();
+                } else if (state === 'failed') {
+                    stopLoading();
+                    showGlobalError(this.addDestinationError);
+                } else if (state === 'succeeded') {
+                    stopLoading();
+                    showToast(this.$t('pages.callForward.addDestinationSuccessMessage', {
+                        destination: this.lastAddedDestination
+                    }));
+                    this.$store.dispatch('callForward/loadAlwaysEverybodyDestinations');
+                }
+            },
+            changeDestinationState(state) {
+                if (state === 'requesting') {
+                    startLoading();
+                } else if (state === 'failed') {
+                    stopLoading();
+                    showGlobalError(this.changeDestinationError);
+                } else if (state === 'succeeded') {
+                    stopLoading();
+                    this.$store.dispatch('callForward/loadAlwaysEverybodyDestinations');
+                }
             }
         }
     }
diff --git a/src/components/pages/CallForward/CompanyHours.vue b/src/components/pages/CallForward/CompanyHours.vue
index bacbe6ff..ff6e50b2 100644
--- a/src/components/pages/CallForward/CompanyHours.vue
+++ b/src/components/pages/CallForward/CompanyHours.vue
@@ -1,19 +1,106 @@
 <template>
     <csc-page :title="$t('pages.callForward.titles.companyHours')">
+        <q-card class="dest-card">
+            <csc-destinations :title="$t('pages.callForward.whenOnline')"
+                :group="destinations.online"
+                group-name="cfu"
+                timeset="Company Hours"
+                icon="signal_wifi_4_bar">
+            </csc-destinations>
+            <csc-destinations :title="$t('pages.callForward.whenBusy')"
+                :group="destinations.busy"
+                group-name="cfb"
+                timeset="Company Hours"
+                icon="record_voice_over">
+            </csc-destinations>
+            <csc-destinations :title="$t('pages.callForward.whenOffline')"
+                :group="destinations.offline"
+                group-name="cfna"
+                timeset="Company Hours"
+                icon="signal_wifi_off">
+            </csc-destinations>
+        </q-card>
     </csc-page>
 </template>
 
 <script>
+    import numberFormat from '../../../filters/number-format'
+    import { mapState } from 'vuex'
+    import { startLoading, stopLoading,
+        showGlobalError, showToast } from '../../../helpers/ui'
     import CscPage from '../../CscPage'
+    import CscDestinations from './CscDestinations'
+    import { QCard } from 'quasar-framework'
     export default {
+        created() {
+            this.$store.dispatch('callForward/loadCompanyHoursEverybodyDestinations');
+        },
         data () {
-            return {}
+            return {
+            }
         },
         components: {
-            CscPage
+            QCard,
+            CscPage,
+            CscDestinations
+        },
+        computed: {
+            ...mapState('callForward', {
+                removeDestinationState: 'removeDestinationState',
+                addDestinationState: 'addDestinationState',
+                changeDestinationState: 'changeDestinationState',
+                destinations: 'companyHoursEverybodyDestinations',
+                lastRemovedDestination: 'lastRemovedDestination',
+                lastAddedDestination: 'lastAddedDestination',
+                addDestinationError(state) {
+                    return state.addDestinationError ||
+                        this.$t('pages.callForward.addErrorMessage');
+                }
+            })
+        },
+        watch: {
+            removeDestinationState(state) {
+                if (state === 'requesting') {
+                    startLoading();
+                } else if (state === 'failed') {
+                    stopLoading();
+                    showGlobalError(this.removeDestinationError);
+                } else if (state === 'succeeded') {
+                    stopLoading();
+                    showToast(this.$t('pages.callForward.removeSuccessMessage', {
+                        destination: this.lastRemovedDestination
+                    }));
+                    this.$store.dispatch('callForward/loadCompanyHoursEverybodyDestinations');
+                }
+            },
+            addDestinationState(state) {
+                if (state === 'requesting') {
+                    startLoading();
+                } else if (state === 'failed') {
+                    stopLoading();
+                    showGlobalError(this.addDestinationError);
+                } else if (state === 'succeeded') {
+                    stopLoading();
+                    showToast(this.$t('pages.callForward.addDestinationSuccessMessage', {
+                        destination: this.lastAddedDestination
+                    }));
+                    this.$store.dispatch('callForward/loadCompanyHoursEverybodyDestinations');
+                }
+            },
+            changeDestinationState(state) {
+                if (state === 'requesting') {
+                    startLoading();
+                } else if (state === 'failed') {
+                    stopLoading();
+                    showGlobalError(this.changeDestinationError);
+                } else if (state === 'succeeded') {
+                    stopLoading();
+                    this.$store.dispatch('callForward/loadCompanyHoursEverybodyDestinations');
+                }
+            }
         }
     }
 </script>
 
-<style>
+<style lang="stylus">
 </style>
diff --git a/src/components/pages/CallForward/CscAddDestinationForm.vue b/src/components/pages/CallForward/CscAddDestinationForm.vue
index da09c956..e0cf8734 100644
--- a/src/components/pages/CallForward/CscAddDestinationForm.vue
+++ b/src/components/pages/CallForward/CscAddDestinationForm.vue
@@ -54,7 +54,9 @@
             'destinations',
             'id',
             'groupName',
-            'priority'
+            'priority',
+            'timeset',
+            'timesetId'
         ],
         data () {
             return {
@@ -81,9 +83,7 @@
             ...mapState('callForward', [
                 'activeForm',
                 'formType',
-                'addDestinationState',
-                'addDestinationError',
-                'lastAddedDestination'
+                'addDestinationState'
             ]),
             ...mapGetters('callForward', [
                 'hasFaxCapability'
@@ -97,9 +97,6 @@
             addDestinationIsRequesting() {
                 return this.addDestinationState === 'requesting';
             },
-            addDestinationError() {
-                return this.$store.state.callForward.addDestinationError || this.$t('pages.callForward.addErrorMessage');
-            },
             beforeIconTimeout() {
                 return [{
                     icon: 'schedule'
@@ -113,17 +110,8 @@
         },
         watch: {
             addDestinationState(state) {
-                if (state === 'failed') {
-                    stopLoading();
-                    showGlobalError(this.addDestinationError);
-                } else if (state === 'succeeded') {
-                    stopLoading();
-                    showToast(this.$t('pages.callForward.addDestinationSuccessMessage', {
-                        destination: this.lastAddedDestination
-                    }));
+                if (state === 'succeeded') {
                     this.disableForm();
-                } else if (state === 'button') {
-                    stopLoading();
                 }
             }
         },
@@ -155,7 +143,9 @@
                 startLoading();
                 this.$store.dispatch('callForward/addDestination', {
                     form: this.destinationForm,
-                    destinations: this.destinations
+                    destinations: this.destinations,
+                    timeset: this.timeset,
+                    timesetId: this.timesetId
                 });
             }
         }
diff --git a/src/components/pages/CallForward/CscDestination.vue b/src/components/pages/CallForward/CscDestination.vue
index f05f7f5a..2a76565f 100644
--- a/src/components/pages/CallForward/CscDestination.vue
+++ b/src/components/pages/CallForward/CscDestination.vue
@@ -119,9 +119,10 @@
             },
             deleteDestination(index) {
                 let clonedDestinations = _.cloneDeep(this.destinations);
+                let clonedDestination = clonedDestinations[index].destination;
                 let indexInt = parseInt(index);
                 let store = this.$store;
-                let removeDestination = numberFormat(this.destinations[index].destination);
+                let removeDestination = numberFormat(clonedDestination);
                 let self = this;
                 let isLastDestination = this.destinations.length === 1;
                 clonedDestinations.splice(indexInt, 1);
@@ -139,14 +140,9 @@
                                 store.dispatch('callForward/deleteDestinationFromDestinationset', {
                                     id: self.id,
                                     data: clonedDestinations,
-                                    deleteDestinationset: isLastDestination }).then((result) => {
-                                        store.dispatch('callForward/loadAlwaysEverybodyDestinations');
-                                        showToast(self.$t('pages.callForward.removeSuccessMessage', {
-                                            destination: removeDestination
-                                        }));
-                                    }).catch((err) => {
-                                        showToast(self.$t('pages.callForward.removeErrorMessage'));
-                                    });
+                                    deleteDestinationset: isLastDestination,
+                                    removeDestination: removeDestination
+                                })
                             }
                         }
                     ]
diff --git a/src/components/pages/CallForward/CscDestinations.vue b/src/components/pages/CallForward/CscDestinations.vue
index bc365ece..6ed8cb52 100644
--- a/src/components/pages/CallForward/CscDestinations.vue
+++ b/src/components/pages/CallForward/CscDestinations.vue
@@ -39,7 +39,8 @@
             'title',
             'icon',
             'group',
-            'groupName'
+            'groupName',
+            'timeset'
         ],
         components: {
             QCardTitle,
@@ -54,6 +55,8 @@
             lastDestinationset() {
                 let destinationset = _.findLast(this.group) || {};
                 destinationset.groupName = this.groupName;
+                destinationset.priority = destinationset.lowestPriority || 1;
+                destinationset.timeset = this.timeset;
                 return destinationset;
             }
         },
diff --git a/src/store/call-forward.js b/src/store/call-forward.js
index 651a430b..1c9bd289 100644
--- a/src/store/call-forward.js
+++ b/src/store/call-forward.js
@@ -3,7 +3,7 @@
 import _ from 'lodash'; import { getSourcesets, getDestinationsets,
     getTimesets,
     getMappings,
-    loadAlwaysEverybodyDestinations,
+    loadAlwaysDestinations,
     deleteDestinationFromDestinationset,
     addDestinationToDestinationset,
     addDestinationToEmptyGroup,
@@ -12,14 +12,7 @@ import _ from 'lodash'; import { getSourcesets, getDestinationsets,
     moveDestinationUp,
     moveDestinationDown } from '../api/call-forward';
 
-const AddDestinationState = {
-    button: 'button',
-    requesting: 'requesting',
-    succeeded: 'succeeded',
-    failed: 'failed'
-};
-
-const ChangeDestinationState = {
+const DestinationState = {
     button: 'button',
     requesting: 'requesting',
     succeeded: 'succeeded',
@@ -34,13 +27,22 @@ export default {
         timesets: null,
         destinationsets: null,
         alwaysEverybodyDestinations: {
-            online: [{}],
-            busy: [{}],
-            offline: [{}]
-        },
-        addDestinationState: AddDestinationState.button,
+            online: [],
+            busy: [],
+            offline: []
+        },
+        companyHoursEverybodyDestinations: {
+            online: [],
+            busy: [],
+            offline: []
+        },
+        removeDestinationState: DestinationState.button,
+        removeDestinationError: null,
+        lastRemovedDestination: null,
+        addDestinationState: DestinationState.button,
         addDestinationError: null,
-        changeDestinationState: ChangeDestinationState.button,
+        lastAddedDestination: null,
+        changeDestinationState: DestinationState.button,
         changeDestinationError: null,
         activeForm: '',
         formType: '',
@@ -51,8 +53,7 @@ export default {
             destination: '',
             priority: 1,
             timeout: ''
-        },
-        lastAddedDestination: null
+        }
     },
     getters: {
         hasFaxCapability(state, getters, rootState, rootGetters) {
@@ -72,6 +73,17 @@ export default {
         },
         getDestinationsetId(state) {
             return state.destinationsetId;
+        },
+        getCompanyHoursId(state) {
+            let timeset;
+            for (let group in state.companyHoursEverybodyDestinations) {
+                if (!timeset) {
+                    timeset = _.find(state.companyHoursEverybodyDestinations[group], (o) => {
+                        return o.timesetId > 0;
+                    });
+                };
+            };
+            return timeset ? timeset.timesetId : null;
         }
     },
     mutations: {
@@ -90,6 +102,9 @@ export default {
         loadAlwaysEverybodyDestinations(state, result) {
             state.alwaysEverybodyDestinations = result;
         },
+        loadCompanyHoursEverybodyDestinations(state, result) {
+            state.companyHoursEverybodyDestinations = result;
+        },
         setActiveForm(state, value) {
             state.activeForm = value;
         },
@@ -121,31 +136,48 @@ export default {
             state.formType = '';
             state.destinationsetId = '';
             state.groupName = '';
-            state.addDestinationState = AddDestinationState.button;
+            state.addDestinationState = DestinationState.button;
+            state.changeDestinationState = DestinationState.button;
+            state.removeDestinationState = DestinationState.button;
         },
         addDestinationRequesting(state) {
-            state.addDestinationState = AddDestinationState.requesting;
+            state.addDestinationState = DestinationState.requesting;
             state.addDestinationError = null;
         },
         addDestinationSucceeded(state) {
-            state.addDestinationState = AddDestinationState.succeeded;
+            state.addDestinationState = DestinationState.succeeded;
             state.addDestinationError = null;
         },
         addDestinationFailed(state, error) {
-            state.addDestinationState = AddDestinationState.failed;
+            state.addDestinationState = DestinationState.failed;
             state.addDestinationError = error;
         },
         changeDestinationRequesting(state) {
-            state.changeDestinationState = ChangeDestinationState.requesting;
+            state.changeDestinationState = DestinationState.requesting;
             state.changeDestinationError = null;
         },
         changeDestinationSucceeded(state) {
-            state.changeDestinationState = ChangeDestinationState.succeeded;
+            state.changeDestinationState = DestinationState.succeeded;
             state.changeDestinationError = null;
         },
         changeDestinationFailed(state, error) {
-            state.changeDestinationState = ChangeDestinationState.failed;
+            state.changeDestinationState = DestinationState.failed;
             state.changeDestinationError = error;
+        },
+        removeDestinationRequesting(state) {
+            state.removeDestinationState = DestinationState.requesting;
+            state.removeDestinationError = null;
+        },
+        removeDestinationSucceeded(state) {
+            state.removeDestinationState = DestinationState.succeeded;
+            state.removeDestinationError = null;
+        },
+        removeDestinationFailed(state, error) {
+            state.removeDestinationState = DestinationState.failed;
+            state.removeDestinationError = error;
+        },
+        setLastRemovedDestination(state, value) {
+            state.lastRemovedDestination = value;
         }
     },
     actions: {
@@ -191,18 +223,34 @@ export default {
         },
         loadAlwaysEverybodyDestinations(context) {
             return new Promise((resolve, reject)=>{
-                loadAlwaysEverybodyDestinations(localStorage.getItem('subscriberId')).then((result)=>{
+                loadAlwaysDestinations({
+                    subscriberId: localStorage.getItem('subscriberId'),
+                    timeset: null
+                        }).then((result)=>{
                     context.commit('loadAlwaysEverybodyDestinations', result);
                 })
             });
         },
+        loadCompanyHoursEverybodyDestinations(context) {
+            return new Promise((resolve, reject)=>{
+                loadAlwaysDestinations({
+                    subscriberId: localStorage.getItem('subscriberId'),
+                    timeset: 'Company Hours'
+                        }).then((result)=>{
+                    context.commit('loadCompanyHoursEverybodyDestinations', result);
+                })
+            });
+        },
         deleteDestinationFromDestinationset(context, options) {
+            let removedDestination = options.removeDestination;
+            context.commit('removeDestinationRequesting');
             return new Promise((resolve, reject) => {
                 deleteDestinationFromDestinationset(options)
-                    .then((result) => {
-                        resolve(result);
+                    .then(() => {
+                        context.commit('setLastRemovedDestination', removedDestination);
+                        context.commit('removeDestinationSucceeded');
                     }).catch((err) => {
-                        reject(err);
+                        context.commit('removeDestinationFailed', err.message);
                     });
             });
         },
@@ -220,6 +268,12 @@ export default {
             let form = _.clone(context.getters.getForm);
             let updatedOptions;
             let type = context.getters.getFormType;
+            let timeset = null;
+            if (options.timeset === 'Company Hours') {
+                timeset = context.getters.getCompanyHoursId;
+            } else if (options.timeset === 'After Hours') {
+                timeset = context.getters.getAfterHoursId;
+            };
             context.commit('addDestinationRequesting');
             if (type !== 'number') {
                 delete form.timeout;
@@ -232,14 +286,14 @@ export default {
                 subscriberId: context.getters.getSubscriberId,
                 data: form,
                 groupName: context.getters.getGroupName,
-                id: context.getters.getDestinationsetId
+                id: context.getters.getDestinationsetId,
+                timesetId: timeset
             };
             if (options.destinations) {
                 return new Promise((resolve, reject) => {
                     addDestinationToExistingGroup(updatedOptions).then(() => {
                         context.commit('setLastAddedDestination', options.form.destination);
                         context.commit('addDestinationSucceeded');
-                        context.dispatch('loadAlwaysEverybodyDestinations');
                     }).catch((err) => {
                         context.commit('addDestinationFailed', err.message);
                     });
@@ -247,8 +301,8 @@ export default {
             } else {
                 return new Promise((resolve, reject) => {
                     addDestinationToEmptyGroup(updatedOptions).then((result) => {
+                        context.commit('setLastAddedDestination', options.form.destination);
                         context.commit('addDestinationSucceeded');
-                        context.dispatch('loadAlwaysEverybodyDestinations');
                     }).catch((err) => {
                         context.commit('addDestinationFailed', err.message);
                     });
@@ -269,7 +323,6 @@ export default {
                         destination: clonedDestination
                     }).then(() => {
                         context.commit('changeDestinationSucceeded');
-                        context.dispatch('loadAlwaysEverybodyDestinations');
                     }).catch((err) => {
                         context.commit('changeDestinationFailed', err.message);
                     });
@@ -282,7 +335,6 @@ export default {
                         destination: clonedDestination
                     }).then(() => {
                         context.commit('changeDestinationSucceeded');
-                        context.dispatch('loadAlwaysEverybodyDestinations');
                     }).catch((err) => {
                         context.commit('changeDestinationFailed', err.message);
                     });
@@ -306,7 +358,6 @@ export default {
                         subscriberId: context.getters.getSubscriberId
                     }).then(() => {
                         context.commit('changeDestinationSucceeded');
-                        context.dispatch('loadAlwaysEverybodyDestinations');
                     }).catch((err) => {
                         context.commit('changeDestinationFailed', err.message);
                     });
diff --git a/t/store/call-forward.js b/t/store/call-forward.js
index 04f31470..1a4d1e8d 100644
--- a/t/store/call-forward.js
+++ b/t/store/call-forward.js
@@ -50,6 +50,36 @@ describe('CallForward', function(){
         };
         CallForwardModule.mutations.resetFormState(state);
         assert.deepEqual(state.form, data);
+
+    it('should load always company hours destinations', function(){
+        let state = {
+            alwaysCompanyHoursDestinations: [
+            ]
+        };
+        let data = {
+            busy: [],
+            offline: [{
+                destinations: [{
+                    "announcement_id": null,
+                    "destination": "sip:3333@192.168.178.23",
+                    "priority": 1,
+                    "simple_destination": "3333",
+                    "timeout": 60
+                },
+                {
+                    "announcement_id": null,
+                    "destination": "sip:2222@192.168.178.23",
+                    "priority": 1,
+                    "simple_destination": "2222",
+                    "timeout": 300
+                }],
+                id: 3,
+                name: "csc_destinationset_1"
+            }],
+            online: []
+        };
+        CallForwardModule.mutations.loadAlwaysCompanyHoursDestinations(state, data);
+        assert.deepEqual(state.alwaysCompanyHoursDestinations, data);
     });
 
 });