123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <script setup>
  2. import { useDialog } from 'primevue/usedialog'
  3. import { optionStatus, dialogStyle } from './config'
  4. import CustomerCreate from './Components/Dialog/CustomerCreate.vue'
  5. import Details from './Components/Details.vue'
  6. import { useForm } from '@/components/useForm'
  7. import AppInputText from '@/components/AppInputText.vue'
  8. import AppInputNumber from '@/components/AppInputNumber.vue'
  9. import AppDropdown from '@/components/AppDropdown.vue'
  10. import AppAutoComplete from '@/components/AppAutoComplete.vue'
  11. import DashboardLayout from '@/layouts/Dashboard/DashboardLayout.vue'
  12. const props = defineProps({
  13. number: String,
  14. ppn: String,
  15. customers: {
  16. type: Array,
  17. default: [],
  18. },
  19. stockProducts: {
  20. type: Array,
  21. default: [],
  22. },
  23. })
  24. const form = useForm({
  25. number: props.number,
  26. status: 'pending',
  27. price: null,
  28. qty: null,
  29. customer: null,
  30. product: null,
  31. })
  32. const onSubmit = () => {
  33. form
  34. .transform((data) => ({
  35. number: data.number,
  36. status: data.status,
  37. price: data.price,
  38. qty: data.qty,
  39. customer_id: data.customer.id,
  40. product_number: data.product.number,
  41. }))
  42. .post(route('sales.store'), {
  43. onSuccess: () => form.reset(),
  44. })
  45. }
  46. const dialog = useDialog()
  47. const showCreateCustomer = () => {
  48. dialog.open(CustomerCreate, {
  49. props: {
  50. header: 'Tambah Pelanggan',
  51. ...dialogStyle,
  52. },
  53. })
  54. }
  55. const showCreateProduct = () => {
  56. dialog.open(ProductCreate, {
  57. props: {
  58. header: 'Tambah Produk',
  59. ...dialogStyle,
  60. },
  61. })
  62. }
  63. const checkBtnSubmit = () => {
  64. if (form.price && form.qty && form.customer && form.product) {
  65. return false
  66. } else {
  67. return true
  68. }
  69. }
  70. </script>
  71. <template>
  72. <DashboardLayout title="Tambah Penjualan">
  73. <DynamicDialog />
  74. <div class="grid">
  75. <div class="col-12 lg:col-8">
  76. <Card>
  77. <template #title> Tambah Penjualan </template>
  78. <template #content>
  79. <div class="grid">
  80. <div class="col-12 md:col-6">
  81. <AppInputText
  82. disabled
  83. label="Nomor Penjualan"
  84. placeholder="nomor penjualan"
  85. :error="form.errors.number"
  86. v-model="form.number"
  87. />
  88. </div>
  89. <div class="col-12 md:col-6">
  90. <AppDropdown
  91. label="Status"
  92. placeholder="status"
  93. :options="optionStatus"
  94. :error="form.errors.status"
  95. v-model="form.status"
  96. />
  97. </div>
  98. <div class="col-12 md:col-6">
  99. <AppAutoComplete
  100. label="Pelanggan"
  101. placeholder="pelanggan"
  102. field="name"
  103. refresh-data="customers"
  104. v-model="form.customer"
  105. :error="form.errors.customer_id"
  106. :suggestions="customers"
  107. >
  108. <template #item="slotProps">
  109. <template v-if="slotProps.item">
  110. <div class="flex flex-column">
  111. <span>{{ slotProps.item.name }}</span>
  112. <span>{{ slotProps.item.npwp }}</span>
  113. </div>
  114. </template>
  115. </template>
  116. <template #empty>
  117. <span
  118. class="cursor-pointer"
  119. style="color: var(--primary-color)"
  120. @click="showCreateCustomer"
  121. >
  122. Tambah Pelanggan
  123. </span>
  124. </template>
  125. </AppAutoComplete>
  126. </div>
  127. <div class="col-12 md:col-6">
  128. <AppAutoComplete
  129. label="Produk"
  130. placeholder="produk"
  131. field="name"
  132. refresh-data="stockProducts"
  133. v-model="form.product"
  134. :error="form.errors.product_number"
  135. :suggestions="stockProducts"
  136. />
  137. </div>
  138. <div class="col-12 md:col-6">
  139. <AppInputNumber
  140. label="Harga"
  141. placeholder="harga"
  142. :error="form.errors.price"
  143. v-model="form.price"
  144. />
  145. </div>
  146. <div class="col-12 md:col-6">
  147. <AppInputText
  148. label="Kuantitas"
  149. placeholder="kuantitas"
  150. type="number"
  151. :error="form.errors.qty"
  152. v-model="form.qty"
  153. />
  154. </div>
  155. </div>
  156. </template>
  157. <template #footer>
  158. <div class="flex flex-column md:flex-row justify-content-end">
  159. <Button
  160. label="Simpan"
  161. icon="pi pi-check"
  162. class="p-button-outlined"
  163. :disabled="form.processing || checkBtnSubmit()"
  164. @click="onSubmit"
  165. />
  166. </div>
  167. </template>
  168. </Card>
  169. </div>
  170. <div class="col-12 lg:col-4">
  171. <Details
  172. title="Detail Penjualan"
  173. :number="number"
  174. :price="form.price"
  175. :qty="form.qty"
  176. :ppn="ppn"
  177. :status="form.status"
  178. :person="form.customer"
  179. :product="form.product"
  180. />
  181. </div>
  182. </div>
  183. </DashboardLayout>
  184. </template>