Browse Source

fix: master topup

Muhammad Iqbal Afandi 3 years ago
parent
commit
1718128977

+ 7
- 8
app/Http/Controllers/TopUpController.php View File

@@ -6,7 +6,6 @@ use App\Http\Requests\TopUp\StoreTopUpRequest;
6 6
 use App\Http\Requests\TopUp\UpdateTopUpRequest;
7 7
 use App\Models\Member;
8 8
 use App\Models\TopUp;
9
-use App\Models\TypeMember;
10 9
 use Inertia\Inertia;
11 10
 
12 11
 class TopUpController extends Controller
@@ -25,11 +24,13 @@ class TopUpController extends Controller
25 24
                 ->paginate(10)
26 25
                 ->withQueryString()
27 26
                 ->through(fn($topUp) => [
27
+                    'id' => $topUp->id,
28 28
                     'updatedAt' => $topUp->updated_at,
29 29
                     'name' => $topUp->member->name,
30 30
                     'phone' => $topUp->member->phone,
31
-                    'platNumber' => $topUp->member->plat_number,
32
-                    'balance' => $topUp->balance,
31
+                    'platNumber' => $topUp->member->vehicleDetail(),
32
+                    'amount' => $topUp->amount,
33
+                    'type' => $topUp->member->typeMember->type,
33 34
                     'expDate' => $topUp->exp_date,
34 35
                 ]),
35 36
         ]);
@@ -43,16 +44,14 @@ class TopUpController extends Controller
43 44
     public function create()
44 45
     {
45 46
         return inertia('topup/Create', [
46
-            'typeMembers' => TypeMember::get()->transform(fn($typeMember) => [
47
-                'label' => $typeMember->type,
48
-                'value' => $typeMember->id,
49
-            ]),
50 47
             'members' => Inertia::lazy(
51 48
                 fn() => Member::filter(request()->only('search'))->latest()->get()->transform(fn($member) => [
52 49
                     'id' => $member->id,
53 50
                     'name' => $member->name,
54 51
                     'phone' => $member->phone,
55
-                    'platNumber' => $member->plat_number,
52
+                    'platNumber' => $member->vehicleDetail(),
53
+                    'type' => $member->typeMember->type,
54
+                    'expDate' => $member->exp_date,
56 55
                 ])
57 56
             ),
58 57
         ]);

+ 1
- 2
app/Models/Member.php View File

@@ -59,8 +59,7 @@ class Member extends Model
59 59
         $query->when($filters['search'] ?? null, function ($query, $search) {
60 60
             $query->where(function ($query) use ($search) {
61 61
                 $query->where('name', 'like', '%' . $search . '%')
62
-                    ->orWhere('phone', 'like', '%' . $search . '%')
63
-                    ->orWhere('plat_number', 'like', '%' . $search . '%');
62
+                    ->orWhere('phone', 'like', '%' . $search . '%');
64 63
             });
65 64
         });
66 65
     }

+ 8
- 1
app/Models/TopUp.php View File

@@ -26,13 +26,20 @@ class TopUp extends Model
26 26
         );
27 27
     }
28 28
 
29
-    protected function balance(): Attribute
29
+    protected function amount(): Attribute
30 30
     {
31 31
         return Attribute::make(
32 32
             get:fn($value) => (new CurrencyFormatService)->setRupiahFormat($value, true)
33 33
         );
34 34
     }
35 35
 
36
+    protected function expDate(): Attribute
37
+    {
38
+        return Attribute::make(
39
+            get:fn($value) => Carbon::parse($value)->translatedFormat('l d/m/Y')
40
+        );
41
+    }
42
+
36 43
     public function member()
