zet-lib 1.3.41 → 1.3.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/Util.js CHANGED
@@ -1,1384 +1,1571 @@
1
- const moment = require('moment')
2
- const path = require('path')
3
- const randomstring = require('randomstring')
4
- const fs = require('fs-extra')
5
- const { v4: uuidv4 } = require('uuid')
6
- const sha256 = require('js-sha256')
7
-
8
- const Util = {}
9
-
10
- Util.tab = '\t'
11
- Util.tabs = (n) => {
12
- let ret = ''
13
- for (var i = 0; i < n; i++) {
14
- ret += Util.tab
15
- }
16
- return ret
17
- }
18
-
19
- Util.NEW_LINE = '\n'
20
- Util.newLine = '\r\n'
21
- Util.newLines = (n) => {
22
- let ret = ''
23
- for (var i = 0; i < n; i++) {
24
- ret += Util.newLine
25
- }
26
- return ret
27
- }
28
-
29
- //sha256
30
- Util.hash = (string) => {
31
- return sha256(string)
32
- }
33
-
34
- Util.hashCompare = (myPlaintextPassword, hash) => {
35
- return Util.hash(myPlaintextPassword) == hash
36
- }
37
-
38
- Util.excelSequence = function () {
39
- let abjads = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
40
- let arr = abjads
41
- let char = 0
42
- let num = 26
43
- for (let x = 2; x < 15; x++) {
44
- let idx = 0
45
- for (let i = 1; i <= 26; i++) {
46
- arr[num] = abjads[char] + abjads[idx]
47
- idx++
48
- num++
49
- }
50
- char++
51
- }
52
-
53
- return arr
54
- }
55
-
56
- Util.now = function () {
57
- return moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
58
- }
59
-
60
- Util.nowShort = function () {
61
- return moment(new Date()).format('YYYY-MM-DD')
62
- }
63
-
64
- Util.ago = (data) => {
65
- return moment(data).fromNow()
66
- }
67
- /*
68
- moment get one month ago from current
69
- var monthago = moment().subtract(1, 'months').format('YYYY-MM-DD');
70
-
71
- */
72
-
73
- Util.dateSql = function (date, format) {
74
- format = format || 'YYYY-MM-DD'
75
- if (date && date != '0000-00-00') return moment(date).format(format)
76
- else return ''
77
- }
78
-
79
- Util.dateOriginal = function (date) {
80
- if (date && date != '0000-00-00') {
81
- let value = moment(date).utc(false)
82
- return value
83
- } else {
84
- return ''
85
- }
86
- }
87
-
88
- Util.dateFormat = function (date, format) {
89
- format = format || 'YYYY-MM-DD'
90
- if (date && date != '0000-00-00') return moment(date).format(format)
91
- else return ''
92
- }
93
-
94
- Util.timePublic = function (date) {
95
- if (date) return moment(date).format('DD MMM YYYY')
96
- else return ''
97
- }
98
-
99
- Util.timeSql = function (date, format) {
100
- if (date && date != '0000-00-00 00:00:00') {
101
- format = format || 'YYYY-MM-DD HH:mm:ss'
102
- return moment(date).format(format)
103
- } else return ''
104
- }
105
-
106
- //moment('2017-11-30T15:00:00-07:00').diff(moment('2017-05-31T15:00:00-07:00'), 'months')
107
- Util.dateDiff = (start, end, format = 'months') => {
108
- let count = 0
109
- if (start && end) {
110
- count = moment(end).diff(moment(start), format, true)
111
- }
112
- return count
113
- }
114
-
115
- Util.getDate = function (date) {
116
- date = date + '' || ''
117
- if (date != '') {
118
- let explode = date.split('-')
119
- return {
120
- year: parseInt(explode[0]),
121
- month: parseInt(explode[1]),
122
- date: parseInt(explode[2]),
123
- }
124
- } else {
125
- return {
126
- year: 0,
127
- month: 0,
128
- date: 0,
129
- }
130
- }
131
- }
132
-
133
- Util.dateIsBetween = (compare, start, end) => {
134
- if (compare == '' || compare == '0000-00-00') {
135
- return false
136
- }
137
- compare = moment(compare).format('YYYY-MM-DD')
138
- start = moment(start).format('YYYY-MM-DD')
139
- end = moment(end).format('YYYY-MM-DD')
140
- let today = moment(compare)
141
- let startDate = moment(start)
142
- let endDate = moment(end)
143
-
144
- if (compare == start) {
145
- return true
146
- } else if (compare == end) {
147
- return true
148
- } else {
149
- return today.isBetween(startDate, endDate)
150
- }
151
- }
152
-
153
- Util.getMonth = function (date) {
154
- if (date.length > 5) {
155
- let n = new Date(date)
156
- let m = n.getMonth()
157
- return parseInt(m) + 1
158
- }
159
- return 0
160
- }
161
-
162
- Util.getYear = function (date) {
163
- date = Util.dateSql(date) || ''
164
- return date.slice(0, 4)
165
- }
166
-
167
- //first is smaller than second
168
- Util.calculateDay = function (from, to, holidayInWeek = 0) {
169
- holidayInWeek = parseInt(holidayInWeek) || 0
170
- let count = 0
171
- if (holidayInWeek == 1) {
172
- let days = Util.enumerateDaysBetweenDates(moment(from).format('YYYY-MM-DD'), moment(to).format('YYYY-MM-DD'))
173
- let countdays = days.filter((item) => parseInt(moment(item).format('d')) != 0)
174
- count = countdays.length
175
- } else if (holidayInWeek == 2) {
176
- let days = Util.enumerateDaysBetweenDates(moment(from).format('YYYY-MM-DD'), moment(to).format('YYYY-MM-DD'))
177
- let countdays = days.filter((item) => parseInt(moment(item).format('d')) != 0 && parseInt(moment(item).format('d')) != 6)
178
- count = countdays.length
179
- } else {
180
- let a = moment(from)
181
- let b = moment(to)
182
- count = b.diff(a, 'days') + 1
183
- }
184
-
185
- return count
186
- }
187
-
188
- var getDaysBetweenDates = function (startDate, endDate) {
189
- let now = startDate.clone(),
190
- dates = []
191
- while (now.isSameOrBefore(endDate)) {
192
- dates.push(now.format('MM/DD/YYYY'))
193
- now.add(1, 'days')
194
- }
195
- return dates
196
- }
197
-
198
- //itterate days in array
199
- Util.enumerateDaysBetweenDates = function (startDate, endDate) {
200
- let now = moment(startDate).clone(),
201
- dates = []
202
- while (now.isSameOrBefore(endDate)) {
203
- dates.push(now.format('MM/DD/YYYY'))
204
- now.add(1, 'days')
205
- }
206
- return dates
207
- }
208
-
209
- Util.tableArray = function (arr = []) {
210
- let r = []
211
- let tables = arr[0]
212
- for (let i = 0; i < tables.length; i++) {
213
- for (let obj in tables[i]) {
214
- r.push(tables[i][obj])
215
- }
216
- }
217
- return r
218
- }
219
-
220
- /*
221
- table array in sql to arr table name
222
- only for generator
223
- */
224
- Util.tableArrayToObj = (arr = []) => {
225
- return arr.map((m) => Object.values(m)[0])
226
- }
227
-
228
- Util.escapeRegExp = function (str = '') {
229
- return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1')
230
- }
231
-
232
- Util.validateEmail = function (email) {
233
- let re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
234
- return re.test(email)
235
- }
236
-
237
- /*
238
- Replace All like str_replace in PHP
239
- example : Util.replaceAll("abd","a","")
240
- */
241
-
242
- Util.replaceAll = function (str = '', find, replace) {
243
- let t = ''
244
- if (Array.isArray(find)) {
245
- t = str
246
- for (let i = 0; i < find.length; i++) {
247
- if (str.indexOf(find[i]) > -1) {
248
- t = str.replace(new RegExp(Util.escapeRegExp(find[i]), 'g'), replace)
249
- }
250
- }
251
- } else {
252
- if (typeof str == 'string') {
253
- t = str.replace(new RegExp(Util.escapeRegExp(find), 'g'), replace)
254
- }
255
- }
256
- return t
257
- }
258
-
259
- Util.phoneFixed = function (str = '') {
260
- let ret = ''
261
- str = Util.replaceAll(str, ' ', '')
262
- let phone = str.trim()
263
- phone = Util.replaceAll(phone, '-', '')
264
- let first = phone.charAt(0)
265
- if (first == '') {
266
- ret = ''
267
- } else if (first == '+') {
268
- ret = phone
269
- } else if (first == '0') {
270
- ret = '+62' + phone.replace('0', '')
271
- } else {
272
- ret = '+' + phone
273
- }
274
-
275
- return ret
276
- }
277
-
278
- Util.jsonSuccess = function (message = '') {
279
- message = message || LANGUAGE.data_saved
280
- let json = { type: 'success', status: 1, title: LANGUAGE.success, message: message }
281
-
282
- return json
283
- }
284
-
285
- Util.flashError = function (message = '', errors = []) {
286
- message = message || LANGUAGE.data_not_found
287
- let json = { type: 'error', status: 0, title: 'Error', message: message, errors: errors }
288
-
289
- return json
290
- }
291
-
292
- Util.jsonError = function (path, message) {
293
- let json = {}
294
- json.errorLog = 1
295
- json.type = 'error'
296
- json.status = 0
297
- json.title = path + ' Error!'
298
- json.message = message
299
- json.errors = [{ path: path, message: message }]
300
-
301
- return json
302
- }
303
-
304
- Util.arrayToObject = (array = [], keyField, isInteger = false) => {
305
- let obj = {}
306
- if (array.length) {
307
- array.forEach(function (item) {
308
- var name = item[keyField] == null ? 'xxxxxx' : item[keyField] == 'null' ? 'xxxxxx' : isInteger ? item[keyField] : item[keyField] + ''
309
- obj[name] = item
310
- })
311
- }
312
- return obj
313
- }
314
-
315
- //chase id:1,name:'test' t0 {1:'test'}
316
- Util.modulesSwitch = (arr = []) => {
317
- let stores = []
318
- stores.push({ id: '', name: '' })
319
- arr.forEach((ar, index) => {
320
- stores.push({ id: index, name: ar })
321
- })
322
- return stores
323
- }
324
-
325
- Util.buildArrayObjectPrefix = function (arr = []) {
326
- return Util.modulesSwitch(arr)
327
- }
328
-
329
- Util.arrayWithObject = (array = [], key, field) => {
330
- if (array.length) {
331
- return array.reduce((obj, item) => {
332
- obj[item[key]] = item[field]
333
- return obj
334
- }, {})
335
- }
336
- }
337
-
338
- /*
339
- for movedupload file using single file
340
- */
341
- Util.moveFile = function (buffer, filename) {
342
- return new Promise(function (resolve, reject) {
343
- buffer.mv(filename, function (err) {
344
- if (err) {
345
- reject(err)
346
- } else {
347
- resolve(filename)
348
- }
349
- })
350
- })
351
- }
352
-
353
- Util.generateUnique = function (length, charset) {
354
- let random = Util.generate(length, charset)
355
- let uid = new Date().valueOf().toString(36)
356
-
357
- return uid + random
358
- }
359
-
360
- Util.generate = function (length, charset) {
361
- length = length || 50
362
- //alphanumeric - [0-9 a-z A-Z] alphabetic - [a-z A-Z] numeric - [0-9] hex - [0-9 a-f] custom - any given characters
363
- charset = charset || 'alphanumeric'
364
- return randomstring.generate({
365
- length: length,
366
- charset: charset,
367
- })
368
- }
369
-
370
- Util.uuid = () => {
371
- return uuidv4()
372
- }
373
- /*
374
- generate random string 8
375
- */
376
- Util.random = function (length) {
377
- length = length || 5
378
- let text = ''
379
- const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
380
- for (let i = 0; i < length; i++) text += possible.charAt(Math.floor(Math.random() * possible.length))
381
-
382
- return text
383
- }
384
-
385
- Util.whitelist = function () {
386
- return ['www', 'app', 'my', 'sintret', 'https', 'https']
387
- }
388
-
389
- Util.convertDate = function (d) {
390
- d = d.trim()
391
- let myarr = d.split(' ')
392
- return myarr[2] + '-' + Util.monthConvert(myarr[1]) + '-' + myarr[0]
393
- }
394
-
395
- // get string start from to
396
- Util.cut = function (text, start, end) {
397
- return text.substr(start, end)
398
- }
399
-
400
- Util.getFormattedDate = function (date) {
401
- let year = date.getFullYear()
402
- let month = (1 + date.getMonth()).toString()
403
- month = month.length > 1 ? month : '0' + month
404
- let day = date.getDate().toString()
405
- day = day.length > 1 ? day : '0' + day
406
- let time = date.getHours() + ':' + date.getMinutes() + ':' + date.getSeconds()
407
- return year + '-' + month + '-' + day + ' ' + time
408
- }
409
-
410
- Util.uniqueId = function () {
411
- return (Date.now().toString(36) + Math.random().toString(36).substr(2, 5)).toUpperCase()
412
- }
413
-
414
- Util.typePaperSize = [
415
- { title: 'F4', description: 'FOLIO', width: 215, height: 330 },
416
- { title: 'LEGAL', description: 'LEGAL', width: 216, height: 356 },
417
- { title: 'LETTER', description: 'LETTER', width: 216, height: 279 },
418
- { title: 'A3', description: 'A3', width: 297, height: 420 },
419
- { title: 'A4', description: 'A4', width: 210, height: 297 },
420
- { title: 'A5', description: 'A5', width: 148, height: 210 },
421
- { title: 'A6', description: 'A6', width: 105, height: 148 },
422
- { title: 'A7', description: 'A7', width: 74, height: 105 },
423
- { title: 'A8', description: 'A8', width: 52, height: 74 },
424
- { title: 'A9', description: 'A9', width: 37, height: 52 },
425
- { title: 'CUSTOM', description: 'CUSTOM', width: 105, height: 148 },
426
- ]
427
-
428
- Util.typeFont = [
429
- 'Verdana, Geneva, sans-serif',
430
- '"Times New Roman", Times, serif',
431
- 'Georgia, serif',
432
- '"Palatino Linotype", "Book Antiqua", Palatino, serif',
433
- 'Arial, Helvetica, sans-serif',
434
- '"Arial Black", Gadget, sans-serif',
435
- '"Comic Sans MS", cursive, sans-serif',
436
- 'Impact, Charcoal, sans-serif',
437
- '"Lucida Sans Unicode", "Lucida Grande", sans-serif',
438
- 'Tahoma, Geneva, sans-serif',
439
- '"Trebuchet MS", Helvetica, sans-serif',
440
- '"Courier New", Courier, monospace',
441
- '"Lucida Console", Monaco, monospace',
442
- ]
443
-
444
- Util.objectToGridFormat = function (obj = {}, isInteger = false) {
445
- isInteger = isInteger || false
446
- let arr = []
447
- arr.push({ id: '', name: '' })
448
- for (let keys in obj) {
449
- if (isInteger) {
450
- arr.push({ id: parseInt(keys), name: obj[keys] })
451
- } else {
452
- arr.push({ id: keys, name: obj[keys] })
453
- }
454
- }
455
- return arr
456
- }
457
-
458
- Util.random = function (length = 5) {
459
- let text = ''
460
- const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
461
- for (let i = 0; i < length; i++) text += possible.charAt(Math.floor(Math.random() * possible.length))
462
-
463
- return text
464
- }
465
-
466
- Util.typePrint = {
467
- register: '{"paper_size":"F4","paper_size_width":"215","paper_size_height":"330","padding_top":"8","padding_right":"8","padding_bottom":"8","padding_left":"8","border":"1","font":"0","font_size":"10","header":"SURAT PERINTAH KERJA","header_font":"0","header_font_size":"26"}',
468
- estimation: '{"paper_size":"F4","paper_size_width":"215","paper_size_height":"330","padding_top":"8","padding_right":"8","padding_bottom":"8","padding_left":"8","border":"1","font":"0","font_size":"12","header":"ESTIMASI BIAYA PERBAIKAN","header_font":"0","header_font_size":"18"}',
469
- invoice: '{"paper_size":"A5","paper_size_width":"148","paper_size_height":"210","padding_top":"8","padding_right":"8","padding_bottom":"8","padding_left":"8","border":"1","font":"0","font_size":"12","header":"INVOICE","header_font":"0","header_font_size":"18"}',
470
- currency: '{"symbol":"Rp","name":"Rupiah","thousand":"."}',
471
- }
472
-
473
- Util.isJson = function (text) {
474
- if (text) {
475
- if (
476
- /^[\],:{}\s]*$/.test(
477
- text
478
- .replace(/\\["\\\/bfnrtu]/g, '@')
479
- .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
480
- .replace(/(?:^|:|,)(?:\s*\[)+/g, '')
481
- )
482
- ) {
483
- //the json is ok
484
- return true
485
- } else {
486
- return false
487
- //the json is not ok
488
- }
489
- }
490
- return false
491
- }
492
-
493
- Util.isEmptyObject = function (obj = {}) {
494
- for (let prop in obj) {
495
- if (Object.prototype.hasOwnProperty.call(obj, prop)) {
496
- return false
497
- }
498
- }
499
-
500
- return JSON.stringify(obj) === JSON.stringify({})
501
- }
502
-
503
- Util.serializeTable = function (table = '') {
504
- return '`' + table + '`'
505
- }
506
-
507
- Util.getKey = function (obj = {}, field = '') {
508
- let t = ''
509
- for (let item in obj) {
510
- if (obj[item] == field) {
511
- return item
512
- }
513
- }
514
- return t
515
- }
516
-
517
- Util.camelize = function (text = '') {
518
- return text.replace(/^([A-Z])|[\s-_]+(\w)/g, function (match, p1, p2, offset) {
519
- if (p2) return p2.toUpperCase()
520
- return p1.toLowerCase()
521
- })
522
- }
523
-
524
- Util.decamelize = function (str = '', separator = '_') {
525
- return str
526
- .replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2')
527
- .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2')
528
- .replace('_', separator)
529
- .toLowerCase()
530
- }
531
-
532
- /*
533
- change : Order Step
534
- to : order_tep
535
- */
536
-
537
- Util.toName = function (str = '', separator = '_') {
538
- if (str && str.length) {
539
- str = str.trim()
540
- //add if first character is number with string character
541
- if (Util.isInteger(str.charAt(0))) {
542
- str = 'a' + str
543
- }
544
- let string = str.replace(/\s+/g, separator).toLowerCase()
545
- string = string.replace('/', '')
546
- string = string.replace('//', '')
547
- string = string.replace('__', '_')
548
- return string.replace(/[^A-Za-z0-9/_]/g, '')
549
- }
550
- }
551
-
552
- /*
553
- change : orderStep
554
- to : Order Step
555
- */
556
- Util.fieldToName = function (str = '') {
557
- let title = Util.capitalizeFirstLetter(Util.decamelize(str))
558
- title = Util.replaceAll(title, '_', ' ')
559
- title = Util.replaceAll(title, ' id', '')
560
- title = Util.capitalizeAfterSpace(title)
561
-
562
- const lastWords = Util.lastWord(title)
563
- if (title.length > 4 && lastWords == 'Id') {
564
- title = title.replace('Id', '')
565
- }
566
-
567
- return title
568
- }
569
-
570
- Util.capitalizeWord = (string = '') => {
571
- return string
572
- .split(' ')
573
- .map((m) => m[0].toUpperCase() + m.substr(1))
574
- .join(' ')
575
- }
576
-
577
- Util.capitalizeFirstLetter = (string = '') => {
578
- return string.charAt(0).toUpperCase() + string.slice(1)
579
- }
580
-
581
- Util.asyncWrap = (fn) => {
582
- return (req, res, next) => {
583
- fn(req, res, next).catch(next)
584
- }
585
- }
586
-
587
- Util.capitalizeAfterSpace = function (str = '') {
588
- str = Util.replaceAll(str, '_', ' ')
589
- return str.replace(/\w\S*/g, function (txt) {
590
- return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()
591
- })
592
- }
593
-
594
- Util.capitalizeAfterSpaceTitle = function (str = '') {
595
- str = Util.replaceAll(str, ' ', '_')
596
- return str.replace(/\w\S*/g, function (txt) {
597
- return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()
598
- })
599
- }
600
-
601
- Util.lastWord = function (words = '') {
602
- let n = words.split(' ')
603
- return n[n.length - 1]
604
- }
605
-
606
- Util.arrayUnShift = function (arr = [], val = '') {
607
- let obj = {}
608
- obj[arr[0]] = ''
609
- obj[arr[1]] = ''
610
- return obj
611
- }
612
-
613
- Util.in_array = function (needle = '', haystack = []) {
614
- if (haystack.length && needle) {
615
- return haystack.includes(needle)
616
- } else {
617
- return false
618
- }
619
- }
620
-
621
- Util.gridSearch = function (visibles, relations, name, value) {
622
- let index = 0
623
- let elm = 'input'
624
- for (let i = 0; i < visibles.length; i++) {
625
- if (name == visibles[i]) {
626
- index = i
627
- }
628
- }
629
- if (!Util.isEmptyObject(relations)) {
630
- let arr = Object.keys(relations)
631
- for (let i = 0; i < arr.length; i++) {
632
- if (name == arr[i]) {
633
- elm = 'select'
634
- }
635
- }
636
- }
637
- return 'searchValue.eq(' + index + ').find("' + elm + '").val("' + value + '");'
638
- }
639
-
640
- Util.toNumber = function (num) {
641
- num = num + ''
642
- return parseFloat(Util.replaceAll(num, '.', ''))
643
- }
644
-
645
- Util.formatNumber = function (num, thousandSeparator = '.') {
646
- num = num || ''
647
- let sep = '$1' + thousandSeparator
648
- let numString = num.toString()
649
- if (numString.indexOf('.') > -1) {
650
- let explode = numString.split('.')
651
- return explode[0].replace(/(\d)(?=(\d{3})+(?!\d))/g, sep) + ',' + explode[1]
652
- } else {
653
- return numString.replace(/(\d)(?=(\d{3})+(?!\d))/g, sep)
654
- }
655
- }
656
-
657
- //usage Util.round(12345.6789, 2) // 12345.68
658
- Util.round = (value, precision = 0) => {
659
- value = +value || 0
660
- var multiplier = Math.pow(10, precision)
661
- return Math.round(value * multiplier) / multiplier
662
- }
663
-
664
- Util.fileAttribute = function (filename = '') {
665
- filename = filename.toLowerCase() || ''
666
- let ext = filename.split('.').pop()
667
- let obj = {}
668
- obj.ext = ext
669
- if (Util.in_array(ext, Util.fileImage)) {
670
- obj.type = 'image'
671
- } else {
672
- obj.type = 'file'
673
- }
674
- return obj
675
- }
676
-
677
- Util.fileImage = ['jpg', 'jpeg', 'png', 'webp', 'bmp', 'tif', 'gif', 'png', 'svg', 'avif']
678
-
679
- Util.fileExtension = (filename = '') => {
680
- filename = filename.toLowerCase() || ''
681
- let obj = {}
682
- let ext = filename.split('.').pop()
683
- obj.ext = ext
684
- if (Util.in_array(ext, Util.fileImage)) {
685
- obj.type = 'image'
686
- } else {
687
- obj.type = 'file'
688
- }
689
- let file = 'file.png'
690
- if (ext == 'docx' || ext == 'doc') {
691
- file = 'word.png'
692
- } else if (ext == 'xls' || ext == 'xlsx') {
693
- file = 'excel.png'
694
- } else if (ext == 'pdf') {
695
- file = 'pdf.png'
696
- } else if (ext == 'ppt' || ext == 'pptx') {
697
- file = 'ppt.png'
698
- } else if (ext == 'txt') {
699
- file = 'txt.png'
700
- } else if (ext == 'zip') {
701
- file = 'zip.jpg'
702
- } else if (ext == 'rar') {
703
- file = 'rar.jpg'
704
- } else if (ext == 'rar') {
705
- file = 'file.png'
706
- }
707
- obj.file = file
708
- return obj
709
- }
710
-
711
- Util.fileView = function (dir = '', file = '', attributes = {}) {
712
- let filename = dir + file
713
- let html = ''
714
- let width = attributes.hasOwnProperty('width') ? attributes.width : '300'
715
- let withIcon = attributes.hasOwnProperty('withIcon') ? true : false
716
- let obj = Util.fileExtension(filename)
717
- let className = attributes.hasOwnProperty('class') ? ` class="${attributes.class}" ` : ''
718
- if (filename.includes('https')) {
719
- html = `<img src="${file}" ${className} class="img-responsive">`
720
- } else {
721
- if (obj.type == 'image') {
722
- html = `<img src="${filename}" ${className} width="${width}px">`
723
- } else {
724
- if (file) {
725
- if (withIcon) {
726
- html = `<img class="mb-3 boxy-small" src="/img/${obj.file}" height="45px" width="45px"><a class="text-success" target="_blank" href="${filename}"> ${file.substring(13)}</a>`
727
- } else {
728
- html = `<a class="text-success" target="_blank" href="${filename}"> ${file.substring(13)}</a>`
729
- }
730
- }
731
- }
732
- }
733
-
734
- return html
735
- }
736
- /// end files
737
-
738
- Util.arrayDelete = function (arr, value) {
739
- return arr.filter((item) => item != value)
740
- }
741
-
742
- Util.arrayDeletes = function (arr = [], array = []) {
743
- return arr.filter((item) => !Util.in_array(item, array))
744
- }
745
-
746
- Util.arrayToList = function (arr, array, delimiter, isCount) {
747
- delimiter = delimiter || '<br>'
748
- isCount = isCount || 1
749
- let html = ''
750
- if (arr) {
751
- for (var i = 0; i < arr.length; i++) {
752
- html += isCount == 1 ? i + 1 + '. ' + array[arr[i]] + delimiter : ' ' + array[arr[i]] + delimiter
753
- }
754
- html = html.slice(0, delimiter.length * -1)
755
- }
756
-
757
- return html
758
- }
759
-
760
- Util.menuAccess = function (menu, params) {
761
- const roles = require('./role')
762
- const routes = roles.routes
763
- if (Util.in_array(menu, routes)) {
764
- if (Util.in_array(menu, params)) return true
765
- else return false
766
- } else {
767
- return true
768
- }
769
- }
770
-
771
- Util.dropdownHelper = function (data, field, model) {
772
- let fieldsx = field + '[]'
773
- let name = field + '[]'
774
- let myvalue = typeof data[fieldsx] == undefined ? ' ' : typeof data[fieldsx] == 'string' ? '["' + data[fieldsx] + '"]' : JSON.stringify(data[name])
775
- if (myvalue) {
776
- let unique = myvalue.indexOf('[') > -1 ? myvalue : !myvalue ? '' : '[' + myvalue + ']'
777
- unique = JSON.parse(unique)
778
- data[field] = JSON.stringify(unique.filter(Util.arrayUnique))
779
- delete data[name]
780
- }
781
- if (model.fields[field].required) {
782
- if (!data[field]) {
783
- return false
784
- }
785
- }
786
- return data
787
- }
788
-
789
- Util.dropdownAdd = function (data, field, model, datas) {
790
- let name = field + '[]'
791
- let myvalue = typeof datas == undefined ? ' ' : typeof datas == 'string' ? '["' + datas + '"]' : JSON.stringify(datas)
792
- if (myvalue) {
793
- let unique = myvalue.indexOf('[') > -1 ? myvalue : !myvalue ? '' : '[' + myvalue + ']'
794
- unique = JSON.parse(unique)
795
- myvalue = JSON.stringify(unique.filter(Util.arrayUnique))
796
- delete data[name]
797
-
798
- data[field] = myvalue
799
- }
800
- if (model.fields[field].required) {
801
- if (!myvalue) {
802
- return false
803
- }
804
- }
805
- return data
806
- }
807
- //array unique
808
- // array.filter(Util.arrayUnique);
809
- Util.arrayUnique = (value, index, self) => {
810
- return self.indexOf(value) == index
811
- }
812
-
813
- Util.virtualHelper = function (obj) {
814
- if (Util.isEmptyObject(obj)) return
815
- if (obj == undefined) return
816
-
817
- var str = ''
818
- for (var key in obj) {
819
- str += ', `' + obj[key] + '` AS ' + key
820
- }
821
-
822
- return str
823
- }
824
-
825
- Util.nots = ['id', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy', 'companyId', 'created_at', 'updated_at', 'updated_by', 'created_by', 'modified_by', 'company_id', 'token', 'version', 'signin_method', 'lastLogin', 'last_login', 'forgotPassword', 'forgot_password', 'no', 'actionColumn', 'lock', 'approval_status', 'approval_history']
826
-
827
- Util.requiredFields = function (obj = {}) {
828
- var nots = Util.nots
829
- var arr = []
830
- for (var key in obj) {
831
- if (!Util.in_array(key, nots)) {
832
- if (obj[key].required == true) {
833
- arr.push(key)
834
- }
835
- }
836
- }
837
- return arr
838
- }
839
-
840
- Util.extractDetails = function (obj = {}) {
841
- let arr = []
842
- for (let key in obj) {
843
- if (obj[key].length > 0) {
844
- for (var i = 0; i < obj[key].length; i++) {
845
- arr.push(obj[key][i])
846
- }
847
- }
848
- }
849
- return arr
850
- }
851
-
852
- Util.arrayToConcat = function (arr = []) {
853
- let str = 'CONCAT('
854
- for (let i = 0; i < arr.length; i++) {
855
- str += arr[i] + '," - ",'
856
- }
857
- str = str.slice(0, -9)
858
- str += ')'
859
-
860
- return str
861
- }
862
-
863
- //sequence all fields based on drag drop generator
864
- Util.arraySequence = function (arr = [], left = [], right = []) {
865
- let obj = Util.arrayToObject(arr, 'Field')
866
- let temp = [],
867
- stores = []
868
- for (let i = 0; i < arr.length; i++) {
869
- if (arr[i].Field == 'id') {
870
- stores.push(arr[i].Field)
871
- temp.push(arr[i])
872
- }
873
- }
874
- if (Array.isArray(left)) {
875
- for (let i = 0; i < left.length; i++) {
876
- if (i % 2 == 0) {
877
- temp.push(obj[left[i]])
878
- stores.push(left[i])
879
- }
880
- }
881
- }
882
- if (Array.isArray(right)) {
883
- for (let i = 0; i < right.length; i++) {
884
- if (i % 2 == 0) {
885
- temp.push(obj[right[i]])
886
- stores.push(right[i])
887
- }
888
- }
889
- }
890
- if (Array.isArray(left)) {
891
- for (let i = 0; i < left.length; i++) {
892
- if (i % 2 == 1) {
893
- temp.push(obj[left[i]])
894
- stores.push(left[i])
895
- }
896
- }
897
- }
898
- if (Array.isArray(right)) {
899
- for (let i = 0; i < right.length; i++) {
900
- if (i % 2 == 1) {
901
- temp.push(obj[right[i]])
902
- stores.push(right[i])
903
- }
904
- }
905
- }
906
-
907
- for (let i = 0; i < arr.length; i++) {
908
- const field = arr[i].Field
909
- if (!Util.in_array(field, stores)) {
910
- temp.push(arr[i])
911
- }
912
- }
913
-
914
- return temp
915
- }
916
-
917
- Util.isInteger = (value) => {
918
- return (
919
- !isNaN(value) &&
920
- (function (x) {
921
- return (x | 0) === x
922
- })(parseFloat(value))
923
- )
924
- }
925
-
926
- Util.isEmptyArray = (arr = []) => {
927
- let isArr = false
928
- if (Array.isArray(arr)) {
929
- if (arr.length === 0) {
930
- isArr = true
931
- } else {
932
- isArr = arr.reduce((a, b) => (b === null ? a + 0 : a + 1), 0) === 0
933
- }
934
- } else {
935
- isArr = true
936
- }
937
- return isArr
938
- }
939
-
940
- Util.isNumeric = function (value) {
941
- return /^-?\d+$/.test(value)
942
- }
943
-
944
- Util.tags = function (tags = '') {
945
- let html = ''
946
- if (tags.indexOf(',') > -1) {
947
- let explode = tags.split(',')
948
- for (var i = 0; i < explode.length; i++) {
949
- html += `<a href="#" rel="tag">${explode[i]}</a>`
950
- }
951
- } else {
952
- html += `<a href="#" rel="tag">${tags}</a>`
953
- }
954
-
955
- return html
956
- }
957
-
958
- /*
959
- get extension of filename
960
- */
961
-
962
- Util.getExtensionFile = (str = '') => {
963
- str = str || ''
964
- let extension = str.split('.').pop()
965
- extension = extension.toLowerCase()
966
- let ret = extension
967
- if (extension == 'jpg') {
968
- ret = 'jpeg'
969
- }
970
- return ret
971
- }
972
-
973
- Util.badgeError = (msg = '') => {
974
- return `<span class="badge badge-danger">${msg}</span>`
975
- }
976
-
977
- Util.badgeSuccess = (msg = '') => {
978
- return `<span class="badge badge-success">${msg}</span>`
979
- }
980
-
981
- Util.alertError = function (msg = '') {
982
- return `<div class="alert alert-danger" role="alert">${msg}</div>`
983
- }
984
-
985
- Util.alertSuccess = function (msg = '') {
986
- return `<div class="alert alert-success" role="alert">${msg}</div>`
987
- }
988
-
989
- Util.alertInfo = function (msg = '') {
990
- return `<div class="alert alert-info" role="alert">${msg}</div>`
991
- }
992
-
993
- Util.regexPassword = (lengthMin, lengthMax) => {
994
- //minimum length
995
- lengthMin = lengthMin || 6
996
- lengthMax = lengthMax || 20
997
-
998
- return new RegExp('^[a-zA-Z0-9_-]{' + lengthMin + ',' + lengthMax + '}$', 'i')
999
- }
1000
-
1001
- //huruf dan angka saja
1002
- Util.regexCode = (lengthMin, lengthMax) => {
1003
- lengthMin = lengthMin || 2
1004
- lengthMax = lengthMax || 10
1005
-
1006
- return new RegExp('^[A-Z0-9]{' + lengthMin + ',' + lengthMax + '}$', 'i')
1007
- }
1008
-
1009
- Util.imageProfile = function (image = '') {
1010
- return image ? (image.indexOf('http') > -1 ? image : '/uploads/zuser/' + image) : '/img/user.png'
1011
- }
1012
-
1013
- /*
1014
- Files
1015
- */
1016
- Util.readFile = function (filename = '') {
1017
- try {
1018
- if (Util.fileExist(filename)) {
1019
- const data = fs.readFileSync(filename, 'utf8')
1020
- return data
1021
- }
1022
- } catch (err) {}
1023
- return ''
1024
- }
1025
- //check directory if not exist create or not return true/false
1026
- Util.dirExist = (dir = '', create = false) => {
1027
- try {
1028
- if (create) {
1029
- fs.ensureDir(dir, (err) => {})
1030
- }
1031
- // check if directory exists
1032
- if (fs.existsSync(dir)) {
1033
- return true
1034
- }
1035
- } catch (e) {}
1036
- return false
1037
- }
1038
-
1039
- Util.fileExist = (filename = '') => {
1040
- if (fs.existsSync(filename)) {
1041
- return true
1042
- }
1043
- return false
1044
- }
1045
-
1046
- Util.getAllFiles = (dir = '') => {
1047
- let files = []
1048
- try {
1049
- if (Util.dirExist(dir, true)) {
1050
- files = fs.readdirSync(dir)
1051
- }
1052
- } catch (e) {
1053
- return []
1054
- }
1055
- return files
1056
- }
1057
-
1058
- Util.writeFile = (filename = '', content = '') => {
1059
- try {
1060
- let dir = require('path').dirname(filename)
1061
- Util.dirExist(dir, true)
1062
- fs.writeFileSync(filename, content)
1063
- return true
1064
- } catch (e) {
1065
- return false
1066
- }
1067
- }
1068
-
1069
- Util.deleteAllFiles = (dir = '') => {
1070
- try {
1071
- fs.emptyDirSync(dir)
1072
- return true
1073
- } catch (e) {
1074
- return false
1075
- }
1076
- }
1077
-
1078
- Util.findFilesName = (arr = [], filename = '') => {
1079
- return arr.filter((item) => item.includes(filename))
1080
- }
1081
-
1082
- //convert image file to base64
1083
- Util.imageFiletoBase64 = (imgPath) => {
1084
- // read image file
1085
- const base64Image = fs.readFileSync(imgPath, 'base64')
1086
- const extensionName = path.extname(imgPath)
1087
- return `data:image/${extensionName.split('.').pop()};base64,${base64Image}`
1088
- }
1089
-
1090
- Util.getFiles = function (dir, token = '') {
1091
- let arr = fs.readdirSync(dir)
1092
- let folders = ''
1093
- let files = ''
1094
- arr.forEach(function (item) {
1095
- if (item.indexOf('.') > -1) {
1096
- var explode = dir.split('public/')
1097
- var path = explode[1]
1098
- var url = '/' + path + '/' + item
1099
- var extension = item.split('.').pop()
1100
- files += ` <div class="folder data-file ui-draggable ui-draggable-handle ui-selectee" data-toggle="tooltip" data-type="file" data-url="${url}" data-extension="${extension}" data-name="${item}" filename="${item}" data-original-title="${item}">
1101
- <img src="/assets/images/formats/file.png" class="img-responsive ui-selectee">
1102
- <p class="text-ellipsis ui-selectee">${item}</p>
1103
- </div>`
1104
- } else {
1105
- let explode = dir.split(token)
1106
- let path = explode[1] || ''
1107
- let state = ''
1108
- if (path == '') {
1109
- state = '/' + item
1110
- } else {
1111
- state = path.replace(item, '') + '/' + item
1112
- }
1113
- folders += `<div class="folder data-folder ui-draggable ui-draggable-handle ui-droppable ui-selectee" data-toggle="tooltip" data-type="folder" data-state="${state}" data-name="${item}" data-original-title="${item}">
1114
- <img src="/assets/images/folder.png" class="img-responsive ui-selectee">
1115
- <p class="text-ellipsis ui-selectee">${item}</p>
1116
- </div>`
1117
- }
1118
- })
1119
-
1120
- return folders + files
1121
- }
1122
-
1123
- Util.ejsOpen = '<%- '
1124
- Util.ejsStart = '<% '
1125
- Util.ejsClose = ' %>'
1126
- Util.ejsFunction = (yourCode, isStatement = false) => {
1127
- const open = isStatement ? Util.ejsStart : Util.ejsOpen
1128
- return open + yourCode + Util.ejsClose
1129
- }
1130
-
1131
- Util.attributeOptions = (obj = {}, defaultObj = {}) => {
1132
- let html = ''
1133
- let arr = Object.keys(defaultObj) || []
1134
- for (const key in obj) {
1135
- let value = obj[key]
1136
- if (defaultObj.hasOwnProperty(key)) {
1137
- value = defaultObj[key] + obj[key]
1138
- Util.arrayDelete(arr, key)
1139
- }
1140
- html += ` ${key}="${value}" `
1141
- }
1142
- if (arr.length) {
1143
- arr.map((item) => (html += ` ${item}="${defaultObj[item]}" `))
1144
- }
1145
- return html
1146
- }
1147
-
1148
- /*
1149
- array to update json array at postgresql
1150
- */
1151
- Util.array_to_jsonb = (arr = []) => {
1152
- let value = ''
1153
- let myarr = []
1154
- if (arr.length > 0) {
1155
- arr.map((item) => {
1156
- myarr.push(JSON.stringify(item))
1157
- })
1158
- }
1159
- value = JSON.stringify(myarr).replace('[', '{').replaceAll(']', '}')
1160
- return value
1161
- }
1162
-
1163
- /*
1164
- array to update array at postgresql
1165
- */
1166
- Util.array_to_arraypg = (arr = []) => {
1167
- let value = null
1168
- if (arr.length > 0) {
1169
- value = JSON.stringify(arr).replace('[', '{').replaceAll(']', '}')
1170
- }
1171
- return value
1172
- }
1173
-
1174
- Util.userAvatar = (img = '') => {
1175
- return img ? (img.includes('http') ? img : `/uploads/user/${img}`) : `/img/user.png`
1176
- }
1177
-
1178
- /*
1179
- SQL HELPER
1180
- */
1181
- Util.selectParser = (fields = [], MYMODEL = {}) => {
1182
- let table = MYMODEL.table
1183
- let virtuals = []
1184
- let select = ''
1185
- for (var key in MYMODEL.widgets) {
1186
- if (MYMODEL.widgets[key].name === 'virtual') {
1187
- virtuals.push(key)
1188
- }
1189
- }
1190
- let arr = []
1191
- fields.forEach((item) => {
1192
- if (virtuals.includes(item)) {
1193
- select += `${MYMODEL.widgets[item].fields},`
1194
- } else if (item === 'no') {
1195
- arr.push(`${table}.id`)
1196
- } else if (item === 'actionColumn') {
1197
- arr.push(`${table}.lock`)
1198
- } else {
1199
- arr.push(Util.fieldWithTable(item, MYMODEL))
1200
- }
1201
- })
1202
- //select += `"${arr.join('","')}"`
1203
- select += arr.join(',')
1204
- return select
1205
- }
1206
-
1207
- Util.fieldWithTable = (field, MYMODEL, isWhere = false) => {
1208
- let name = ''
1209
- let joinList = MYMODEL.joins && MYMODEL.joins.list.length > 0 ? MYMODEL.joins.list : []
1210
- if (joinList.length > 0) {
1211
- if (joinList.includes(field)) {
1212
- let split = field.split('___')
1213
- if (isWhere) {
1214
- name = `${split[0]}.${split[1]}`
1215
- } else {
1216
- name = `${split[0]}.${split[1]} as ${field}`
1217
- }
1218
- } else {
1219
- name = `${MYMODEL.table}.${field}`
1220
- }
1221
- } else {
1222
- name = `${MYMODEL.table}.${field}`
1223
- }
1224
- return name
1225
- }
1226
-
1227
- Util.tableWithJoin = (MYMODEL) => {
1228
- return MYMODEL.joins && MYMODEL.joins.list.length > 0 ? MYMODEL.joins.sql : []
1229
- }
1230
-
1231
- Util.selectMysql = (fields = [], relations = {}) => {
1232
- let obj = {}
1233
- let arr = []
1234
- let virtuals = {}
1235
- let virtualArray = []
1236
- if (relations.hasOwnProperty('zvirtuals')) {
1237
- virtuals = relations.zvirtuals
1238
- delete relations.zvirtuals
1239
- virtualArray = Object.keys(virtuals)
1240
- virtualArray.forEach(function (item) {
1241
- fields = Util.arrayDelete(fields, item)
1242
- })
1243
- }
1244
- let selects = []
1245
- fields.forEach(function (item) {
1246
- if (item != 'actionColumn') {
1247
- if (item == 'no') {
1248
- selects.push('id')
1249
- } else {
1250
- selects.push(item)
1251
- }
1252
- }
1253
- })
1254
- //make sure id
1255
- selects.push('id')
1256
- let select = `"${selects.join('","')}"`
1257
- if (virtualArray.length) {
1258
- for (let key in virtuals) {
1259
- select += `, ${virtuals[key]} `
1260
- }
1261
- }
1262
- return select
1263
- }
1264
-
1265
- /*
1266
- Sorting array object with key name
1267
- */
1268
- Util.sortArray = (arr, key) => {
1269
- function compare(a, b) {
1270
- if (a[key] < b[key]) {
1271
- return -1
1272
- }
1273
- if (a[key] > b[key]) {
1274
- return 1
1275
- }
1276
- return 0
1277
- }
1278
-
1279
- return arr.sort(compare)
1280
- }
1281
-
1282
- Util.cleanString = (str = '') => {
1283
- return str.replaceAll('(', '').replaceAll(')', '').replaceAll('%', '').replaceAll('-', '')
1284
- }
1285
-
1286
- Util.encrypt = (str, key) => {
1287
- const crypto = require('crypto')
1288
- var encrypt = crypto.createCipheriv('des-ede3', key, '')
1289
- var theCipher = encrypt.update(str, 'utf8', 'base64')
1290
- theCipher += encrypt.final('base64')
1291
- theCipher = theCipher.replaceAll('/', '55ter55')
1292
- return theCipher
1293
- }
1294
-
1295
- Util.decrypt = (str, key) => {
1296
- const crypto = require('crypto')
1297
- str = str.replaceAll('55ter55', '/')
1298
- var decrypt = crypto.createDecipheriv('des-ede3', key, '')
1299
- var s = decrypt.update(str, 'base64', 'utf8')
1300
- return s + decrypt.final('utf8')
1301
- }
1302
-
1303
- Util.terbilang = (nilai) => {
1304
- nilai = Math.floor(Math.abs(nilai))
1305
- let huruf = ['', 'Satu', 'Dua', 'Tiga', 'Empat', 'Lima', 'Enam', 'Tujuh', 'Delapan', 'Sembilan', 'Sepuluh', 'Sebelas']
1306
- let bagi = 0
1307
- let penyimpanan = ''
1308
- if (nilai < 12) {
1309
- penyimpanan = ' ' + huruf[nilai]
1310
- } else if (nilai < 20) {
1311
- penyimpanan = Util.terbilang(Math.floor(nilai - 10)) + ' Belas'
1312
- } else if (nilai < 100) {
1313
- bagi = Math.floor(nilai / 10)
1314
- penyimpanan = Util.terbilang(bagi) + ' Puluh' + Util.terbilang(nilai % 10)
1315
- } else if (nilai < 200) {
1316
- penyimpanan = ' Seratus' + Util.terbilang(nilai - 100)
1317
- } else if (nilai < 1000) {
1318
- bagi = Math.floor(nilai / 100)
1319
- penyimpanan = Util.terbilang(bagi) + ' Ratus' + Util.terbilang(nilai % 100)
1320
- } else if (nilai < 2000) {
1321
- penyimpanan = ' Seribu' + Util.terbilang(nilai - 1000)
1322
- } else if (nilai < 1000000) {
1323
- bagi = Math.floor(nilai / 1000)
1324
- penyimpanan = Util.terbilang(bagi) + ' Ribu' + Util.terbilang(nilai % 1000)
1325
- } else if (nilai < 1000000000) {
1326
- bagi = Math.floor(nilai / 1000000)
1327
- penyimpanan = Util.terbilang(bagi) + ' Juta' + Util.terbilang(nilai % 1000000)
1328
- } else if (nilai < 1000000000000) {
1329
- bagi = Math.floor(nilai / 1000000000)
1330
- penyimpanan = Util.terbilang(bagi) + ' Miliar' + Util.terbilang(nilai % 1000000000)
1331
- } else if (nilai < 1000000000000000) {
1332
- bagi = Math.floor(nilai / 1000000000000)
1333
- penyimpanan = Util.terbilang(nilai / 1000000000000) + ' Triliun' + Util.terbilang(nilai % 1000000000000)
1334
- }
1335
- return penyimpanan
1336
- }
1337
-
1338
- Util.array_id_to_zname = (arr) => {
1339
- let r = {}
1340
- arr.map((item) => {
1341
- r[item.id] = item.zname;
1342
- })
1343
- return r;
1344
- }
1345
-
1346
- Util.tableShowInGrid = (arr, qey, MYMODEL, myCache, companyId) => {
1347
- try {
1348
- if (typeof arr != 'object') {
1349
- arr = []
1350
- }
1351
- arr = arr || []
1352
- let html = ''
1353
- let MYMODELS = myCache.get('MYMODELS');
1354
- let mywidget = MYMODELS[MYMODEL.widgets[qey].table].widgets
1355
- if (arr.length > 0) {
1356
- html += `<table class="table table-sm table-striped table-bordered table-hover">`
1357
- let json = arr[0]
1358
- arr.map((item) => {
1359
- html += `<tr>`
1360
- for (let key in item) {
1361
- var keyFields = key + 'Fields'
1362
- var keyObject = key + 'Object'
1363
- let value = item[key]
1364
- if(mywidget[key].name == "relation"){
1365
- value = value ? Util.array_id_to_zname(myCache.get(`${mywidget[key].table}_${MYMODEL.widgets[qey].table}___${key}_${companyId}`))[value] : ''
1366
- } else {
1367
- if (Util.isNumeric(value)) {
1368
- value = Util.formatNumber(value, '.')
1369
- }
1370
- }
1371
-
1372
- html += `<td>${value}</td>`
1373
- }
1374
- html += `</tr>`
1375
- })
1376
- html += `</table>`
1377
- }
1378
- return html
1379
- } catch (e) {
1380
- return e + ''
1381
- }
1382
- }
1383
-
1384
- module.exports = Util
1
+ const moment = require("moment");
2
+ const path = require("path");
3
+ const randomstring = require("randomstring");
4
+ const fs = require("fs-extra");
5
+ const { v4: uuidv4 } = require("uuid");
6
+ const sha256 = require("js-sha256");
7
+
8
+ const Util = {};
9
+
10
+ Util.tab = "\t";
11
+ Util.tabs = (n) => {
12
+ let ret = "";
13
+ for (var i = 0; i < n; i++) {
14
+ ret += Util.tab;
15
+ }
16
+ return ret;
17
+ };
18
+
19
+ Util.NEW_LINE = "\n";
20
+ Util.newLine = "\r\n";
21
+ Util.newLines = (n) => {
22
+ let ret = "";
23
+ for (var i = 0; i < n; i++) {
24
+ ret += Util.newLine;
25
+ }
26
+ return ret;
27
+ };
28
+
29
+ //sha256
30
+ Util.hash = (string) => {
31
+ return sha256(string);
32
+ };
33
+
34
+ Util.hashCompare = (myPlaintextPassword, hash) => {
35
+ return Util.hash(myPlaintextPassword) == hash;
36
+ };
37
+
38
+ Util.excelSequence = function () {
39
+ let abjads = [
40
+ "A",
41
+ "B",
42
+ "C",
43
+ "D",
44
+ "E",
45
+ "F",
46
+ "G",
47
+ "H",
48
+ "I",
49
+ "J",
50
+ "K",
51
+ "L",
52
+ "M",
53
+ "N",
54
+ "O",
55
+ "P",
56
+ "Q",
57
+ "R",
58
+ "S",
59
+ "T",
60
+ "U",
61
+ "V",
62
+ "W",
63
+ "X",
64
+ "Y",
65
+ "Z",
66
+ ];
67
+ let arr = abjads;
68
+ let char = 0;
69
+ let num = 26;
70
+ for (let x = 2; x < 15; x++) {
71
+ let idx = 0;
72
+ for (let i = 1; i <= 26; i++) {
73
+ arr[num] = abjads[char] + abjads[idx];
74
+ idx++;
75
+ num++;
76
+ }
77
+ char++;
78
+ }
79
+
80
+ return arr;
81
+ };
82
+
83
+ Util.now = function () {
84
+ return moment(new Date()).format("YYYY-MM-DD HH:mm:ss");
85
+ };
86
+
87
+ Util.nowShort = function () {
88
+ return moment(new Date()).format("YYYY-MM-DD");
89
+ };
90
+
91
+ Util.ago = (data) => {
92
+ return moment(data).fromNow();
93
+ };
94
+ /*
95
+ moment get one month ago from current
96
+ var monthago = moment().subtract(1, 'months').format('YYYY-MM-DD');
97
+
98
+ */
99
+
100
+ Util.dateSql = function (date, format) {
101
+ format = format || "YYYY-MM-DD";
102
+ if (date && date != "0000-00-00") return moment(date).format(format);
103
+ else return "";
104
+ };
105
+
106
+ Util.dateOriginal = function (date) {
107
+ if (date && date != "0000-00-00") {
108
+ let value = moment(date).utc(false);
109
+ return value;
110
+ } else {
111
+ return "";
112
+ }
113
+ };
114
+
115
+ Util.dateFormat = function (date, format) {
116
+ format = format || "YYYY-MM-DD";
117
+ if (date && date != "0000-00-00") return moment(date).format(format);
118
+ else return "";
119
+ };
120
+
121
+ Util.timePublic = function (date) {
122
+ if (date) return moment(date).format("DD MMM YYYY");
123
+ else return "";
124
+ };
125
+
126
+ Util.timeSql = function (date, format) {
127
+ if (date && date != "0000-00-00 00:00:00") {
128
+ format = format || "YYYY-MM-DD HH:mm:ss";
129
+ return moment(date).format(format);
130
+ } else return "";
131
+ };
132
+
133
+ //moment('2017-11-30T15:00:00-07:00').diff(moment('2017-05-31T15:00:00-07:00'), 'months')
134
+ Util.dateDiff = (start, end, format = "months") => {
135
+ let count = 0;
136
+ if (start && end) {
137
+ count = moment(end).diff(moment(start), format, true);
138
+ }
139
+ return count;
140
+ };
141
+
142
+ Util.getDate = function (date) {
143
+ date = date + "" || "";
144
+ if (date != "") {
145
+ let explode = date.split("-");
146
+ return {
147
+ year: parseInt(explode[0]),
148
+ month: parseInt(explode[1]),
149
+ date: parseInt(explode[2]),
150
+ };
151
+ } else {
152
+ return {
153
+ year: 0,
154
+ month: 0,
155
+ date: 0,
156
+ };
157
+ }
158
+ };
159
+
160
+ Util.dateIsBetween = (compare, start, end) => {
161
+ if (compare == "" || compare == "0000-00-00") {
162
+ return false;
163
+ }
164
+ compare = moment(compare).format("YYYY-MM-DD");
165
+ start = moment(start).format("YYYY-MM-DD");
166
+ end = moment(end).format("YYYY-MM-DD");
167
+ let today = moment(compare);
168
+ let startDate = moment(start);
169
+ let endDate = moment(end);
170
+
171
+ if (compare == start) {
172
+ return true;
173
+ } else if (compare == end) {
174
+ return true;
175
+ } else {
176
+ return today.isBetween(startDate, endDate);
177
+ }
178
+ };
179
+
180
+ Util.getMonth = function (date) {
181
+ if (date.length > 5) {
182
+ let n = new Date(date);
183
+ let m = n.getMonth();
184
+ return parseInt(m) + 1;
185
+ }
186
+ return 0;
187
+ };
188
+
189
+ Util.getYear = function (date) {
190
+ date = Util.dateSql(date) || "";
191
+ return date.slice(0, 4);
192
+ };
193
+
194
+ //first is smaller than second
195
+ Util.calculateDay = function (from, to, holidayInWeek = 0) {
196
+ holidayInWeek = parseInt(holidayInWeek) || 0;
197
+ let count = 0;
198
+ if (holidayInWeek == 1) {
199
+ let days = Util.enumerateDaysBetweenDates(
200
+ moment(from).format("YYYY-MM-DD"),
201
+ moment(to).format("YYYY-MM-DD")
202
+ );
203
+ let countdays = days.filter(
204
+ (item) => parseInt(moment(item).format("d")) != 0
205
+ );
206
+ count = countdays.length;
207
+ } else if (holidayInWeek == 2) {
208
+ let days = Util.enumerateDaysBetweenDates(
209
+ moment(from).format("YYYY-MM-DD"),
210
+ moment(to).format("YYYY-MM-DD")
211
+ );
212
+ let countdays = days.filter(
213
+ (item) =>
214
+ parseInt(moment(item).format("d")) != 0 &&
215
+ parseInt(moment(item).format("d")) != 6
216
+ );
217
+ count = countdays.length;
218
+ } else {
219
+ let a = moment(from);
220
+ let b = moment(to);
221
+ count = b.diff(a, "days") + 1;
222
+ }
223
+
224
+ return count;
225
+ };
226
+
227
+ var getDaysBetweenDates = function (startDate, endDate) {
228
+ let now = startDate.clone(),
229
+ dates = [];
230
+ while (now.isSameOrBefore(endDate)) {
231
+ dates.push(now.format("MM/DD/YYYY"));
232
+ now.add(1, "days");
233
+ }
234
+ return dates;
235
+ };
236
+
237
+ //itterate days in array
238
+ Util.enumerateDaysBetweenDates = function (startDate, endDate) {
239
+ let now = moment(startDate).clone(),
240
+ dates = [];
241
+ while (now.isSameOrBefore(endDate)) {
242
+ dates.push(now.format("MM/DD/YYYY"));
243
+ now.add(1, "days");
244
+ }
245
+ return dates;
246
+ };
247
+
248
+ Util.tableArray = function (arr = []) {
249
+ let r = [];
250
+ let tables = arr[0];
251
+ for (let i = 0; i < tables.length; i++) {
252
+ for (let obj in tables[i]) {
253
+ r.push(tables[i][obj]);
254
+ }
255
+ }
256
+ return r;
257
+ };
258
+
259
+ /*
260
+ table array in sql to arr table name
261
+ only for generator
262
+ */
263
+ Util.tableArrayToObj = (arr = []) => {
264
+ return arr.map((m) => Object.values(m)[0]);
265
+ };
266
+
267
+ Util.escapeRegExp = function (str = "") {
268
+ return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
269
+ };
270
+
271
+ Util.validateEmail = function (email) {
272
+ let re =
273
+ /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
274
+ return re.test(email);
275
+ };
276
+
277
+ /*
278
+ Replace All like str_replace in PHP
279
+ example : Util.replaceAll("abd","a","")
280
+ */
281
+
282
+ Util.replaceAll = function (str = "", find, replace) {
283
+ let t = "";
284
+ if (Array.isArray(find)) {
285
+ t = str;
286
+ for (let i = 0; i < find.length; i++) {
287
+ if (str.indexOf(find[i]) > -1) {
288
+ t = str.replace(new RegExp(Util.escapeRegExp(find[i]), "g"), replace);
289
+ }
290
+ }
291
+ } else {
292
+ if (typeof str == "string") {
293
+ t = str.replace(new RegExp(Util.escapeRegExp(find), "g"), replace);
294
+ }
295
+ }
296
+ return t;
297
+ };
298
+
299
+ Util.phoneFixed = function (str = "") {
300
+ let ret = "";
301
+ str = Util.replaceAll(str, " ", "");
302
+ let phone = str.trim();
303
+ phone = Util.replaceAll(phone, "-", "");
304
+ let first = phone.charAt(0);
305
+ if (first == "") {
306
+ ret = "";
307
+ } else if (first == "+") {
308
+ ret = phone;
309
+ } else if (first == "0") {
310
+ ret = "+62" + phone.replace("0", "");
311
+ } else {
312
+ ret = "+" + phone;
313
+ }
314
+
315
+ return ret;
316
+ };
317
+
318
+ Util.jsonSuccess = function (message = "") {
319
+ message = message || LANGUAGE.data_saved;
320
+ let json = {
321
+ type: "success",
322
+ status: 1,
323
+ title: LANGUAGE.success,
324
+ message: message,
325
+ };
326
+
327
+ return json;
328
+ };
329
+
330
+ Util.flashError = function (message = "", errors = []) {
331
+ message = message || LANGUAGE.data_not_found;
332
+ let json = {
333
+ type: "error",
334
+ status: 0,
335
+ title: "Error",
336
+ message: message,
337
+ errors: errors,
338
+ };
339
+
340
+ return json;
341
+ };
342
+
343
+ Util.jsonError = function (path, message) {
344
+ let json = {};
345
+ json.errorLog = 1;
346
+ json.type = "error";
347
+ json.status = 0;
348
+ json.title = path + " Error!";
349
+ json.message = message;
350
+ json.errors = [{ path: path, message: message }];
351
+
352
+ return json;
353
+ };
354
+
355
+ Util.arrayToObject = (array = [], keyField, isInteger = false) => {
356
+ let obj = {};
357
+ if (array.length) {
358
+ array.forEach(function (item) {
359
+ var name =
360
+ item[keyField] == null
361
+ ? "xxxxxx"
362
+ : item[keyField] == "null"
363
+ ? "xxxxxx"
364
+ : isInteger
365
+ ? item[keyField]
366
+ : item[keyField] + "";
367
+ obj[name] = item;
368
+ });
369
+ }
370
+ return obj;
371
+ };
372
+
373
+ //chase id:1,name:'test' t0 {1:'test'}
374
+ Util.modulesSwitch = (arr = []) => {
375
+ let stores = [];
376
+ stores.push({ id: "", name: "" });
377
+ arr.forEach((ar, index) => {
378
+ stores.push({ id: index, name: ar });
379
+ });
380
+ return stores;
381
+ };
382
+
383
+ Util.buildArrayObjectPrefix = function (arr = []) {
384
+ return Util.modulesSwitch(arr);
385
+ };
386
+
387
+ Util.arrayWithObject = (array = [], key, field) => {
388
+ if (array.length) {
389
+ return array.reduce((obj, item) => {
390
+ obj[item[key]] = item[field];
391
+ return obj;
392
+ }, {});
393
+ }
394
+ };
395
+
396
+ /*
397
+ for movedupload file using single file
398
+ */
399
+ Util.moveFile = function (buffer, filename) {
400
+ return new Promise(function (resolve, reject) {
401
+ buffer.mv(filename, function (err) {
402
+ if (err) {
403
+ reject(err);
404
+ } else {
405
+ resolve(filename);
406
+ }
407
+ });
408
+ });
409
+ };
410
+
411
+ Util.generateUnique = function (length, charset) {
412
+ let random = Util.generate(length, charset);
413
+ let uid = new Date().valueOf().toString(36);
414
+
415
+ return uid + random;
416
+ };
417
+
418
+ Util.generate = function (length, charset) {
419
+ length = length || 50;
420
+ //alphanumeric - [0-9 a-z A-Z] alphabetic - [a-z A-Z] numeric - [0-9] hex - [0-9 a-f] custom - any given characters
421
+ charset = charset || "alphanumeric";
422
+ return randomstring.generate({
423
+ length: length,
424
+ charset: charset,
425
+ });
426
+ };
427
+
428
+ Util.uuid = () => {
429
+ return uuidv4();
430
+ };
431
+ /*
432
+ generate random string 8
433
+ */
434
+ Util.random = function (length) {
435
+ length = length || 5;
436
+ let text = "";
437
+ const possible =
438
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
439
+ for (let i = 0; i < length; i++)
440
+ text += possible.charAt(Math.floor(Math.random() * possible.length));
441
+
442
+ return text;
443
+ };
444
+
445
+ Util.whitelist = function () {
446
+ return ["www", "app", "my", "sintret", "https", "https"];
447
+ };
448
+
449
+ Util.convertDate = function (d) {
450
+ d = d.trim();
451
+ let myarr = d.split(" ");
452
+ return myarr[2] + "-" + Util.monthConvert(myarr[1]) + "-" + myarr[0];
453
+ };
454
+
455
+ // get string start from to
456
+ Util.cut = function (text, start, end) {
457
+ return text.substr(start, end);
458
+ };
459
+
460
+ Util.getFormattedDate = function (date) {
461
+ let year = date.getFullYear();
462
+ let month = (1 + date.getMonth()).toString();
463
+ month = month.length > 1 ? month : "0" + month;
464
+ let day = date.getDate().toString();
465
+ day = day.length > 1 ? day : "0" + day;
466
+ let time =
467
+ date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
468
+ return year + "-" + month + "-" + day + " " + time;
469
+ };
470
+
471
+ Util.uniqueId = function () {
472
+ return (
473
+ Date.now().toString(36) + Math.random().toString(36).substr(2, 5)
474
+ ).toUpperCase();
475
+ };
476
+
477
+ Util.typePaperSize = [
478
+ { title: "F4", description: "FOLIO", width: 215, height: 330 },
479
+ { title: "LEGAL", description: "LEGAL", width: 216, height: 356 },
480
+ { title: "LETTER", description: "LETTER", width: 216, height: 279 },
481
+ { title: "A3", description: "A3", width: 297, height: 420 },
482
+ { title: "A4", description: "A4", width: 210, height: 297 },
483
+ { title: "A5", description: "A5", width: 148, height: 210 },
484
+ { title: "A6", description: "A6", width: 105, height: 148 },
485
+ { title: "A7", description: "A7", width: 74, height: 105 },
486
+ { title: "A8", description: "A8", width: 52, height: 74 },
487
+ { title: "A9", description: "A9", width: 37, height: 52 },
488
+ { title: "CUSTOM", description: "CUSTOM", width: 105, height: 148 },
489
+ ];
490
+
491
+ Util.typeFont = [
492
+ "Verdana, Geneva, sans-serif",
493
+ '"Times New Roman", Times, serif',
494
+ "Georgia, serif",
495
+ '"Palatino Linotype", "Book Antiqua", Palatino, serif',
496
+ "Arial, Helvetica, sans-serif",
497
+ '"Arial Black", Gadget, sans-serif',
498
+ '"Comic Sans MS", cursive, sans-serif',
499
+ "Impact, Charcoal, sans-serif",
500
+ '"Lucida Sans Unicode", "Lucida Grande", sans-serif',
501
+ "Tahoma, Geneva, sans-serif",
502
+ '"Trebuchet MS", Helvetica, sans-serif',
503
+ '"Courier New", Courier, monospace',
504
+ '"Lucida Console", Monaco, monospace',
505
+ ];
506
+
507
+ Util.objectToGridFormat = function (obj = {}, isInteger = false) {
508
+ isInteger = isInteger || false;
509
+ let arr = [];
510
+ arr.push({ id: "", name: "" });
511
+ for (let keys in obj) {
512
+ if (isInteger) {
513
+ arr.push({ id: parseInt(keys), name: obj[keys] });
514
+ } else {
515
+ arr.push({ id: keys, name: obj[keys] });
516
+ }
517
+ }
518
+ return arr;
519
+ };
520
+
521
+ Util.random = function (length = 5) {
522
+ let text = "";
523
+ const possible =
524
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
525
+ for (let i = 0; i < length; i++)
526
+ text += possible.charAt(Math.floor(Math.random() * possible.length));
527
+
528
+ return text;
529
+ };
530
+
531
+ Util.typePrint = {
532
+ register:
533
+ '{"paper_size":"F4","paper_size_width":"215","paper_size_height":"330","padding_top":"8","padding_right":"8","padding_bottom":"8","padding_left":"8","border":"1","font":"0","font_size":"10","header":"SURAT PERINTAH KERJA","header_font":"0","header_font_size":"26"}',
534
+ estimation:
535
+ '{"paper_size":"F4","paper_size_width":"215","paper_size_height":"330","padding_top":"8","padding_right":"8","padding_bottom":"8","padding_left":"8","border":"1","font":"0","font_size":"12","header":"ESTIMASI BIAYA PERBAIKAN","header_font":"0","header_font_size":"18"}',
536
+ invoice:
537
+ '{"paper_size":"A5","paper_size_width":"148","paper_size_height":"210","padding_top":"8","padding_right":"8","padding_bottom":"8","padding_left":"8","border":"1","font":"0","font_size":"12","header":"INVOICE","header_font":"0","header_font_size":"18"}',
538
+ currency: '{"symbol":"Rp","name":"Rupiah","thousand":"."}',
539
+ };
540
+
541
+ Util.isJson = function (text) {
542
+ if (text) {
543
+ if (
544
+ /^[\],:{}\s]*$/.test(
545
+ text
546
+ .replace(/\\["\\\/bfnrtu]/g, "@")
547
+ .replace(
548
+ /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
549
+ "]"
550
+ )
551
+ .replace(/(?:^|:|,)(?:\s*\[)+/g, "")
552
+ )
553
+ ) {
554
+ //the json is ok
555
+ return true;
556
+ } else {
557
+ return false;
558
+ //the json is not ok
559
+ }
560
+ }
561
+ return false;
562
+ };
563
+
564
+ Util.isEmptyObject = function (obj = {}) {
565
+ for (let prop in obj) {
566
+ if (Object.prototype.hasOwnProperty.call(obj, prop)) {
567
+ return false;
568
+ }
569
+ }
570
+
571
+ return JSON.stringify(obj) === JSON.stringify({});
572
+ };
573
+
574
+ Util.serializeTable = function (table = "") {
575
+ return "`" + table + "`";
576
+ };
577
+
578
+ Util.getKey = function (obj = {}, field = "") {
579
+ let t = "";
580
+ for (let item in obj) {
581
+ if (obj[item] == field) {
582
+ return item;
583
+ }
584
+ }
585
+ return t;
586
+ };
587
+
588
+ Util.camelize = function (text = "") {
589
+ return text.replace(
590
+ /^([A-Z])|[\s-_]+(\w)/g,
591
+ function (match, p1, p2, offset) {
592
+ if (p2) return p2.toUpperCase();
593
+ return p1.toLowerCase();
594
+ }
595
+ );
596
+ };
597
+
598
+ Util.decamelize = function (str = "", separator = "_") {
599
+ return str
600
+ .replace(/([a-z\d])([A-Z])/g, "$1" + separator + "$2")
601
+ .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, "$1" + separator + "$2")
602
+ .replace("_", separator)
603
+ .toLowerCase();
604
+ };
605
+
606
+ /*
607
+ change : Order Step
608
+ to : order_tep
609
+ */
610
+
611
+ Util.toName = function (str = "", separator = "_") {
612
+ if (str && str.length) {
613
+ str = str.trim();
614
+ //add if first character is number with string character
615
+ if (Util.isInteger(str.charAt(0))) {
616
+ str = "a" + str;
617
+ }
618
+ let string = str.replace(/\s+/g, separator).toLowerCase();
619
+ string = string.replace("/", "");
620
+ string = string.replace("//", "");
621
+ string = string.replace("__", "_");
622
+ return string.replace(/[^A-Za-z0-9/_]/g, "");
623
+ }
624
+ };
625
+
626
+ /*
627
+ change : orderStep
628
+ to : Order Step
629
+ */
630
+ Util.fieldToName = function (str = "") {
631
+ let title = Util.capitalizeFirstLetter(Util.decamelize(str));
632
+ title = Util.replaceAll(title, "_", " ");
633
+ title = Util.replaceAll(title, " id", "");
634
+ title = Util.capitalizeAfterSpace(title);
635
+
636
+ const lastWords = Util.lastWord(title);
637
+ if (title.length > 4 && lastWords == "Id") {
638
+ title = title.replace("Id", "");
639
+ }
640
+
641
+ return title;
642
+ };
643
+
644
+ Util.capitalizeWord = (string = "") => {
645
+ return string
646
+ .split(" ")
647
+ .map((m) => m[0].toUpperCase() + m.substr(1))
648
+ .join(" ");
649
+ };
650
+
651
+ Util.capitalizeFirstLetter = (string = "") => {
652
+ return string.charAt(0).toUpperCase() + string.slice(1);
653
+ };
654
+
655
+ Util.asyncWrap = (fn) => {
656
+ return (req, res, next) => {
657
+ fn(req, res, next).catch(next);
658
+ };
659
+ };
660
+
661
+ Util.capitalizeAfterSpace = function (str = "") {
662
+ str = Util.replaceAll(str, "_", " ");
663
+ return str.replace(/\w\S*/g, function (txt) {
664
+ return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
665
+ });
666
+ };
667
+
668
+ Util.capitalizeAfterSpaceTitle = function (str = "") {
669
+ str = Util.replaceAll(str, " ", "_");
670
+ return str.replace(/\w\S*/g, function (txt) {
671
+ return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
672
+ });
673
+ };
674
+
675
+ Util.lastWord = function (words = "") {
676
+ let n = words.split(" ");
677
+ return n[n.length - 1];
678
+ };
679
+
680
+ Util.arrayUnShift = function (arr = [], val = "") {
681
+ let obj = {};
682
+ obj[arr[0]] = "";
683
+ obj[arr[1]] = "";
684
+ return obj;
685
+ };
686
+
687
+ Util.in_array = function (needle = "", haystack = []) {
688
+ if (haystack.length && needle) {
689
+ return haystack.includes(needle);
690
+ } else {
691
+ return false;
692
+ }
693
+ };
694
+
695
+ Util.gridSearch = function (visibles, relations, name, value) {
696
+ let index = 0;
697
+ let elm = "input";
698
+ for (let i = 0; i < visibles.length; i++) {
699
+ if (name == visibles[i]) {
700
+ index = i;
701
+ }
702
+ }
703
+ if (!Util.isEmptyObject(relations)) {
704
+ let arr = Object.keys(relations);
705
+ for (let i = 0; i < arr.length; i++) {
706
+ if (name == arr[i]) {
707
+ elm = "select";
708
+ }
709
+ }
710
+ }
711
+ return (
712
+ "searchValue.eq(" + index + ').find("' + elm + '").val("' + value + '");'
713
+ );
714
+ };
715
+
716
+ Util.toNumber = function (num) {
717
+ num = num + "";
718
+ return parseFloat(Util.replaceAll(num, ".", ""));
719
+ };
720
+
721
+ Util.formatNumber = function (num, thousandSeparator = ".") {
722
+ num = num || "";
723
+ let sep = "$1" + thousandSeparator;
724
+ let numString = num.toString();
725
+ if (numString.indexOf(".") > -1) {
726
+ let explode = numString.split(".");
727
+ return (
728
+ explode[0].replace(/(\d)(?=(\d{3})+(?!\d))/g, sep) + "," + explode[1]
729
+ );
730
+ } else {
731
+ return numString.replace(/(\d)(?=(\d{3})+(?!\d))/g, sep);
732
+ }
733
+ };
734
+
735
+ //usage Util.round(12345.6789, 2) // 12345.68
736
+ Util.round = (value, precision = 0) => {
737
+ value = +value || 0;
738
+ var multiplier = Math.pow(10, precision);
739
+ return Math.round(value * multiplier) / multiplier;
740
+ };
741
+
742
+ Util.fileAttribute = function (filename = "") {
743
+ filename = filename.toLowerCase() || "";
744
+ let ext = filename.split(".").pop();
745
+ let obj = {};
746
+ obj.ext = ext;
747
+ if (Util.in_array(ext, Util.fileImage)) {
748
+ obj.type = "image";
749
+ } else {
750
+ obj.type = "file";
751
+ }
752
+ return obj;
753
+ };
754
+
755
+ Util.fileImage = [
756
+ "jpg",
757
+ "jpeg",
758
+ "png",
759
+ "webp",
760
+ "bmp",
761
+ "tif",
762
+ "gif",
763
+ "png",
764
+ "svg",
765
+ "avif",
766
+ ];
767
+
768
+ Util.fileExtension = (filename = "") => {
769
+ filename = filename.toLowerCase() || "";
770
+ let obj = {};
771
+ let ext = filename.split(".").pop();
772
+ obj.ext = ext;
773
+ if (Util.in_array(ext, Util.fileImage)) {
774
+ obj.type = "image";
775
+ } else {
776
+ obj.type = "file";
777
+ }
778
+ let file = "file.png";
779
+ if (ext == "docx" || ext == "doc") {
780
+ file = "word.png";
781
+ } else if (ext == "xls" || ext == "xlsx") {
782
+ file = "excel.png";
783
+ } else if (ext == "pdf") {
784
+ file = "pdf.png";
785
+ } else if (ext == "ppt" || ext == "pptx") {
786
+ file = "ppt.png";
787
+ } else if (ext == "txt") {
788
+ file = "txt.png";
789
+ } else if (ext == "zip") {
790
+ file = "zip.jpg";
791
+ } else if (ext == "rar") {
792
+ file = "rar.jpg";
793
+ } else if (ext == "rar") {
794
+ file = "file.png";
795
+ }
796
+ obj.file = file;
797
+ return obj;
798
+ };
799
+
800
+ Util.fileView = function (dir = "", file = "", attributes = {}) {
801
+ let filename = dir + file;
802
+ let html = "";
803
+ let width = attributes.hasOwnProperty("width") ? attributes.width : "300";
804
+ let withIcon = attributes.hasOwnProperty("withIcon") ? true : false;
805
+ let obj = Util.fileExtension(filename);
806
+ let className = attributes.hasOwnProperty("class")
807
+ ? ` class="${attributes.class}" `
808
+ : "";
809
+ if (filename.includes("https")) {
810
+ html = `<img src="${file}" ${className} class="img-responsive">`;
811
+ } else {
812
+ if (obj.type == "image") {
813
+ html = `<img src="${filename}" ${className} width="${width}px">`;
814
+ } else {
815
+ if (file) {
816
+ if (withIcon) {
817
+ html = `<img class="mb-3 boxy-small" src="/img/${
818
+ obj.file
819
+ }" height="45px" width="45px"><a class="text-success" target="_blank" href="${filename}"> ${file.substring(
820
+ 13
821
+ )}</a>`;
822
+ } else {
823
+ html = `<a class="text-success" target="_blank" href="${filename}"> ${file.substring(
824
+ 13
825
+ )}</a>`;
826
+ }
827
+ }
828
+ }
829
+ }
830
+
831
+ return html;
832
+ };
833
+ /// end files
834
+
835
+ Util.arrayDelete = function (arr, value) {
836
+ return arr.filter((item) => item != value);
837
+ };
838
+
839
+ Util.arrayDeletes = function (arr = [], array = []) {
840
+ return arr.filter((item) => !Util.in_array(item, array));
841
+ };
842
+
843
+ Util.arrayToList = function (arr, array, delimiter, isCount) {
844
+ delimiter = delimiter || "<br>";
845
+ isCount = isCount || 1;
846
+ let html = "";
847
+ if (arr) {
848
+ for (var i = 0; i < arr.length; i++) {
849
+ html +=
850
+ isCount == 1
851
+ ? i + 1 + ". " + array[arr[i]] + delimiter
852
+ : " " + array[arr[i]] + delimiter;
853
+ }
854
+ html = html.slice(0, delimiter.length * -1);
855
+ }
856
+
857
+ return html;
858
+ };
859
+
860
+ Util.menuAccess = function (menu, params) {
861
+ const roles = require("./role");
862
+ const routes = roles.routes;
863
+ if (Util.in_array(menu, routes)) {
864
+ if (Util.in_array(menu, params)) return true;
865
+ else return false;
866
+ } else {
867
+ return true;
868
+ }
869
+ };
870
+
871
+ Util.dropdownHelper = function (data, field, model) {
872
+ let fieldsx = field + "[]";
873
+ let name = field + "[]";
874
+ let myvalue =
875
+ typeof data[fieldsx] == undefined
876
+ ? " "
877
+ : typeof data[fieldsx] == "string"
878
+ ? '["' + data[fieldsx] + '"]'
879
+ : JSON.stringify(data[name]);
880
+ if (myvalue) {
881
+ let unique =
882
+ myvalue.indexOf("[") > -1 ? myvalue : !myvalue ? "" : "[" + myvalue + "]";
883
+ unique = JSON.parse(unique);
884
+ data[field] = JSON.stringify(unique.filter(Util.arrayUnique));
885
+ delete data[name];
886
+ }
887
+ if (model.fields[field].required) {
888
+ if (!data[field]) {
889
+ return false;
890
+ }
891
+ }
892
+ return data;
893
+ };
894
+
895
+ Util.dropdownAdd = function (data, field, model, datas) {
896
+ let name = field + "[]";
897
+ let myvalue =
898
+ typeof datas == undefined
899
+ ? " "
900
+ : typeof datas == "string"
901
+ ? '["' + datas + '"]'
902
+ : JSON.stringify(datas);
903
+ if (myvalue) {
904
+ let unique =
905
+ myvalue.indexOf("[") > -1 ? myvalue : !myvalue ? "" : "[" + myvalue + "]";
906
+ unique = JSON.parse(unique);
907
+ myvalue = JSON.stringify(unique.filter(Util.arrayUnique));
908
+ delete data[name];
909
+
910
+ data[field] = myvalue;
911
+ }
912
+ if (model.fields[field].required) {
913
+ if (!myvalue) {
914
+ return false;
915
+ }
916
+ }
917
+ return data;
918
+ };
919
+ //array unique
920
+ // array.filter(Util.arrayUnique);
921
+ Util.arrayUnique = (value, index, self) => {
922
+ return self.indexOf(value) == index;
923
+ };
924
+
925
+ Util.virtualHelper = function (obj) {
926
+ if (Util.isEmptyObject(obj)) return;
927
+ if (obj == undefined) return;
928
+
929
+ var str = "";
930
+ for (var key in obj) {
931
+ str += ", `" + obj[key] + "` AS " + key;
932
+ }
933
+
934
+ return str;
935
+ };
936
+
937
+ Util.nots = [
938
+ "id",
939
+ "createdAt",
940
+ "updatedAt",
941
+ "createdBy",
942
+ "updatedBy",
943
+ "companyId",
944
+ "created_at",
945
+ "updated_at",
946
+ "updated_by",
947
+ "created_by",
948
+ "modified_by",
949
+ "company_id",
950
+ "token",
951
+ "version",
952
+ "signin_method",
953
+ "lastLogin",
954
+ "last_login",
955
+ "forgotPassword",
956
+ "forgot_password",
957
+ "no",
958
+ "actionColumn",
959
+ "lock",
960
+ "approval_status",
961
+ "approval_history",
962
+ ];
963
+
964
+ Util.requiredFields = function (obj = {}) {
965
+ var nots = Util.nots;
966
+ var arr = [];
967
+ for (var key in obj) {
968
+ if (!Util.in_array(key, nots)) {
969
+ if (obj[key].required == true) {
970
+ arr.push(key);
971
+ }
972
+ }
973
+ }
974
+ return arr;
975
+ };
976
+
977
+ Util.extractDetails = function (obj = {}) {
978
+ let arr = [];
979
+ for (let key in obj) {
980
+ if (obj[key].length > 0) {
981
+ for (var i = 0; i < obj[key].length; i++) {
982
+ arr.push(obj[key][i]);
983
+ }
984
+ }
985
+ }
986
+ return arr;
987
+ };
988
+
989
+ Util.arrayToConcat = function (arr = []) {
990
+ let str = "CONCAT(";
991
+ for (let i = 0; i < arr.length; i++) {
992
+ str += arr[i] + '," - ",';
993
+ }
994
+ str = str.slice(0, -9);
995
+ str += ")";
996
+
997
+ return str;
998
+ };
999
+
1000
+ //sequence all fields based on drag drop generator
1001
+ Util.arraySequence = function (arr = [], left = [], right = []) {
1002
+ let obj = Util.arrayToObject(arr, "Field");
1003
+ let temp = [],
1004
+ stores = [];
1005
+ for (let i = 0; i < arr.length; i++) {
1006
+ if (arr[i].Field == "id") {
1007
+ stores.push(arr[i].Field);
1008
+ temp.push(arr[i]);
1009
+ }
1010
+ }
1011
+ if (Array.isArray(left)) {
1012
+ for (let i = 0; i < left.length; i++) {
1013
+ if (i % 2 == 0) {
1014
+ temp.push(obj[left[i]]);
1015
+ stores.push(left[i]);
1016
+ }
1017
+ }
1018
+ }
1019
+ if (Array.isArray(right)) {
1020
+ for (let i = 0; i < right.length; i++) {
1021
+ if (i % 2 == 0) {
1022
+ temp.push(obj[right[i]]);
1023
+ stores.push(right[i]);
1024
+ }
1025
+ }
1026
+ }
1027
+ if (Array.isArray(left)) {
1028
+ for (let i = 0; i < left.length; i++) {
1029
+ if (i % 2 == 1) {
1030
+ temp.push(obj[left[i]]);
1031
+ stores.push(left[i]);
1032
+ }
1033
+ }
1034
+ }
1035
+ if (Array.isArray(right)) {
1036
+ for (let i = 0; i < right.length; i++) {
1037
+ if (i % 2 == 1) {
1038
+ temp.push(obj[right[i]]);
1039
+ stores.push(right[i]);
1040
+ }
1041
+ }
1042
+ }
1043
+
1044
+ for (let i = 0; i < arr.length; i++) {
1045
+ const field = arr[i].Field;
1046
+ if (!Util.in_array(field, stores)) {
1047
+ temp.push(arr[i]);
1048
+ }
1049
+ }
1050
+
1051
+ return temp;
1052
+ };
1053
+
1054
+ Util.isInteger = (value) => {
1055
+ return (
1056
+ !isNaN(value) &&
1057
+ (function (x) {
1058
+ return (x | 0) === x;
1059
+ })(parseFloat(value))
1060
+ );
1061
+ };
1062
+
1063
+ Util.isEmptyArray = (arr = []) => {
1064
+ let isArr = false;
1065
+ if (Array.isArray(arr)) {
1066
+ if (arr.length === 0) {
1067
+ isArr = true;
1068
+ } else {
1069
+ isArr = arr.reduce((a, b) => (b === null ? a + 0 : a + 1), 0) === 0;
1070
+ }
1071
+ } else {
1072
+ isArr = true;
1073
+ }
1074
+ return isArr;
1075
+ };
1076
+
1077
+ Util.isNumeric = function (value) {
1078
+ return /^-?\d+$/.test(value);
1079
+ };
1080
+
1081
+ Util.tags = function (tags = "") {
1082
+ let html = "";
1083
+ if (tags.indexOf(",") > -1) {
1084
+ let explode = tags.split(",");
1085
+ for (var i = 0; i < explode.length; i++) {
1086
+ html += `<a href="#" rel="tag">${explode[i]}</a>`;
1087
+ }
1088
+ } else {
1089
+ html += `<a href="#" rel="tag">${tags}</a>`;
1090
+ }
1091
+
1092
+ return html;
1093
+ };
1094
+
1095
+ /*
1096
+ get extension of filename
1097
+ */
1098
+
1099
+ Util.getExtensionFile = (str = "") => {
1100
+ str = str || "";
1101
+ let extension = str.split(".").pop();
1102
+ extension = extension.toLowerCase();
1103
+ let ret = extension;
1104
+ if (extension == "jpg") {
1105
+ ret = "jpeg";
1106
+ }
1107
+ return ret;
1108
+ };
1109
+
1110
+ Util.badgeError = (msg = "") => {
1111
+ return `<span class="badge badge-danger">${msg}</span>`;
1112
+ };
1113
+
1114
+ Util.badgeSuccess = (msg = "") => {
1115
+ return `<span class="badge badge-success">${msg}</span>`;
1116
+ };
1117
+
1118
+ Util.alertError = function (msg = "") {
1119
+ return `<div class="alert alert-danger" role="alert">${msg}</div>`;
1120
+ };
1121
+
1122
+ Util.alertSuccess = function (msg = "") {
1123
+ return `<div class="alert alert-success" role="alert">${msg}</div>`;
1124
+ };
1125
+
1126
+ Util.alertInfo = function (msg = "") {
1127
+ return `<div class="alert alert-info" role="alert">${msg}</div>`;
1128
+ };
1129
+
1130
+ Util.regexPassword = (lengthMin, lengthMax) => {
1131
+ //minimum length
1132
+ lengthMin = lengthMin || 6;
1133
+ lengthMax = lengthMax || 20;
1134
+
1135
+ return new RegExp(
1136
+ "^[a-zA-Z0-9_-]{" + lengthMin + "," + lengthMax + "}$",
1137
+ "i"
1138
+ );
1139
+ };
1140
+
1141
+ //huruf dan angka saja
1142
+ Util.regexCode = (lengthMin, lengthMax) => {
1143
+ lengthMin = lengthMin || 2;
1144
+ lengthMax = lengthMax || 10;
1145
+
1146
+ return new RegExp("^[A-Z0-9]{" + lengthMin + "," + lengthMax + "}$", "i");
1147
+ };
1148
+
1149
+ Util.imageProfile = function (image = "") {
1150
+ return image
1151
+ ? image.indexOf("http") > -1
1152
+ ? image
1153
+ : "/uploads/zuser/" + image
1154
+ : "/img/user.png";
1155
+ };
1156
+
1157
+ /*
1158
+ Files
1159
+ */
1160
+ Util.readFile = function (filename = "") {
1161
+ try {
1162
+ if (Util.fileExist(filename)) {
1163
+ const data = fs.readFileSync(filename, "utf8");
1164
+ return data;
1165
+ }
1166
+ } catch (err) {}
1167
+ return "";
1168
+ };
1169
+ //check directory if not exist create or not return true/false
1170
+ Util.dirExist = (dir = "", create = false) => {
1171
+ try {
1172
+ if (create) {
1173
+ fs.ensureDir(dir, (err) => {});
1174
+ }
1175
+ // check if directory exists
1176
+ if (fs.existsSync(dir)) {
1177
+ return true;
1178
+ }
1179
+ } catch (e) {}
1180
+ return false;
1181
+ };
1182
+
1183
+ Util.fileExist = (filename = "") => {
1184
+ if (fs.existsSync(filename)) {
1185
+ return true;
1186
+ }
1187
+ return false;
1188
+ };
1189
+
1190
+ Util.getAllFiles = (dir = "") => {
1191
+ let files = [];
1192
+ try {
1193
+ if (Util.dirExist(dir, true)) {
1194
+ files = fs.readdirSync(dir);
1195
+ }
1196
+ } catch (e) {
1197
+ return [];
1198
+ }
1199
+ return files;
1200
+ };
1201
+
1202
+ Util.writeFile = (filename = "", content = "") => {
1203
+ try {
1204
+ let dir = require("path").dirname(filename);
1205
+ Util.dirExist(dir, true);
1206
+ fs.writeFileSync(filename, content);
1207
+ return true;
1208
+ } catch (e) {
1209
+ return false;
1210
+ }
1211
+ };
1212
+
1213
+ Util.deleteAllFiles = (dir = "") => {
1214
+ try {
1215
+ fs.emptyDirSync(dir);
1216
+ return true;
1217
+ } catch (e) {
1218
+ return false;
1219
+ }
1220
+ };
1221
+
1222
+ Util.findFilesName = (arr = [], filename = "") => {
1223
+ return arr.filter((item) => item.includes(filename));
1224
+ };
1225
+
1226
+ //convert image file to base64
1227
+ Util.imageFiletoBase64 = (imgPath) => {
1228
+ // read image file
1229
+ const base64Image = fs.readFileSync(imgPath, "base64");
1230
+ const extensionName = path.extname(imgPath);
1231
+ return `data:image/${extensionName.split(".").pop()};base64,${base64Image}`;
1232
+ };
1233
+
1234
+ Util.getFiles = function (dir, token = "") {
1235
+ let arr = fs.readdirSync(dir);
1236
+ let folders = "";
1237
+ let files = "";
1238
+ arr.forEach(function (item) {
1239
+ if (item.indexOf(".") > -1) {
1240
+ var explode = dir.split("public/");
1241
+ var path = explode[1];
1242
+ var url = "/" + path + "/" + item;
1243
+ var extension = item.split(".").pop();
1244
+ files += ` <div class="folder data-file ui-draggable ui-draggable-handle ui-selectee" data-toggle="tooltip" data-type="file" data-url="${url}" data-extension="${extension}" data-name="${item}" filename="${item}" data-original-title="${item}">
1245
+ <img src="/assets/images/formats/file.png" class="img-responsive ui-selectee">
1246
+ <p class="text-ellipsis ui-selectee">${item}</p>
1247
+ </div>`;
1248
+ } else {
1249
+ let explode = dir.split(token);
1250
+ let path = explode[1] || "";
1251
+ let state = "";
1252
+ if (path == "") {
1253
+ state = "/" + item;
1254
+ } else {
1255
+ state = path.replace(item, "") + "/" + item;
1256
+ }
1257
+ folders += `<div class="folder data-folder ui-draggable ui-draggable-handle ui-droppable ui-selectee" data-toggle="tooltip" data-type="folder" data-state="${state}" data-name="${item}" data-original-title="${item}">
1258
+ <img src="/assets/images/folder.png" class="img-responsive ui-selectee">
1259
+ <p class="text-ellipsis ui-selectee">${item}</p>
1260
+ </div>`;
1261
+ }
1262
+ });
1263
+
1264
+ return folders + files;
1265
+ };
1266
+
1267
+ Util.ejsOpen = "<%- ";
1268
+ Util.ejsStart = "<% ";
1269
+ Util.ejsClose = " %>";
1270
+ Util.ejsFunction = (yourCode, isStatement = false) => {
1271
+ const open = isStatement ? Util.ejsStart : Util.ejsOpen;
1272
+ return open + yourCode + Util.ejsClose;
1273
+ };
1274
+
1275
+ Util.attributeOptions = (obj = {}, defaultObj = {}) => {
1276
+ let html = "";
1277
+ let arr = Object.keys(defaultObj) || [];
1278
+ for (const key in obj) {
1279
+ let value = obj[key];
1280
+ if (defaultObj.hasOwnProperty(key)) {
1281
+ value = defaultObj[key] + obj[key];
1282
+ Util.arrayDelete(arr, key);
1283
+ }
1284
+ html += ` ${key}="${value}" `;
1285
+ }
1286
+ if (arr.length) {
1287
+ arr.map((item) => (html += ` ${item}="${defaultObj[item]}" `));
1288
+ }
1289
+ return html;
1290
+ };
1291
+
1292
+ /*
1293
+ array to update json array at postgresql
1294
+ */
1295
+ Util.array_to_jsonb = (arr = []) => {
1296
+ let value = "";
1297
+ let myarr = [];
1298
+ if (arr.length > 0) {
1299
+ arr.map((item) => {
1300
+ myarr.push(JSON.stringify(item));
1301
+ });
1302
+ }
1303
+ value = JSON.stringify(myarr).replace("[", "{").replaceAll("]", "}");
1304
+ return value;
1305
+ };
1306
+
1307
+ /*
1308
+ array to update array at postgresql
1309
+ */
1310
+ Util.array_to_arraypg = (arr = []) => {
1311
+ let value = null;
1312
+ if (arr.length > 0) {
1313
+ value = JSON.stringify(arr).replace("[", "{").replaceAll("]", "}");
1314
+ }
1315
+ return value;
1316
+ };
1317
+
1318
+ Util.userAvatar = (img = "") => {
1319
+ return img
1320
+ ? img.includes("http")
1321
+ ? img
1322
+ : `/uploads/user/${img}`
1323
+ : `/img/user.png`;
1324
+ };
1325
+
1326
+ /*
1327
+ SQL HELPER
1328
+ */
1329
+ Util.selectParser = (fields = [], MYMODEL = {}) => {
1330
+ let table = MYMODEL.table;
1331
+ let virtuals = [];
1332
+ let select = "";
1333
+ for (var key in MYMODEL.widgets) {
1334
+ if (MYMODEL.widgets[key].name === "virtual") {
1335
+ virtuals.push(key);
1336
+ }
1337
+ }
1338
+ let arr = [];
1339
+ fields.forEach((item) => {
1340
+ if (virtuals.includes(item)) {
1341
+ select += `${MYMODEL.widgets[item].fields},`;
1342
+ } else if (item === "no") {
1343
+ arr.push(`${table}.id`);
1344
+ } else if (item === "actionColumn") {
1345
+ arr.push(`${table}.lock`);
1346
+ } else {
1347
+ arr.push(Util.fieldWithTable(item, MYMODEL));
1348
+ }
1349
+ });
1350
+ //select += `"${arr.join('","')}"`
1351
+ select += arr.join(",");
1352
+ return select;
1353
+ };
1354
+
1355
+ Util.fieldWithTable = (field, MYMODEL, isWhere = false) => {
1356
+ let name = "";
1357
+ let joinList =
1358
+ MYMODEL.joins && MYMODEL.joins.list.length > 0 ? MYMODEL.joins.list : [];
1359
+ if (joinList.length > 0) {
1360
+ if (joinList.includes(field)) {
1361
+ let split = field.split("___");
1362
+ if (isWhere) {
1363
+ name = `${split[0]}.${split[1]}`;
1364
+ } else {
1365
+ name = `${split[0]}.${split[1]} as ${field}`;
1366
+ }
1367
+ } else {
1368
+ name = `${MYMODEL.table}.${field}`;
1369
+ }
1370
+ } else {
1371
+ name = `${MYMODEL.table}.${field}`;
1372
+ }
1373
+ return name;
1374
+ };
1375
+
1376
+ Util.tableWithJoin = (MYMODEL) => {
1377
+ return MYMODEL.joins && MYMODEL.joins.list.length > 0
1378
+ ? MYMODEL.joins.sql
1379
+ : [];
1380
+ };
1381
+
1382
+ Util.selectMysql = (fields = [], relations = {}) => {
1383
+ let obj = {};
1384
+ let arr = [];
1385
+ let virtuals = {};
1386
+ let virtualArray = [];
1387
+ if (relations.hasOwnProperty("zvirtuals")) {
1388
+ virtuals = relations.zvirtuals;
1389
+ delete relations.zvirtuals;
1390
+ virtualArray = Object.keys(virtuals);
1391
+ virtualArray.forEach(function (item) {
1392
+ fields = Util.arrayDelete(fields, item);
1393
+ });
1394
+ }
1395
+ let selects = [];
1396
+ fields.forEach(function (item) {
1397
+ if (item != "actionColumn") {
1398
+ if (item == "no") {
1399
+ selects.push("id");
1400
+ } else {
1401
+ selects.push(item);
1402
+ }
1403
+ }
1404
+ });
1405
+ //make sure id
1406
+ selects.push("id");
1407
+ let select = `"${selects.join('","')}"`;
1408
+ if (virtualArray.length) {
1409
+ for (let key in virtuals) {
1410
+ select += `, ${virtuals[key]} `;
1411
+ }
1412
+ }
1413
+ return select;
1414
+ };
1415
+
1416
+ /*
1417
+ Sorting array object with key name
1418
+ */
1419
+ Util.sortArray = (arr, key) => {
1420
+ function compare(a, b) {
1421
+ if (a[key] < b[key]) {
1422
+ return -1;
1423
+ }
1424
+ if (a[key] > b[key]) {
1425
+ return 1;
1426
+ }
1427
+ return 0;
1428
+ }
1429
+
1430
+ return arr.sort(compare);
1431
+ };
1432
+
1433
+ Util.cleanString = (str = "") => {
1434
+ return str
1435
+ .replaceAll("(", "")
1436
+ .replaceAll(")", "")
1437
+ .replaceAll("%", "")
1438
+ .replaceAll("-", "");
1439
+ };
1440
+
1441
+ Util.encrypt = (str, key) => {
1442
+ const crypto = require("crypto");
1443
+ var encrypt = crypto.createCipheriv("des-ede3", key, "");
1444
+ var theCipher = encrypt.update(str, "utf8", "base64");
1445
+ theCipher += encrypt.final("base64");
1446
+ theCipher = theCipher.replaceAll("/", "55ter55");
1447
+ return theCipher;
1448
+ };
1449
+
1450
+ Util.decrypt = (str, key) => {
1451
+ const crypto = require("crypto");
1452
+ str = str.replaceAll("55ter55", "/");
1453
+ var decrypt = crypto.createDecipheriv("des-ede3", key, "");
1454
+ var s = decrypt.update(str, "base64", "utf8");
1455
+ return s + decrypt.final("utf8");
1456
+ };
1457
+
1458
+ Util.terbilang = (nilai) => {
1459
+ nilai = Math.floor(Math.abs(nilai));
1460
+ let huruf = [
1461
+ "",
1462
+ "Satu",
1463
+ "Dua",
1464
+ "Tiga",
1465
+ "Empat",
1466
+ "Lima",
1467
+ "Enam",
1468
+ "Tujuh",
1469
+ "Delapan",
1470
+ "Sembilan",
1471
+ "Sepuluh",
1472
+ "Sebelas",
1473
+ ];
1474
+ let bagi = 0;
1475
+ let penyimpanan = "";
1476
+ if (nilai < 12) {
1477
+ penyimpanan = " " + huruf[nilai];
1478
+ } else if (nilai < 20) {
1479
+ penyimpanan = Util.terbilang(Math.floor(nilai - 10)) + " Belas";
1480
+ } else if (nilai < 100) {
1481
+ bagi = Math.floor(nilai / 10);
1482
+ penyimpanan = Util.terbilang(bagi) + " Puluh" + Util.terbilang(nilai % 10);
1483
+ } else if (nilai < 200) {
1484
+ penyimpanan = " Seratus" + Util.terbilang(nilai - 100);
1485
+ } else if (nilai < 1000) {
1486
+ bagi = Math.floor(nilai / 100);
1487
+ penyimpanan = Util.terbilang(bagi) + " Ratus" + Util.terbilang(nilai % 100);
1488
+ } else if (nilai < 2000) {
1489
+ penyimpanan = " Seribu" + Util.terbilang(nilai - 1000);
1490
+ } else if (nilai < 1000000) {
1491
+ bagi = Math.floor(nilai / 1000);
1492
+ penyimpanan = Util.terbilang(bagi) + " Ribu" + Util.terbilang(nilai % 1000);
1493
+ } else if (nilai < 1000000000) {
1494
+ bagi = Math.floor(nilai / 1000000);
1495
+ penyimpanan =
1496
+ Util.terbilang(bagi) + " Juta" + Util.terbilang(nilai % 1000000);
1497
+ } else if (nilai < 1000000000000) {
1498
+ bagi = Math.floor(nilai / 1000000000);
1499
+ penyimpanan =
1500
+ Util.terbilang(bagi) + " Miliar" + Util.terbilang(nilai % 1000000000);
1501
+ } else if (nilai < 1000000000000000) {
1502
+ bagi = Math.floor(nilai / 1000000000000);
1503
+ penyimpanan =
1504
+ Util.terbilang(nilai / 1000000000000) +
1505
+ " Triliun" +
1506
+ Util.terbilang(nilai % 1000000000000);
1507
+ }
1508
+ return penyimpanan;
1509
+ };
1510
+
1511
+ Util.array_id_to_zname = (arr) => {
1512
+ let r = {};
1513
+ arr.map((item) => {
1514
+ r[item.id] = item.zname;
1515
+ });
1516
+ return r;
1517
+ };
1518
+
1519
+ Util.array_zname_to_id = (arr) => {
1520
+ let r = {};
1521
+ arr.map((item) => {
1522
+ r[item.zname] = item.id;
1523
+ });
1524
+ return r;
1525
+ };
1526
+
1527
+ Util.tableShowInGrid = (arr, qey, MYMODEL, myCache, companyId) => {
1528
+ try {
1529
+ if (typeof arr != "object") {
1530
+ arr = [];
1531
+ }
1532
+ arr = arr || [];
1533
+ let html = "";
1534
+ let MYMODELS = myCache.get("MYMODELS");
1535
+ let mywidget = MYMODELS[MYMODEL.widgets[qey].table].widgets;
1536
+ if (arr.length > 0) {
1537
+ html += `<table class="table table-sm table-striped table-bordered table-hover">`;
1538
+ let json = arr[0];
1539
+ arr.map((item) => {
1540
+ html += `<tr>`;
1541
+ for (let key in item) {
1542
+ var keyFields = key + "Fields";
1543
+ var keyObject = key + "Object";
1544
+ let value = item[key];
1545
+ if (mywidget[key].name == "relation") {
1546
+ value = value
1547
+ ? Util.array_id_to_zname(
1548
+ myCache.get(
1549
+ `${mywidget[key].table}_${MYMODEL.widgets[qey].table}___${key}_${companyId}`
1550
+ )
1551
+ )[value]
1552
+ : "";
1553
+ } else {
1554
+ if (Util.isNumeric(value)) {
1555
+ value = Util.formatNumber(value, ".");
1556
+ }
1557
+ }
1558
+
1559
+ html += `<td>${value}</td>`;
1560
+ }
1561
+ html += `</tr>`;
1562
+ });
1563
+ html += `</table>`;
1564
+ }
1565
+ return html;
1566
+ } catch (e) {
1567
+ return e + "";
1568
+ }
1569
+ };
1570
+
1571
+ module.exports = Util;