Edit.vue 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <script setup>
  2. import { optionStatus } from './config'
  3. import { cartTable } from './config'
  4. import Details from './Components/Details.vue'
  5. import Cart from './Components/Cart.vue'
  6. import { useProductCart } from './Composables/useProductCart'
  7. import { onShowDialog } from './Composables/onShowDialog'
  8. import { useForm } from '@/composables/useForm'
  9. import AppInputText from '@/components/AppInputText.vue'
  10. import AppInputNumber from '@/components/AppInputNumber.vue'
  11. import AppDropdown from '@/components/AppDropdown.vue'
  12. import AppAutoComplete from '@/components/AppAutoComplete.vue'
  13. import DashboardLayout from '@/layouts/Dashboard/DashboardLayout.vue'
  14. const props = defineProps({
  15. id: Number,
  16. number: String,
  17. ppn: Number,
  18. status: String,
  19. ppnChecked: Boolean,
  20. supplier: Object,
  21. products: {
  22. type: Array,
  23. default: [],
  24. },
  25. purchaseDetail: Array,
  26. })
  27. const form = useForm({
  28. status: props.status,
  29. price: null,
  30. qty: null,
  31. supplier: props.supplier,
  32. product: null,
  33. ppn: props.ppn,
  34. checkedPpn: props.ppnChecked,
  35. })
  36. const onSubmit = () => {
  37. form
  38. .transform((data) => ({
  39. status: data.status,
  40. ppn: data.checkedPpn,
  41. products: [...productCart, ...productCartDeleted],
  42. }))
  43. .put(route('purchases.update', props.id), {
  44. onSuccess: () => onClearProductCartDelete(),
  45. })
  46. }
  47. const {
  48. productCart,
  49. productCartDeleted,
  50. onClearProductCartDelete,
  51. onAddProduct,
  52. onDeleteProduct,
  53. onEditProduct,
  54. totalProductPrice,
  55. } = useProductCart(form, props.purchaseDetail)
  56. const { onShowCreateProduct } = onShowDialog()
  57. </script>
  58. <template>
  59. <DashboardLayout title="Tambah Pembelian">
  60. <DynamicDialog />
  61. <div class="grid">
  62. <div class="col-12 md:col-8">
  63. <div class="grid">
  64. <div class="col-12">
  65. <Card>
  66. <template #title> Transaksi </template>
  67. <template #content>
  68. <div class="grid">
  69. <div class="col-12 md:col-6">
  70. <AppDropdown
  71. label="Status"
  72. placeholder="status"
  73. :options="optionStatus"
  74. :error="form.errors.status"
  75. v-model="form.status"
  76. />
  77. </div>
  78. <div class="col-12 md:col-6">
  79. <AppInputText
  80. disabled
  81. label="Supplier"
  82. placeholder="supplier"
  83. v-model="supplier.name"
  84. />
  85. </div>
  86. </div>
  87. </template>
  88. </Card>
  89. </div>
  90. <div class="col-12">
  91. <Card>
  92. <template #title>Produk</template>
  93. <template #content>
  94. <div class="grid">
  95. <div class="col-12 md:col-6">
  96. <AppAutoComplete
  97. :disabled="!form.supplier?.id"
  98. empty
  99. label="Produk"
  100. placeholder="produk"
  101. field="name"
  102. refresh-data="products"
  103. v-model="form.product"
  104. :error="form.errors.products"
  105. :suggestions="products"
  106. >
  107. <template #item="slotProps">
  108. <template v-if="slotProps.item">
  109. <div class="flex flex-column">
  110. <span>{{ slotProps.item.number }}</span>
  111. <span>{{ slotProps.item.name }}</span>
  112. </div>
  113. </template>
  114. </template>
  115. <template #empty>
  116. <span
  117. class="cursor-pointer"
  118. style="color: var(--primary-color)"
  119. @click="onShowCreateProduct"
  120. >
  121. Tambah Produk
  122. </span>
  123. </template>
  124. </AppAutoComplete>
  125. </div>
  126. <div v-if="form.product?.number" class="col-12 md:col-6">
  127. <AppInputText
  128. disabled
  129. label="Satuan"
  130. placeholder="satuan"
  131. v-model="form.product.unit"
  132. />
  133. </div>
  134. <div class="col-12 md:col-6">
  135. <AppInputNumber
  136. :disabled="!form.supplier?.id"
  137. label="Harga"
  138. placeholder="harga"
  139. v-model="form.price"
  140. />
  141. </div>
  142. <div class="col-12 md:col-6">
  143. <AppInputText
  144. :disabled="!form.supplier?.id"
  145. label="Kuantitas"
  146. placeholder="kuantitas"
  147. type="number"
  148. v-model="form.qty"
  149. />
  150. </div>
  151. </div>
  152. </template>
  153. <template #footer>
  154. <div class="flex flex-column md:flex-row justify-content-end">
  155. <Button
  156. label="Tambah Produk"
  157. icon="pi pi-check"
  158. class="p-button-outlined"
  159. :disabled="
  160. !form.price || !form.qty || !form.product?.number
  161. "
  162. @click="onAddProduct"
  163. />
  164. </div>
  165. </template>
  166. </Card>
  167. </div>
  168. <div class="col-12">
  169. <Cart
  170. title="Keranjang Produk"
  171. :product-cart="productCart"
  172. :header-table="cartTable"
  173. v-model:checked-ppn="form.checkedPpn"
  174. @delete="onDeleteProduct"
  175. @edit="onEditProduct"
  176. />
  177. </div>
  178. </div>
  179. </div>
  180. <div class="col-12 md:col-4">
  181. <Details
  182. title="Detail Pembelian"
  183. message="Pastikan semua produk sudah benar"
  184. :number="number"
  185. :status="form.status"
  186. :person="form.supplier"
  187. :product="form.product"
  188. :price="totalProductPrice()"
  189. :disabled="
  190. form.processing ||
  191. !form.status ||
  192. !form.supplier?.id ||
  193. productCart.length === 0
  194. "
  195. @submit="onSubmit"
  196. />
  197. </div>
  198. </div>
  199. </DashboardLayout>
  200. </template>