Edit.vue 6.8KB

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