Create.vue 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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. number: String,
  16. ppn: Number,
  17. customers: {
  18. type: Array,
  19. default: [],
  20. },
  21. stockProducts: {
  22. type: Array,
  23. default: [],
  24. },
  25. })
  26. const form = useForm({
  27. status: 'pending',
  28. price: null,
  29. qty: null,
  30. customer: null,
  31. product: null,
  32. ppn: props.ppn,
  33. checkedPpn: false,
  34. })
  35. const onSubmit = () => {
  36. form
  37. .transform((data) => ({
  38. number: props.number,
  39. status: data.status,
  40. ppn: data.checkedPpn,
  41. customer_id: data.customer.id,
  42. products: productCart,
  43. }))
  44. .post(route('sales.store'), {
  45. onSuccess: () => {
  46. form.reset()
  47. onClearProduct()
  48. },
  49. })
  50. }
  51. const {
  52. productCart,
  53. onAddProduct,
  54. onDeleteProduct,
  55. onEditProduct,
  56. onClearProduct,
  57. totalProductPrice,
  58. } = useProductCart(form)
  59. const { onShowCustomerCreate } = onShowDialog()
  60. </script>
  61. <template>
  62. <DashboardLayout title="Tambah Penjualan">
  63. <DynamicDialog />
  64. <div class="grid">
  65. <div class="col-12 md:col-8">
  66. <div class="grid">
  67. <div class="col-12">
  68. <Card>
  69. <template #title> Transaksi </template>
  70. <template #content>
  71. <div class="grid">
  72. <div class="col-12 md:col-6">
  73. <AppDropdown
  74. label="Status"
  75. placeholder="status"
  76. :options="optionStatus"
  77. :error="form.errors.status"
  78. v-model="form.status"
  79. />
  80. </div>
  81. <div class="col-12 md:col-6">
  82. <AppAutoComplete
  83. empty
  84. label="Pelanggan"
  85. placeholder="pelanggan"
  86. field="name"
  87. refresh-data="customers"
  88. v-model="form.customer"
  89. :error="form.errors.customer_id"
  90. :suggestions="customers"
  91. >
  92. <template #item="slotProps">
  93. <template v-if="slotProps.item">
  94. <div class="flex flex-column">
  95. <span>{{ slotProps.item.name }}</span>
  96. <span>{{ slotProps.item.phone }}</span>
  97. </div>
  98. </template>
  99. </template>
  100. <template #empty>
  101. <span
  102. class="cursor-pointer"
  103. style="color: var(--primary-color)"
  104. @click="onShowCustomerCreate"
  105. >
  106. Tambah Pelanggan
  107. </span>
  108. </template>
  109. </AppAutoComplete>
  110. </div>
  111. </div>
  112. </template>
  113. </Card>
  114. </div>
  115. <div class="col-12">
  116. <Card>
  117. <template #title>Produk</template>
  118. <template #content>
  119. <div class="grid">
  120. <div class="col-12 md:col-6">
  121. <AppAutoComplete
  122. :disabled="!form.customer?.id"
  123. empty
  124. label="Produk"
  125. placeholder="produk"
  126. field="name"
  127. refresh-data="stockProducts"
  128. v-model="form.product"
  129. :error="form.errors.products"
  130. :suggestions="stockProducts"
  131. >
  132. <template #item="slotProps">
  133. <template v-if="slotProps.item">
  134. <div class="flex flex-column">
  135. <span>{{ slotProps.item.number }}</span>
  136. <span>{{ slotProps.item.name }}</span>
  137. </div>
  138. </template>
  139. </template>
  140. </AppAutoComplete>
  141. </div>
  142. <template v-if="form.product?.number">
  143. <div class="col-12 md:col-6">
  144. <AppInputText
  145. disabled
  146. label="Satuan"
  147. placeholder="satuan"
  148. v-model="form.product.unit"
  149. />
  150. </div>
  151. <div class="col-12 md:col-6">
  152. <AppInputNumber
  153. disabled
  154. label="Harga Beli"
  155. placeholder="harga beli produk"
  156. v-model="form.product.price"
  157. />
  158. </div>
  159. <div class="col-12 md:col-6">
  160. <AppInputText
  161. disabled
  162. label="Stok Tersedia"
  163. placeholder="stok tersedia"
  164. type="number"
  165. v-model="form.product.qty"
  166. />
  167. </div>
  168. </template>
  169. <Divider type="dashed" />
  170. <div class="col-12 md:col-6">
  171. <AppInputNumber
  172. class="m-0"
  173. :disabled="!form.customer?.id"
  174. label="Harga Jual"
  175. placeholder="harga jual"
  176. v-model="form.price"
  177. />
  178. <span v-if="form.product?.number" class="text-xs">
  179. Sudah termasuk profit 30%
  180. </span>
  181. </div>
  182. <div class="col-12 md:col-6">
  183. <AppInputText
  184. :disabled="!form.customer?.id"
  185. label="Kuantitas"
  186. placeholder="kuantitas"
  187. type="number"
  188. v-model="form.qty"
  189. />
  190. </div>
  191. </div>
  192. </template>
  193. <template #footer>
  194. <div class="flex flex-column md:flex-row justify-content-end">
  195. <Button
  196. label="Tambah Produk"
  197. icon="pi pi-check"
  198. class="p-button-outlined"
  199. :disabled="
  200. !form.price || !form.qty || !form.product?.number
  201. "
  202. @click="onAddProduct"
  203. />
  204. </div>
  205. </template>
  206. </Card>
  207. </div>
  208. <div class="col-12">
  209. <Cart
  210. title="Keranjang Produk"
  211. :product-cart="productCart"
  212. :header-table="cartTable"
  213. v-model:checked-ppn="form.checkedPpn"
  214. @delete="onDeleteProduct"
  215. @edit="onEditProduct"
  216. />
  217. </div>
  218. </div>
  219. </div>
  220. <div class="col-12 md:col-4">
  221. <Details
  222. title="Detail Penjualan"
  223. message="Pastikan semua produk sudah benar"
  224. :number="number"
  225. :status="form.status"
  226. :person="form.customer"
  227. :product="form.product"
  228. :price="totalProductPrice()"
  229. :disabled="
  230. form.processing ||
  231. !form.status ||
  232. !form.customer?.id ||
  233. productCart.length === 0
  234. "
  235. @submit="onSubmit"
  236. />
  237. </div>
  238. </div>
  239. </DashboardLayout>
  240. </template>