Edit.vue 7.0KB

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