@puninar-logistics/pds-sdk 0.0.1
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/README.md +128 -0
- package/dist/chunk-6NBFV4YQ.js +441 -0
- package/dist/chunk-6NBFV4YQ.js.map +1 -0
- package/dist/chunk-LCT4PDW4.js +403 -0
- package/dist/chunk-LCT4PDW4.js.map +1 -0
- package/dist/chunk-NTC4K7PW.js +379 -0
- package/dist/chunk-NTC4K7PW.js.map +1 -0
- package/dist/chunk-NTC7P4ZY.js +440 -0
- package/dist/chunk-NTC7P4ZY.js.map +1 -0
- package/dist/chunk-OCHH4OB7.js +486 -0
- package/dist/chunk-OCHH4OB7.js.map +1 -0
- package/dist/chunk-VFUBVERU.js +440 -0
- package/dist/chunk-VFUBVERU.js.map +1 -0
- package/dist/chunk-YL5EXHSB.js +462 -0
- package/dist/chunk-YL5EXHSB.js.map +1 -0
- package/dist/custom.css +111 -0
- package/dist/global.css +142 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.js +334 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/index.d.ts +80 -0
- package/dist/utils/index.js +61 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
// src/utils/localStorage.ts
|
|
2
|
+
var setLocalStorage = (key, value) => {
|
|
3
|
+
try {
|
|
4
|
+
const serializedValue = typeof value === "string" ? value : JSON.stringify(value);
|
|
5
|
+
localStorage.setItem(key, serializedValue);
|
|
6
|
+
} catch (error) {
|
|
7
|
+
console.error(`Gagal menyimpan ke localStorage: ${key}`, error);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var getLocalStorage = (key, defaultValue = null) => {
|
|
11
|
+
try {
|
|
12
|
+
const value = localStorage.getItem(key);
|
|
13
|
+
if (value === null) return defaultValue;
|
|
14
|
+
try {
|
|
15
|
+
return JSON.parse(value);
|
|
16
|
+
} catch {
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
} catch (error) {
|
|
20
|
+
console.error(`Gagal membaca dari localStorage: ${key}`, error);
|
|
21
|
+
return defaultValue;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
var removeLocalStorage = (key) => {
|
|
25
|
+
try {
|
|
26
|
+
localStorage.removeItem(key);
|
|
27
|
+
} catch (error) {
|
|
28
|
+
console.error(`Gagal menghapus localStorage: ${key}`, error);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
var clearLocalStorage = () => {
|
|
32
|
+
try {
|
|
33
|
+
localStorage.clear();
|
|
34
|
+
} catch (error) {
|
|
35
|
+
console.error("Gagal membersihkan localStorage", error);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// src/utils/accessCheck.ts
|
|
40
|
+
var getByPath = (obj, path) => {
|
|
41
|
+
const keys = path.split(".");
|
|
42
|
+
let current = obj;
|
|
43
|
+
for (const key of keys) {
|
|
44
|
+
if (current == null || !(key in current)) return null;
|
|
45
|
+
current = current[key];
|
|
46
|
+
}
|
|
47
|
+
return current;
|
|
48
|
+
};
|
|
49
|
+
var accessCheck = (keyPath, requiredAccess) => {
|
|
50
|
+
try {
|
|
51
|
+
const list = getLocalStorage("menu-access");
|
|
52
|
+
if (!list) return false;
|
|
53
|
+
const accessRoot = Object.assign({}, ...list);
|
|
54
|
+
const node = getByPath(accessRoot, keyPath);
|
|
55
|
+
if (!node || !Array.isArray(node.access)) return false;
|
|
56
|
+
const userAccessList = node.access;
|
|
57
|
+
if (Array.isArray(requiredAccess)) {
|
|
58
|
+
return requiredAccess.some((a) => userAccessList.includes(a));
|
|
59
|
+
}
|
|
60
|
+
return userAccessList.includes(requiredAccess);
|
|
61
|
+
} catch (error) {
|
|
62
|
+
console.error("Invalid menu-access format:", error);
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// src/utils/aliasBundlingTypeArchive.ts
|
|
68
|
+
var aliasBundlingTypeArchive = (bundlingTypeArchive) => {
|
|
69
|
+
const alias = {
|
|
70
|
+
TRUCKING_ONLY: "Trucking Only",
|
|
71
|
+
CUSTOMS_CLEARANCE: "Customs Clearance"
|
|
72
|
+
};
|
|
73
|
+
return bundlingTypeArchive ? alias[bundlingTypeArchive] : "N/A";
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// src/utils/base64DecodeWithSecret.ts
|
|
77
|
+
function base64DecodeWithSecret(encodedData, secretKey) {
|
|
78
|
+
const decodedData = atob(encodedData);
|
|
79
|
+
const originalData = decodedData.slice(0, -secretKey.length);
|
|
80
|
+
return JSON.parse(originalData);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// src/utils/convertToArrayOfObject.ts
|
|
84
|
+
function convertToArrayOfObject(arr, fields) {
|
|
85
|
+
if (!Array.isArray(arr) || arr.length === 0) {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
return arr.map((item) => {
|
|
89
|
+
if (typeof item !== "string") return {};
|
|
90
|
+
const parts = item.split("|");
|
|
91
|
+
const obj = {};
|
|
92
|
+
parts.forEach((value, index) => {
|
|
93
|
+
const key = fields && fields[index] ? fields[index] : `field${index + 1}`;
|
|
94
|
+
obj[key] = value?.trim?.() ?? "";
|
|
95
|
+
});
|
|
96
|
+
return obj;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// src/utils/decodeEncodeFlateBase64.ts
|
|
101
|
+
import pako from "pako";
|
|
102
|
+
function decodeFlateBase64(encoded) {
|
|
103
|
+
if (!encoded) return null;
|
|
104
|
+
const binary = atob(encoded);
|
|
105
|
+
const bytes = Uint8Array.from(binary, (c) => c.charCodeAt(0));
|
|
106
|
+
const text = pako.inflateRaw(bytes, { to: "string" });
|
|
107
|
+
return JSON.parse(text);
|
|
108
|
+
}
|
|
109
|
+
function encodeFlateBase64(data) {
|
|
110
|
+
const json = JSON.stringify(data);
|
|
111
|
+
const compressed = pako.deflateRaw(json, { level: 9 });
|
|
112
|
+
let binary = "";
|
|
113
|
+
for (let i = 0; i < compressed.length; i++) {
|
|
114
|
+
binary += String.fromCharCode(compressed[i]);
|
|
115
|
+
}
|
|
116
|
+
return btoa(binary).replace(/=+$/, "");
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// src/utils/decodeEncodeLzString.ts
|
|
120
|
+
import LZString from "lz-string";
|
|
121
|
+
function encodeShort(data) {
|
|
122
|
+
return LZString.compressToEncodedURIComponent(
|
|
123
|
+
JSON.stringify(data)
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
function decodeShort(encoded) {
|
|
127
|
+
const decompressed = LZString.decompressFromEncodedURIComponent(encoded);
|
|
128
|
+
return JSON.parse(decompressed || "{}");
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// src/utils/encodeDecode.ts
|
|
132
|
+
function encodeData(data) {
|
|
133
|
+
try {
|
|
134
|
+
const json = JSON.stringify(data);
|
|
135
|
+
return btoa(unescape(encodeURIComponent(json)));
|
|
136
|
+
} catch (error) {
|
|
137
|
+
console.error("Failed to encode data:", error);
|
|
138
|
+
return "";
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function decodeData(encoded) {
|
|
142
|
+
try {
|
|
143
|
+
const decoded = decodeURIComponent(escape(atob(encoded)));
|
|
144
|
+
const parsed = JSON.parse(decoded);
|
|
145
|
+
if (typeof parsed === "string" || typeof parsed === "number" || Array.isArray(parsed) || typeof parsed === "object") {
|
|
146
|
+
return parsed;
|
|
147
|
+
}
|
|
148
|
+
return decoded;
|
|
149
|
+
} catch (error) {
|
|
150
|
+
console.error("Failed to decode data:", error);
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// src/utils/formatCurrency.ts
|
|
156
|
+
function formatCurrency(value, decimals = 2, withLabel = true) {
|
|
157
|
+
if (value === null || value === void 0 || value === "") {
|
|
158
|
+
return withLabel ? "Rp0" : "0";
|
|
159
|
+
}
|
|
160
|
+
let number;
|
|
161
|
+
if (typeof value === "string") {
|
|
162
|
+
const normalized = value.replace(/\./g, "").replace(",", ".");
|
|
163
|
+
number = parseFloat(normalized);
|
|
164
|
+
} else {
|
|
165
|
+
number = value;
|
|
166
|
+
}
|
|
167
|
+
if (isNaN(number)) return withLabel ? "Rp0" : "0";
|
|
168
|
+
const rounded = Math.round(number * Math.pow(10, decimals)) / Math.pow(10, decimals);
|
|
169
|
+
return (withLabel ? "Rp" : "") + rounded.toFixed(decimals).replace(".", ",").replace(/\B(?=(\d{3})+(?!\d))/g, ".");
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// src/utils/generateHeaders.ts
|
|
173
|
+
import SHA256 from "crypto-js/sha256";
|
|
174
|
+
import Hex from "crypto-js/enc-hex";
|
|
175
|
+
function generateHeaders(api_key) {
|
|
176
|
+
const date = /* @__PURE__ */ new Date();
|
|
177
|
+
const timestamp = date.toISOString().slice(0, 19).replace("T", " ");
|
|
178
|
+
const encryptionKey = `${api_key}${timestamp}`;
|
|
179
|
+
const keyPun = SHA256(encryptionKey).toString(Hex);
|
|
180
|
+
return {
|
|
181
|
+
// "Content-Type": "application/json",
|
|
182
|
+
"Authorization": `Bearer ${getLocalStorage("odong-token")}`,
|
|
183
|
+
"key-puninar": keyPun,
|
|
184
|
+
timestamp
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// src/utils/generateUUID.ts
|
|
189
|
+
var generateUUID = () => {
|
|
190
|
+
if (typeof crypto !== "undefined" && crypto.randomUUID) {
|
|
191
|
+
return crypto.randomUUID();
|
|
192
|
+
}
|
|
193
|
+
return `temp-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
// src/utils/getInitials.ts
|
|
197
|
+
function getInitials(name) {
|
|
198
|
+
if (!name) return "";
|
|
199
|
+
const parts = name.trim().split(/\s+/);
|
|
200
|
+
if (parts.length === 1) {
|
|
201
|
+
return parts[0][0].toUpperCase();
|
|
202
|
+
}
|
|
203
|
+
const first = parts[0][0].toUpperCase();
|
|
204
|
+
const last = parts[parts.length - 1][0].toUpperCase();
|
|
205
|
+
return first + last;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// src/utils/formatRupiah.ts
|
|
209
|
+
var formatRupiah = (value) => {
|
|
210
|
+
if (value === null || value === void 0 || value === "") {
|
|
211
|
+
return "";
|
|
212
|
+
}
|
|
213
|
+
let numberValue;
|
|
214
|
+
if (typeof value === "number") {
|
|
215
|
+
numberValue = value;
|
|
216
|
+
} else {
|
|
217
|
+
const normalized = value.toString().replace(/\s/g, "").replace(/Rp/gi, "").replace(/\./g, "").replace(/,/g, ".").replace(/[^0-9.-]/g, "");
|
|
218
|
+
numberValue = Number(normalized);
|
|
219
|
+
}
|
|
220
|
+
if (Number.isNaN(numberValue)) {
|
|
221
|
+
return "";
|
|
222
|
+
}
|
|
223
|
+
const hasDecimal = Math.round(numberValue * 100) % 100 !== 0;
|
|
224
|
+
return new Intl.NumberFormat("id-ID", {
|
|
225
|
+
style: "currency",
|
|
226
|
+
currency: "IDR",
|
|
227
|
+
minimumFractionDigits: hasDecimal ? 2 : 0,
|
|
228
|
+
maximumFractionDigits: 2
|
|
229
|
+
}).format(numberValue);
|
|
230
|
+
};
|
|
231
|
+
var transformThousands = (value, mode = "format") => {
|
|
232
|
+
if (value === null || value === void 0) {
|
|
233
|
+
return mode === "format" ? "" : 0;
|
|
234
|
+
}
|
|
235
|
+
const str = value.toString();
|
|
236
|
+
if (mode === "parse") {
|
|
237
|
+
const normalized = str.replace(/\./g, "").replace(/,/g, ".").replace(/[^0-9.]/g, "");
|
|
238
|
+
const num = Number(normalized);
|
|
239
|
+
return isNaN(num) ? 0 : num;
|
|
240
|
+
}
|
|
241
|
+
const endsWithComma = str.endsWith(",");
|
|
242
|
+
const cleaned = str.replace(/[^0-9,]/g, "");
|
|
243
|
+
const [intRaw = "", decRaw = ""] = cleaned.split(",");
|
|
244
|
+
const intPart = intRaw.replace(/\D/g, "");
|
|
245
|
+
const formattedInt = intPart.replace(/\B(?=(\d{3})+(?!\d))/g, ".");
|
|
246
|
+
let decimalPart = decRaw.replace(/\D/g, "").slice(0, 2);
|
|
247
|
+
if (endsWithComma && decimalPart.length === 0) {
|
|
248
|
+
return `${formattedInt},`;
|
|
249
|
+
}
|
|
250
|
+
if (decimalPart.length > 0) {
|
|
251
|
+
return `${formattedInt},${decimalPart}`;
|
|
252
|
+
}
|
|
253
|
+
return formattedInt;
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
// src/utils/formatDate.ts
|
|
257
|
+
import dayjs from "dayjs";
|
|
258
|
+
import "dayjs/locale/id";
|
|
259
|
+
dayjs.locale("id");
|
|
260
|
+
var formatDate = (value, format = "DD MMM YYYY HH:mm") => {
|
|
261
|
+
if (!value) return "";
|
|
262
|
+
let sanitized = value;
|
|
263
|
+
if (typeof value === "string" && value.endsWith("Z")) {
|
|
264
|
+
sanitized = value.replace(/Z$/, "");
|
|
265
|
+
}
|
|
266
|
+
const parsed = dayjs(sanitized);
|
|
267
|
+
if (!parsed.isValid()) return "";
|
|
268
|
+
return parsed.format(format);
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
// src/utils/dateFormat.ts
|
|
272
|
+
function formatDateTime(date) {
|
|
273
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
274
|
+
const year = date.getFullYear();
|
|
275
|
+
const months = [
|
|
276
|
+
"Januari",
|
|
277
|
+
"Februari",
|
|
278
|
+
"Maret",
|
|
279
|
+
"April",
|
|
280
|
+
"Mei",
|
|
281
|
+
"Juni",
|
|
282
|
+
"Juli",
|
|
283
|
+
"Agustus",
|
|
284
|
+
"September",
|
|
285
|
+
"Oktober",
|
|
286
|
+
"November",
|
|
287
|
+
"Desember"
|
|
288
|
+
];
|
|
289
|
+
const month = months[date.getMonth()];
|
|
290
|
+
const hours = String(date.getHours()).padStart(2, "0");
|
|
291
|
+
const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
292
|
+
const seconds = String(date.getSeconds()).padStart(2, "0");
|
|
293
|
+
return `${day} ${month} ${year}, ${hours}:${minutes}:${seconds}`;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// src/utils/formatter.ts
|
|
297
|
+
var MASK = "___.___-__.________";
|
|
298
|
+
var DIGIT_INDEXES = [
|
|
299
|
+
0,
|
|
300
|
+
1,
|
|
301
|
+
2,
|
|
302
|
+
// ___
|
|
303
|
+
4,
|
|
304
|
+
5,
|
|
305
|
+
6,
|
|
306
|
+
// ___
|
|
307
|
+
8,
|
|
308
|
+
9,
|
|
309
|
+
// __
|
|
310
|
+
11,
|
|
311
|
+
12,
|
|
312
|
+
13,
|
|
313
|
+
14,
|
|
314
|
+
15,
|
|
315
|
+
16,
|
|
316
|
+
17,
|
|
317
|
+
18
|
|
318
|
+
// ________
|
|
319
|
+
];
|
|
320
|
+
function applyEFakturMask(raw) {
|
|
321
|
+
const digits = raw.replace(/\D/g, "").slice(0, DIGIT_INDEXES.length);
|
|
322
|
+
const chars = MASK.split("");
|
|
323
|
+
digits.split("").forEach((d, i) => {
|
|
324
|
+
chars[DIGIT_INDEXES[i]] = d;
|
|
325
|
+
});
|
|
326
|
+
return chars.join("");
|
|
327
|
+
}
|
|
328
|
+
var CORETAX_MASK = "____-____-____-____";
|
|
329
|
+
var CORETAX_INDEXES = [
|
|
330
|
+
0,
|
|
331
|
+
1,
|
|
332
|
+
2,
|
|
333
|
+
3,
|
|
334
|
+
5,
|
|
335
|
+
6,
|
|
336
|
+
7,
|
|
337
|
+
8,
|
|
338
|
+
10,
|
|
339
|
+
11,
|
|
340
|
+
12,
|
|
341
|
+
13,
|
|
342
|
+
15,
|
|
343
|
+
16,
|
|
344
|
+
17,
|
|
345
|
+
18
|
|
346
|
+
];
|
|
347
|
+
function applyCoretaxMask(raw) {
|
|
348
|
+
const digits = raw.replace(/\D/g, "").slice(0, 16);
|
|
349
|
+
const chars = CORETAX_MASK.split("");
|
|
350
|
+
digits.split("").forEach((d, i) => {
|
|
351
|
+
chars[CORETAX_INDEXES[i]] = d;
|
|
352
|
+
});
|
|
353
|
+
return chars.join("");
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// src/utils/taxFormat.ts
|
|
357
|
+
var pphFormat = (str) => {
|
|
358
|
+
const match = str.match(/(?:PPH|WHT.*?PPH)(\d+)_(\d+)%$/);
|
|
359
|
+
return match ? `${match[1]}_${match[2]}%` : null;
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
// src/utils/rolesCheck.ts
|
|
363
|
+
function matchRole(selectedRole, comparator, mode = "exact") {
|
|
364
|
+
if (!selectedRole) return false;
|
|
365
|
+
const role = selectedRole.toUpperCase();
|
|
366
|
+
const comparators = Array.isArray(comparator) ? comparator.map((c) => c.toUpperCase()) : [comparator.toUpperCase()];
|
|
367
|
+
return comparators.some((c) => {
|
|
368
|
+
switch (mode) {
|
|
369
|
+
case "exact":
|
|
370
|
+
return role === c;
|
|
371
|
+
case "startsWith":
|
|
372
|
+
return role.startsWith(c);
|
|
373
|
+
case "includes":
|
|
374
|
+
return role.includes(c);
|
|
375
|
+
case "regex":
|
|
376
|
+
return new RegExp(c, "i").test(selectedRole);
|
|
377
|
+
default:
|
|
378
|
+
return false;
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// src/utils/terbilang.ts
|
|
384
|
+
function terbilang(input) {
|
|
385
|
+
const angkaAwal = typeof input === "string" ? parseFloat(input.replace(/,/g, "")) : input;
|
|
386
|
+
if (isNaN(angkaAwal)) return "Nol Rupiah";
|
|
387
|
+
const rounded = Math.round(angkaAwal * 100) / 100;
|
|
388
|
+
const integerPart = Math.floor(rounded);
|
|
389
|
+
const decimalPart = Math.round((rounded - integerPart) * 100);
|
|
390
|
+
const kata = [
|
|
391
|
+
"Nol",
|
|
392
|
+
"Satu",
|
|
393
|
+
"Dua",
|
|
394
|
+
"Tiga",
|
|
395
|
+
"Empat",
|
|
396
|
+
"Lima",
|
|
397
|
+
"Enam",
|
|
398
|
+
"Tujuh",
|
|
399
|
+
"Delapan",
|
|
400
|
+
"Sembilan"
|
|
401
|
+
];
|
|
402
|
+
const tingkat = ["", "Ribu", "Juta", "Miliar", "Triliun"];
|
|
403
|
+
const bacaRatusan = (num) => {
|
|
404
|
+
let hasil2 = "";
|
|
405
|
+
const ratus = Math.floor(num / 100);
|
|
406
|
+
const sisa = num % 100;
|
|
407
|
+
if (ratus > 0) {
|
|
408
|
+
hasil2 += ratus === 1 ? "Seratus " : `${kata[ratus]} Ratus `;
|
|
409
|
+
}
|
|
410
|
+
if (sisa > 0) {
|
|
411
|
+
if (sisa < 10) hasil2 += kata[sisa];
|
|
412
|
+
else if (sisa === 10) hasil2 += "Sepuluh";
|
|
413
|
+
else if (sisa === 11) hasil2 += "Sebelas";
|
|
414
|
+
else if (sisa < 20) hasil2 += `${kata[sisa - 10]} Belas`;
|
|
415
|
+
else {
|
|
416
|
+
const puluh = Math.floor(sisa / 10);
|
|
417
|
+
const satuan = sisa % 10;
|
|
418
|
+
hasil2 += `${kata[puluh]} Puluh`;
|
|
419
|
+
if (satuan > 0) hasil2 += ` ${kata[satuan]}`;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
return hasil2.trim();
|
|
423
|
+
};
|
|
424
|
+
let hasil = "";
|
|
425
|
+
let temp = integerPart;
|
|
426
|
+
let level = 0;
|
|
427
|
+
if (temp === 0) hasil = "Nol";
|
|
428
|
+
while (temp > 0) {
|
|
429
|
+
const bagian = temp % 1e3;
|
|
430
|
+
if (bagian > 0) {
|
|
431
|
+
let teks = bacaRatusan(bagian);
|
|
432
|
+
if (level === 1 && bagian === 1) teks = "Seribu";
|
|
433
|
+
hasil = `${teks} ${tingkat[level]} ${hasil}`.trim();
|
|
434
|
+
}
|
|
435
|
+
temp = Math.floor(temp / 1e3);
|
|
436
|
+
level++;
|
|
437
|
+
}
|
|
438
|
+
let komaText = "";
|
|
439
|
+
if (decimalPart > 0) {
|
|
440
|
+
const desimalStr = decimalPart.toString().padStart(2, "0");
|
|
441
|
+
komaText = " Koma " + desimalStr.split("").map((d) => kata[parseInt(d, 10)]).join(" ");
|
|
442
|
+
}
|
|
443
|
+
return `${hasil}${komaText} Rupiah`.trim();
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// src/utils/visibleTable.ts
|
|
447
|
+
function visibleTable(columns, role) {
|
|
448
|
+
return columns.filter((col) => {
|
|
449
|
+
if (role === "VENDOR" && (col.id === "status_dokumen" || col.id === "verification_date")) {
|
|
450
|
+
return false;
|
|
451
|
+
}
|
|
452
|
+
return true;
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
export {
|
|
457
|
+
setLocalStorage,
|
|
458
|
+
getLocalStorage,
|
|
459
|
+
removeLocalStorage,
|
|
460
|
+
clearLocalStorage,
|
|
461
|
+
accessCheck,
|
|
462
|
+
aliasBundlingTypeArchive,
|
|
463
|
+
base64DecodeWithSecret,
|
|
464
|
+
convertToArrayOfObject,
|
|
465
|
+
decodeFlateBase64,
|
|
466
|
+
encodeFlateBase64,
|
|
467
|
+
encodeShort,
|
|
468
|
+
decodeShort,
|
|
469
|
+
encodeData,
|
|
470
|
+
decodeData,
|
|
471
|
+
formatCurrency,
|
|
472
|
+
generateHeaders,
|
|
473
|
+
generateUUID,
|
|
474
|
+
getInitials,
|
|
475
|
+
formatRupiah,
|
|
476
|
+
transformThousands,
|
|
477
|
+
formatDate,
|
|
478
|
+
formatDateTime,
|
|
479
|
+
applyEFakturMask,
|
|
480
|
+
applyCoretaxMask,
|
|
481
|
+
pphFormat,
|
|
482
|
+
matchRole,
|
|
483
|
+
terbilang,
|
|
484
|
+
visibleTable
|
|
485
|
+
};
|
|
486
|
+
//# sourceMappingURL=chunk-OCHH4OB7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/localStorage.ts","../src/utils/accessCheck.ts","../src/utils/aliasBundlingTypeArchive.ts","../src/utils/base64DecodeWithSecret.ts","../src/utils/convertToArrayOfObject.ts","../src/utils/decodeEncodeFlateBase64.ts","../src/utils/decodeEncodeLzString.ts","../src/utils/encodeDecode.ts","../src/utils/formatCurrency.ts","../src/utils/generateHeaders.ts","../src/utils/generateUUID.ts","../src/utils/getInitials.ts","../src/utils/formatRupiah.ts","../src/utils/formatDate.ts","../src/utils/dateFormat.ts","../src/utils/formatter.ts","../src/utils/taxFormat.ts","../src/utils/rolesCheck.ts","../src/utils/terbilang.ts","../src/utils/visibleTable.ts"],"sourcesContent":["// utils/localStorage.ts\r\n\r\n/**\r\n * Simpan data ke localStorage dengan aman.\r\n */\r\nexport const setLocalStorage = (key: string, value: unknown): void => {\r\n try {\r\n const serializedValue =\r\n typeof value === \"string\" ? value : JSON.stringify(value);\r\n localStorage.setItem(key, serializedValue);\r\n } catch (error) {\r\n console.error(`Gagal menyimpan ke localStorage: ${key}`, error);\r\n }\r\n};\r\n\r\n/**\r\n * Ambil data dari localStorage dengan aman (auto-parse JSON jika valid).\r\n * Generic <T> agar hasil bisa ditentukan tipenya.\r\n */\r\nexport const getLocalStorage = <T = unknown>(\r\n key: string,\r\n defaultValue: T | null = null\r\n): T | string | null => {\r\n try {\r\n const value = localStorage.getItem(key);\r\n if (value === null) return defaultValue;\r\n\r\n try {\r\n return JSON.parse(value) as T;\r\n } catch {\r\n return value; // Jika bukan JSON, kembalikan string\r\n }\r\n } catch (error) {\r\n console.error(`Gagal membaca dari localStorage: ${key}`, error);\r\n return defaultValue;\r\n }\r\n};\r\n\r\n/**\r\n * Hapus data dari localStorage.\r\n */\r\nexport const removeLocalStorage = (key: string): void => {\r\n try {\r\n localStorage.removeItem(key);\r\n } catch (error) {\r\n console.error(`Gagal menghapus localStorage: ${key}`, error);\r\n }\r\n};\r\n\r\n/**\r\n * Hapus seluruh localStorage.\r\n */\r\nexport const clearLocalStorage = (): void => {\r\n try {\r\n localStorage.clear();\r\n } catch (error) {\r\n console.error(\"Gagal membersihkan localStorage\", error);\r\n }\r\n};","import { getLocalStorage } from \"./localStorage\";\r\n\r\ntype AnyObject = Record<string, any>;\r\n\r\n/**\r\n * Ambil value dari object berdasarkan path (misal: \"a.b.c\")\r\n */\r\nconst getByPath = (obj: AnyObject, path: string): any => {\r\n const keys = path.split(\".\");\r\n let current: any = obj;\r\n\r\n for (const key of keys) {\r\n if (current == null || !(key in current)) return null;\r\n current = current[key];\r\n }\r\n\r\n return current;\r\n};\r\n\r\ninterface AccessNode {\r\n access?: string[];\r\n}\r\n\r\n/**\r\n * Cek otorisasi akses berdasarkan path dan list akses user.\r\n */\r\nexport const accessCheck = (\r\n keyPath: string,\r\n requiredAccess: string | string[]\r\n): boolean => {\r\n try {\r\n const list = getLocalStorage<AnyObject[]>(\"menu-access\");\r\n if (!list) return false;\r\n\r\n // Gabungkan array of object menjadi satu object\r\n const accessRoot: AnyObject = Object.assign({}, ...list);\r\n\r\n const node = getByPath(accessRoot, keyPath) as AccessNode | null;\r\n if (!node || !Array.isArray(node.access)) return false;\r\n\r\n const userAccessList = node.access;\r\n\r\n if (Array.isArray(requiredAccess)) {\r\n return requiredAccess.some((a) => userAccessList.includes(a));\r\n }\r\n\r\n return userAccessList.includes(requiredAccess);\r\n } catch (error) {\r\n console.error(\"Invalid menu-access format:\", error);\r\n return false;\r\n }\r\n};\r\n","type BundlingTypeArchive = 'TRUCKING_ONLY' | 'CUSTOMS_CLEARANCE';\r\n\r\nexport const aliasBundlingTypeArchive = (bundlingTypeArchive: BundlingTypeArchive | undefined): string => {\r\n const alias: Record<BundlingTypeArchive, string> = {\r\n TRUCKING_ONLY: 'Trucking Only',\r\n CUSTOMS_CLEARANCE: 'Customs Clearance',\r\n };\r\n\r\n return bundlingTypeArchive ? alias[bundlingTypeArchive] : 'N/A';\r\n};\r\n","export function base64DecodeWithSecret<T = unknown>(\r\n encodedData: string,\r\n secretKey: string\r\n): T {\r\n const decodedData = atob(encodedData);\r\n const originalData = decodedData.slice(0, -secretKey.length);\r\n return JSON.parse(originalData) as T;\r\n}\r\n","// utils.ts\r\n\r\n/**\r\n * Convert an array of pipe-separated strings into an array of objects.\r\n * If field names are provided, they will be used instead of generic field1, field2, etc.\r\n * Example:\r\n * convertToArrayOfObject([\"1|01|PUJA|PUNINAR JAYA\"], [\"id\",\"code\",\"short_name\",\"full_name\"])\r\n * → [{ id: \"1\", code: \"01\", short_name: \"PUJA\", full_name: \"PUNINAR JAYA\" }]\r\n */\r\nexport function convertToArrayOfObject(\r\n arr?: string[] | null,\r\n fields?: string[]\r\n): Record<string, string>[] {\r\n if (!Array.isArray(arr) || arr.length === 0) {\r\n return [];\r\n }\r\n\r\n return arr.map((item) => {\r\n if (typeof item !== \"string\") return {};\r\n\r\n const parts = item.split(\"|\");\r\n const obj: Record<string, string> = {};\r\n\r\n parts.forEach((value, index) => {\r\n const key =\r\n fields && fields[index]\r\n ? fields[index]\r\n : `field${index + 1}`;\r\n obj[key] = value?.trim?.() ?? \"\";\r\n });\r\n\r\n return obj;\r\n });\r\n}\r\n","import pako from \"pako\";\r\n\r\nexport function decodeFlateBase64<T = any>(encoded: string): T {\r\n if (!encoded) return null as T;\r\n\r\n const binary = atob(encoded);\r\n\r\n const bytes = Uint8Array.from(binary, (c) => c.charCodeAt(0));\r\n const text = pako.inflateRaw(bytes, { to: \"string\" });\r\n\r\n return JSON.parse(text) as T;\r\n}\r\n\r\nexport function encodeFlateBase64<T>(data: T): string {\r\n const json = JSON.stringify(data);\r\n\r\n const compressed = pako.deflateRaw(json, { level: 9 });\r\n\r\n let binary = \"\";\r\n for (let i = 0; i < compressed.length; i++) {\r\n binary += String.fromCharCode(compressed[i]);\r\n }\r\n\r\n return btoa(binary).replace(/=+$/, \"\");\r\n}\r\n","import LZString from \"lz-string\";\r\n\r\nexport function encodeShort<T>(data: T): string {\r\n return LZString.compressToEncodedURIComponent(\r\n JSON.stringify(data)\r\n );\r\n}\r\n\r\nexport function decodeShort<T>(encoded: string): T {\r\n const decompressed =\r\n LZString.decompressFromEncodedURIComponent(encoded);\r\n\r\n return JSON.parse(decompressed || \"{}\") as T;\r\n}\r\n","// utils/encodeDecode.ts\r\nexport function encodeData(data: unknown): string {\r\n try {\r\n // pastikan semua tipe diubah ke string JSON\r\n const json = JSON.stringify(data);\r\n return btoa(unescape(encodeURIComponent(json)));\r\n } catch (error) {\r\n console.error(\"Failed to encode data:\", error);\r\n return \"\";\r\n }\r\n}\r\n\r\nexport function decodeData<T = unknown>(encoded: string): T | string | number | null {\r\n try {\r\n const decoded = decodeURIComponent(escape(atob(encoded)));\r\n const parsed = JSON.parse(decoded);\r\n\r\n // Kalau hasilnya string atau number biasa, langsung return\r\n if (typeof parsed === \"string\" || typeof parsed === \"number\" || Array.isArray(parsed) || typeof parsed === \"object\") {\r\n return parsed as T;\r\n }\r\n\r\n return decoded; // fallback kalau bukan JSON\r\n } catch (error) {\r\n console.error(\"Failed to decode data:\", error);\r\n return null;\r\n }\r\n}\r\n","export function formatCurrency(\r\n value: number | string,\r\n decimals: number = 2,\r\n withLabel: boolean = true\r\n): string {\r\n if (value === null || value === undefined || value === '') {\r\n return withLabel ? 'Rp0' : '0'\r\n }\r\n\r\n let number: number\r\n\r\n if (typeof value === 'string') {\r\n // handle \"1.234,56\" atau \"1,234.56\"\r\n const normalized = value\r\n .replace(/\\./g, '')\r\n .replace(',', '.')\r\n\r\n number = parseFloat(normalized)\r\n } else {\r\n number = value\r\n }\r\n\r\n if (isNaN(number)) return withLabel ? 'Rp0' : '0'\r\n\r\n // 🔹 ROUNDING EXPLICIT (lebih jelas)\r\n const rounded = Math.round(number * Math.pow(10, decimals)) / Math.pow(10, decimals)\r\n\r\n return (\r\n (withLabel ? 'Rp' : '') +\r\n rounded\r\n .toFixed(decimals)\r\n .replace('.', ',')\r\n .replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.')\r\n )\r\n}\r\n","import SHA256 from \"crypto-js/sha256\";\r\nimport Hex from \"crypto-js/enc-hex\";\r\nimport { getLocalStorage } from \"./localStorage\";\r\n\r\nexport function generateHeaders(api_key: string): Record<string, string> {\r\n const date = new Date();\r\n const timestamp = date.toISOString().slice(0, 19).replace(\"T\", \" \"); // 2025-10-02 12:34:56\r\n const encryptionKey = `${api_key}${timestamp}`;\r\n const keyPun = SHA256(encryptionKey).toString(Hex);\r\n\r\n return {\r\n // \"Content-Type\": \"application/json\",\r\n \"Authorization\": `Bearer ${getLocalStorage(\"odong-token\")}`,\r\n \"key-puninar\": keyPun,\r\n timestamp,\r\n };\r\n}","export const generateUUID = (): string => {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n // Fallback sederhana (bukan UUID asli, tapi cukup unik untuk UI)\r\n return `temp-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\r\n};","/**\r\n * Generate initials from a name\r\n * @param name - Full name\r\n * @returns Initials (first and last letter)\r\n */\r\nexport function getInitials(name?: string): string {\r\n if (!name) return \"\";\r\n\r\n const parts = name.trim().split(/\\s+/); // pisah berdasarkan spasi\r\n\r\n if (parts.length === 1) {\r\n return parts[0][0].toUpperCase(); // satu kata → ambil huruf pertama\r\n }\r\n\r\n const first = parts[0][0].toUpperCase();\r\n const last = parts[parts.length - 1][0].toUpperCase();\r\n return first + last;\r\n}","export const formatRupiah = (\r\n value: number | string | null | undefined\r\n): string => {\r\n if (value === null || value === undefined || value === '') {\r\n return '';\r\n }\r\n\r\n let numberValue: number;\r\n\r\n if (typeof value === 'number') {\r\n numberValue = value;\r\n } else {\r\n // support \"1.234,56\", \"1234.56\", \"Rp 1.234,56\"\r\n const normalized = value\r\n .toString()\r\n .replace(/\\s/g, '')\r\n .replace(/Rp/gi, '')\r\n .replace(/\\./g, '')\r\n .replace(/,/g, '.')\r\n .replace(/[^0-9.-]/g, '');\r\n\r\n numberValue = Number(normalized);\r\n }\r\n\r\n if (Number.isNaN(numberValue)) {\r\n return '';\r\n }\r\n\r\n const hasDecimal = Math.round(numberValue * 100) % 100 !== 0;\r\n\r\n return new Intl.NumberFormat('id-ID', {\r\n style: 'currency',\r\n currency: 'IDR',\r\n minimumFractionDigits: hasDecimal ? 2 : 0,\r\n maximumFractionDigits: 2,\r\n }).format(numberValue);\r\n};\r\n\r\nexport const transformThousands = (\r\n value: string | number | null | undefined,\r\n mode: \"format\" | \"parse\" = \"format\"\r\n): string | number => {\r\n if (value === null || value === undefined) {\r\n return mode === \"format\" ? \"\" : 0;\r\n }\r\n\r\n const str = value.toString();\r\n\r\n if (mode === \"parse\") {\r\n const normalized = str\r\n .replace(/\\./g, \"\")\r\n .replace(/,/g, \".\")\r\n .replace(/[^0-9.]/g, \"\");\r\n\r\n const num = Number(normalized);\r\n return isNaN(num) ? 0 : num;\r\n }\r\n\r\n // ===== FORMAT MODE =====\r\n\r\n const endsWithComma = str.endsWith(\",\");\r\n\r\n const cleaned = str.replace(/[^0-9,]/g, \"\");\r\n const [intRaw = \"\", decRaw = \"\"] = cleaned.split(\",\");\r\n\r\n const intPart = intRaw.replace(/\\D/g, \"\");\r\n const formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \".\");\r\n\r\n let decimalPart = decRaw.replace(/\\D/g, \"\").slice(0, 2);\r\n\r\n // Case: user baru mengetik koma → simpan koma\r\n if (endsWithComma && decimalPart.length === 0) {\r\n return `${formattedInt},`;\r\n }\r\n\r\n if (decimalPart.length > 0) {\r\n return `${formattedInt},${decimalPart}`;\r\n }\r\n\r\n return formattedInt;\r\n};\r\n","import dayjs from \"dayjs\";\r\nimport \"dayjs/locale/id\";\r\n\r\ndayjs.locale(\"id\");\r\n\r\nexport const formatDate = (\r\n value?: string | Date | null,\r\n format = \"DD MMM YYYY HH:mm\"\r\n): string => {\r\n if (!value) return \"\";\r\n\r\n let sanitized = value;\r\n\r\n if (typeof value === \"string\" && value.endsWith(\"Z\")) {\r\n sanitized = value.replace(/Z$/, \"\");\r\n }\r\n\r\n const parsed = dayjs(sanitized);\r\n\r\n if (!parsed.isValid()) return \"\";\r\n\r\n return parsed.format(format);\r\n};","export function formatDateTime(date: Date): string {\r\n const day: string = String(date.getDate()).padStart(2, '0')\r\n const year: number = date.getFullYear()\r\n\r\n const months: string[] = [\r\n 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',\r\n 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'\r\n ]\r\n\r\n const month: string = months[date.getMonth()]\r\n\r\n const hours: string = String(date.getHours()).padStart(2, '0')\r\n const minutes: string = String(date.getMinutes()).padStart(2, '0')\r\n const seconds: string = String(date.getSeconds()).padStart(2, '0')\r\n\r\n return `${day} ${month} ${year}, ${hours}:${minutes}:${seconds}`\r\n}\r\n","// EFaktur: XXX.XXX-XX.XXXXXXXX\r\nconst MASK = '___.___-__.________'\r\nconst DIGIT_INDEXES = [\r\n 0, 1, 2, // ___\r\n 4, 5, 6, // ___\r\n 8, 9, // __\r\n 11, 12, 13, 14, 15, 16, 17, 18 // ________\r\n]\r\n\r\nexport function applyEFakturMask(\r\n raw: string\r\n): string {\r\n const digits = raw.replace(/\\D/g, '').slice(0, DIGIT_INDEXES.length)\r\n\r\n const chars = MASK.split('')\r\n\r\n digits.split('').forEach((d, i) => {\r\n chars[DIGIT_INDEXES[i]] = d\r\n })\r\n\r\n return chars.join('')\r\n}\r\n\r\n\r\n// Coretax: 16 digit angka\r\nconst CORETAX_MASK = '____-____-____-____'\r\nconst CORETAX_INDEXES = [\r\n 0, 1, 2, 3,\r\n 5, 6, 7, 8,\r\n 10, 11, 12, 13,\r\n 15, 16, 17, 18\r\n]\r\n\r\nexport function applyCoretaxMask(raw: string): string {\r\n const digits = raw.replace(/\\D/g, '').slice(0, 16)\r\n const chars = CORETAX_MASK.split('')\r\n\r\n digits.split('').forEach((d, i) => {\r\n chars[CORETAX_INDEXES[i]] = d\r\n })\r\n\r\n return chars.join('')\r\n}","export const pphFormat = (str: string): string | null => {\r\n // Match pola seperti PPH23_15% atau WHT_PPH23_15%\r\n const match = str.match(/(?:PPH|WHT.*?PPH)(\\d+)_(\\d+)%$/);\r\n return match ? `${match[1]}_${match[2]}%` : null;\r\n};\r\n","type MatchMode = \"exact\" | \"startsWith\" | \"includes\" | \"regex\";\r\n\r\nexport function matchRole(\r\n selectedRole: string | undefined,\r\n comparator: string | string[],\r\n mode: MatchMode = \"exact\"\r\n): boolean {\r\n if (!selectedRole) return false;\r\n\r\n const role = selectedRole.toUpperCase();\r\n const comparators = Array.isArray(comparator)\r\n ? comparator.map((c) => c.toUpperCase())\r\n : [comparator.toUpperCase()];\r\n\r\n return comparators.some((c) => {\r\n switch (mode) {\r\n case \"exact\":\r\n return role === c;\r\n\r\n case \"startsWith\":\r\n return role.startsWith(c);\r\n\r\n case \"includes\":\r\n return role.includes(c);\r\n\r\n case \"regex\":\r\n return new RegExp(c, \"i\").test(selectedRole);\r\n\r\n default:\r\n return false;\r\n }\r\n });\r\n}\r\n","export function terbilang(input: number | string): string {\r\n const angkaAwal =\r\n typeof input === 'string'\r\n ? parseFloat(input.replace(/,/g, ''))\r\n : input;\r\n\r\n if (isNaN(angkaAwal)) return 'Nol Rupiah';\r\n\r\n // 🔹 BULATKAN KE 2 DESIMAL\r\n const rounded = Math.round(angkaAwal * 100) / 100;\r\n\r\n const integerPart = Math.floor(rounded);\r\n const decimalPart = Math.round((rounded - integerPart) * 100);\r\n\r\n const kata = [\r\n 'Nol', 'Satu', 'Dua', 'Tiga', 'Empat',\r\n 'Lima', 'Enam', 'Tujuh', 'Delapan', 'Sembilan',\r\n ];\r\n const tingkat = ['', 'Ribu', 'Juta', 'Miliar', 'Triliun'];\r\n\r\n const bacaRatusan = (num: number): string => {\r\n let hasil = '';\r\n const ratus = Math.floor(num / 100);\r\n const sisa = num % 100;\r\n\r\n if (ratus > 0) {\r\n hasil += ratus === 1 ? 'Seratus ' : `${kata[ratus]} Ratus `;\r\n }\r\n\r\n if (sisa > 0) {\r\n if (sisa < 10) hasil += kata[sisa];\r\n else if (sisa === 10) hasil += 'Sepuluh';\r\n else if (sisa === 11) hasil += 'Sebelas';\r\n else if (sisa < 20) hasil += `${kata[sisa - 10]} Belas`;\r\n else {\r\n const puluh = Math.floor(sisa / 10);\r\n const satuan = sisa % 10;\r\n hasil += `${kata[puluh]} Puluh`;\r\n if (satuan > 0) hasil += ` ${kata[satuan]}`;\r\n }\r\n }\r\n\r\n return hasil.trim();\r\n };\r\n\r\n // 🔹 BAGIAN BILANGAN BULAT\r\n let hasil = '';\r\n let temp = integerPart;\r\n let level = 0;\r\n\r\n if (temp === 0) hasil = 'Nol';\r\n\r\n while (temp > 0) {\r\n const bagian = temp % 1000;\r\n\r\n if (bagian > 0) {\r\n let teks = bacaRatusan(bagian);\r\n if (level === 1 && bagian === 1) teks = 'Seribu';\r\n hasil = `${teks} ${tingkat[level]} ${hasil}`.trim();\r\n }\r\n\r\n temp = Math.floor(temp / 1000);\r\n level++;\r\n }\r\n\r\n // 🔹 BAGIAN KOMA (MAKS 2 DIGIT, SUDAH DIBULATKAN)\r\n let komaText = '';\r\n if (decimalPart > 0) {\r\n const desimalStr = decimalPart.toString().padStart(2, '0');\r\n komaText =\r\n ' Koma ' +\r\n desimalStr\r\n .split('')\r\n .map((d) => kata[parseInt(d, 10)])\r\n .join(' ');\r\n }\r\n\r\n return `${hasil}${komaText} Rupiah`.trim();\r\n}\r\n","type Role = \"ADMIN\" | \"VENDOR\" | \"FINANCE\"\r\n\r\nexport function visibleTable(\r\n columns: any[],\r\n role?: Role\r\n) {\r\n return columns.filter((col) => {\r\n // Hide Status Dokumen untuk VENDOR\r\n if (role === \"VENDOR\" && (col.id === \"status_dokumen\" || col.id === \"verification_date\")) {\r\n return false\r\n }\r\n\r\n // Contoh tambahan rule\r\n // if (role === \"VENDOR\" && col.id === \"action\") return false\r\n\r\n return true\r\n })\r\n}\r\n"],"mappings":"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","names":["hasil"]}
|