mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-27 11:41:09 -04:00
258 lines
7.6 KiB
JavaScript
258 lines
7.6 KiB
JavaScript
import axios from 'axios'
|
|
import { defineStore } from 'pinia'
|
|
import { useRoute } from 'vue-router'
|
|
import { handleError } from '@/scripts/helpers/error-handling'
|
|
import { useNotificationStore } from '@/scripts/stores/notification'
|
|
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
|
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
|
import addressStub from '@/scripts/admin/stub/address.js'
|
|
import customerStub from '@/scripts/admin/stub/customer'
|
|
|
|
export const useCustomerStore = (useWindow = false) => {
|
|
const defineStoreFunc = useWindow ? window.pinia.defineStore : defineStore
|
|
const { global } = window.i18n
|
|
|
|
return defineStoreFunc({
|
|
id: 'customer',
|
|
state: () => ({
|
|
customers: [],
|
|
totalCustomers: 0,
|
|
selectAllField: false,
|
|
selectedCustomers: [],
|
|
selectedViewCustomer: {},
|
|
isFetchingInitialSettings: false,
|
|
isFetchingViewData: false,
|
|
currentCustomer: {
|
|
...customerStub(),
|
|
},
|
|
editCustomer: null
|
|
}),
|
|
|
|
getters: {
|
|
isEdit: (state) => (state.currentCustomer.id ? true : false),
|
|
},
|
|
|
|
actions: {
|
|
resetCurrentCustomer() {
|
|
this.currentCustomer = {
|
|
...customerStub(),
|
|
}
|
|
},
|
|
|
|
copyAddress() {
|
|
this.currentCustomer.shipping = {
|
|
...this.currentCustomer.billing,
|
|
type: 'shipping',
|
|
}
|
|
},
|
|
|
|
fetchCustomerInitialSettings(isEdit) {
|
|
const route = useRoute()
|
|
const globalStore = useGlobalStore()
|
|
const companyStore = useCompanyStore()
|
|
|
|
this.isFetchingInitialSettings = true
|
|
let editActions = []
|
|
if (isEdit) {
|
|
editActions = [this.fetchCustomer(route.params.id)]
|
|
} else {
|
|
this.currentCustomer.currency_id =
|
|
companyStore.selectedCompanyCurrency.id
|
|
}
|
|
|
|
Promise.all([
|
|
globalStore.fetchCurrencies(),
|
|
globalStore.fetchCountries(),
|
|
...editActions,
|
|
])
|
|
.then(async ([res1, res2, res3]) => {
|
|
this.isFetchingInitialSettings = false
|
|
})
|
|
.catch((error) => {
|
|
handleError(error)
|
|
})
|
|
},
|
|
|
|
fetchCustomers(params) {
|
|
return new Promise((resolve, reject) => {
|
|
axios
|
|
.get(`/api/v1/customers`, { params })
|
|
.then((response) => {
|
|
this.customers = response.data.data
|
|
this.totalCustomers = response.data.meta.customer_total_count
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
})
|
|
},
|
|
|
|
fetchViewCustomer(params) {
|
|
return new Promise((resolve, reject) => {
|
|
this.isFetchingViewData = true
|
|
axios
|
|
.get(`/api/v1/customers/${params.id}/stats`, { params })
|
|
|
|
.then((response) => {
|
|
this.selectedViewCustomer = {}
|
|
Object.assign(this.selectedViewCustomer, response.data.data)
|
|
this.setAddressStub(response.data.data)
|
|
this.isFetchingViewData = false
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
this.isFetchingViewData = false
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
})
|
|
},
|
|
|
|
fetchCustomer(id) {
|
|
return new Promise((resolve, reject) => {
|
|
axios
|
|
.get(`/api/v1/customers/${id}`)
|
|
.then((response) => {
|
|
Object.assign(this.currentCustomer, response.data.data)
|
|
|
|
this.setAddressStub(response.data.data)
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
})
|
|
},
|
|
|
|
addCustomer(data) {
|
|
return new Promise((resolve, reject) => {
|
|
axios
|
|
.post('/api/v1/customers', data)
|
|
.then((response) => {
|
|
this.customers.push(response.data.data)
|
|
|
|
const notificationStore = useNotificationStore()
|
|
notificationStore.showNotification({
|
|
type: 'success',
|
|
message: global.t('customers.created_message'),
|
|
})
|
|
resolve(response)
|
|
})
|
|
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
})
|
|
},
|
|
|
|
updateCustomer(data) {
|
|
return new Promise((resolve, reject) => {
|
|
axios
|
|
.put(`/api/v1/customers/${data.id}`, data)
|
|
.then((response) => {
|
|
if (response.data) {
|
|
let pos = this.customers.findIndex(
|
|
(customer) => customer.id === response.data.data.id
|
|
)
|
|
this.customers[pos] = data
|
|
const notificationStore = useNotificationStore()
|
|
notificationStore.showNotification({
|
|
type: 'success',
|
|
message: global.t('customers.updated_message'),
|
|
})
|
|
}
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
})
|
|
},
|
|
|
|
deleteCustomer(id) {
|
|
const notificationStore = useNotificationStore()
|
|
return new Promise((resolve, reject) => {
|
|
axios
|
|
.post(`/api/v1/customers/delete`, id)
|
|
.then((response) => {
|
|
let index = this.customers.findIndex(
|
|
(customer) => customer.id === id
|
|
)
|
|
this.customers.splice(index, 1)
|
|
notificationStore.showNotification({
|
|
type: 'success',
|
|
message: global.tc('customers.deleted_message', 1),
|
|
})
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
})
|
|
},
|
|
|
|
deleteMultipleCustomers() {
|
|
const notificationStore = useNotificationStore()
|
|
|
|
return new Promise((resolve, reject) => {
|
|
axios
|
|
.post(`/api/v1/customers/delete`, { ids: this.selectedCustomers })
|
|
.then((response) => {
|
|
this.selectedCustomers.forEach((customer) => {
|
|
let index = this.customers.findIndex(
|
|
(_customer) => _customer.id === customer.id
|
|
)
|
|
this.customers.splice(index, 1)
|
|
})
|
|
|
|
notificationStore.showNotification({
|
|
type: 'success',
|
|
message: global.tc('customers.deleted_message', 2),
|
|
})
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
})
|
|
},
|
|
|
|
setSelectAllState(data) {
|
|
this.selectAllField = data
|
|
},
|
|
|
|
selectCustomer(data) {
|
|
this.selectedCustomers = data
|
|
if (this.selectedCustomers.length === this.customers.length) {
|
|
this.selectAllField = true
|
|
} else {
|
|
this.selectAllField = false
|
|
}
|
|
},
|
|
|
|
selectAllCustomers() {
|
|
if (this.selectedCustomers.length === this.customers.length) {
|
|
this.selectedCustomers = []
|
|
this.selectAllField = false
|
|
} else {
|
|
let allCustomerIds = this.customers.map((customer) => customer.id)
|
|
this.selectedCustomers = allCustomerIds
|
|
this.selectAllField = true
|
|
}
|
|
},
|
|
|
|
setAddressStub(data) {
|
|
if (!data.billing) this.currentCustomer.billing = { ...addressStub }
|
|
if (!data.shipping) this.currentCustomer.shipping = { ...addressStub }
|
|
},
|
|
},
|
|
})()
|
|
}
|