37 44
     {
38 45
         return $this->belongsTo(Member::class);

+ 124
- 855
public/js/resources_js_pages_topup_Create_vue.js
File diff suppressed because it is too large
View File


+ 6
- 3
public/js/resources_js_pages_topup_Index_vue.js View File

@@ -1317,11 +1317,14 @@ __webpack_require__.r(__webpack_exports__);
1317 1317
   field: 'platNumber',
1318 1318
   header: 'Plat Kendaraan'
1319 1319
 }, {
1320
-  field: 'balance',
1321
-  header: 'Saldo'
1320
+  field: 'type',
1321
+  header: 'Jenis Member'
1322
+}, {
1323
+  field: 'amount',
1324
+  header: 'Tarif Member'
1322 1325
 }, {
1323 1326
   field: 'expDate',
1324
-  header: 'Tanggal Kadaluarsa'
1327
+  header: 'Berakhir'
1325 1328
 }]);
1326 1329
 
1327 1330
 /***/ }),

+ 6
- 3
public/js/resources_js_pages_topup_TableHeader_js.js View File

@@ -24,11 +24,14 @@ __webpack_require__.r(__webpack_exports__);
24 24
   field: 'platNumber',
25 25
   header: 'Plat Kendaraan'
26 26
 }, {
27
-  field: 'balance',
28
-  header: 'Saldo'
27
+  field: 'type',
28
+  header: 'Jenis Member'
29
+}, {
30
+  field: 'amount',
31
+  header: 'Tarif Member'
29 32
 }, {
30 33
   field: 'expDate',
31
-  header: 'Tanggal Kadaluarsa'
34
+  header: 'Berakhir'
32 35
 }]);
33 36
 
34 37
 /***/ })

+ 1
- 1
public/js/vue.js View File

