Edit.vue 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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 { useForm } from '@/composables/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. id: Number,
  15. number: String,
  16. ppn: Number,
  17. status: String,
  18. ppnChecked: Boolean,
  19. customer: Object,
  20. stockProducts: {
  21. type: Array,
  22. default: [],
  23. },
  24. saleDetail: Array,
  25. })
  26. const form = useForm({
  27. status: props.status,
  28. price: null,
  29. qty: null,
  30. customer: props.customer,
  31. product: null,
  32. ppn: props.ppn,
  33. checkedPpn: props.ppnChecked,
  34. })
  35. const onSubmit = () => {
  36. form
  37. .transform((data) => ({
  38. status: data.status,
  39. ppn: data.checkedPpn,
  40. products: [...productCart, ...productCartDeleted],
  41. }))
  42. .post(route('sales.store'), {
  43. onSuccess: () => {
  44. form.reset()
  45. onClearProduct()
  46. },
  47. })
  48. }
  49. const {
  50. productCart,
  51. productCartDeleted,
  52. onAddProduct,
  53. onDeleteProduct,
  54. onEditProduct,
  55. totalProductPrice,
  56. } = useProductCart(form, props.saleDetail)
  57. </script>
  58. <template>
  59. <DashboardLayout title="Ubah Penjualan">
  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> Pembeli </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="Customer"
  82. placeholder="customer"
  83. v-model="customer.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.customer?.id"
  98. empty
  99. label="Produk"
  100. placeholder="produk"
  101. field="name"
  102. refresh-data="stockProducts"
  103. v-model="form.product"
  104. :error="form.errors.products"
  105. :suggestions="stockProducts"
  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. </AppAutoComplete>
  116. </div>
  117. <div class="col-12 md:col-6">
  118. <AppInputText
  119. disabled
  120. label="Satuan"
  121. placeholder="satuan"
  122. :value="form.product?.unit"
  123. />
  124. </div>
  125. <div class="col-12 md:col-6">
  126. <AppInputNumber
  127. disabled
  128. label="Harga Beli"
  129. placeholder="harga beli produk"
  130. :value="form.product?.price"
  131. />
  132. </div>
  133. <div class="col-12 md:col-6">
  134. <AppInputText
  135. disabled
  136. label="Stok Tersedia"
  137. placeholder="stok tersedia"
  138. type="number"
  139. :value="form.product?.qty"
  140. />
  141. </div>
  142. <Divider type="dashed" />
  143. <div class="col-12 md:col-6">
  144. <AppInputNumber
  145. :disabled="!form.customer?.id"
  146. label="Harga Jual"
  147. placeholder="harga jual"
  148. v-model="form.price"
  149. />
  150. </div>
  151. <div class="col-12 md:col-6">
  152. <AppInputText
  153. :disabled="!form.customer?.id"
  154. label="Kuantitas"
  155. placeholder="kuantitas"
  156. type="number"
  157. v-model="form.qty"
  158. />
  159. </div>
  160. </div>
  161. </template>
  162. <template #footer>
  163. <div class="flex flex-column md:flex-row justify-content-end">
  164. <Button
  165. label="Tambah Produk"
  166. icon="pi pi-check"
  167. class="p-button-outlined"
  168. :disabled="
  169. !form.price || !form.qty || !form.product?.number
  170. "
  171. @click="onAddProduct"
  172. />
  173. </div>
  174. </template>
  175. </Card>
  176. </div>
  177. <div class="col-12">
  178. <Cart
  179. title="Keranjang Produk"
  180. :product-cart="productCart"
  181. :header-table="cartTable"
  182. v-model:checked-ppn="form.checkedPpn"
  183. @delete="onDeleteProduct"
  184. @edit="onEditProduct"
  185. />
  186. </div>
  187. </div>
  188. </div>
  189. <div class="col-12 md:col-4">
  190. <Details
  191. title="Detail Penjualan"
  192. message="Pastikan semua produk sudah benar"
  193. :number="number"
  194. :status="form.status"
  195. :person="form.customer"
  196. :product="form.product"
  197. :price="totalProductPrice()"
  198. :disabled="
  199. form.processing ||
  200. !form.status ||
  201. !form.customer?.id ||
  202. productCart.length === 0
  203. "
  204. @submit="onSubmit"
  205. />
  206. </div>
  207. </div>
  208. </DashboardLayout>
  209. </template>