aboutsummaryrefslogtreecommitdiff
path: root/src/components/invoice_header.vue
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/invoice_header.vue')
-rw-r--r--src/components/invoice_header.vue118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/components/invoice_header.vue b/src/components/invoice_header.vue
new file mode 100644
index 0000000..2c62f15
--- /dev/null
+++ b/src/components/invoice_header.vue
@@ -0,0 +1,118 @@
+<script setup lang="ts">
+import { ref, toRaw, onMounted } from 'vue'
+import axios from 'axios'
+import { useToast } from 'vue-toast-notification'
+
+const toast = useToast({
+ position: 'top-right'
+})
+
+const isLoading = ref(true)
+const allCustomers = ref([])
+
+const invoiceCustomer = ref(null)
+const invoiceNumber = ref(0)
+const invoiceDate = ref(new Date().toISOString().substr(0, 10))
+
+const handleDateChange = e => {
+ invoiceDate.value = e
+}
+
+const getAllCustomers = async () => {
+ allCustomers.value = []
+ isLoading.value = true
+
+ try {
+ const r = await axios.get('/customer')
+ if (r.status === 200) {
+ allCustomers.value = r.data.data
+ } else if (r.status === 204) {
+ toast.warning('No customers found')
+ }
+ } catch (err) {
+ toast.error('An unhandled exception occoured. Please check logs')
+ console.error(err)
+ }
+
+ isLoading.value = false
+}
+
+const submit = async (e) => {
+ e.preventDefault()
+ isLoading.value = true
+
+ try {
+ const c = toRaw(invoiceCustomer.value)
+
+ await axios.post('/invoice', {
+ "invoicenumber": toRaw(invoiceNumber.value),
+ "invoicedate": new Date(toRaw(invoiceDate.value)).toISOString(),
+ "isdraft": true,
+ "billingaddress": c.BillingAddress,
+ "shippingaddress": c.BillingAddress, // TODO
+ "customername": c.Name,
+ "customergstin": c.Gstin,
+ "customercontactname": c.ContactName,
+ "customerphone": c.Phone,
+ "customeremail": c.Email,
+ "customerwebsite": c.Website,
+ })
+ } catch (err) {
+ const statusCode = err.request.status
+ const res = JSON.parse(err.request.response)
+
+ switch (statusCode) {
+ case (400, 409):
+ toast.error(res.error)
+ break
+ default:
+ console.error(err)
+ toast.error('An unhandled exception occoured. Please check logs')
+ }
+ }
+
+ isLoading.value = false
+}
+
+onMounted(() => {
+ getAllCustomers()
+})
+</script>
+
+<template>
+ <form class="row g-12" v-on:submit="submit">
+ <div class="col-md-4">
+ <label for="item-brand-input" class="form-label">Customer</label>
+ <select
+ v-model="invoiceCustomer"
+ class="form-select"
+ aria-label="Select Brand"
+ id="item-brand-input"
+ >
+ <option selected disabled value="null">Select Customer</option>
+ <option v-for="customer in allCustomers" :value="customer" :key="customer.id">
+ {{ customer.Name }}
+ </option>
+ </select>
+ </div>
+
+ <div class="col-md-4">
+ <label for="invoice-number" class="form-label">Invoice Number</label>
+ <input id="invoice-number" class="form-control" type="number" v-model="invoiceNumber" min="0"/>
+ </div>
+
+ <div class="col-md-4">
+ <label for="invoice-date" class="form-label">Invoice Date</label>
+ <input
+ type="date"
+ id="invoice-date"
+ class="form-control"
+ :value="new Date().toISOString().substr(0, 10)"
+ @input="handleDateChange($event.target.value)" />
+ </div>
+
+ <div class="col-12">
+ <input type="submit" value="Continue" class="btn btn-primary" />
+ </div>
+ </form>
+</template>