@@ -58101,7 +58101,7 @@ module.exports = JSON.parse('{"name":"axios","version":"0.21.4","description":"P
58101 58101
 /******/ 		// This function allow to reference async chunks
58102 58102
 /******/ 		__webpack_require__.u = (chunkId) => {
58103 58103
 /******/ 			// return url for filenames based on template
58104
-/******/ 			return "js/" + chunkId + ".js?id=" + {"node_modules_chart_js_auto_auto_esm_js":"10c6b388645ceb22","resources_js_pages_auth_ForgotPassword_vue":"5b9f0529bda25a9b","resources_js_pages_auth_Login_vue":"61b9c9ae1ae9da32","resources_js_pages_auth_ResetPassword_vue":"b091193a1e114ce8","resources_js_pages_auth_VerifyEmail_vue":"a7b9a99e5a331088","resources_js_pages_expense_Create_vue":"1772093ec9ad8e1f","resources_js_pages_expense_Index_vue":"51f7facd5c3c3ea6","resources_js_pages_expense_Show_vue":"6e60ec4571b580bb","resources_js_pages_expense_TableHeader_js":"eed3f0613f167cfd","resources_js_pages_home_Index_vue":"6cd0224828ac8129","resources_js_pages_member_Create_vue":"3ca394fe875a5c72","resources_js_pages_member_Edit_vue":"7b222567b848883e","resources_js_pages_member_Index_vue":"71a31a774bb1b571","resources_js_pages_member_TableHeader_js":"51dbf053f7ddd45c","resources_js_pages_topup_Create_vue":"9d958cbaf19eb892","resources_js_pages_topup_Edit_vue":"258c3b0746574dc0","resources_js_pages_topup_Index_vue":"5c7eced88af886fa","resources_js_pages_topup_Show_vue":"cb35ad21e9ce163f","resources_js_pages_topup_TableHeader_js":"c803a04362b71855","resources_js_pages_typemember_Create_vue":"79728a0314d12450","resources_js_pages_typemember_Edit_vue":"94fb9b5b49338c01","resources_js_pages_typemember_Index_vue":"cd93651ebf36d5a5","resources_js_pages_typemember_TableHeader_js":"de81088b132d3e90","resources_js_pages_typevehicle_Create_vue":"0f937d93865a1ea2","resources_js_pages_typevehicle_Edit_vue":"edba97a3715ba957","resources_js_pages_typevehicle_Index_vue":"53c702d33feb6196","resources_js_pages_typevehicle_TableHeader_js":"a40378918fbe74e1","resources_js_pages_user_Create_vue":"361bf2589467f820","resources_js_pages_user_Edit_vue":"fdb844cf830ec11c","resources_js_pages_user_Index_vue":"16d93eb7e5210300","resources_js_pages_user_Show_vue":"138fd92d6ae36518","resources_js_pages_user_TableHeader_js":"0d87fd422fe40491"}[chunkId] + "";
58104
+/******/ 			return "js/" + chunkId + ".js?id=" + {"node_modules_chart_js_auto_auto_esm_js":"10c6b388645ceb22","resources_js_pages_auth_ForgotPassword_vue":"5b9f0529bda25a9b","resources_js_pages_auth_Login_vue":"61b9c9ae1ae9da32","resources_js_pages_auth_ResetPassword_vue":"b091193a1e114ce8","resources_js_pages_auth_VerifyEmail_vue":"a7b9a99e5a331088","resources_js_pages_expense_Create_vue":"1772093ec9ad8e1f","resources_js_pages_expense_Index_vue":"51f7facd5c3c3ea6","resources_js_pages_expense_Show_vue":"6e60ec4571b580bb","resources_js_pages_expense_TableHeader_js":"eed3f0613f167cfd","resources_js_pages_home_Index_vue":"6cd0224828ac8129","resources_js_pages_member_Create_vue":"3ca394fe875a5c72","resources_js_pages_member_Edit_vue":"7b222567b848883e","resources_js_pages_member_Index_vue":"71a31a774bb1b571","resources_js_pages_member_TableHeader_js":"51dbf053f7ddd45c","resources_js_pages_topup_Create_vue":"8c4788849612d68f","resources_js_pages_topup_Edit_vue":"258c3b0746574dc0","resources_js_pages_topup_Index_vue":"70bcf9869c3024d0","resources_js_pages_topup_Show_vue":"cb35ad21e9ce163f","resources_js_pages_topup_TableHeader_js":"c0dc89df0e3b8b7d","resources_js_pages_typemember_Create_vue":"79728a0314d12450","resources_js_pages_typemember_Edit_vue":"94fb9b5b49338c01","resources_js_pages_typemember_Index_vue":"cd93651ebf36d5a5","resources_js_pages_typemember_TableHeader_js":"de81088b132d3e90","resources_js_pages_typevehicle_Create_vue":"0f937d93865a1ea2","resources_js_pages_typevehicle_Edit_vue":"edba97a3715ba957","resources_js_pages_typevehicle_Index_vue":"53c702d33feb6196","resources_js_pages_typevehicle_TableHeader_js":"a40378918fbe74e1","resources_js_pages_user_Create_vue":"361bf2589467f820","resources_js_pages_user_Edit_vue":"fdb844cf830ec11c","resources_js_pages_user_Index_vue":"16d93eb7e5210300","resources_js_pages_user_Show_vue":"138fd92d6ae36518","resources_js_pages_user_TableHeader_js":"0d87fd422fe40491"}[chunkId] + "";
58105 58105
 /******/ 		};
58106 58106
 /******/ 	})();
58107 58107
 /******/ 	

+ 51
- 109
resources/js/pages/topup/Create.vue View File

@@ -1,19 +1,15 @@
1 1
 <script setup>
2
-import { computed, watch, ref } from 'vue'
2
+import { computed, watch } from 'vue'
3 3
 import { Inertia } from '@inertiajs/inertia'
4 4
 import { Head, useForm, usePage } from '@inertiajs/inertia-vue3'
5
-import AppLayout from '@/layouts/AppLayout.vue'
6 5
 import AppAutocompleteBasic from '@/components/AppAutocompleteBasic.vue'
7
-import AppInputNumber from '@/components/AppInputNumber.vue'
8
-import AppDropdown from '@/components/AppDropdown.vue'
9
-import AppInputText from '@/components/AppInputText.vue'
6
+import AppLayout from '@/layouts/AppLayout.vue'
10 7
 
11 8
 defineProps({
12 9
   members: {
13 10
     type: Array,
14 11
     default: [],
15 12
   },
16
-  typeMembers: Array,
17 13
 })
