@semacode/cli 0.8.8 → 1.0.0
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 +11 -3
- package/dist/drift.d.ts +30 -1
- package/dist/drift.js +373 -17
- package/dist/drift.js.map +1 -1
- package/dist/index.js +828 -53
- package/dist/index.js.map +1 -1
- package/docs/AGENT_STARTER.md +10 -4
- package/docs/como-ensinar-a-sema-para-ia.md +17 -11
- package/docs/fluxo-pratico-ia-sema.md +42 -38
- package/docs/instalacao-e-primeiro-uso.md +189 -0
- package/docs/integracao-com-ia.md +228 -0
- package/docs/pagamento-ponta-a-ponta.md +155 -0
- package/docs/prompt-base-ia-sema.md +10 -3
- package/docs/sintaxe.md +267 -0
- package/exemplos/automacao.sema +107 -0
- package/exemplos/cadastro_usuario.sema +54 -0
- package/exemplos/calculadora.sema +78 -0
- package/exemplos/crud_simples.sema +89 -0
- package/exemplos/operacao_estrategia.sema +402 -0
- package/exemplos/pagamento.sema +222 -0
- package/exemplos/pagamento_dominio.sema +35 -0
- package/exemplos/testes_embutidos.sema +45 -0
- package/exemplos/tratamento_erro.sema +157 -0
- package/node_modules/@sema/gerador-dart/package.json +1 -1
- package/node_modules/@sema/gerador-python/package.json +1 -1
- package/node_modules/@sema/gerador-typescript/package.json +1 -1
- package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +14 -1
- package/node_modules/@sema/nucleo/dist/formatador/index.js +131 -22
- package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.js +546 -102
- package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +83 -5
- package/node_modules/@sema/nucleo/dist/lexer/lexer.js +1 -1
- package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js +10 -0
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.js +230 -19
- package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +6 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js +269 -10
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
- package/node_modules/@sema/nucleo/package.json +1 -1
- package/node_modules/@sema/padroes/package.json +1 -1
- package/package.json +7 -6
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
module exemplos.operacao_estrategia {
|
|
2
|
+
docs {
|
|
3
|
+
resumo: "Referencia oficial de governanca operacional para strategy,slice,gate,discovery semanal e rollout de nova versao de modelo."
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
type JanelaDiscovery {
|
|
7
|
+
fields {
|
|
8
|
+
semana_referencia: Data
|
|
9
|
+
strategy_id: Id
|
|
10
|
+
versao_modelo_candidata: Texto
|
|
11
|
+
status_discovery: StatusDiscovery
|
|
12
|
+
}
|
|
13
|
+
invariants {
|
|
14
|
+
semana_referencia existe
|
|
15
|
+
strategy_id existe
|
|
16
|
+
versao_modelo_candidata existe
|
|
17
|
+
status_discovery em [ABERTA, EM_AVALIACAO, APROVADA, REJEITADA]
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
type ContextoQuarentena {
|
|
22
|
+
fields {
|
|
23
|
+
motivo: Texto
|
|
24
|
+
origem: Texto
|
|
25
|
+
desde: Data
|
|
26
|
+
}
|
|
27
|
+
invariants {
|
|
28
|
+
motivo existe
|
|
29
|
+
origem existe
|
|
30
|
+
desde existe
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
entity Strategy {
|
|
35
|
+
fields {
|
|
36
|
+
id: Id
|
|
37
|
+
versao_modelo_ativa: Texto
|
|
38
|
+
versao_modelo_candidata: Texto
|
|
39
|
+
status: StatusStrategy
|
|
40
|
+
gate_global: StatusGate
|
|
41
|
+
discovery_atual: JanelaDiscovery
|
|
42
|
+
ultima_quarentena: ContextoQuarentena
|
|
43
|
+
}
|
|
44
|
+
invariants {
|
|
45
|
+
id existe
|
|
46
|
+
versao_modelo_ativa existe
|
|
47
|
+
versao_modelo_candidata existe
|
|
48
|
+
status em [RASCUNHO, ATIVA, QUARENTENA, DESATIVADA]
|
|
49
|
+
gate_global em [ABERTO, FECHADO]
|
|
50
|
+
discovery_atual existe
|
|
51
|
+
ultima_quarentena existe
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
entity Slice {
|
|
56
|
+
fields {
|
|
57
|
+
id: Id
|
|
58
|
+
strategy_id: Id
|
|
59
|
+
status: StatusSlice
|
|
60
|
+
gate: StatusGate
|
|
61
|
+
versao_modelo_ativa: Texto
|
|
62
|
+
versao_modelo_candidata: Texto
|
|
63
|
+
motivo_quarentena: Texto
|
|
64
|
+
precision_observada: Decimal
|
|
65
|
+
}
|
|
66
|
+
invariants {
|
|
67
|
+
id existe
|
|
68
|
+
strategy_id existe
|
|
69
|
+
status em [ATIVO, QUARENTENA, DESLIGADO]
|
|
70
|
+
gate em [ABERTO, FECHADO]
|
|
71
|
+
versao_modelo_ativa existe
|
|
72
|
+
versao_modelo_candidata existe
|
|
73
|
+
motivo_quarentena existe
|
|
74
|
+
precision_observada existe
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
enum StatusStrategy {
|
|
79
|
+
RASCUNHO,
|
|
80
|
+
ATIVA,
|
|
81
|
+
QUARENTENA,
|
|
82
|
+
DESATIVADA
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
enum StatusSlice {
|
|
86
|
+
ATIVO,
|
|
87
|
+
QUARENTENA,
|
|
88
|
+
DESLIGADO
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
enum StatusGate {
|
|
92
|
+
ABERTO,
|
|
93
|
+
FECHADO
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
enum StatusDiscovery {
|
|
97
|
+
ABERTA,
|
|
98
|
+
EM_AVALIACAO,
|
|
99
|
+
APROVADA,
|
|
100
|
+
REJEITADA
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
state governanca_estrategia {
|
|
104
|
+
fields {
|
|
105
|
+
status: StatusStrategy
|
|
106
|
+
slice_status: StatusSlice
|
|
107
|
+
gate_global: StatusGate
|
|
108
|
+
gate_slice: StatusGate
|
|
109
|
+
discovery_status: StatusDiscovery
|
|
110
|
+
versao_modelo_ativa: Texto
|
|
111
|
+
versao_modelo_candidata: Texto
|
|
112
|
+
motivo_operacional: Texto
|
|
113
|
+
}
|
|
114
|
+
invariants {
|
|
115
|
+
status em [RASCUNHO, ATIVA, QUARENTENA, DESATIVADA]
|
|
116
|
+
slice_status em [ATIVO, QUARENTENA, DESLIGADO]
|
|
117
|
+
gate_global em [ABERTO, FECHADO]
|
|
118
|
+
gate_slice em [ABERTO, FECHADO]
|
|
119
|
+
discovery_status em [ABERTA, EM_AVALIACAO, APROVADA, REJEITADA]
|
|
120
|
+
versao_modelo_ativa existe
|
|
121
|
+
versao_modelo_candidata existe
|
|
122
|
+
motivo_operacional existe
|
|
123
|
+
}
|
|
124
|
+
transitions {
|
|
125
|
+
RASCUNHO -> ATIVA
|
|
126
|
+
ATIVA -> QUARENTENA
|
|
127
|
+
QUARENTENA -> ATIVA
|
|
128
|
+
ATIVA -> DESATIVADA
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
task registrar_discovery_semanal {
|
|
133
|
+
docs {
|
|
134
|
+
resumo: "Abre a janela semanal de discovery para uma strategy e marca a versao candidata que esta entrando em avaliacao."
|
|
135
|
+
}
|
|
136
|
+
input {
|
|
137
|
+
strategy_id: Id required
|
|
138
|
+
semana_referencia: Data required
|
|
139
|
+
versao_modelo_candidata: Texto required
|
|
140
|
+
}
|
|
141
|
+
output {
|
|
142
|
+
janela: JanelaDiscovery
|
|
143
|
+
discovery_registrada: Booleano
|
|
144
|
+
}
|
|
145
|
+
rules {
|
|
146
|
+
strategy_id existe
|
|
147
|
+
semana_referencia existe
|
|
148
|
+
versao_modelo_candidata existe
|
|
149
|
+
}
|
|
150
|
+
effects {
|
|
151
|
+
persistencia discovery_semanal criticidade = alta
|
|
152
|
+
auditoria strategy criticidade = alta
|
|
153
|
+
evento discovery_aberta criticidade = media
|
|
154
|
+
}
|
|
155
|
+
guarantees {
|
|
156
|
+
janela existe
|
|
157
|
+
discovery_registrada == verdadeiro
|
|
158
|
+
}
|
|
159
|
+
tests {
|
|
160
|
+
caso "abre discovery da semana" {
|
|
161
|
+
given {
|
|
162
|
+
strategy_id: "strategy_alpha"
|
|
163
|
+
semana_referencia: "2026-03-30"
|
|
164
|
+
versao_modelo_candidata: "modelo_2026_13"
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
expect {
|
|
168
|
+
sucesso: verdadeiro
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
task avaliar_slice_apos_discovery {
|
|
175
|
+
docs {
|
|
176
|
+
resumo: "Decide se um slice segue aberto,entra em quarentena ou precisa ficar bloqueado ate nova avaliacao."
|
|
177
|
+
}
|
|
178
|
+
input {
|
|
179
|
+
strategy_id: Id required
|
|
180
|
+
slice_id: Id required
|
|
181
|
+
precision_observada: Decimal required
|
|
182
|
+
precision_minima: Decimal required
|
|
183
|
+
risco_operacional: Texto required
|
|
184
|
+
}
|
|
185
|
+
output {
|
|
186
|
+
gate_slice: StatusGate
|
|
187
|
+
slice_status: StatusSlice
|
|
188
|
+
motivo_operacional: Texto
|
|
189
|
+
}
|
|
190
|
+
rules {
|
|
191
|
+
strategy_id existe
|
|
192
|
+
slice_id existe
|
|
193
|
+
precision_observada existe
|
|
194
|
+
precision_minima existe
|
|
195
|
+
risco_operacional existe
|
|
196
|
+
}
|
|
197
|
+
effects {
|
|
198
|
+
persistencia slice criticidade = alta
|
|
199
|
+
auditoria discovery_slice criticidade = alta
|
|
200
|
+
notificacao operacao criticidade = media
|
|
201
|
+
}
|
|
202
|
+
guarantees {
|
|
203
|
+
gate_slice existe
|
|
204
|
+
slice_status existe
|
|
205
|
+
motivo_operacional existe
|
|
206
|
+
}
|
|
207
|
+
tests {
|
|
208
|
+
caso "slice ruim fecha gate na avaliacao" {
|
|
209
|
+
given {
|
|
210
|
+
strategy_id: "strategy_alpha"
|
|
211
|
+
slice_id: "slice_under35_serie_a"
|
|
212
|
+
precision_observada: 0.49
|
|
213
|
+
precision_minima: 0.58
|
|
214
|
+
risco_operacional: "drawdown_excessivo"
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
expect {
|
|
218
|
+
sucesso: verdadeiro
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
task colocar_slice_em_quarentena {
|
|
225
|
+
docs {
|
|
226
|
+
resumo: "Transforma um problema de slice em acao operacional explicita,sem desligar a strategy inteira por reflexo idiota."
|
|
227
|
+
}
|
|
228
|
+
input {
|
|
229
|
+
strategy_id: Id required
|
|
230
|
+
slice_id: Id required
|
|
231
|
+
motivo: Texto required
|
|
232
|
+
origem: Texto required
|
|
233
|
+
data_referencia: Data required
|
|
234
|
+
}
|
|
235
|
+
output {
|
|
236
|
+
slice_status: StatusSlice
|
|
237
|
+
gate_slice: StatusGate
|
|
238
|
+
contexto: ContextoQuarentena
|
|
239
|
+
}
|
|
240
|
+
rules {
|
|
241
|
+
strategy_id existe
|
|
242
|
+
slice_id existe
|
|
243
|
+
motivo existe
|
|
244
|
+
origem existe
|
|
245
|
+
data_referencia existe
|
|
246
|
+
}
|
|
247
|
+
effects {
|
|
248
|
+
persistencia slice criticidade = alta
|
|
249
|
+
persistencia quarentena criticidade = alta
|
|
250
|
+
notificacao operacao criticidade = alta
|
|
251
|
+
auditoria quarentena criticidade = alta
|
|
252
|
+
}
|
|
253
|
+
state governanca_estrategia {
|
|
254
|
+
transitions {
|
|
255
|
+
ATIVA -> QUARENTENA
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
guarantees {
|
|
259
|
+
slice_status == QUARENTENA
|
|
260
|
+
gate_slice == FECHADO
|
|
261
|
+
contexto existe
|
|
262
|
+
}
|
|
263
|
+
tests {
|
|
264
|
+
caso "quarentena seletiva fecha so o slice afetado" {
|
|
265
|
+
given {
|
|
266
|
+
strategy_id: "strategy_alpha"
|
|
267
|
+
slice_id: "slice_under35_serie_a"
|
|
268
|
+
motivo: "llm_detectou_noticia_ruim"
|
|
269
|
+
origem: "monitoramento_live"
|
|
270
|
+
data_referencia: "2026-03-30"
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
expect {
|
|
274
|
+
sucesso: verdadeiro
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
task fechar_gate_global_strategy {
|
|
281
|
+
docs {
|
|
282
|
+
resumo: "Fecha o gate global quando a strategy inteira precisa parar de liberar sem apagar historico nem perder a trilha da versao ativa."
|
|
283
|
+
}
|
|
284
|
+
input {
|
|
285
|
+
strategy_id: Id required
|
|
286
|
+
motivo_operacional: Texto required
|
|
287
|
+
versao_modelo_ativa: Texto required
|
|
288
|
+
}
|
|
289
|
+
output {
|
|
290
|
+
strategy_status: StatusStrategy
|
|
291
|
+
gate_global: StatusGate
|
|
292
|
+
versao_modelo_ativa: Texto
|
|
293
|
+
}
|
|
294
|
+
rules {
|
|
295
|
+
strategy_id existe
|
|
296
|
+
motivo_operacional existe
|
|
297
|
+
versao_modelo_ativa existe
|
|
298
|
+
}
|
|
299
|
+
effects {
|
|
300
|
+
persistencia strategy criticidade = alta
|
|
301
|
+
notificacao operacao criticidade = alta
|
|
302
|
+
auditoria gate_global criticidade = alta
|
|
303
|
+
}
|
|
304
|
+
guarantees {
|
|
305
|
+
strategy_status == QUARENTENA
|
|
306
|
+
gate_global == FECHADO
|
|
307
|
+
versao_modelo_ativa existe
|
|
308
|
+
}
|
|
309
|
+
tests {
|
|
310
|
+
caso "fecha gate global sem perder versao ativa" {
|
|
311
|
+
given {
|
|
312
|
+
strategy_id: "strategy_alpha"
|
|
313
|
+
motivo_operacional: "sequencia_ruim_em_varias_ligas"
|
|
314
|
+
versao_modelo_ativa: "modelo_2026_12"
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
expect {
|
|
318
|
+
sucesso: verdadeiro
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
task ativar_strategy_com_nova_versao {
|
|
325
|
+
docs {
|
|
326
|
+
resumo: "Promove a versao candidata aprovada e reabre a strategy so quando houver aprovacao manual e gate global devidamente controlado."
|
|
327
|
+
}
|
|
328
|
+
input {
|
|
329
|
+
strategy_id: Id required
|
|
330
|
+
versao_modelo_ativa: Texto required
|
|
331
|
+
versao_modelo_candidata: Texto required
|
|
332
|
+
strategy_status_atual: StatusStrategy required
|
|
333
|
+
gate_global_atual: StatusGate required
|
|
334
|
+
aprovacao_manual: Booleano required
|
|
335
|
+
}
|
|
336
|
+
output {
|
|
337
|
+
strategy_status: StatusStrategy
|
|
338
|
+
gate_global: StatusGate
|
|
339
|
+
versao_modelo_ativa: Texto
|
|
340
|
+
}
|
|
341
|
+
rules {
|
|
342
|
+
strategy_id existe
|
|
343
|
+
versao_modelo_ativa existe
|
|
344
|
+
versao_modelo_candidata existe
|
|
345
|
+
strategy_status_atual em [RASCUNHO, QUARENTENA]
|
|
346
|
+
gate_global_atual == FECHADO
|
|
347
|
+
aprovacao_manual == verdadeiro
|
|
348
|
+
}
|
|
349
|
+
effects {
|
|
350
|
+
persistencia strategy criticidade = alta
|
|
351
|
+
evento strategy_ativada criticidade = alta
|
|
352
|
+
auditoria rollout criticidade = alta
|
|
353
|
+
}
|
|
354
|
+
state governanca_estrategia {
|
|
355
|
+
transitions {
|
|
356
|
+
QUARENTENA -> ATIVA
|
|
357
|
+
RASCUNHO -> ATIVA
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
guarantees {
|
|
361
|
+
strategy_status == ATIVA
|
|
362
|
+
gate_global == ABERTO
|
|
363
|
+
versao_modelo_ativa existe
|
|
364
|
+
}
|
|
365
|
+
tests {
|
|
366
|
+
caso "reativa strategy apos aprovacao do novo modelo" {
|
|
367
|
+
given {
|
|
368
|
+
strategy_id: "strategy_alpha"
|
|
369
|
+
versao_modelo_ativa: "modelo_2026_12"
|
|
370
|
+
versao_modelo_candidata: "modelo_2026_13"
|
|
371
|
+
strategy_status_atual: "QUARENTENA"
|
|
372
|
+
gate_global_atual: "FECHADO"
|
|
373
|
+
aprovacao_manual: verdadeiro
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
expect {
|
|
377
|
+
sucesso: verdadeiro
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
flow governanca_operacional {
|
|
384
|
+
strategy_id: Id
|
|
385
|
+
slice_id: Id
|
|
386
|
+
semana_referencia: Data
|
|
387
|
+
versao_modelo_ativa: Texto
|
|
388
|
+
versao_modelo_candidata: Texto
|
|
389
|
+
precision_observada: Decimal
|
|
390
|
+
precision_minima: Decimal
|
|
391
|
+
risco_operacional: Texto
|
|
392
|
+
motivo_operacional: Texto
|
|
393
|
+
strategy_status_atual: StatusStrategy
|
|
394
|
+
gate_global_atual: StatusGate
|
|
395
|
+
aprovacao_manual: Booleano
|
|
396
|
+
etapa discovery usa registrar_discovery_semanal com strategy_id = strategy_id, semana_referencia = semana_referencia, versao_modelo_candidata = versao_modelo_candidata
|
|
397
|
+
etapa avaliar_slice usa avaliar_slice_apos_discovery com strategy_id = strategy_id, slice_id = slice_id, precision_observada = precision_observada, precision_minima = precision_minima, risco_operacional = risco_operacional depende_de discovery
|
|
398
|
+
etapa quarentena_slice usa colocar_slice_em_quarentena com strategy_id = strategy_id, slice_id = slice_id, motivo = motivo_operacional, origem = risco_operacional, data_referencia = semana_referencia quando motivo_operacional existe depende_de avaliar_slice
|
|
399
|
+
etapa fechar_gate_global usa fechar_gate_global_strategy com strategy_id = strategy_id, motivo_operacional = motivo_operacional, versao_modelo_ativa = versao_modelo_ativa quando motivo_operacional existe depende_de quarentena_slice
|
|
400
|
+
etapa reativacao usa ativar_strategy_com_nova_versao com strategy_id = strategy_id, versao_modelo_ativa = versao_modelo_ativa, versao_modelo_candidata = versao_modelo_candidata, strategy_status_atual = strategy_status_atual, gate_global_atual = gate_global_atual, aprovacao_manual = aprovacao_manual quando aprovacao_manual == verdadeiro depende_de fechar_gate_global
|
|
401
|
+
}
|
|
402
|
+
}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
module exemplos.pagamento {
|
|
2
|
+
docs {
|
|
3
|
+
resumo: "Vertical oficial de pagamento da Sema 0.5,usado como referencia de utilidade real controlada."
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
use exemplos.pagamento.dominio
|
|
7
|
+
|
|
8
|
+
task processar_pagamento {
|
|
9
|
+
input {
|
|
10
|
+
pagamento_id: Id required
|
|
11
|
+
valor: Decimal required
|
|
12
|
+
token: Texto required
|
|
13
|
+
}
|
|
14
|
+
output {
|
|
15
|
+
pagamento: Pagamento
|
|
16
|
+
status: StatusPagamento
|
|
17
|
+
}
|
|
18
|
+
rules {
|
|
19
|
+
valor > 0
|
|
20
|
+
token existe
|
|
21
|
+
token deve_ser valido
|
|
22
|
+
}
|
|
23
|
+
effects {
|
|
24
|
+
consulta gateway_pagamento criticidade = alta
|
|
25
|
+
persistencia Pagamento criticidade = alta
|
|
26
|
+
evento pagamento_autorizado criticidade = media
|
|
27
|
+
notificacao cliente comprovante_pagamento criticidade = media
|
|
28
|
+
auditoria pagamento criticidade = alta
|
|
29
|
+
}
|
|
30
|
+
state ciclo_pagamento {
|
|
31
|
+
transitions {
|
|
32
|
+
PENDENTE -> AUTORIZADO
|
|
33
|
+
AUTORIZADO -> PROCESSADO
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
guarantees {
|
|
37
|
+
pagamento existe
|
|
38
|
+
status em [AUTORIZADO, PROCESSADO]
|
|
39
|
+
pagamento.status == status
|
|
40
|
+
}
|
|
41
|
+
error {
|
|
42
|
+
autorizacao_negada: "A operacao foi recusada pelo gateway."
|
|
43
|
+
saldo_insuficiente: "O saldo nao cobre o valor da cobranca."
|
|
44
|
+
timeout_gateway: "O gateway nao respondeu em tempo habil."
|
|
45
|
+
}
|
|
46
|
+
tests {
|
|
47
|
+
caso "pagamento autorizado" {
|
|
48
|
+
given {
|
|
49
|
+
pagamento_id: "pag_1"
|
|
50
|
+
valor: 199.9
|
|
51
|
+
token: "tok_ok"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
expect {
|
|
55
|
+
sucesso: verdadeiro
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
caso "pagamento recusado por autorizacao" {
|
|
59
|
+
given {
|
|
60
|
+
pagamento_id: "pag_erro"
|
|
61
|
+
valor: 10
|
|
62
|
+
token: "tok_recusado"
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
expect {
|
|
66
|
+
sucesso: falso
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
error {
|
|
70
|
+
tipo: "autorizacao_negada"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
caso "pagamento falha por timeout" {
|
|
74
|
+
given {
|
|
75
|
+
pagamento_id: "pag_timeout"
|
|
76
|
+
valor: 10
|
|
77
|
+
token: "tok_timeout"
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
expect {
|
|
81
|
+
sucesso: falso
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
error {
|
|
85
|
+
tipo: "timeout_gateway"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
task confirmar_pagamento {
|
|
92
|
+
input {
|
|
93
|
+
pagamento_id: Id required
|
|
94
|
+
}
|
|
95
|
+
output {
|
|
96
|
+
status: StatusPagamento
|
|
97
|
+
}
|
|
98
|
+
rules {
|
|
99
|
+
pagamento_id existe
|
|
100
|
+
}
|
|
101
|
+
effects {
|
|
102
|
+
consulta gateway_pagamento criticidade = alta
|
|
103
|
+
persistencia Pagamento criticidade = alta
|
|
104
|
+
evento pagamento_confirmado criticidade = media
|
|
105
|
+
auditoria conciliacao_pagamento criticidade = alta
|
|
106
|
+
}
|
|
107
|
+
state ciclo_pagamento {
|
|
108
|
+
transitions {
|
|
109
|
+
AUTORIZADO -> PROCESSADO
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
guarantees {
|
|
113
|
+
status == PROCESSADO
|
|
114
|
+
}
|
|
115
|
+
tests {
|
|
116
|
+
caso "confirma pagamento autorizado" {
|
|
117
|
+
given {
|
|
118
|
+
pagamento_id: "pag_1"
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
expect {
|
|
122
|
+
sucesso: verdadeiro
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
task notificar_falha_pagamento {
|
|
129
|
+
input {
|
|
130
|
+
pagamento_id: Id required
|
|
131
|
+
motivo: Texto required
|
|
132
|
+
}
|
|
133
|
+
output {
|
|
134
|
+
protocolo_notificacao: Id
|
|
135
|
+
}
|
|
136
|
+
effects {
|
|
137
|
+
notificacao cliente falha_pagamento criticidade = alta
|
|
138
|
+
auditoria falha_pagamento criticidade = media
|
|
139
|
+
}
|
|
140
|
+
guarantees {
|
|
141
|
+
protocolo_notificacao existe
|
|
142
|
+
}
|
|
143
|
+
tests {
|
|
144
|
+
caso "notifica falha por recusa" {
|
|
145
|
+
given {
|
|
146
|
+
pagamento_id: "pag_erro"
|
|
147
|
+
motivo: "autorizacao_negada"
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
expect {
|
|
151
|
+
sucesso: verdadeiro
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
task registrar_timeout_pagamento {
|
|
158
|
+
input {
|
|
159
|
+
pagamento_id: Id required
|
|
160
|
+
}
|
|
161
|
+
output {
|
|
162
|
+
auditoria_id: Id
|
|
163
|
+
}
|
|
164
|
+
effects {
|
|
165
|
+
auditoria timeout_gateway criticidade = alta
|
|
166
|
+
persistencia incidente_pagamento criticidade = media
|
|
167
|
+
}
|
|
168
|
+
guarantees {
|
|
169
|
+
auditoria_id existe
|
|
170
|
+
}
|
|
171
|
+
tests {
|
|
172
|
+
caso "registra timeout" {
|
|
173
|
+
given {
|
|
174
|
+
pagamento_id: "pag_timeout"
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
expect {
|
|
178
|
+
sucesso: verdadeiro
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
flow orquestracao_pagamento {
|
|
185
|
+
pagamento_id: Id
|
|
186
|
+
valor: Decimal
|
|
187
|
+
token: Texto
|
|
188
|
+
etapa autorizar usa processar_pagamento com pagamento_id = pagamento_id, valor = valor, token = token em_sucesso confirmar em_erro registrar_falha por_erro autorizacao_negada = notificar_falha, timeout_gateway = registrar_timeout
|
|
189
|
+
etapa confirmar usa confirmar_pagamento com pagamento_id = pagamento_id depende_de autorizar
|
|
190
|
+
etapa notificar_falha usa notificar_falha_pagamento com pagamento_id = pagamento_id, motivo = autorizacao_negada depende_de autorizar
|
|
191
|
+
etapa registrar_timeout usa registrar_timeout_pagamento com pagamento_id = pagamento_id depende_de autorizar
|
|
192
|
+
etapa registrar_falha usa registrar_timeout_pagamento com pagamento_id = pagamento_id depende_de autorizar
|
|
193
|
+
effects {
|
|
194
|
+
auditoria fluxo_pagamento criticidade = alta
|
|
195
|
+
evento pagamento_em_processamento criticidade = media
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
route processar_pagamento_publico {
|
|
200
|
+
metodo: POST
|
|
201
|
+
caminho: /pagamentos/processar
|
|
202
|
+
task: processar_pagamento
|
|
203
|
+
input {
|
|
204
|
+
pagamento_id: Id required
|
|
205
|
+
valor: Decimal required
|
|
206
|
+
token: Texto required
|
|
207
|
+
}
|
|
208
|
+
output {
|
|
209
|
+
pagamento: Pagamento required
|
|
210
|
+
status: StatusPagamento required
|
|
211
|
+
}
|
|
212
|
+
effects {
|
|
213
|
+
auditoria pagamento_publico criticidade = alta
|
|
214
|
+
evento pagamento_requisitado criticidade = media
|
|
215
|
+
}
|
|
216
|
+
error {
|
|
217
|
+
autorizacao_negada: "Erro publico quando o gateway recusa a operacao."
|
|
218
|
+
saldo_insuficiente: "Erro publico quando nao ha saldo suficiente."
|
|
219
|
+
timeout_gateway: "Erro publico quando o gateway nao responde."
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module exemplos.pagamento.dominio {
|
|
2
|
+
docs {
|
|
3
|
+
resumo: "Contratos de dominio compartilhados pelo vertical oficial de pagamento da Sema 0.5."
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
entity Pagamento {
|
|
7
|
+
fields {
|
|
8
|
+
id: Id
|
|
9
|
+
valor: Decimal
|
|
10
|
+
status: StatusPagamento
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
enum StatusPagamento {
|
|
15
|
+
PENDENTE,
|
|
16
|
+
AUTORIZADO,
|
|
17
|
+
RECUSADO,
|
|
18
|
+
PROCESSADO
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
state ciclo_pagamento {
|
|
22
|
+
fields {
|
|
23
|
+
status: StatusPagamento
|
|
24
|
+
conciliado: Booleano
|
|
25
|
+
}
|
|
26
|
+
invariants {
|
|
27
|
+
status existe
|
|
28
|
+
}
|
|
29
|
+
transitions {
|
|
30
|
+
PENDENTE -> AUTORIZADO
|
|
31
|
+
AUTORIZADO -> PROCESSADO
|
|
32
|
+
PENDENTE -> RECUSADO
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module exemplos.testes.embutidos {
|
|
2
|
+
task validar_documento {
|
|
3
|
+
input {
|
|
4
|
+
documento: Texto required
|
|
5
|
+
}
|
|
6
|
+
output {
|
|
7
|
+
valido: Booleano
|
|
8
|
+
motivo: Texto
|
|
9
|
+
}
|
|
10
|
+
rules {
|
|
11
|
+
documento deve_ser preenchido
|
|
12
|
+
}
|
|
13
|
+
effects {
|
|
14
|
+
auditoria validacao_documento
|
|
15
|
+
}
|
|
16
|
+
guarantees {
|
|
17
|
+
valido existe
|
|
18
|
+
motivo existe
|
|
19
|
+
}
|
|
20
|
+
tests {
|
|
21
|
+
caso "documento valido" {
|
|
22
|
+
given {
|
|
23
|
+
documento: 12345678900
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
expect {
|
|
27
|
+
sucesso: verdadeiro
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
caso "documento vazio" {
|
|
31
|
+
given {
|
|
32
|
+
documento: ""
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
expect {
|
|
36
|
+
sucesso: falso
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
error {
|
|
40
|
+
tipo: "entrada_invalida"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|