Create.vue 6.2KB

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