Create.vue 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <script setup>
  2. import { useForm, Head } from '@inertiajs/inertia-vue3'
  3. import { useFormErrorReset } from '@/components/useFormErrorReset'
  4. import { useProductAutoComplete } from './useProductAutoComplete'
  5. import { useCustomerAutoComplete } from './useCustomerAutoComplete'
  6. import { optionStatus } from './config'
  7. import SaleDetails from './Components/SaleDetails.vue'
  8. import AppInputText from '@/components/AppInputText.vue'
  9. import AppInputNumber from '@/components/AppInputNumber.vue'
  10. import AppDropdown from '@/components/AppDropdown.vue'
  11. import AppAutoComplete from '@/components/AutoComplete.vue'
  12. import DashboardLayout from '@/layouts/DashboardLayout.vue'
  13. const props = defineProps({
  14. number: String,
  15. customers: {
  16. type: Array,
  17. default: [],
  18. },
  19. products: {
  20. type: Array,
  21. default: [],
  22. },
  23. })
  24. const form = useForm({
  25. number: props.number,
  26. status: 'pending',
  27. price: null,
  28. qty: null,
  29. customer: null,
  30. product: null,
  31. })
  32. const { customerOnComplete, customerOnSelected, showCreateCustomer } =
  33. useCustomerAutoComplete(form)
  34. const { productOnComplete, productOnSelected, showCreateProduct } =
  35. useProductAutoComplete(form)
  36. useFormErrorReset(form)
  37. const onSubmit = () => {
  38. form
  39. .transform((data) => ({
  40. number: data.number,
  41. status: data.status,
  42. price: data.price,
  43. qty: data.qty,
  44. customer_id: data.customer.id,
  45. product_id: data.product.number,
  46. }))
  47. .post(route('sales.store'), { onSuccess: () => form.reset() })
  48. }
  49. useFormErrorReset(form)
  50. const checkSales = () => {
  51. if (form.price && form.qty && form.customer && form.product) {
  52. return false
  53. } else {
  54. return true
  55. }
  56. }
  57. </script>
  58. <template>
  59. <Head title="Tambah Penjualan" />
  60. <DashboardLayout>
  61. <DynamicDialog />
  62. <div class="grid">
  63. <div class="col-12 lg:col-8">
  64. <Card>
  65. <template #title> Tambah Penjualan </template>
  66. <template #content>
  67. <div class="grid">
  68. <div class="col-12 md:col-6">
  69. <AppInputText
  70. disabled
  71. label="Nomor Penjualan"
  72. placeholder="nomor penjualan"
  73. :error="form.errors.number"
  74. v-model="form.number"
  75. />
  76. </div>
  77. <div class="col-12 md:col-6">
  78. <AppDropdown
  79. label="Status"
  80. placeholder="status"
  81. :options="optionStatus"
  82. :error="form.errors.status"
  83. v-model="form.status"
  84. />
  85. </div>
  86. <div class="col-12 md:col-6">
  87. <AppAutoComplete
  88. label="Pelanggan"
  89. placeholder="pelanggan"
  90. field="name"
  91. v-model="form.customer"
  92. :error="form.errors.customer_id"
  93. :suggestions="customers"
  94. @complete="customerOnComplete"
  95. @item-select="customerOnSelected"
  96. >
  97. <template #item="slotProps">
  98. <template v-if="slotProps.item">
  99. <div class="flex flex-column">
  100. <span>{{ slotProps.item.name }}</span>
  101. <span>{{ slotProps.item.npwp }}</span>
  102. </div>
  103. </template>
  104. </template>
  105. <template #empty>
  106. <span
  107. class="cursor-pointer"
  108. style="color: var(--primary-color)"
  109. @click="showCreateCustomer"
  110. >
  111. Tambah Pelanggan
  112. </span>
  113. </template>
  114. </AppAutoComplete>
  115. </div>
  116. <div class="col-12 md:col-6">
  117. <AppAutoComplete
  118. label="Produk"
  119. placeholder="produk"
  120. field="name"
  121. v-model="form.product"
  122. :error="form.errors.product_id"
  123. :suggestions="products"
  124. @complete="productOnComplete"
  125. @item-select="productOnSelected"
  126. >
  127. <template #item="slotProps">
  128. <template v-if="slotProps.item">
  129. <div class="flex flex-column">
  130. <span>{{ slotProps.item.number }}</span>
  131. <span>{{ slotProps.item.name }}</span>
  132. </div>
  133. </template>
  134. </template>
  135. <template #empty>
  136. <span
  137. class="cursor-pointer"
  138. style="color: var(--primary-color)"
  139. @click="showCreateProduct"
  140. >
  141. Tambah Produk
  142. </span>
  143. </template>
  144. </AppAutoComplete>
  145. </div>
  146. <div class="col-12 md:col-6">
  147. <AppInputNumber
  148. label="Harga"
  149. placeholder="harga"
  150. :error="form.errors.price"
  151. v-model="form.price"
  152. />
  153. </div>
  154. <div class="col-12 md:col-6">
  155. <AppInputText
  156. label="Kuantitas"
  157. placeholder="kuantitas"
  158. type="number"
  159. :error="form.errors.qty"
  160. v-model="form.qty"
  161. />
  162. </div>
  163. </div>
  164. </template>
  165. <template #footer>
  166. <div class="flex flex-column md:flex-row justify-content-end">
  167. <Button
  168. label="Simpan"
  169. icon="pi pi-check"
  170. class="p-button-outlined"
  171. :disabled="form.processing || checkSales()"
  172. @click="onSubmit"
  173. />
  174. </div>
  175. </template>
  176. </Card>
  177. </div>
  178. <div class="col-12 lg:col-4">
  179. <SaleDetails
  180. :sale-number="number"
  181. :sale-price="form.price"
  182. :sale-qty="form.qty"
  183. :sale-status="form.status"
  184. :customer="form.customer"
  185. :product="form.product"
  186. />
  187. </div>
  188. </div>
  189. </DashboardLayout>
  190. </template>