Create.vue 6.1KB

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