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