18 14
 
19 15
 const errors = computed(() => usePage().props.value.errors)
@@ -22,18 +18,6 @@ watch(errors, () => {
22 18
   form.clearErrors()
23 19
 })
24 20
 
25
-const memberDialogShow = ref(false)
26
-
27
-const memberDialogOnHide = () => {
28
-  formMember.reset()
29
-
30
-  formMember.clearErrors()
31
-
32
-  usePage().props.value.errors = {}
33
-
34
-  usePage().props.value.flash.error = null
35
-}
36
-
37 21
 const memberOnComplete = (event) => {
38 22
   Inertia.reload({
39 23
     data: { search: event.query },
@@ -45,35 +29,16 @@ const memberOnSelected = (event) => {
45 29
   form.member = event.value
46 30
 }
47 31
 
48
-const formMember = useForm({
49
-  name: null,
50
-  phone: null,
51
-  plat_number: null,
52
-  type_member_id: null,
53
-})
54
-
55
-const submitMember = () => {
56
-  formMember.post(route('members.store'), {
57
-    onSuccess: () => {
58
-      formMember.reset()
59
-
60
-      memberDialogShow.value = !memberDialogShow.value
61
-    },
62
-  })
32
+const gotoMember = () => {
33
+  return Inertia.get(route('members.create'))
63 34
 }
64 35
 
65 36
 const form = useForm({
66
-  balance: null,
67 37
   member: null,
68 38
 })
69 39
 
70 40
 const submit = () => {
71
-  form
72
-    .transform((data) => ({
73
-      balance: data.balance,
74
-      member_id: data.member.id,
75
-    }))
76
-    .post(route('top-ups.store'), { onSuccess: () => form.reset() })
41
+  form.post(route('top-ups.store'), { onSuccess: () => form.reset() })
77 42
 }
78 43
 </script>
79 44
 
@@ -81,24 +46,61 @@ const submit = () => {
81 46
   <Head title="Top Up" />
82 47
 
83 48
   <AppLayout>
49
+    <template v-if="form.member">
50
+      <h1 class="text-2xl font-bold">Detail Member</h1>
51
+
52
+      <div class="grid px-2">
53
+        <div class="col-auto mr-7">
54
+          <h2>
55
+            <span class="text-base"> <i class="pi pi-user" /> Nama</span>
56
+
57
+            <br />
58
+
59
+            <span class="text-lg">{{ form.member.name }}</span>
60
+          </h2>
61
+        </div>
62
+
63
+        <div class="col-auto mr-7">
64
+          <h2>
65
+            <span class="text-base"> <i class="pi pi-mobile" /> No HP</span>
66
+
67
+            <br />
68
+
69
+            <span class="text-lg">{{ form.member.phone }}</span>
70
+          </h2>
71
+        </div>
72
+      </div>
73
+
74
+      <div class="grid">
75
+        <div class="col-12">
76
+          <h2 class="mb-4">
77
+            <span class="text-base">
78
+              <i class="pi pi-car red-700" />
79
+              Detail Plat Kendaraan
80
+            </span>
81
+
82
+            <br />
83
+
84
+            <span class="text-lg">{{ form.member.platNumber }}</span>
85
+          </h2>
86
+        </div>
87
+      </div>
88
+    </template>
89
+
84 90
     <div class="grid">
85 91
       <div class="col-12 md:col-8">
86 92
         <Card>
87 93
           <template #title> Top Up </template>
88 94
           <template #content>
89 95
             <div class="grid">
90
-              <div class="col-12 md:col-6">
91
-                <AppInputNumber v-model="form.balance" label="Saldo" placeholder="saldo" :error="form.errors.balance" />
92
-              </div>
93
-
94 96
               <div class="col-12 md:col-6">
95 97
                 <AppAutocompleteBasic
96 98
                   empty
97 99
                   label="Member"
98
-                  field="platNumber"
100
+                  field="name"
99 101
                   placeholder="member"
100 102
                   v-model="form.member"
101
-                  :error="form.errors.member_id"
103
+                  :error="form.errors.member"
102 104
                   :suggestions="members"
103 105
                   @complete="memberOnComplete"
104 106
                   @item-select="memberOnSelected"
@@ -108,18 +110,14 @@ const submit = () => {
108 110
                       <div class="flex flex-column">
109 111
                         <span>{{ slotProps.item.name }}</span>
110 112
                         <span class="font-bold">{{ slotProps.item.phone }}</span>
111
-                        <span class="font-bold">{{ slotProps.item.platNumber }}</span>
113
+                        <span class="font-bold">{{ slotProps.item.type }}</span>
112 114
                       </div>
113 115
                     </template>
114 116
                   </template>
115 117
 
116 118
                   <template #empty>
117
-                    <span
118
-                      class="cursor-pointer"
119
-                      style="color: var(--primary-color)"
120
-                      @click="memberDialogShow = !memberDialogShow"
121
-                    >
122
-                      Tambah Member
119
+                    <span class="cursor-pointer" style="color: var(--primary-color)" @click="gotoMember">
120
+                      Buat Member
123 121
                     </span>
124 122
                   </template>
125 123
                 </AppAutocompleteBasic>
@@ -141,61 +139,5 @@ const submit = () => {
141 139
         </Card>
142 140
       </div>
143 141
     </div>
144
-
145
-    <Dialog
146
-      modal
147
-      v-model:visible="memberDialogShow"
148
-      class="p-fluid"
149
-      header="Tambah Member"
150
-      :style="{ width: '450px' }"
151
-      :breakpoints="{ '960px': '75vw' }"
152
-      @hide="memberDialogOnHide"
153
-    >
154
-      <div class="grid">
155
-        <div class="col-12 md:col-6">
156
-          <AppInputText v-model="formMember.name" label="Nama" placeholder="nama" :error="formMember.errors.name" />
157
-        </div>
158
-
159
-        <div class="col-12 md:col-6">
160
-          <AppInputText
161
-            v-model="formMember.phone"
162
-            label="Nomor HP"
163
-            placeholder="nomor hp"
164
-            :error="formMember.errors.phone"
165
-          />
166
-        </div>
167
-
168
-        <div class="col-12 md:col-6">
169
-          <AppInputText
170
-            v-model="formMember.plat_number"
171
-            label="Plat Kendaraan"
172
-            placeholder="plat kendaraan"
173
-            :error="formMember.errors.plat_number"
174
-          />
175
-        </div>
176
-
177
-        <div class="col-12 md:col-6">
178
-          <AppDropdown
179
-            label="Jenis member"
180
-            placeholder="pilih satu"
181
-            v-model="formMember.type_member_id"
182
-            :options="typeMembers"
183
-            :error="formMember.errors.type_member_id"
184
-          />
185
-        </div>
186
-      </div>
187
-
188
-      <template #footer>
189
-        <div class="flex flex-column md:flex-row justify-content-end">
190
-          <Button
191
-            label="Simpan"
192
-            icon="pi pi-check"
193
-            class="p-button-outlined"
194
-            :disabled="formMember.processing"
195
-            @click="submitMember"
196
-          />
197
-        </div>
198
-      </template>
199
-    </Dialog>
200 142
   </AppLayout>
201 143
 </template>

+ 3
- 2
resources/js/pages/topup/TableHeader.js View File

@@ -3,6 +3,7 @@ export default [
3 3
   { field: 'name', header: 'Nama' },
4 4
   { field: 'phone', header: 'Nomor HP' },
5 5
   { field: 'platNumber', header: 'Plat Kendaraan' },
6
-  { field: 'balance', header: 'Saldo' },
7
-  { field: 'expDate', header: 'Tanggal Kadaluarsa' },
6
+  { field: 'type', header: 'Jenis Member' },
7
+  { field: 'amount', header: 'Tarif Member' },
8
+  { field: 'expDate', header: 'Berakhir' },
8 9
 ]