mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-11-03 22:13:18 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			241 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			241 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import axios from 'axios'
 | 
						|
import { defineStore } from 'pinia'
 | 
						|
import { handleError } from '@/scripts/helpers/error-handling'
 | 
						|
import { useNotificationStore } from '@/scripts/stores/notification'
 | 
						|
import expenseStub from '@/scripts/admin/stub/expense'
 | 
						|
import utils from '@/scripts/helpers/utilities'
 | 
						|
 | 
						|
export const useExpenseStore = (useWindow = false) => {
 | 
						|
  const defineStoreFunc = useWindow ? window.pinia.defineStore : defineStore
 | 
						|
  const { global } = window.i18n
 | 
						|
 | 
						|
  return defineStoreFunc({
 | 
						|
    id: 'expense',
 | 
						|
 | 
						|
    state: () => ({
 | 
						|
      expenses: [],
 | 
						|
      totalExpenses: 0,
 | 
						|
      selectAllField: false,
 | 
						|
      selectedExpenses: [],
 | 
						|
      paymentModes: [],
 | 
						|
      showExchangeRate: false,
 | 
						|
      currentExpense: {
 | 
						|
        ...expenseStub,
 | 
						|
      },
 | 
						|
    }),
 | 
						|
 | 
						|
    getters: {
 | 
						|
      getCurrentExpense: (state) => state.currentExpense,
 | 
						|
      getSelectedExpenses: (state) => state.selectedExpenses,
 | 
						|
    },
 | 
						|
 | 
						|
    actions: {
 | 
						|
      resetCurrentExpenseData() {
 | 
						|
        this.currentExpense = {
 | 
						|
          ...expenseStub,
 | 
						|
        }
 | 
						|
      },
 | 
						|
 | 
						|
      fetchExpenses(params) {
 | 
						|
        return new Promise((resolve, reject) => {
 | 
						|
          axios
 | 
						|
            .get(`/api/v1/expenses`, { params })
 | 
						|
            .then((response) => {
 | 
						|
              this.expenses = response.data.data
 | 
						|
              this.totalExpenses = response.data.meta.expense_total_count
 | 
						|
              resolve(response)
 | 
						|
            })
 | 
						|
            .catch((err) => {
 | 
						|
              handleError(err)
 | 
						|
              reject(err)
 | 
						|
            })
 | 
						|
        })
 | 
						|
      },
 | 
						|
 | 
						|
      fetchExpense(id) {
 | 
						|
        return new Promise((resolve, reject) => {
 | 
						|
          axios
 | 
						|
            .get(`/api/v1/expenses/${id}`)
 | 
						|
            .then((response) => {
 | 
						|
              if (response.data) {
 | 
						|
                Object.assign(this.currentExpense, response.data.data)
 | 
						|
                this.currentExpense.selectedCurrency =
 | 
						|
                  response.data.data.currency
 | 
						|
                this.currentExpense.attachment_receipt = null
 | 
						|
                if (response.data.data.attachment_receipt_url) {
 | 
						|
                  if (
 | 
						|
                    utils.isImageFile(
 | 
						|
                      response.data.data.attachment_receipt_meta.mime_type
 | 
						|
                    )
 | 
						|
                  ) {
 | 
						|
                    this.currentExpense.receiptFiles = [
 | 
						|
                      { image: `/reports/expenses/${id}/receipt?${response.data.data.attachment_receipt_meta.uuid}` },
 | 
						|
                    ]
 | 
						|
                  } else {
 | 
						|
                    this.currentExpense.receiptFiles = [
 | 
						|
                      {
 | 
						|
                        type: 'document',
 | 
						|
                        name: response.data.data.attachment_receipt_meta
 | 
						|
                          .file_name,
 | 
						|
                      },
 | 
						|
                    ]
 | 
						|
                  }
 | 
						|
                } else {
 | 
						|
                  this.currentExpense.receiptFiles = []
 | 
						|
                }
 | 
						|
              }
 | 
						|
              resolve(response)
 | 
						|
            })
 | 
						|
            .catch((err) => {
 | 
						|
              handleError(err)
 | 
						|
              reject(err)
 | 
						|
            })
 | 
						|
        })
 | 
						|
      },
 | 
						|
 | 
						|
      addExpense(data) {
 | 
						|
        const formData = utils.toFormData(data)
 | 
						|
 | 
						|
        return new Promise((resolve, reject) => {
 | 
						|
          axios
 | 
						|
            .post('/api/v1/expenses', formData)
 | 
						|
            .then((response) => {
 | 
						|
              this.expenses.push(response.data)
 | 
						|
 | 
						|
              const notificationStore = useNotificationStore()
 | 
						|
 | 
						|
              notificationStore.showNotification({
 | 
						|
                type: 'success',
 | 
						|
                message: global.t('expenses.created_message'),
 | 
						|
              })
 | 
						|
 | 
						|
              resolve(response)
 | 
						|
            })
 | 
						|
            .catch((err) => {
 | 
						|
              handleError(err)
 | 
						|
              reject(err)
 | 
						|
            })
 | 
						|
        })
 | 
						|
      },
 | 
						|
 | 
						|
      updateExpense({ id, data, isAttachmentReceiptRemoved }) {
 | 
						|
        const notificationStore = useNotificationStore()
 | 
						|
 | 
						|
        const formData = utils.toFormData(data)
 | 
						|
 | 
						|
        formData.append('_method', 'PUT')
 | 
						|
        formData.append('is_attachment_receipt_removed', isAttachmentReceiptRemoved)
 | 
						|
 | 
						|
        return new Promise((resolve) => {
 | 
						|
          axios.post(`/api/v1/expenses/${id}`, formData).then((response) => {
 | 
						|
            let pos = this.expenses.findIndex(
 | 
						|
              (expense) => expense.id === response.data.id
 | 
						|
            )
 | 
						|
 | 
						|
            this.expenses[pos] = data.expense
 | 
						|
 | 
						|
            notificationStore.showNotification({
 | 
						|
              type: 'success',
 | 
						|
              message: global.t('expenses.updated_message'),
 | 
						|
            })
 | 
						|
 | 
						|
            resolve(response)
 | 
						|
          })
 | 
						|
        }).catch((err) => {
 | 
						|
          handleError(err)
 | 
						|
          reject(err)
 | 
						|
        })
 | 
						|
      },
 | 
						|
 | 
						|
      setSelectAllState(data) {
 | 
						|
        this.selectAllField = data
 | 
						|
      },
 | 
						|
 | 
						|
      selectExpense(data) {
 | 
						|
        this.selectedExpenses = data
 | 
						|
        if (this.selectedExpenses.length === this.expenses.length) {
 | 
						|
          this.selectAllField = true
 | 
						|
        } else {
 | 
						|
          this.selectAllField = false
 | 
						|
        }
 | 
						|
      },
 | 
						|
 | 
						|
      selectAllExpenses(data) {
 | 
						|
        if (this.selectedExpenses.length === this.expenses.length) {
 | 
						|
          this.selectedExpenses = []
 | 
						|
          this.selectAllField = false
 | 
						|
        } else {
 | 
						|
          let allExpenseIds = this.expenses.map((expense) => expense.id)
 | 
						|
          this.selectedExpenses = allExpenseIds
 | 
						|
          this.selectAllField = true
 | 
						|
        }
 | 
						|
      },
 | 
						|
 | 
						|
      deleteExpense(id) {
 | 
						|
        const notificationStore = useNotificationStore()
 | 
						|
 | 
						|
        return new Promise((resolve, reject) => {
 | 
						|
          axios
 | 
						|
            .post(`/api/v1/expenses/delete`, id)
 | 
						|
            .then((response) => {
 | 
						|
              let index = this.expenses.findIndex(
 | 
						|
                (expense) => expense.id === id
 | 
						|
              )
 | 
						|
              this.expenses.splice(index, 1)
 | 
						|
 | 
						|
              notificationStore.showNotification({
 | 
						|
                type: 'success',
 | 
						|
                message: global.tc('expenses.deleted_message', 1),
 | 
						|
              })
 | 
						|
              resolve(response)
 | 
						|
            })
 | 
						|
            .catch((err) => {
 | 
						|
              handleError(err)
 | 
						|
              reject(err)
 | 
						|
            })
 | 
						|
        })
 | 
						|
      },
 | 
						|
 | 
						|
      deleteMultipleExpenses() {
 | 
						|
        const notificationStore = useNotificationStore()
 | 
						|
 | 
						|
        return new Promise((resolve, reject) => {
 | 
						|
          axios
 | 
						|
            .post(`/api/v1/expenses/delete`, { ids: this.selectedExpenses })
 | 
						|
            .then((response) => {
 | 
						|
              this.selectedExpenses.forEach((expense) => {
 | 
						|
                let index = this.expenses.findIndex(
 | 
						|
                  (_expense) => _expense.id === expense.id
 | 
						|
                )
 | 
						|
                this.expenses.splice(index, 1)
 | 
						|
              })
 | 
						|
              notificationStore.showNotification({
 | 
						|
                type: 'success',
 | 
						|
                message: global.tc('expenses.deleted_message', 2),
 | 
						|
              })
 | 
						|
              resolve(response)
 | 
						|
            })
 | 
						|
            .catch((err) => {
 | 
						|
              handleError(err)
 | 
						|
              reject(err)
 | 
						|
            })
 | 
						|
        })
 | 
						|
      },
 | 
						|
      fetchPaymentModes(params) {
 | 
						|
        return new Promise((resolve, reject) => {
 | 
						|
          axios
 | 
						|
            .get(`/api/v1/payment-methods`, { params })
 | 
						|
            .then((response) => {
 | 
						|
              this.paymentModes = response.data.data
 | 
						|
              resolve(response)
 | 
						|
            })
 | 
						|
            .catch((err) => {
 | 
						|
              handleError(err)
 | 
						|
              reject(err)
 | 
						|
            })
 | 
						|
        })
 | 
						|
      },
 | 
						|
    },
 | 
						|
  })()
 | 
						|
}
 |