mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-10-28 12:11:08 -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 }
 | |
|       },
 | |
|     },
 | |
|   })()
 | |
| }
 |