Browse Source

fix: master topup

Muhammad Iqbal Afandi 4 years ago
parent
commit
1718128977

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

6
 use App\Http\Requests\TopUp\UpdateTopUpRequest;
6
 use App\Http\Requests\TopUp\UpdateTopUpRequest;
7
 use App\Models\Member;
7
 use App\Models\Member;
8
 use App\Models\TopUp;
8
 use App\Models\TopUp;
9
-use App\Models\TypeMember;
10
 use Inertia\Inertia;
9
 use Inertia\Inertia;
11
 
10
 
12
 class TopUpController extends Controller
11
 class TopUpController extends Controller
25
                 ->paginate(10)
24
                 ->paginate(10)
26
                 ->withQueryString()
25
                 ->withQueryString()
27
                 ->through(fn($topUp) => [
26
                 ->through(fn($topUp) => [
27
+                    'id' => $topUp->id,
28
                     'updatedAt' => $topUp->updated_at,
28
                     'updatedAt' => $topUp->updated_at,
29
                     'name' => $topUp->member->name,
29
                     'name' => $topUp->member->name,
30
                     'phone' => $topUp->member->phone,
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
                     'expDate' => $topUp->exp_date,
34
                     'expDate' => $topUp->exp_date,
34
                 ]),
35
                 ]),
35
         ]);
36
         ]);
43
     public function create()
44
     public function create()
44
     {
45
     {
45
         return inertia('topup/Create', [
46
         return inertia('topup/Create', [
46
-            'typeMembers' => TypeMember::get()->transform(fn($typeMember) => [
47
-                'label' => $typeMember->type,
48
-                'value' => $typeMember->id,
49
-            ]),
50
             'members' => Inertia::lazy(
47
             'members' => Inertia::lazy(
51
                 fn() => Member::filter(request()->only('search'))->latest()->get()->transform(fn($member) => [
48
                 fn() => Member::filter(request()->only('search'))->latest()->get()->transform(fn($member) => [
52
                     'id' => $member->id,
49
                     'id' => $member->id,
53
                     'name' => $member->name,
50
                     'name' => $member->name,
54
                     'phone' => $member->phone,
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
         $query->when($filters['search'] ?? null, function ($query, $search) {
59
         $query->when($filters['search'] ?? null, function ($query, $search) {
60
             $query->where(function ($query) use ($search) {
60
             $query->where(function ($query) use ($search) {
61
                 $query->where('name', 'like', '%' . $search . '%')
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
         );
26
         );
27
     }
27
     }
28
 
28
 
29
-    protected function balance(): Attribute
29
+    protected function amount(): Attribute
30
     {
30
     {
31
         return Attribute::make(
31
         return Attribute::make(
32
             get:fn($value) => (new CurrencyFormatService)->setRupiahFormat($value, true)
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
     public function member()
43
     public function member()
37
     {
44
     {
38
         return $this->belongsTo(Member::class);
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
   field: 'platNumber',
1317
   field: 'platNumber',
1318
   header: 'Plat Kendaraan'
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
   field: 'expDate',
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
   field: 'platNumber',
24
   field: 'platNumber',
25
   header: 'Plat Kendaraan'
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
   field: 'expDate',
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
 /******/ 		// This function allow to reference async chunks
58101
 /******/ 		// This function allow to reference async chunks
58102
 /******/ 		__webpack_require__.u = (chunkId) => {
58102
 /******/ 		__webpack_require__.u = (chunkId) => {
58103
 /******/ 			// return url for filenames based on template
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
 <script setup>
1
 <script setup>
2
-import { computed, watch, ref } from 'vue'
2
+import { computed, watch } from 'vue'
3
 import { Inertia } from '@inertiajs/inertia'
3
 import { Inertia } from '@inertiajs/inertia'
4
 import { Head, useForm, usePage } from '@inertiajs/inertia-vue3'
4
 import { Head, useForm, usePage } from '@inertiajs/inertia-vue3'
5
-import AppLayout from '@/layouts/AppLayout.vue'
6
 import AppAutocompleteBasic from '@/components/AppAutocompleteBasic.vue'
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
 defineProps({
8
 defineProps({
12
   members: {
9
   members: {
13
     type: Array,
10
     type: Array,
14
     default: [],
11
     default: [],
15
   },
12
   },
16
-  typeMembers: Array,
17
 })
13
 })
18
 
14
 
19
 const errors = computed(() => usePage().props.value.errors)
15
 const errors = computed(() => usePage().props.value.errors)
22
   form.clearErrors()
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
 const memberOnComplete = (event) => {
21
 const memberOnComplete = (event) => {
38
   Inertia.reload({
22
   Inertia.reload({
39
     data: { search: event.query },
23
     data: { search: event.query },
45
   form.member = event.value
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
 const form = useForm({
36
 const form = useForm({
66
-  balance: null,
67
   member: null,
37
   member: null,
68
 })
38
 })
69
 
39
 
70
 const submit = () => {
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
 </script>
43
 </script>
79
 
44
 
81
   <Head title="Top Up" />
46
   <Head title="Top Up" />
82
 
47
 
83
   <AppLayout>
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
     <div class="grid">
90
     <div class="grid">
85
       <div class="col-12 md:col-8">
91
       <div class="col-12 md:col-8">
86
         <Card>
92
         <Card>
87
           <template #title> Top Up </template>
93
           <template #title> Top Up </template>
88
           <template #content>
94
           <template #content>
89
             <div class="grid">
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
               <div class="col-12 md:col-6">
96
               <div class="col-12 md:col-6">
95
                 <AppAutocompleteBasic
97
                 <AppAutocompleteBasic
96
                   empty
98
                   empty
97
                   label="Member"
99
                   label="Member"
98
-                  field="platNumber"
100
+                  field="name"
99
                   placeholder="member"
101
                   placeholder="member"
100
                   v-model="form.member"
102
                   v-model="form.member"
101
-                  :error="form.errors.member_id"
103
+                  :error="form.errors.member"
102
                   :suggestions="members"
104
                   :suggestions="members"
103
                   @complete="memberOnComplete"
105
                   @complete="memberOnComplete"
104
                   @item-select="memberOnSelected"
106
                   @item-select="memberOnSelected"
108
                       <div class="flex flex-column">
110
                       <div class="flex flex-column">
109
                         <span>{{ slotProps.item.name }}</span>
111
                         <span>{{ slotProps.item.name }}</span>
110
                         <span class="font-bold">{{ slotProps.item.phone }}</span>
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
                       </div>
114
                       </div>
113
                     </template>
115
                     </template>
114
                   </template>
116
                   </template>
115
 
117
 
116
                   <template #empty>
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
                     </span>
121
                     </span>
124
                   </template>
122
                   </template>
125
                 </AppAutocompleteBasic>
123
                 </AppAutocompleteBasic>
141
         </Card>
139
         </Card>
142
       </div>
140
       </div>
143
     </div>
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
   </AppLayout>
142
   </AppLayout>
201
 </template>
143
 </template>

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

3
   { field: 'name', header: 'Nama' },
3
   { field: 'name', header: 'Nama' },
4
   { field: 'phone', header: 'Nomor HP' },
4
   { field: 'phone', header: 'Nomor HP' },
5
   { field: 'platNumber', header: 'Plat Kendaraan' },
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
 ]