@devoplus/one-sdk 0.0.0-stage → 0.2.0-next.112
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/CHANGELOG.md +268 -0
- package/README.md +894 -2
- package/bin/accessRequest.d.mts +96 -0
- package/bin/accessRequest.mjs +340 -0
- package/bin/appOps.d.mts +97 -0
- package/bin/appOps.mjs +336 -0
- package/bin/dataCommand.mjs +131 -0
- package/bin/devConfig.mjs +132 -0
- package/bin/one.mjs +341 -0
- package/bin/session.mjs +239 -0
- package/dist/agentInput.d.ts +9 -0
- package/dist/agentInput.d.ts.map +1 -0
- package/dist/agentInput.js +102 -0
- package/dist/agentInput.js.map +1 -0
- package/dist/agentTools.d.ts +83 -0
- package/dist/agentTools.d.ts.map +1 -0
- package/dist/agentTools.js +164 -0
- package/dist/agentTools.js.map +1 -0
- package/dist/ai.d.ts +67 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +129 -0
- package/dist/ai.js.map +1 -0
- package/dist/audit.d.ts +21 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +58 -0
- package/dist/audit.js.map +1 -0
- package/dist/backend.d.ts +27 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +63 -0
- package/dist/backend.js.map +1 -0
- package/dist/cache.d.ts +20 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +84 -0
- package/dist/cache.js.map +1 -0
- package/dist/client.d.ts +147 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +469 -0
- package/dist/client.js.map +1 -0
- package/dist/components.d.ts +235 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +1491 -0
- package/dist/components.js.map +1 -0
- package/dist/context.d.ts +110 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +126 -0
- package/dist/context.js.map +1 -0
- package/dist/data/crud.d.ts +74 -0
- package/dist/data/crud.d.ts.map +1 -0
- package/dist/data/crud.js +614 -0
- package/dist/data/crud.js.map +1 -0
- package/dist/data/ddl.d.ts +76 -0
- package/dist/data/ddl.d.ts.map +1 -0
- package/dist/data/ddl.js +362 -0
- package/dist/data/ddl.js.map +1 -0
- package/dist/data/fold.d.ts +14 -0
- package/dist/data/fold.d.ts.map +1 -0
- package/dist/data/fold.js +76 -0
- package/dist/data/fold.js.map +1 -0
- package/dist/data/model.d.ts +113 -0
- package/dist/data/model.d.ts.map +1 -0
- package/dist/data/model.js +408 -0
- package/dist/data/model.js.map +1 -0
- package/dist/data/values.d.ts +29 -0
- package/dist/data/values.d.ts.map +1 -0
- package/dist/data/values.js +152 -0
- package/dist/data/values.js.map +1 -0
- package/dist/dexa.d.ts +44 -0
- package/dist/dexa.d.ts.map +1 -0
- package/dist/dexa.js +74 -0
- package/dist/dexa.js.map +1 -0
- package/dist/dexaCommand.d.ts +116 -0
- package/dist/dexaCommand.d.ts.map +1 -0
- package/dist/dexaCommand.js +226 -0
- package/dist/dexaCommand.js.map +1 -0
- package/dist/export/columns.d.ts +62 -0
- package/dist/export/columns.d.ts.map +1 -0
- package/dist/export/columns.js +127 -0
- package/dist/export/columns.js.map +1 -0
- package/dist/export/csv.d.ts +10 -0
- package/dist/export/csv.d.ts.map +1 -0
- package/dist/export/csv.js +30 -0
- package/dist/export/csv.js.map +1 -0
- package/dist/export/report.d.ts +19 -0
- package/dist/export/report.d.ts.map +1 -0
- package/dist/export/report.js +91 -0
- package/dist/export/report.js.map +1 -0
- package/dist/export/response.d.ts +14 -0
- package/dist/export/response.d.ts.map +1 -0
- package/dist/export/response.js +70 -0
- package/dist/export/response.js.map +1 -0
- package/dist/export/xlsx.d.ts +15 -0
- package/dist/export/xlsx.d.ts.map +1 -0
- package/dist/export/xlsx.js +167 -0
- package/dist/export/xlsx.js.map +1 -0
- package/dist/export/zip.d.ts +7 -0
- package/dist/export/zip.d.ts.map +1 -0
- package/dist/export/zip.js +83 -0
- package/dist/export/zip.js.map +1 -0
- package/dist/files.d.ts +52 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +137 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs.d.ts +57 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +157 -0
- package/dist/jobs.js.map +1 -0
- package/dist/log.d.ts +22 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +107 -0
- package/dist/log.js.map +1 -0
- package/dist/notify.d.ts +41 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +11 -0
- package/dist/notify.js.map +1 -0
- package/dist/org.d.ts +184 -0
- package/dist/org.d.ts.map +1 -0
- package/dist/org.js +114 -0
- package/dist/org.js.map +1 -0
- package/dist/people.d.ts +39 -0
- package/dist/people.d.ts.map +1 -0
- package/dist/people.js +88 -0
- package/dist/people.js.map +1 -0
- package/dist/problem.d.ts +12 -0
- package/dist/problem.d.ts.map +1 -0
- package/dist/problem.js +33 -0
- package/dist/problem.js.map +1 -0
- package/dist/runtime.d.ts +92 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +8 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scenarios.d.ts +125 -0
- package/dist/scenarios.d.ts.map +1 -0
- package/dist/scenarios.js +251 -0
- package/dist/scenarios.js.map +1 -0
- package/package.json +55 -3
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { OneError } from './context.js';
|
|
2
|
+
import { DEXA_KEY_RE, DEXA_MAX_PARAMETERS, DEXA_PARAMETER_NAME_RE } from './dexa.js';
|
|
3
|
+
/** Komut parametre değerinin en çok uzunluğu (UTF-16 birimi). Sorgulardaki 2.000'den büyüktür: `Body` model JSON'u taşır. */
|
|
4
|
+
export const DEXA_COMMAND_PARAMETER_VALUE_MAX_LENGTH = 65_536;
|
|
5
|
+
/** Kanonik UUID biçimi (harf duyarsız). Sunucu (`Guid.TryParse`) daha çok biçim kabul eder; SDK bilinçli olarak dardır. */
|
|
6
|
+
export const IDEMPOTENCY_KEY_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
7
|
+
const NIL_UUID = '00000000-0000-0000-0000-000000000000';
|
|
8
|
+
/** Yeni bir kullanıcı eylemi için anahtar (`crypto.randomUUID`). Göndermeden ÖNCE kalıcı yere yazın. */
|
|
9
|
+
export function newIdempotencyKey() {
|
|
10
|
+
return crypto.randomUUID();
|
|
11
|
+
}
|
|
12
|
+
/** Anahtarı doğrular ve kanonik küçük harf biçimini döner; geçersizse fırlatır (istek hiç gitmez). */
|
|
13
|
+
export function normalizeIdempotencyKey(idempotencyKey) {
|
|
14
|
+
if (typeof idempotencyKey !== 'string' || !IDEMPOTENCY_KEY_RE.test(idempotencyKey))
|
|
15
|
+
throw new OneError(400, 'ONE-SDK-E-049', 'Idempotency-Key 8-4-4-4-12 biçiminde bir UUID olmalıdır (newIdempotencyKey() ile üretin ve kullanıcı eylemi başına bir kez saklayın).');
|
|
16
|
+
const key = idempotencyKey.toLowerCase();
|
|
17
|
+
if (key === NIL_UUID)
|
|
18
|
+
throw new OneError(400, 'ONE-SDK-E-049', 'Idempotency-Key boş UUID (tümü sıfır) olamaz: her kullanıcı eylemi kendi anahtarını alır.');
|
|
19
|
+
return key;
|
|
20
|
+
}
|
|
21
|
+
/** Sunucuya giden gövdeyi doğrular ve kurar; hatalı girdi fırlatır (istek hiç gitmez). */
|
|
22
|
+
export function buildDexaCommandRequest(key, parameters) {
|
|
23
|
+
if (typeof key !== 'string' || !DEXA_KEY_RE.test(key))
|
|
24
|
+
throw new OneError(400, 'ONE-SDK-E-045', 'DEXA işlem anahtarı 1-128 karakter olmalı; harf ya da rakamla başlamalı ve yalnız harf, rakam, ".", "_", "-" içermelidir.');
|
|
25
|
+
const body = { key };
|
|
26
|
+
if (parameters === undefined)
|
|
27
|
+
return body;
|
|
28
|
+
if (parameters === null || typeof parameters !== 'object' || Array.isArray(parameters))
|
|
29
|
+
throw new OneError(400, 'ONE-SDK-E-046', 'DEXA işlem parametreleri ad → metin değer eşlemesi (nesne) olmalıdır.');
|
|
30
|
+
const entries = Object.entries(parameters);
|
|
31
|
+
if (entries.length > DEXA_MAX_PARAMETERS)
|
|
32
|
+
throw new OneError(400, 'ONE-SDK-E-046', `DEXA işlemine en çok ${DEXA_MAX_PARAMETERS} parametre gönderilebilir (${entries.length}).`);
|
|
33
|
+
const out = {};
|
|
34
|
+
for (const [name, value] of entries) {
|
|
35
|
+
if (!DEXA_PARAMETER_NAME_RE.test(name))
|
|
36
|
+
throw new OneError(400, 'ONE-SDK-E-047', `DEXA işlem parametresinin adı geçersiz: "${name}" — harf ya da "_" ile başlamalı, yalnız harf/rakam/"_" içermeli ve en çok 64 karakter olmalıdır.`);
|
|
37
|
+
if (typeof value !== 'string')
|
|
38
|
+
throw new OneError(400, 'ONE-SDK-E-048', `DEXA işlem parametresi "${name}" metin olmalıdır (nesne JSON.stringify ile, sayı String(...) ile çevrilir).`);
|
|
39
|
+
if (value.length > DEXA_COMMAND_PARAMETER_VALUE_MAX_LENGTH)
|
|
40
|
+
throw new OneError(400, 'ONE-SDK-E-048', `DEXA işlem parametresi "${name}" en çok ${DEXA_COMMAND_PARAMETER_VALUE_MAX_LENGTH} karakter olabilir (${value.length}).`);
|
|
41
|
+
out[name] = value;
|
|
42
|
+
}
|
|
43
|
+
body.parameters = out;
|
|
44
|
+
return body;
|
|
45
|
+
}
|
|
46
|
+
function isRecord(value) {
|
|
47
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
48
|
+
}
|
|
49
|
+
function stringOrNull(value) {
|
|
50
|
+
return typeof value === 'string' ? value : null;
|
|
51
|
+
}
|
|
52
|
+
function normalizeErpView(raw) {
|
|
53
|
+
const v = isRecord(raw) ? raw : {};
|
|
54
|
+
return {
|
|
55
|
+
shape: typeof v.shape === 'string' ? v.shape : 'unrecognized',
|
|
56
|
+
isSuccessful: typeof v.isSuccessful === 'boolean' ? v.isSuccessful : null,
|
|
57
|
+
headerId: stringOrNull(v.headerId),
|
|
58
|
+
documentNumber: stringOrNull(v.documentNumber),
|
|
59
|
+
exceptionMessage: stringOrNull(v.exceptionMessage),
|
|
60
|
+
lines: v.lines ?? null,
|
|
61
|
+
raw: v.raw ?? null,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const COMMAND_OUTCOMES = new Set(['succeeded', 'rejected', 'inDoubt']);
|
|
65
|
+
const STATUS_OUTCOMES = new Set(['succeeded', 'rejected', 'inDoubt', 'pending', 'notSent']);
|
|
66
|
+
// ── Yanıt doğrulaması ────────────────────────────────────────────────────────────────────────────────────────────
|
|
67
|
+
// Ölçüt backend kayıtlarının TİPLERİDİR (okundu: `ErpCommandResponse` · `ErpCommandErpView` ·
|
|
68
|
+
// `ErpCommandStatusResponse`): nullable OLMAYAN alan ZORUNLUDUR ve doğru tipte olmalıdır; nullable alan yok, `null` ya
|
|
69
|
+
// da doğru tipte olabilir. Backend `AddJsonOptions`'ta yalnız bir dönüştürücü ekler (okundu: Web.Api
|
|
70
|
+
// `DependencyInjection.cs`), yani `null` alanları da yazan varsayılan geçerlidir ve tam bir yanıtta eksik alan olmaz
|
|
71
|
+
// (canlı yanıtla ölçülmedi). Kimlik eşleşmesi ayrıca aranır: yanıt BAŞKA bir komutun sonucuysa (farklı `idempotencyKey`) onu bu eylemin
|
|
72
|
+
// sonucu saymak, "başarılı" bir çağrının ERP'ye hiç yazılmamış olabileceğini gizler.
|
|
73
|
+
function optionalString(value) {
|
|
74
|
+
return value === undefined || value === null || typeof value === 'string';
|
|
75
|
+
}
|
|
76
|
+
function optionalBoolean(value) {
|
|
77
|
+
return value === undefined || value === null || typeof value === 'boolean';
|
|
78
|
+
}
|
|
79
|
+
/** `ErpCommandErpView`: `shape` zorunlu metin; `isSuccessful` boolean|null; metin alanları metin|null; `lines`/`raw` serbest JSON. */
|
|
80
|
+
function isErpView(value) {
|
|
81
|
+
return (isRecord(value) &&
|
|
82
|
+
typeof value.shape === 'string' &&
|
|
83
|
+
optionalBoolean(value.isSuccessful) &&
|
|
84
|
+
optionalString(value.headerId) &&
|
|
85
|
+
optionalString(value.documentNumber) &&
|
|
86
|
+
optionalString(value.exceptionMessage));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Komut anahtarı eşleşmesi — yalnız ASCII harflerde büyük/küçük harf duyarsız. Backend kataloğu anahtarı harf duyarsız
|
|
90
|
+
* bulur ve yanıtta KATALOGDAKİ yazımı döner (okundu: `ErpCommandCatalog.Find` `OrdinalIgnoreCase` +
|
|
91
|
+
* `ErpCommandExecutor` `entry.Key`); kayıt defterindeki yazım katalogdan harf olarak farklıysa birebir karşılaştırma
|
|
92
|
+
* başarılı her işlemi `inDoubt` yapardı. Gönderilen anahtar `DEXA_KEY_RE` ile ASCII'dir; ASCII dışı her fark eşleşmez.
|
|
93
|
+
*/
|
|
94
|
+
function sameCommandKey(received, sent) {
|
|
95
|
+
const fold = (s) => s.replace(/[A-Z]/g, (c) => c.toLowerCase());
|
|
96
|
+
return received.length === sent.length && fold(received) === fold(sent);
|
|
97
|
+
}
|
|
98
|
+
/** `ErpCommandResponse` sözleşmesi + gönderilen anahtarlarla eşleşme. */
|
|
99
|
+
function isConsistentCommandResult(r, sentIdempotencyKey, sentKey) {
|
|
100
|
+
return (typeof r.outcome === 'string' &&
|
|
101
|
+
COMMAND_OUTCOMES.has(r.outcome) &&
|
|
102
|
+
r.idempotencyKey === sentIdempotencyKey &&
|
|
103
|
+
typeof r.queryStoreKey === 'string' &&
|
|
104
|
+
sameCommandKey(r.queryStoreKey, sentKey) &&
|
|
105
|
+
typeof r.replayed === 'boolean' &&
|
|
106
|
+
optionalString(r.correlationId) &&
|
|
107
|
+
isErpView(r.erp));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* `ErpCommandStatusResponse` sözleşmesi + gönderilen anahtarla eşleşme. Durum ucu anahtarı yoldan alır; komut anahtarı
|
|
111
|
+
* istekte YOKTUR, bu yüzden `queryStoreKey` yalnız tipiyle denetlenir. `succeeded`/`rejected` ERP görünümü OLMADAN
|
|
112
|
+
* kabul edilmez (okundu: genel komutta `erp` yalnız sonuçlanmış kayıtta doludur, `GetErpCommandStatusQueryHandler`).
|
|
113
|
+
*/
|
|
114
|
+
function isConsistentStatus(r, sentIdempotencyKey) {
|
|
115
|
+
return (typeof r.outcome === 'string' &&
|
|
116
|
+
STATUS_OUTCOMES.has(r.outcome) &&
|
|
117
|
+
r.idempotencyKey === sentIdempotencyKey &&
|
|
118
|
+
typeof r.queryStoreKey === 'string' &&
|
|
119
|
+
optionalString(r.correlationId) &&
|
|
120
|
+
typeof r.attemptCount === 'number' &&
|
|
121
|
+
Number.isInteger(r.attemptCount) &&
|
|
122
|
+
r.attemptCount >= 0 &&
|
|
123
|
+
typeof r.createdAtUtc === 'string' &&
|
|
124
|
+
optionalString(r.completedAtUtc) &&
|
|
125
|
+
(r.erp === undefined || r.erp === null || isErpView(r.erp)) &&
|
|
126
|
+
((r.outcome !== 'succeeded' && r.outcome !== 'rejected') || isErpView(r.erp)) &&
|
|
127
|
+
Array.isArray(r.steps) &&
|
|
128
|
+
r.steps.every(isRecord) &&
|
|
129
|
+
typeof r.kind === 'string' &&
|
|
130
|
+
Array.isArray(r.warnings) &&
|
|
131
|
+
r.warnings.every(isRecord));
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 200 yanıtını sözleşmeye indirger. ⛔ Sözleşmeye uymayan her yanıt — nesne olmayan gövde, bilinmeyen `outcome`, eksik
|
|
135
|
+
* ya da yanlış tipli alan, gönderilenden farklı `idempotencyKey` ya da `queryStoreKey` — `inDoubt` sayılır: ERP'ye
|
|
136
|
+
* gittiği kesin olan bir isteğin sonucu anlaşılamıyorsa onu başarı ya da ret saymak yanlış eylemi (yeni anahtarla
|
|
137
|
+
* tekrar → çift kayıt) tetikler. O durumda gövdenin HİÇBİR alanı sonuca taşınmaz (başka bir komuta ait olabilir):
|
|
138
|
+
* anahtarlar gönderilenlerdir, `replayed: false`, `correlationId: null`, `erp.shape: 'unrecognized'` — doğru sonuç AYNI
|
|
139
|
+
* anahtarla `getDexaCommandStatus` üzerinden okunur.
|
|
140
|
+
*/
|
|
141
|
+
export function normalizeDexaCommandResult(raw, sentIdempotencyKey, sentKey) {
|
|
142
|
+
if (!isRecord(raw) || !isConsistentCommandResult(raw, sentIdempotencyKey, sentKey))
|
|
143
|
+
return {
|
|
144
|
+
queryStoreKey: sentKey,
|
|
145
|
+
idempotencyKey: sentIdempotencyKey,
|
|
146
|
+
replayed: false,
|
|
147
|
+
outcome: 'inDoubt',
|
|
148
|
+
correlationId: null,
|
|
149
|
+
erp: normalizeErpView(undefined),
|
|
150
|
+
};
|
|
151
|
+
return {
|
|
152
|
+
queryStoreKey: raw.queryStoreKey,
|
|
153
|
+
idempotencyKey: sentIdempotencyKey,
|
|
154
|
+
replayed: raw.replayed,
|
|
155
|
+
outcome: raw.outcome,
|
|
156
|
+
correlationId: stringOrNull(raw.correlationId),
|
|
157
|
+
erp: normalizeErpView(raw.erp),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Durum yanıtını sözleşmeye indirger; doğrulama kuralı ve geri düşüş komut sonucuyla AYNIDIR (sözleşmeye uymayan
|
|
162
|
+
* yanıt `inDoubt`, gövdeden hiçbir alan taşınmaz; `queryStoreKey` bilinmediği için boş metindir).
|
|
163
|
+
*/
|
|
164
|
+
export function normalizeDexaCommandStatus(raw, sentIdempotencyKey) {
|
|
165
|
+
if (!isRecord(raw) || !isConsistentStatus(raw, sentIdempotencyKey))
|
|
166
|
+
return {
|
|
167
|
+
queryStoreKey: '',
|
|
168
|
+
idempotencyKey: sentIdempotencyKey,
|
|
169
|
+
outcome: 'inDoubt',
|
|
170
|
+
correlationId: null,
|
|
171
|
+
attemptCount: 0,
|
|
172
|
+
createdAtUtc: '',
|
|
173
|
+
completedAtUtc: null,
|
|
174
|
+
erp: null,
|
|
175
|
+
steps: [],
|
|
176
|
+
kind: 'command',
|
|
177
|
+
warnings: [],
|
|
178
|
+
};
|
|
179
|
+
return {
|
|
180
|
+
queryStoreKey: raw.queryStoreKey,
|
|
181
|
+
idempotencyKey: sentIdempotencyKey,
|
|
182
|
+
outcome: raw.outcome,
|
|
183
|
+
correlationId: stringOrNull(raw.correlationId),
|
|
184
|
+
attemptCount: raw.attemptCount,
|
|
185
|
+
createdAtUtc: raw.createdAtUtc,
|
|
186
|
+
completedAtUtc: stringOrNull(raw.completedAtUtc),
|
|
187
|
+
erp: isRecord(raw.erp) ? normalizeErpView(raw.erp) : null,
|
|
188
|
+
steps: raw.steps,
|
|
189
|
+
kind: raw.kind,
|
|
190
|
+
warnings: raw.warnings,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Kayıt defterinde izinli, önceden tanımlı bir DEXA komutunu çalıştırır — ERP'ye VERİ YAZAR (scope `dexa.write`).
|
|
195
|
+
* Kullanıcı, portal ve uygulama istekle GÖNDERİLMEZ; backend doğrulanmış platform bağlamından alır.
|
|
196
|
+
* 4xx hatası `OneError` olarak fırlar ve ERP'ye hiçbir şey gönderilmediği anlamına gelir; 409 `ERPCMD-APP-E-016`
|
|
197
|
+
* (`pending`) `OneError.retryAfterSeconds` taşır — o süre sonra AYNI anahtarla tekrar deneyin ya da durumu okuyun.
|
|
198
|
+
*/
|
|
199
|
+
export async function runDexaCommand(api, key, parameters, options) {
|
|
200
|
+
const idempotencyKey = normalizeIdempotencyKey(options?.idempotencyKey);
|
|
201
|
+
const body = buildDexaCommandRequest(key, parameters);
|
|
202
|
+
const raw = await api.request('One/services/dexa/command', {
|
|
203
|
+
method: 'POST',
|
|
204
|
+
headers: { 'Idempotency-Key': idempotencyKey },
|
|
205
|
+
body: JSON.stringify(body),
|
|
206
|
+
});
|
|
207
|
+
return normalizeDexaCommandResult(raw, idempotencyKey, body.key);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Bu kullanıcının, bu uygulamanın izinli anahtarlarıyla çalıştırdığı bir komutun durumu (scope `dexa.write`).
|
|
211
|
+
* `null` = bu anahtarla görebileceğiniz bir kayıt yok (`404 ERPCMD-APP-E-017`): komut hiç kaydedilmemiştir, AYNI
|
|
212
|
+
* anahtarla yeniden gönderilebilir. Diğer her hata `OneError` olarak fırlar (eski backend'de uç yoksa da).
|
|
213
|
+
*/
|
|
214
|
+
export async function getDexaCommandStatus(api, idempotencyKey) {
|
|
215
|
+
const key = normalizeIdempotencyKey(idempotencyKey);
|
|
216
|
+
try {
|
|
217
|
+
const raw = await api.request(`One/services/dexa/command/${encodeURIComponent(key)}`, { method: 'GET' });
|
|
218
|
+
return normalizeDexaCommandStatus(raw, key);
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
if (error instanceof OneError && error.status === 404 && error.code === 'ERPCMD-APP-E-017')
|
|
222
|
+
return null;
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=dexaCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dexaCommand.js","sourceRoot":"","sources":["../src/dexaCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export type ExportLang = 'tr' | 'en';
|
|
2
|
+
export type ExportCellType = 'text' | 'number' | 'money' | 'date' | 'datetime' | 'boolean';
|
|
3
|
+
export interface ExportColumn {
|
|
4
|
+
/** Satır nesnesindeki anahtar. */
|
|
5
|
+
key: string;
|
|
6
|
+
/** Başlık: düz metin ya da iki dilde ad. */
|
|
7
|
+
title: string | {
|
|
8
|
+
tr: string;
|
|
9
|
+
en: string;
|
|
10
|
+
};
|
|
11
|
+
/** Hücre türü (varsayılan `text`). `money`: ondalıklı metin ("1234.50") ya da sayı; `date`: YYYY-AA-GG; `datetime`: ISO. */
|
|
12
|
+
type?: ExportCellType;
|
|
13
|
+
/** Değer → görünen ad eşlemesi (ör. seçim kodu → "Onaylandı"); yalnız `text` sütununda. */
|
|
14
|
+
labels?: Record<string, string | {
|
|
15
|
+
tr: string;
|
|
16
|
+
en: string;
|
|
17
|
+
}>;
|
|
18
|
+
/** XLSX sütun genişliği (karakter, 4-80); verilmezse başlık ve içeriğe göre kestirilir. */
|
|
19
|
+
width?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface ExportOptions {
|
|
22
|
+
lang?: ExportLang;
|
|
23
|
+
/** Tarih-saat hücrelerinin gösterildiği saat dilimi (IANA); varsayılan `Europe/Istanbul`. */
|
|
24
|
+
timeZone?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare const EXPORT_MAX_ROWS = 50000;
|
|
27
|
+
export declare const EXPORT_MAX_COLUMNS = 100;
|
|
28
|
+
export declare const DEFAULT_TIME_ZONE = "Europe/Istanbul";
|
|
29
|
+
export type ExportRow = Record<string, unknown>;
|
|
30
|
+
export declare function localize(value: string | {
|
|
31
|
+
tr: string;
|
|
32
|
+
en: string;
|
|
33
|
+
}, lang: ExportLang): string;
|
|
34
|
+
/** Sütun ve satır sayısını, sütun anahtarlarını ve türlerini denetler (`ONE-SDK-E-120`). */
|
|
35
|
+
export declare function checkExportInput(rows: readonly ExportRow[], columns: readonly ExportColumn[]): void;
|
|
36
|
+
/** Para değeri (ondalıklı metin ya da sayı) → kuruş; tanınmazsa `null`. Kayan nokta çarpımı yapılmaz. */
|
|
37
|
+
export declare function moneyMinorOf(value: unknown): number | null;
|
|
38
|
+
/** Kuruş → "1.234,50" (tr) / "1,234.50" (en). */
|
|
39
|
+
export declare function formatMoneyMinor(minor: number, lang: ExportLang): string;
|
|
40
|
+
export declare function formatNumber(n: number, lang: ExportLang): string;
|
|
41
|
+
/** `YYYY-AA-GG` → "gg.aa.yyyy" (tr) / "yyyy-mm-dd" (en). */
|
|
42
|
+
export declare function formatDate(text: string, lang: ExportLang): string;
|
|
43
|
+
/** Saat dilimindeki takvim parçaları (yıl, ay, gün, saat, dakika, saniye). */
|
|
44
|
+
export declare function zonedParts(iso: string, timeZone: string): {
|
|
45
|
+
y: number;
|
|
46
|
+
mo: number;
|
|
47
|
+
d: number;
|
|
48
|
+
h: number;
|
|
49
|
+
mi: number;
|
|
50
|
+
s: number;
|
|
51
|
+
} | null;
|
|
52
|
+
export declare function formatDateTime(iso: string, lang: ExportLang, timeZone: string): string;
|
|
53
|
+
/** Hücrenin görünen metni (CSV ve yazdırma sayfası için); boş değer → "". */
|
|
54
|
+
export declare function formatCell(value: unknown, column: ExportColumn, options: {
|
|
55
|
+
lang: ExportLang;
|
|
56
|
+
timeZone: string;
|
|
57
|
+
}): string;
|
|
58
|
+
export declare function resolveOptions(options: ExportOptions | undefined): {
|
|
59
|
+
lang: ExportLang;
|
|
60
|
+
timeZone: string;
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=columns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columns.d.ts","sourceRoot":"","sources":["../../src/export/columns.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAA;AACpC,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;AAE1F,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,4CAA4C;IAC5C,KAAK,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1C,4HAA4H;IAC5H,IAAI,CAAC,EAAE,cAAc,CAAA;IACrB,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC5D,2FAA2F;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,eAAO,MAAM,eAAe,QAAS,CAAA;AACrC,eAAO,MAAM,kBAAkB,MAAM,CAAA;AACrC,eAAO,MAAM,iBAAiB,oBAAoB,CAAA;AAElD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAK/C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAE7F;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,EAAE,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,IAAI,CAWnG;AAED,yGAAyG;AACzG,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAW1D;AAMD,iDAAiD;AACjD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAIxE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAEhE;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAIjE;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAevI;AAID,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAItF;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAwBxH;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CASzG"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// Dışa aktarma sütunları ve hücre biçimlendirmesi (D-85) — CSV, XLSX ve yazdırma sayfası aynı kuralları kullanır.
|
|
2
|
+
import { OneError } from '../context.js';
|
|
3
|
+
export const EXPORT_MAX_ROWS = 50_000;
|
|
4
|
+
export const EXPORT_MAX_COLUMNS = 100;
|
|
5
|
+
export const DEFAULT_TIME_ZONE = 'Europe/Istanbul';
|
|
6
|
+
const COLUMN_KEY_RE = /^[A-Za-z_][A-Za-z0-9_.-]{0,99}$/;
|
|
7
|
+
const TYPES = ['text', 'number', 'money', 'date', 'datetime', 'boolean'];
|
|
8
|
+
export function localize(value, lang) {
|
|
9
|
+
return typeof value === 'string' ? value : value[lang] || value.tr;
|
|
10
|
+
}
|
|
11
|
+
/** Sütun ve satır sayısını, sütun anahtarlarını ve türlerini denetler (`ONE-SDK-E-120`). */
|
|
12
|
+
export function checkExportInput(rows, columns) {
|
|
13
|
+
if (!Array.isArray(columns) || columns.length === 0)
|
|
14
|
+
throw new OneError(400, 'ONE-SDK-E-120', 'Dışa aktarma için en az bir sütun gerekir.');
|
|
15
|
+
if (columns.length > EXPORT_MAX_COLUMNS)
|
|
16
|
+
throw new OneError(400, 'ONE-SDK-E-120', `Dışa aktarmada en çok ${EXPORT_MAX_COLUMNS} sütun olabilir (${columns.length}).`);
|
|
17
|
+
for (const c of columns) {
|
|
18
|
+
if (!c || typeof c.key !== 'string' || !COLUMN_KEY_RE.test(c.key))
|
|
19
|
+
throw new OneError(400, 'ONE-SDK-E-120', `Geçersiz sütun anahtarı: ${String(c?.key)}`);
|
|
20
|
+
if (c.type !== undefined && !TYPES.includes(c.type))
|
|
21
|
+
throw new OneError(400, 'ONE-SDK-E-120', `Bilinmeyen sütun türü: ${String(c.type)}`);
|
|
22
|
+
}
|
|
23
|
+
if (!Array.isArray(rows))
|
|
24
|
+
throw new OneError(400, 'ONE-SDK-E-120', 'Satırlar bir dizi olmalı.');
|
|
25
|
+
if (rows.length > EXPORT_MAX_ROWS)
|
|
26
|
+
throw new OneError(400, 'ONE-SDK-E-121', `Dışa aktarmada en çok ${EXPORT_MAX_ROWS.toLocaleString('tr-TR')} satır olabilir (${rows.length}); süzgeci daraltın.`);
|
|
27
|
+
}
|
|
28
|
+
/** Para değeri (ondalıklı metin ya da sayı) → kuruş; tanınmazsa `null`. Kayan nokta çarpımı yapılmaz. */
|
|
29
|
+
export function moneyMinorOf(value) {
|
|
30
|
+
if (typeof value === 'number') {
|
|
31
|
+
if (!Number.isFinite(value))
|
|
32
|
+
return null;
|
|
33
|
+
return Math.round(value * 100);
|
|
34
|
+
}
|
|
35
|
+
if (typeof value !== 'string')
|
|
36
|
+
return null;
|
|
37
|
+
const m = /^\s*(-)?(\d{1,16})(?:[.,](\d{1,2}))?\s*$/.exec(value);
|
|
38
|
+
if (!m)
|
|
39
|
+
return null;
|
|
40
|
+
const minor = Number(m[2]) * 100 + Number((m[3] ?? '').padEnd(2, '0'));
|
|
41
|
+
if (!Number.isSafeInteger(minor))
|
|
42
|
+
return null;
|
|
43
|
+
return m[1] ? -minor : minor;
|
|
44
|
+
}
|
|
45
|
+
function groupDigits(digits, sep) {
|
|
46
|
+
return digits.replace(/\B(?=(\d{3})+(?!\d))/g, sep);
|
|
47
|
+
}
|
|
48
|
+
/** Kuruş → "1.234,50" (tr) / "1,234.50" (en). */
|
|
49
|
+
export function formatMoneyMinor(minor, lang) {
|
|
50
|
+
const abs = Math.abs(minor);
|
|
51
|
+
const major = groupDigits(String(Math.floor(abs / 100)), lang === 'tr' ? '.' : ',');
|
|
52
|
+
return `${minor < 0 ? '-' : ''}${major}${lang === 'tr' ? ',' : '.'}${String(abs % 100).padStart(2, '0')}`;
|
|
53
|
+
}
|
|
54
|
+
export function formatNumber(n, lang) {
|
|
55
|
+
return new Intl.NumberFormat(lang === 'tr' ? 'tr-TR' : 'en-US', { maximumFractionDigits: 6, useGrouping: true }).format(n);
|
|
56
|
+
}
|
|
57
|
+
/** `YYYY-AA-GG` → "gg.aa.yyyy" (tr) / "yyyy-mm-dd" (en). */
|
|
58
|
+
export function formatDate(text, lang) {
|
|
59
|
+
const m = /^(\d{4})-(\d{2})-(\d{2})/.exec(text);
|
|
60
|
+
if (!m)
|
|
61
|
+
return text;
|
|
62
|
+
return lang === 'tr' ? `${m[3]}.${m[2]}.${m[1]}` : `${m[1]}-${m[2]}-${m[3]}`;
|
|
63
|
+
}
|
|
64
|
+
/** Saat dilimindeki takvim parçaları (yıl, ay, gün, saat, dakika, saniye). */
|
|
65
|
+
export function zonedParts(iso, timeZone) {
|
|
66
|
+
const t = Date.parse(iso);
|
|
67
|
+
if (!Number.isFinite(t))
|
|
68
|
+
return null;
|
|
69
|
+
const parts = new Intl.DateTimeFormat('en-US', {
|
|
70
|
+
timeZone,
|
|
71
|
+
hourCycle: 'h23',
|
|
72
|
+
year: 'numeric',
|
|
73
|
+
month: '2-digit',
|
|
74
|
+
day: '2-digit',
|
|
75
|
+
hour: '2-digit',
|
|
76
|
+
minute: '2-digit',
|
|
77
|
+
second: '2-digit',
|
|
78
|
+
}).formatToParts(new Date(t));
|
|
79
|
+
const get = (type) => Number(parts.find((p) => p.type === type)?.value);
|
|
80
|
+
return { y: get('year'), mo: get('month'), d: get('day'), h: get('hour'), mi: get('minute'), s: get('second') };
|
|
81
|
+
}
|
|
82
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
83
|
+
export function formatDateTime(iso, lang, timeZone) {
|
|
84
|
+
const p = zonedParts(iso, timeZone);
|
|
85
|
+
if (!p)
|
|
86
|
+
return iso;
|
|
87
|
+
return lang === 'tr' ? `${pad(p.d)}.${pad(p.mo)}.${p.y} ${pad(p.h)}:${pad(p.mi)}` : `${p.y}-${pad(p.mo)}-${pad(p.d)} ${pad(p.h)}:${pad(p.mi)}`;
|
|
88
|
+
}
|
|
89
|
+
/** Hücrenin görünen metni (CSV ve yazdırma sayfası için); boş değer → "". */
|
|
90
|
+
export function formatCell(value, column, options) {
|
|
91
|
+
if (value === null || value === undefined || value === '')
|
|
92
|
+
return '';
|
|
93
|
+
const { lang, timeZone } = options;
|
|
94
|
+
switch (column.type ?? 'text') {
|
|
95
|
+
case 'number':
|
|
96
|
+
return typeof value === 'number' && Number.isFinite(value) ? formatNumber(value, lang) : String(value);
|
|
97
|
+
case 'money': {
|
|
98
|
+
const minor = moneyMinorOf(value);
|
|
99
|
+
return minor === null ? String(value) : formatMoneyMinor(minor, lang);
|
|
100
|
+
}
|
|
101
|
+
case 'date':
|
|
102
|
+
return typeof value === 'string' ? formatDate(value, lang) : String(value);
|
|
103
|
+
case 'datetime':
|
|
104
|
+
return typeof value === 'string' ? formatDateTime(value, lang, timeZone) : String(value);
|
|
105
|
+
case 'boolean': {
|
|
106
|
+
const yes = value === true || value === 1 || value === 'true';
|
|
107
|
+
return lang === 'tr' ? (yes ? 'Evet' : 'Hayır') : yes ? 'Yes' : 'No';
|
|
108
|
+
}
|
|
109
|
+
default: {
|
|
110
|
+
const text = typeof value === 'string' ? value : typeof value === 'number' || typeof value === 'boolean' ? String(value) : JSON.stringify(value);
|
|
111
|
+
const label = column.labels?.[text];
|
|
112
|
+
return label === undefined ? text : localize(label, lang);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
export function resolveOptions(options) {
|
|
117
|
+
const lang = options?.lang === 'en' ? 'en' : 'tr';
|
|
118
|
+
const timeZone = options?.timeZone ?? DEFAULT_TIME_ZONE;
|
|
119
|
+
try {
|
|
120
|
+
new Intl.DateTimeFormat('en-US', { timeZone });
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
throw new OneError(400, 'ONE-SDK-E-120', `Bilinmeyen saat dilimi: ${timeZone}`);
|
|
124
|
+
}
|
|
125
|
+
return { lang, timeZone };
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=columns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columns.js","sourceRoot":"","sources":["../../src/export/columns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ExportColumn, type ExportOptions, type ExportRow } from './columns.ts';
|
|
2
|
+
export interface CsvOptions extends ExportOptions {
|
|
3
|
+
/** Alan ayırıcısı; varsayılan Türkçede `;`, İngilizcede `,`. */
|
|
4
|
+
delimiter?: ';' | ',';
|
|
5
|
+
/** BOM yazılsın mı (varsayılan `true`). */
|
|
6
|
+
bom?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/** Satırları CSV metnine çevirir (`exportResponse(text, { format: 'csv', … })` ile indirilebilir). */
|
|
9
|
+
export declare function toCsv(rows: readonly ExportRow[], columns: readonly ExportColumn[], options?: CsvOptions): string;
|
|
10
|
+
//# sourceMappingURL=csv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../src/export/csv.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAA0D,MAAM,cAAc,CAAA;AAE5I,MAAM,WAAW,UAAW,SAAQ,aAAa;IAC/C,gEAAgE;IAChE,SAAS,CAAC,EAAE,GAAG,GAAG,GAAG,CAAA;IACrB,2CAA2C;IAC3C,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAQD,sGAAsG;AACtG,wBAAgB,KAAK,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,EAAE,OAAO,EAAE,SAAS,YAAY,EAAE,EAAE,OAAO,GAAE,UAAe,GAAG,MAAM,CAWpH"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// CSV dışa aktarma (D-85) — bağımlılıksız.
|
|
2
|
+
//
|
|
3
|
+
// Biçim kararları:
|
|
4
|
+
// • UTF-8 + BOM: Excel, BOM'suz UTF-8 dosyayı yerel kod sayfasıyla açar ve "ç, ğ, ı, ş" bozulur.
|
|
5
|
+
// • Ayırıcı: Türkçe (`lang: 'tr'`) varsayılanı `;`, İngilizce `,`. Türkçe bölge ayarlı Excel'de liste ayırıcısı `;`,
|
|
6
|
+
// ondalık ayırıcı `,`'dir: `,` ile ayrılmış dosya tek sütun açılır. Sayılar da aynı nedenle Türkçede "1.234,50"
|
|
7
|
+
// biçiminde yazılır. Dosya başka bir programa verilecekse `delimiter: ','` ve `lang: 'en'` seçilebilir.
|
|
8
|
+
// • Satır sonu CRLF, alanlar gerektiğinde çift tırnaklı (RFC 4180).
|
|
9
|
+
// • Formül enjeksiyonu: metin hücresi `= + - @` ya da sekme/satır başıyla başlıyorsa başına `'` eklenir — kullanıcının
|
|
10
|
+
// yazdığı "=HYPERLINK(…)" Excel'de formül olarak çalışmasın (OWASP "CSV Injection").
|
|
11
|
+
import { checkExportInput, formatCell, localize, resolveOptions } from './columns.js';
|
|
12
|
+
const FORMULA_START = /^[=+\-@\t\r]/;
|
|
13
|
+
function quote(text, delimiter) {
|
|
14
|
+
return text.includes(delimiter) || /["\r\n]/.test(text) || /^\s|\s$/.test(text) ? `"${text.replace(/"/g, '""')}"` : text;
|
|
15
|
+
}
|
|
16
|
+
/** Satırları CSV metnine çevirir (`exportResponse(text, { format: 'csv', … })` ile indirilebilir). */
|
|
17
|
+
export function toCsv(rows, columns, options = {}) {
|
|
18
|
+
checkExportInput(rows, columns);
|
|
19
|
+
const resolved = resolveOptions(options);
|
|
20
|
+
const delimiter = options.delimiter ?? (resolved.lang === 'tr' ? ';' : ',');
|
|
21
|
+
const cell = (text, column) => {
|
|
22
|
+
const isText = column === null || (column.type ?? 'text') === 'text';
|
|
23
|
+
return quote(isText && FORMULA_START.test(text) ? `'${text}` : text, delimiter);
|
|
24
|
+
};
|
|
25
|
+
const lines = [columns.map((c) => cell(localize(c.title, resolved.lang), null)).join(delimiter)];
|
|
26
|
+
for (const row of rows)
|
|
27
|
+
lines.push(columns.map((c) => cell(formatCell(row?.[c.key], c, resolved), c)).join(delimiter));
|
|
28
|
+
return (options.bom === false ? '' : '') + lines.join('\r\n') + '\r\n';
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=csv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv.js","sourceRoot":"","sources":["../../src/export/csv.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,mBAAmB;AACnB,kGAAkG;AAClG,sHAAsH;AACtH,mHAAmH;AACnH,2GAA2G;AAC3G,qEAAqE;AACrE,wHAAwH;AACxH,wFAAwF;AACxF,OAAO,EAAyD,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAS5I,MAAM,aAAa,GAAG,cAAc,CAAA;AAEpC,SAAS,KAAK,CAAC,IAAY,EAAE,SAAiB;IAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1H,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,KAAK,CAAC,IAA0B,EAAE,OAAgC,EAAE,OAAO,GAAe,EAAE;IAC1G,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC/B,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IACxC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAC3E,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,MAA2B,EAAU,EAAE;QACjE,MAAM,MAAM,GAAG,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,MAAM,CAAA;QACpE,OAAO,KAAK,CAAC,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IACjF,CAAC,CAAA;IACD,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;IAChG,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;IACtH,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;AACzE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type ExportColumn, type ExportOptions, type ExportRow } from './columns.ts';
|
|
2
|
+
export interface PrintableReportOptions extends ExportOptions {
|
|
3
|
+
title: string;
|
|
4
|
+
/** Başlık altındaki açıklama (ör. "Durum: Açık, 01.10.2026 - 18.10.2026"). */
|
|
5
|
+
subtitle?: string;
|
|
6
|
+
columns: readonly ExportColumn[];
|
|
7
|
+
rows: readonly ExportRow[];
|
|
8
|
+
/** Toplamı alınacak sütun anahtarları (yalnız `number` ve `money` sütunları). */
|
|
9
|
+
totals?: readonly string[];
|
|
10
|
+
/** Raporun üretildiği an (ISO); varsayılan şimdi. */
|
|
11
|
+
generatedAt?: string;
|
|
12
|
+
/** Sayfa yönü (varsayılan dikey). */
|
|
13
|
+
orientation?: 'portrait' | 'landscape';
|
|
14
|
+
}
|
|
15
|
+
/** Yazdırmaya uygun tam HTML belgesi (betiksiz). */
|
|
16
|
+
export declare function renderPrintableReport(options: PrintableReportOptions): string;
|
|
17
|
+
/** Rapor sayfasını sayfa olarak döndürür (indirme değil; yazdırma çerçevesi için). */
|
|
18
|
+
export declare function reportResponse(html: string): Response;
|
|
19
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/export/report.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAwH,MAAM,cAAc,CAAA;AAE1M,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,KAAK,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,YAAY,EAAE,CAAA;IAChC,IAAI,EAAE,SAAS,SAAS,EAAE,CAAA;IAC1B,iFAAiF;IACjF,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1B,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qCAAqC;IACrC,WAAW,CAAC,EAAE,UAAU,GAAG,WAAW,CAAA;CACvC;AAoBD,oDAAoD;AACpD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAsD7E;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAKrD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// Yazdırmaya uygun rapor sayfası (D-85). PDF için ayrı motor YOKTUR (Türkçe karakterli PDF yazı tipi gömmeyi gerektirir):
|
|
2
|
+
// sayfa tarayıcının "Yazdır → PDF olarak kaydet" komutuyla PDF'e çevrilir — bilinçli sınır.
|
|
3
|
+
//
|
|
4
|
+
// Sayfa betik İÇERMEZ (platform CSP'si satır içi betiği kapatır; yazdırma düğmesi de gerekmez): görsel dil `/one-ui.css`
|
|
5
|
+
// bağlantısından, yazdırma kuralları satır içi `<style>`dan gelir (satır içi stil platformda açıktır). Bağlantı
|
|
6
|
+
// çözülemezse (ör. dosya indirilip bilgisayarda açılırsa) satır içi temel stiller sayfayı yine okunur tutar.
|
|
7
|
+
// Bütün metinler kaçışlanır; tablo başlığı her yazdırılan sayfada tekrarlanır.
|
|
8
|
+
//
|
|
9
|
+
// Kullanım (uygulamanın kendi betiğinde): rapor HTML'i belirteçli istekle alınır ve gizli bir çerçevede yazdırılır —
|
|
10
|
+
// const html = await (await one.fetch('/api/<varlık>/report.html?…')).text()
|
|
11
|
+
// const frame = document.createElement('iframe'); frame.className = 'one-print-frame'; frame.srcdoc = html
|
|
12
|
+
// frame.onload = () => { frame.contentWindow.print(); setTimeout(() => frame.remove(), 60000) }
|
|
13
|
+
// document.body.appendChild(frame)
|
|
14
|
+
// ya da `exportResponse(html, { format: 'html', … })` ile dosya olarak `one.download`a verilir.
|
|
15
|
+
import { UI_CSS_PATH } from '../client.js';
|
|
16
|
+
import { OneError } from '../context.js';
|
|
17
|
+
import { checkExportInput, formatCell, formatMoneyMinor, formatNumber, localize, moneyMinorOf, resolveOptions, formatDateTime } from './columns.js';
|
|
18
|
+
const esc = (s) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''');
|
|
19
|
+
const NUMERIC = new Set(['number', 'money']);
|
|
20
|
+
function printCss(orientation) {
|
|
21
|
+
return (`@page{size:A4 ${orientation};margin:12mm}` +
|
|
22
|
+
'body{font-family:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;color:#1f2328;background:#fff;margin:16px}' +
|
|
23
|
+
'.one-report h1{font-size:1.25rem;margin:0 0 4px}.one-report p.one-report-sub{margin:0 0 12px;color:#57606a}' +
|
|
24
|
+
'.one-report table{width:100%;border-collapse:collapse;font-size:.85rem}' +
|
|
25
|
+
'.one-report th,.one-report td{text-align:left;vertical-align:top;padding:4px 6px;border-bottom:1px solid #d0d7de}' +
|
|
26
|
+
'.one-report th{font-weight:600}.one-report .one-num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}' +
|
|
27
|
+
'.one-report tfoot td{font-weight:600;border-top:2px solid #57606a}.one-report footer{margin-top:12px;font-size:.75rem;color:#57606a}' +
|
|
28
|
+
'@media print{body{margin:0;background:#fff;color:#000}.one-report thead{display:table-header-group}' +
|
|
29
|
+
'.one-report tfoot{display:table-row-group}.one-report tr{break-inside:avoid}}');
|
|
30
|
+
}
|
|
31
|
+
/** Yazdırmaya uygun tam HTML belgesi (betiksiz). */
|
|
32
|
+
export function renderPrintableReport(options) {
|
|
33
|
+
checkExportInput(options.rows, options.columns);
|
|
34
|
+
const resolved = resolveOptions(options);
|
|
35
|
+
const { lang } = resolved;
|
|
36
|
+
const columns = options.columns;
|
|
37
|
+
const totals = new Set(options.totals ?? []);
|
|
38
|
+
for (const key of totals) {
|
|
39
|
+
const c = columns.find((col) => col.key === key);
|
|
40
|
+
if (!c || !NUMERIC.has(c.type ?? 'text'))
|
|
41
|
+
throw new OneError(400, 'ONE-SDK-E-120', `Toplam yalnız sayı ya da para sütununda alınır: ${key}`);
|
|
42
|
+
}
|
|
43
|
+
const head = columns.map((c) => `<th scope="col"${NUMERIC.has(c.type ?? 'text') ? ' class="one-num"' : ''}>${esc(localize(c.title, lang))}</th>`).join('');
|
|
44
|
+
const body = options.rows
|
|
45
|
+
.map((row) => `<tr>${columns
|
|
46
|
+
.map((c) => `<td${NUMERIC.has(c.type ?? 'text') ? ' class="one-num"' : ''}>${esc(formatCell(row?.[c.key], c, resolved)).replace(/\r?\n/g, '<br>')}</td>`)
|
|
47
|
+
.join('')}</tr>`)
|
|
48
|
+
.join('\n');
|
|
49
|
+
let foot = '';
|
|
50
|
+
if (totals.size > 0) {
|
|
51
|
+
const cells = columns.map((c, i) => {
|
|
52
|
+
if (!totals.has(c.key))
|
|
53
|
+
return i === 0 ? `<td>${lang === 'tr' ? 'Toplam' : 'Total'}</td>` : '<td></td>';
|
|
54
|
+
if (c.type === 'money') {
|
|
55
|
+
let sum = 0;
|
|
56
|
+
for (const row of options.rows)
|
|
57
|
+
sum += moneyMinorOf(row?.[c.key]) ?? 0;
|
|
58
|
+
return `<td class="one-num">${esc(formatMoneyMinor(sum, lang))}</td>`;
|
|
59
|
+
}
|
|
60
|
+
let sum = 0;
|
|
61
|
+
for (const row of options.rows) {
|
|
62
|
+
const v = row?.[c.key];
|
|
63
|
+
if (typeof v === 'number' && Number.isFinite(v))
|
|
64
|
+
sum += v;
|
|
65
|
+
}
|
|
66
|
+
return `<td class="one-num">${esc(formatNumber(sum, lang))}</td>`;
|
|
67
|
+
});
|
|
68
|
+
foot = `<tfoot><tr>${cells.join('')}</tr></tfoot>`;
|
|
69
|
+
}
|
|
70
|
+
const generated = formatDateTime(options.generatedAt ?? new Date().toISOString(), lang, resolved.timeZone);
|
|
71
|
+
const count = options.rows.length;
|
|
72
|
+
const footer = lang === 'tr' ? `${count.toLocaleString('tr-TR')} kayıt - Oluşturulma: ${generated}` : `${count.toLocaleString('en-US')} records - Generated: ${generated}`;
|
|
73
|
+
return (`<!doctype html>\n<html lang="${lang}"><head><meta charset="utf-8"><title>${esc(options.title)}</title>` +
|
|
74
|
+
'<meta name="viewport" content="width=device-width, initial-scale=1">' +
|
|
75
|
+
`<link rel="stylesheet" href="${UI_CSS_PATH}">` +
|
|
76
|
+
`<style>${printCss(options.orientation ?? 'portrait')}</style></head>\n` +
|
|
77
|
+
`<body><main class="one-report"><h1>${esc(options.title)}</h1>` +
|
|
78
|
+
(options.subtitle ? `<p class="one-report-sub">${esc(options.subtitle)}</p>` : '') +
|
|
79
|
+
(count === 0
|
|
80
|
+
? `<p>${lang === 'tr' ? 'Gösterilecek kayıt yok.' : 'No records to show.'}</p>`
|
|
81
|
+
: `<table class="one-table"><thead><tr>${head}</tr></thead>${foot}<tbody>\n${body}\n</tbody></table>`) +
|
|
82
|
+
`<footer>${esc(footer)}</footer></main></body></html>\n`);
|
|
83
|
+
}
|
|
84
|
+
/** Rapor sayfasını sayfa olarak döndürür (indirme değil; yazdırma çerçevesi için). */
|
|
85
|
+
export function reportResponse(html) {
|
|
86
|
+
return new Response(html, {
|
|
87
|
+
status: 200,
|
|
88
|
+
headers: { 'content-type': 'text/html; charset=utf-8', 'cache-control': 'no-store', 'x-content-type-options': 'nosniff' },
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=report.js.map
|