bfocus 0.2.3__tar.gz → 0.2.5__tar.gz
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.
- {bfocus-0.2.3 → bfocus-0.2.5}/PKG-INFO +32 -5
- {bfocus-0.2.3 → bfocus-0.2.5}/README.md +31 -4
- {bfocus-0.2.3 → bfocus-0.2.5}/bfocus/_resources.py +10 -0
- {bfocus-0.2.3 → bfocus-0.2.5}/bfocus/_version.py +1 -1
- {bfocus-0.2.3 → bfocus-0.2.5}/bfocus/types.py +10 -0
- {bfocus-0.2.3 → bfocus-0.2.5}/pyproject.toml +1 -1
- {bfocus-0.2.3 → bfocus-0.2.5}/tests/fixtures/cases.json +613 -0
- {bfocus-0.2.3 → bfocus-0.2.5}/.gitignore +0 -0
- {bfocus-0.2.3 → bfocus-0.2.5}/LICENSE +0 -0
- {bfocus-0.2.3 → bfocus-0.2.5}/bfocus/__init__.py +0 -0
- {bfocus-0.2.3 → bfocus-0.2.5}/bfocus/_client.py +0 -0
- {bfocus-0.2.3 → bfocus-0.2.5}/bfocus/_transport.py +0 -0
- {bfocus-0.2.3 → bfocus-0.2.5}/bfocus/errors.py +0 -0
- {bfocus-0.2.3 → bfocus-0.2.5}/bfocus/py.typed +0 -0
- {bfocus-0.2.3 → bfocus-0.2.5}/bfocus/widget.py +0 -0
- {bfocus-0.2.3 → bfocus-0.2.5}/examples/quickstart.py +0 -0
- {bfocus-0.2.3 → bfocus-0.2.5}/tests/_support.py +0 -0
- {bfocus-0.2.3 → bfocus-0.2.5}/tests/test_conformance.py +0 -0
- {bfocus-0.2.3 → bfocus-0.2.5}/tests/test_unit.py +0 -0
- {bfocus-0.2.3 → bfocus-0.2.5}/tests/test_version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: bfocus
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.5
|
|
4
4
|
Summary: SDK oficial em Python da API pública do bFocus: clientes, produtos, release notes, base de conhecimento e agentes de IA.
|
|
5
5
|
Project-URL: Homepage, https://bfocus.com.br
|
|
6
6
|
Project-URL: Repository, https://github.com/bernisoftware/bfocus-python
|
|
@@ -256,6 +256,30 @@ Três regras que parecem contraintuitivas e são de propósito:
|
|
|
256
256
|
|
|
257
257
|
Vale no `people.upsert` e no `people.batch` (`{"clear": ["phone"]}` no item).
|
|
258
258
|
|
|
259
|
+
### CPF: a pessoa é única
|
|
260
|
+
|
|
261
|
+
`document` é o CPF da pessoa. É por ele que dois sistemas que conhecem a mesma pessoa por ids
|
|
262
|
+
diferentes chegam ao MESMO cadastro.
|
|
263
|
+
|
|
264
|
+
```python
|
|
265
|
+
p = bf.people.upsert("erp-1042", "app-91", name="Paula Reis", document="529.982.247-25")
|
|
266
|
+
print(p["document"]) # "52998224725"
|
|
267
|
+
print(p["merged_into"]) # "app-77" se o CPF já era de outra ficha; None se não
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
Regras (valem no upsert e no lote):
|
|
271
|
+
|
|
272
|
+
- **A pessoa é única.** O mesmo CPF é sempre o mesmo cadastro, em qualquer produto e cliente. Mande
|
|
273
|
+
com ou sem máscara; a resposta traz só os 11 dígitos em `document`.
|
|
274
|
+
- **Id desconhecido + CPF que já existe** → a API acha a ficha, o seu id vira identificador extra
|
|
275
|
+
dela e a resposta vem com `merged_into` = o id principal. Guarde esse id do seu lado.
|
|
276
|
+
- **Id de uma ficha + CPF de OUTRA** → as duas são mescladas na hora; `merged_into` = a que tinha o CPF.
|
|
277
|
+
- **`document=None` NÃO apaga** o CPF (e `document` não é campo do `clear`). Omitir é o mesmo que "não mexe".
|
|
278
|
+
- Erros: 422 `PERSON_DOCUMENT_INVALID` (CPF inválido, `ValidationError`) e 409 `PERSON_DOCUMENT_CONFLICT` (a
|
|
279
|
+
ficha já tem OUTRO CPF — a API nunca troca sozinho; `ConflictError`).
|
|
280
|
+
|
|
281
|
+
No lote: `{"document": "529.982.247-25"}` no item.
|
|
282
|
+
|
|
259
283
|
### Contato já usado: um 409 que você consegue resolver
|
|
260
284
|
|
|
261
285
|
`PERSON_EMAIL_TAKEN` e `PERSON_PHONE_TAKEN` (409) não são "tente de novo": o e-mail (ou o
|
|
@@ -295,10 +319,13 @@ except ConflictError as err:
|
|
|
295
319
|
avisar_cadastro(err.code, dono)
|
|
296
320
|
```
|
|
297
321
|
|
|
298
|
-
`PERSON_CONTACT_OTHER_CUSTOMER` (409) é o mesmo assunto pelo outro lado
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
322
|
+
`PERSON_CONTACT_OTHER_CUSTOMER` (409) é o mesmo assunto pelo outro lado: o e-mail (ou o telefone) é
|
|
323
|
+
de uma pessoa de **outro cliente**. A API **não liga duas fichas sozinha** só porque o contato casou
|
|
324
|
+
— dois cadastros podem dividir um e-mail ou um telefone, e ligar por palpite já destruiu fichas.
|
|
325
|
+
Repetir a chamada não resolve. Se for **mesmo a mesma pessoa** (confirme antes), o erro traz o dono
|
|
326
|
+
nos dados, como os outros dois conflitos: registre o seu id como identificador extra da ficha dele
|
|
327
|
+
(`owner_external_id`) e o próximo envio **liga** a pessoa ao seu cliente (`linked: true`), sem
|
|
328
|
+
sobrescrever os dados da outra ficha.
|
|
302
329
|
|
|
303
330
|
## Lotes
|
|
304
331
|
|
|
@@ -229,6 +229,30 @@ Três regras que parecem contraintuitivas e são de propósito:
|
|
|
229
229
|
|
|
230
230
|
Vale no `people.upsert` e no `people.batch` (`{"clear": ["phone"]}` no item).
|
|
231
231
|
|
|
232
|
+
### CPF: a pessoa é única
|
|
233
|
+
|
|
234
|
+
`document` é o CPF da pessoa. É por ele que dois sistemas que conhecem a mesma pessoa por ids
|
|
235
|
+
diferentes chegam ao MESMO cadastro.
|
|
236
|
+
|
|
237
|
+
```python
|
|
238
|
+
p = bf.people.upsert("erp-1042", "app-91", name="Paula Reis", document="529.982.247-25")
|
|
239
|
+
print(p["document"]) # "52998224725"
|
|
240
|
+
print(p["merged_into"]) # "app-77" se o CPF já era de outra ficha; None se não
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Regras (valem no upsert e no lote):
|
|
244
|
+
|
|
245
|
+
- **A pessoa é única.** O mesmo CPF é sempre o mesmo cadastro, em qualquer produto e cliente. Mande
|
|
246
|
+
com ou sem máscara; a resposta traz só os 11 dígitos em `document`.
|
|
247
|
+
- **Id desconhecido + CPF que já existe** → a API acha a ficha, o seu id vira identificador extra
|
|
248
|
+
dela e a resposta vem com `merged_into` = o id principal. Guarde esse id do seu lado.
|
|
249
|
+
- **Id de uma ficha + CPF de OUTRA** → as duas são mescladas na hora; `merged_into` = a que tinha o CPF.
|
|
250
|
+
- **`document=None` NÃO apaga** o CPF (e `document` não é campo do `clear`). Omitir é o mesmo que "não mexe".
|
|
251
|
+
- Erros: 422 `PERSON_DOCUMENT_INVALID` (CPF inválido, `ValidationError`) e 409 `PERSON_DOCUMENT_CONFLICT` (a
|
|
252
|
+
ficha já tem OUTRO CPF — a API nunca troca sozinho; `ConflictError`).
|
|
253
|
+
|
|
254
|
+
No lote: `{"document": "529.982.247-25"}` no item.
|
|
255
|
+
|
|
232
256
|
### Contato já usado: um 409 que você consegue resolver
|
|
233
257
|
|
|
234
258
|
`PERSON_EMAIL_TAKEN` e `PERSON_PHONE_TAKEN` (409) não são "tente de novo": o e-mail (ou o
|
|
@@ -268,10 +292,13 @@ except ConflictError as err:
|
|
|
268
292
|
avisar_cadastro(err.code, dono)
|
|
269
293
|
```
|
|
270
294
|
|
|
271
|
-
`PERSON_CONTACT_OTHER_CUSTOMER` (409) é o mesmo assunto pelo outro lado
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
295
|
+
`PERSON_CONTACT_OTHER_CUSTOMER` (409) é o mesmo assunto pelo outro lado: o e-mail (ou o telefone) é
|
|
296
|
+
de uma pessoa de **outro cliente**. A API **não liga duas fichas sozinha** só porque o contato casou
|
|
297
|
+
— dois cadastros podem dividir um e-mail ou um telefone, e ligar por palpite já destruiu fichas.
|
|
298
|
+
Repetir a chamada não resolve. Se for **mesmo a mesma pessoa** (confirme antes), o erro traz o dono
|
|
299
|
+
nos dados, como os outros dois conflitos: registre o seu id como identificador extra da ficha dele
|
|
300
|
+
(`owner_external_id`) e o próximo envio **liga** a pessoa ao seu cliente (`linked: true`), sem
|
|
301
|
+
sobrescrever os dados da outra ficha.
|
|
275
302
|
|
|
276
303
|
## Lotes
|
|
277
304
|
|
|
@@ -655,6 +655,7 @@ class People(_Resource):
|
|
|
655
655
|
name: MaybeUnset[Optional[str]] = UNSET,
|
|
656
656
|
email: MaybeUnset[Optional[str]] = UNSET,
|
|
657
657
|
phone: MaybeUnset[Optional[str]] = UNSET,
|
|
658
|
+
document: MaybeUnset[Optional[str]] = UNSET,
|
|
658
659
|
role: MaybeUnset[Optional[str]] = UNSET,
|
|
659
660
|
access: MaybeUnset[Optional[bool]] = UNSET,
|
|
660
661
|
is_primary: MaybeUnset[Optional[bool]] = UNSET,
|
|
@@ -675,6 +676,14 @@ class People(_Resource):
|
|
|
675
676
|
|
|
676
677
|
Args:
|
|
677
678
|
name: Obrigatório ao criar.
|
|
679
|
+
document: CPF da pessoa, com ou sem máscara (a resposta traz só os 11 dígitos).
|
|
680
|
+
A PESSOA É ÚNICA: o mesmo CPF é sempre o mesmo cadastro, em qualquer produto.
|
|
681
|
+
Id desconhecido + CPF de uma ficha existente → a resposta vem com
|
|
682
|
+
``merged_into`` = id principal dela (o seu id vira identificador extra). Id de
|
|
683
|
+
uma ficha + CPF de OUTRA → as duas são mescladas na hora (``merged_into`` = a
|
|
684
|
+
que tinha o CPF). ``None``/vazio NÃO apaga (não é campo do ``clear``). Erros:
|
|
685
|
+
422 ``PERSON_DOCUMENT_INVALID`` (CPF inválido) e 409
|
|
686
|
+
``PERSON_DOCUMENT_CONFLICT`` (a ficha já tem OUTRO CPF — nunca troca sozinho).
|
|
678
687
|
access: Acesso ao widget/portal (padrão ao criar: ``True``). ``True`` devolve o
|
|
679
688
|
acesso retirado por :meth:`delete`.
|
|
680
689
|
extra_emails: E-mails adicionais (somam aos que já existem).
|
|
@@ -700,6 +709,7 @@ class People(_Resource):
|
|
|
700
709
|
"name": name,
|
|
701
710
|
"email": email,
|
|
702
711
|
"phone": phone,
|
|
712
|
+
"document": document,
|
|
703
713
|
"role": role,
|
|
704
714
|
"access": access,
|
|
705
715
|
"is_primary": is_primary,
|
|
@@ -167,6 +167,11 @@ class CustomerBatchItem(_CustomerBatchItemRequired, total=False):
|
|
|
167
167
|
|
|
168
168
|
name: Optional[str]
|
|
169
169
|
document: Optional[str]
|
|
170
|
+
kind: Optional[Literal["pj", "pf"]]
|
|
171
|
+
legal_name: Optional[str]
|
|
172
|
+
state_registration: Optional[str]
|
|
173
|
+
municipal_registration: Optional[str]
|
|
174
|
+
id_document: Optional[str]
|
|
170
175
|
email: Optional[str]
|
|
171
176
|
phone: Optional[str]
|
|
172
177
|
website: Optional[str]
|
|
@@ -189,6 +194,9 @@ class PersonBatchItem(_PersonBatchItemRequired, total=False):
|
|
|
189
194
|
name: Optional[str]
|
|
190
195
|
email: Optional[str]
|
|
191
196
|
phone: Optional[str]
|
|
197
|
+
#: CPF da pessoa (com ou sem máscara). A pessoa é ÚNICA: o mesmo CPF é sempre o mesmo
|
|
198
|
+
#: cadastro. ``None``/vazio não apaga. Ver ``people.upsert``.
|
|
199
|
+
document: Optional[str]
|
|
192
200
|
role: Optional[str]
|
|
193
201
|
access: Optional[bool]
|
|
194
202
|
is_primary: Optional[bool]
|
|
@@ -397,6 +405,8 @@ class Person(TypedDict):
|
|
|
397
405
|
name: str
|
|
398
406
|
email: Optional[str]
|
|
399
407
|
phone: Optional[str]
|
|
408
|
+
#: CPF da pessoa, só os 11 dígitos (``None`` = não informado).
|
|
409
|
+
document: Optional[str]
|
|
400
410
|
role: Optional[str]
|
|
401
411
|
access: bool
|
|
402
412
|
is_primary: bool
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "bfocus"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.5"
|
|
8
8
|
description = "SDK oficial em Python da API pública do bFocus: clientes, produtos, release notes, base de conhecimento e agentes de IA."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -118,6 +118,188 @@
|
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
120
|
},
|
|
121
|
+
{
|
|
122
|
+
"id": "customers.upsert/pj_fields",
|
|
123
|
+
"op": "customers.upsert",
|
|
124
|
+
"args": {
|
|
125
|
+
"external_id": "ERP 1042",
|
|
126
|
+
"kind": "pj",
|
|
127
|
+
"name": "Padaria Estrela",
|
|
128
|
+
"legal_name": "Estrela Panificação e Comércio Ltda",
|
|
129
|
+
"document": "12345678000190",
|
|
130
|
+
"state_registration": "ISENTO",
|
|
131
|
+
"municipal_registration": "1.234.567-8"
|
|
132
|
+
},
|
|
133
|
+
"exchanges": [
|
|
134
|
+
{
|
|
135
|
+
"retry": false,
|
|
136
|
+
"request": {
|
|
137
|
+
"method": "PUT",
|
|
138
|
+
"path": "/api/v1/integration/customers/ERP%201042",
|
|
139
|
+
"query": {},
|
|
140
|
+
"body": {
|
|
141
|
+
"kind": "pj",
|
|
142
|
+
"name": "Padaria Estrela",
|
|
143
|
+
"legal_name": "Estrela Panificação e Comércio Ltda",
|
|
144
|
+
"document": "12345678000190",
|
|
145
|
+
"state_registration": "ISENTO",
|
|
146
|
+
"municipal_registration": "1.234.567-8"
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
"response": {
|
|
150
|
+
"status": 200,
|
|
151
|
+
"headers": {},
|
|
152
|
+
"body": {
|
|
153
|
+
"code": 200,
|
|
154
|
+
"data": {
|
|
155
|
+
"id": "00000000-0000-4000-8000-000000000001",
|
|
156
|
+
"external_id": "ERP 1042",
|
|
157
|
+
"name": "Padaria Estrela",
|
|
158
|
+
"kind": "pj",
|
|
159
|
+
"legal_name": "Estrela Panificação e Comércio Ltda",
|
|
160
|
+
"state_registration": "ISENTO",
|
|
161
|
+
"municipal_registration": "1.234.567-8",
|
|
162
|
+
"id_document": null,
|
|
163
|
+
"document": "12345678000190",
|
|
164
|
+
"email": "contato@padaria.example",
|
|
165
|
+
"phone": null,
|
|
166
|
+
"website": null,
|
|
167
|
+
"notes": null,
|
|
168
|
+
"custom_fields": [
|
|
169
|
+
{
|
|
170
|
+
"key": "plano",
|
|
171
|
+
"label": "Plano",
|
|
172
|
+
"type": "text",
|
|
173
|
+
"value": "ouro",
|
|
174
|
+
"visibility": "interno"
|
|
175
|
+
}
|
|
176
|
+
],
|
|
177
|
+
"is_active": true,
|
|
178
|
+
"logo_url": null,
|
|
179
|
+
"extra_emails": [],
|
|
180
|
+
"extra_phones": [],
|
|
181
|
+
"created_at": "2026-09-13T12:00:00+00:00",
|
|
182
|
+
"updated_at": "2026-09-13T12:00:00+00:00"
|
|
183
|
+
},
|
|
184
|
+
"message": "Executado com sucesso"
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
],
|
|
189
|
+
"expect": {
|
|
190
|
+
"result": {
|
|
191
|
+
"id": "00000000-0000-4000-8000-000000000001",
|
|
192
|
+
"external_id": "ERP 1042",
|
|
193
|
+
"name": "Padaria Estrela",
|
|
194
|
+
"kind": "pj",
|
|
195
|
+
"legal_name": "Estrela Panificação e Comércio Ltda",
|
|
196
|
+
"state_registration": "ISENTO",
|
|
197
|
+
"municipal_registration": "1.234.567-8",
|
|
198
|
+
"id_document": null,
|
|
199
|
+
"document": "12345678000190",
|
|
200
|
+
"email": "contato@padaria.example",
|
|
201
|
+
"phone": null,
|
|
202
|
+
"website": null,
|
|
203
|
+
"notes": null,
|
|
204
|
+
"custom_fields": [
|
|
205
|
+
{
|
|
206
|
+
"key": "plano",
|
|
207
|
+
"label": "Plano",
|
|
208
|
+
"type": "text",
|
|
209
|
+
"value": "ouro",
|
|
210
|
+
"visibility": "interno"
|
|
211
|
+
}
|
|
212
|
+
],
|
|
213
|
+
"is_active": true,
|
|
214
|
+
"logo_url": null,
|
|
215
|
+
"extra_emails": [],
|
|
216
|
+
"extra_phones": [],
|
|
217
|
+
"created_at": "2026-09-13T12:00:00+00:00",
|
|
218
|
+
"updated_at": "2026-09-13T12:00:00+00:00"
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"id": "customers.upsert/pf_fields",
|
|
224
|
+
"op": "customers.upsert",
|
|
225
|
+
"args": {
|
|
226
|
+
"external_id": "ERP 2001",
|
|
227
|
+
"kind": "pf",
|
|
228
|
+
"name": "João da Silva",
|
|
229
|
+
"document": "52998224725",
|
|
230
|
+
"id_document": "MG-12.345.678 SSP/MG"
|
|
231
|
+
},
|
|
232
|
+
"exchanges": [
|
|
233
|
+
{
|
|
234
|
+
"retry": false,
|
|
235
|
+
"request": {
|
|
236
|
+
"method": "PUT",
|
|
237
|
+
"path": "/api/v1/integration/customers/ERP%202001",
|
|
238
|
+
"query": {},
|
|
239
|
+
"body": {
|
|
240
|
+
"kind": "pf",
|
|
241
|
+
"name": "João da Silva",
|
|
242
|
+
"document": "52998224725",
|
|
243
|
+
"id_document": "MG-12.345.678 SSP/MG"
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
"response": {
|
|
247
|
+
"status": 201,
|
|
248
|
+
"headers": {},
|
|
249
|
+
"body": {
|
|
250
|
+
"code": 201,
|
|
251
|
+
"data": {
|
|
252
|
+
"id": "00000000-0000-4000-8000-000000000003",
|
|
253
|
+
"external_id": "ERP 2001",
|
|
254
|
+
"name": "João da Silva",
|
|
255
|
+
"kind": "pf",
|
|
256
|
+
"legal_name": null,
|
|
257
|
+
"state_registration": null,
|
|
258
|
+
"municipal_registration": null,
|
|
259
|
+
"id_document": "MG-12.345.678 SSP/MG",
|
|
260
|
+
"document": "52998224725",
|
|
261
|
+
"email": "contato@padaria.example",
|
|
262
|
+
"phone": null,
|
|
263
|
+
"website": null,
|
|
264
|
+
"notes": null,
|
|
265
|
+
"custom_fields": [],
|
|
266
|
+
"is_active": true,
|
|
267
|
+
"logo_url": null,
|
|
268
|
+
"extra_emails": [],
|
|
269
|
+
"extra_phones": [],
|
|
270
|
+
"created_at": "2026-09-13T12:00:00+00:00",
|
|
271
|
+
"updated_at": "2026-09-13T12:00:00+00:00"
|
|
272
|
+
},
|
|
273
|
+
"message": "Executado com sucesso"
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
],
|
|
278
|
+
"expect": {
|
|
279
|
+
"result": {
|
|
280
|
+
"id": "00000000-0000-4000-8000-000000000003",
|
|
281
|
+
"external_id": "ERP 2001",
|
|
282
|
+
"name": "João da Silva",
|
|
283
|
+
"kind": "pf",
|
|
284
|
+
"legal_name": null,
|
|
285
|
+
"state_registration": null,
|
|
286
|
+
"municipal_registration": null,
|
|
287
|
+
"id_document": "MG-12.345.678 SSP/MG",
|
|
288
|
+
"document": "52998224725",
|
|
289
|
+
"email": "contato@padaria.example",
|
|
290
|
+
"phone": null,
|
|
291
|
+
"website": null,
|
|
292
|
+
"notes": null,
|
|
293
|
+
"custom_fields": [],
|
|
294
|
+
"is_active": true,
|
|
295
|
+
"logo_url": null,
|
|
296
|
+
"extra_emails": [],
|
|
297
|
+
"extra_phones": [],
|
|
298
|
+
"created_at": "2026-09-13T12:00:00+00:00",
|
|
299
|
+
"updated_at": "2026-09-13T12:00:00+00:00"
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
},
|
|
121
303
|
{
|
|
122
304
|
"id": "customers.upsert/null_clears_field",
|
|
123
305
|
"op": "customers.upsert",
|
|
@@ -1113,6 +1295,7 @@
|
|
|
1113
1295
|
"name": "Paula Reis",
|
|
1114
1296
|
"email": "paula@padaria.example",
|
|
1115
1297
|
"phone": null,
|
|
1298
|
+
"document": null,
|
|
1116
1299
|
"role": "Financeiro",
|
|
1117
1300
|
"access": true,
|
|
1118
1301
|
"is_primary": true,
|
|
@@ -1141,6 +1324,7 @@
|
|
|
1141
1324
|
"name": "Paula Reis",
|
|
1142
1325
|
"email": "paula@padaria.example",
|
|
1143
1326
|
"phone": null,
|
|
1327
|
+
"document": null,
|
|
1144
1328
|
"role": "Financeiro",
|
|
1145
1329
|
"access": true,
|
|
1146
1330
|
"is_primary": true,
|
|
@@ -1199,6 +1383,7 @@
|
|
|
1199
1383
|
"name": "Paula Reis",
|
|
1200
1384
|
"email": "paula@padaria.example",
|
|
1201
1385
|
"phone": null,
|
|
1386
|
+
"document": null,
|
|
1202
1387
|
"role": "Financeiro",
|
|
1203
1388
|
"access": false,
|
|
1204
1389
|
"is_primary": true,
|
|
@@ -1227,6 +1412,7 @@
|
|
|
1227
1412
|
"name": "Paula Reis",
|
|
1228
1413
|
"email": "paula@padaria.example",
|
|
1229
1414
|
"phone": null,
|
|
1415
|
+
"document": null,
|
|
1230
1416
|
"role": "Financeiro",
|
|
1231
1417
|
"access": false,
|
|
1232
1418
|
"is_primary": true,
|
|
@@ -1292,6 +1478,199 @@
|
|
|
1292
1478
|
}
|
|
1293
1479
|
}
|
|
1294
1480
|
},
|
|
1481
|
+
{
|
|
1482
|
+
"id": "people.upsert/document_merged",
|
|
1483
|
+
"op": "people.upsert",
|
|
1484
|
+
"args": {
|
|
1485
|
+
"customer_external_id": "ERP 1042",
|
|
1486
|
+
"person_external_id": "app-91",
|
|
1487
|
+
"name": "Paula Reis",
|
|
1488
|
+
"document": "529.982.247-25"
|
|
1489
|
+
},
|
|
1490
|
+
"exchanges": [
|
|
1491
|
+
{
|
|
1492
|
+
"retry": false,
|
|
1493
|
+
"request": {
|
|
1494
|
+
"method": "PUT",
|
|
1495
|
+
"path": "/api/v1/integration/customers/ERP%201042/people/app-91",
|
|
1496
|
+
"query": {},
|
|
1497
|
+
"body": {
|
|
1498
|
+
"person": {
|
|
1499
|
+
"name": "Paula Reis",
|
|
1500
|
+
"document": "529.982.247-25"
|
|
1501
|
+
}
|
|
1502
|
+
}
|
|
1503
|
+
},
|
|
1504
|
+
"response": {
|
|
1505
|
+
"status": 200,
|
|
1506
|
+
"headers": {},
|
|
1507
|
+
"body": {
|
|
1508
|
+
"code": 200,
|
|
1509
|
+
"data": {
|
|
1510
|
+
"external_id": "app-77",
|
|
1511
|
+
"name": "Paula Reis",
|
|
1512
|
+
"email": "paula@padaria.example",
|
|
1513
|
+
"phone": null,
|
|
1514
|
+
"document": "52998224725",
|
|
1515
|
+
"role": "Financeiro",
|
|
1516
|
+
"access": true,
|
|
1517
|
+
"is_primary": true,
|
|
1518
|
+
"customer_external_id": "ERP 1042",
|
|
1519
|
+
"custom_fields": [
|
|
1520
|
+
{
|
|
1521
|
+
"key": "matricula",
|
|
1522
|
+
"label": "Matrícula",
|
|
1523
|
+
"value": "4471",
|
|
1524
|
+
"visibility": "interno"
|
|
1525
|
+
}
|
|
1526
|
+
],
|
|
1527
|
+
"identifiers": [
|
|
1528
|
+
{
|
|
1529
|
+
"external_id": "app-91",
|
|
1530
|
+
"label": null,
|
|
1531
|
+
"source": "api"
|
|
1532
|
+
}
|
|
1533
|
+
],
|
|
1534
|
+
"linked": false,
|
|
1535
|
+
"merged_into": "app-77",
|
|
1536
|
+
"status": "updated"
|
|
1537
|
+
},
|
|
1538
|
+
"message": "Executado com sucesso"
|
|
1539
|
+
}
|
|
1540
|
+
}
|
|
1541
|
+
}
|
|
1542
|
+
],
|
|
1543
|
+
"expect": {
|
|
1544
|
+
"result": {
|
|
1545
|
+
"external_id": "app-77",
|
|
1546
|
+
"name": "Paula Reis",
|
|
1547
|
+
"email": "paula@padaria.example",
|
|
1548
|
+
"phone": null,
|
|
1549
|
+
"document": "52998224725",
|
|
1550
|
+
"role": "Financeiro",
|
|
1551
|
+
"access": true,
|
|
1552
|
+
"is_primary": true,
|
|
1553
|
+
"customer_external_id": "ERP 1042",
|
|
1554
|
+
"custom_fields": [
|
|
1555
|
+
{
|
|
1556
|
+
"key": "matricula",
|
|
1557
|
+
"label": "Matrícula",
|
|
1558
|
+
"value": "4471",
|
|
1559
|
+
"visibility": "interno"
|
|
1560
|
+
}
|
|
1561
|
+
],
|
|
1562
|
+
"identifiers": [
|
|
1563
|
+
{
|
|
1564
|
+
"external_id": "app-91",
|
|
1565
|
+
"label": null,
|
|
1566
|
+
"source": "api"
|
|
1567
|
+
}
|
|
1568
|
+
],
|
|
1569
|
+
"linked": false,
|
|
1570
|
+
"merged_into": "app-77",
|
|
1571
|
+
"status": "updated"
|
|
1572
|
+
}
|
|
1573
|
+
}
|
|
1574
|
+
},
|
|
1575
|
+
{
|
|
1576
|
+
"id": "people.upsert/document_conflict",
|
|
1577
|
+
"op": "people.upsert",
|
|
1578
|
+
"args": {
|
|
1579
|
+
"customer_external_id": "ERP 1042",
|
|
1580
|
+
"person_external_id": "app-77",
|
|
1581
|
+
"document": "111.444.777-35"
|
|
1582
|
+
},
|
|
1583
|
+
"exchanges": [
|
|
1584
|
+
{
|
|
1585
|
+
"retry": false,
|
|
1586
|
+
"request": {
|
|
1587
|
+
"method": "PUT",
|
|
1588
|
+
"path": "/api/v1/integration/customers/ERP%201042/people/app-77",
|
|
1589
|
+
"query": {},
|
|
1590
|
+
"body": {
|
|
1591
|
+
"person": {
|
|
1592
|
+
"document": "111.444.777-35"
|
|
1593
|
+
}
|
|
1594
|
+
}
|
|
1595
|
+
},
|
|
1596
|
+
"response": {
|
|
1597
|
+
"status": 409,
|
|
1598
|
+
"headers": {},
|
|
1599
|
+
"body": {
|
|
1600
|
+
"code": 409,
|
|
1601
|
+
"data": {
|
|
1602
|
+
"field": "document"
|
|
1603
|
+
},
|
|
1604
|
+
"message": "PERSON_DOCUMENT_CONFLICT",
|
|
1605
|
+
"error": "PERSON_DOCUMENT_CONFLICT",
|
|
1606
|
+
"validation": {
|
|
1607
|
+
"field": "document"
|
|
1608
|
+
},
|
|
1609
|
+
"request_id": "req-conformance-01"
|
|
1610
|
+
}
|
|
1611
|
+
}
|
|
1612
|
+
}
|
|
1613
|
+
],
|
|
1614
|
+
"expect": {
|
|
1615
|
+
"error": {
|
|
1616
|
+
"type": "conflict",
|
|
1617
|
+
"code": "PERSON_DOCUMENT_CONFLICT",
|
|
1618
|
+
"status": 409,
|
|
1619
|
+
"request_id": "req-conformance-01"
|
|
1620
|
+
}
|
|
1621
|
+
}
|
|
1622
|
+
},
|
|
1623
|
+
{
|
|
1624
|
+
"id": "people.upsert/document_invalid",
|
|
1625
|
+
"op": "people.upsert",
|
|
1626
|
+
"args": {
|
|
1627
|
+
"customer_external_id": "ERP 1042",
|
|
1628
|
+
"person_external_id": "app-77",
|
|
1629
|
+
"document": "123.456.789-00"
|
|
1630
|
+
},
|
|
1631
|
+
"exchanges": [
|
|
1632
|
+
{
|
|
1633
|
+
"retry": false,
|
|
1634
|
+
"request": {
|
|
1635
|
+
"method": "PUT",
|
|
1636
|
+
"path": "/api/v1/integration/customers/ERP%201042/people/app-77",
|
|
1637
|
+
"query": {},
|
|
1638
|
+
"body": {
|
|
1639
|
+
"person": {
|
|
1640
|
+
"document": "123.456.789-00"
|
|
1641
|
+
}
|
|
1642
|
+
}
|
|
1643
|
+
},
|
|
1644
|
+
"response": {
|
|
1645
|
+
"status": 422,
|
|
1646
|
+
"headers": {},
|
|
1647
|
+
"body": {
|
|
1648
|
+
"code": 422,
|
|
1649
|
+
"data": {
|
|
1650
|
+
"field": "document"
|
|
1651
|
+
},
|
|
1652
|
+
"message": "PERSON_DOCUMENT_INVALID",
|
|
1653
|
+
"error": "PERSON_DOCUMENT_INVALID",
|
|
1654
|
+
"validation": {
|
|
1655
|
+
"field": "document"
|
|
1656
|
+
},
|
|
1657
|
+
"request_id": "req-conformance-01"
|
|
1658
|
+
}
|
|
1659
|
+
}
|
|
1660
|
+
}
|
|
1661
|
+
],
|
|
1662
|
+
"expect": {
|
|
1663
|
+
"error": {
|
|
1664
|
+
"type": "validation",
|
|
1665
|
+
"code": "PERSON_DOCUMENT_INVALID",
|
|
1666
|
+
"status": 422,
|
|
1667
|
+
"request_id": "req-conformance-01",
|
|
1668
|
+
"validation": {
|
|
1669
|
+
"field": "document"
|
|
1670
|
+
}
|
|
1671
|
+
}
|
|
1672
|
+
}
|
|
1673
|
+
},
|
|
1295
1674
|
{
|
|
1296
1675
|
"id": "people.list/ok",
|
|
1297
1676
|
"op": "people.list",
|
|
@@ -1318,6 +1697,7 @@
|
|
|
1318
1697
|
"name": "Paula Reis",
|
|
1319
1698
|
"email": "paula@padaria.example",
|
|
1320
1699
|
"phone": null,
|
|
1700
|
+
"document": null,
|
|
1321
1701
|
"role": "Financeiro",
|
|
1322
1702
|
"access": true,
|
|
1323
1703
|
"is_primary": true,
|
|
@@ -1337,6 +1717,7 @@
|
|
|
1337
1717
|
"name": "Rui Lima",
|
|
1338
1718
|
"email": null,
|
|
1339
1719
|
"phone": "+5511999990000",
|
|
1720
|
+
"document": null,
|
|
1340
1721
|
"role": "Compras",
|
|
1341
1722
|
"access": false,
|
|
1342
1723
|
"is_primary": false,
|
|
@@ -1357,6 +1738,7 @@
|
|
|
1357
1738
|
"name": "Paula Reis",
|
|
1358
1739
|
"email": "paula@padaria.example",
|
|
1359
1740
|
"phone": null,
|
|
1741
|
+
"document": null,
|
|
1360
1742
|
"role": "Financeiro",
|
|
1361
1743
|
"access": true,
|
|
1362
1744
|
"is_primary": true,
|
|
@@ -1376,6 +1758,7 @@
|
|
|
1376
1758
|
"name": "Rui Lima",
|
|
1377
1759
|
"email": null,
|
|
1378
1760
|
"phone": "+5511999990000",
|
|
1761
|
+
"document": null,
|
|
1379
1762
|
"role": "Compras",
|
|
1380
1763
|
"access": false,
|
|
1381
1764
|
"is_primary": false,
|
|
@@ -1412,6 +1795,7 @@
|
|
|
1412
1795
|
"name": "Paula Reis",
|
|
1413
1796
|
"email": "paula@padaria.example",
|
|
1414
1797
|
"phone": null,
|
|
1798
|
+
"document": null,
|
|
1415
1799
|
"role": "Financeiro",
|
|
1416
1800
|
"access": false,
|
|
1417
1801
|
"is_primary": true,
|
|
@@ -1438,6 +1822,7 @@
|
|
|
1438
1822
|
"name": "Paula Reis",
|
|
1439
1823
|
"email": "paula@padaria.example",
|
|
1440
1824
|
"phone": null,
|
|
1825
|
+
"document": null,
|
|
1441
1826
|
"role": "Financeiro",
|
|
1442
1827
|
"access": false,
|
|
1443
1828
|
"is_primary": true,
|
|
@@ -1619,6 +2004,120 @@
|
|
|
1619
2004
|
}
|
|
1620
2005
|
}
|
|
1621
2006
|
},
|
|
2007
|
+
{
|
|
2008
|
+
"id": "customers.batch/typed_fields",
|
|
2009
|
+
"op": "customers.batch",
|
|
2010
|
+
"args": {
|
|
2011
|
+
"items": [
|
|
2012
|
+
{
|
|
2013
|
+
"external_id": "ERP 1042",
|
|
2014
|
+
"kind": "pj",
|
|
2015
|
+
"legal_name": "Estrela Panificação e Comércio Ltda",
|
|
2016
|
+
"state_registration": "ISENTO",
|
|
2017
|
+
"municipal_registration": "1.234.567-8"
|
|
2018
|
+
},
|
|
2019
|
+
{
|
|
2020
|
+
"external_id": "ERP 2001",
|
|
2021
|
+
"kind": "pf",
|
|
2022
|
+
"name": "João da Silva",
|
|
2023
|
+
"id_document": "MG-12.345.678 SSP/MG"
|
|
2024
|
+
}
|
|
2025
|
+
]
|
|
2026
|
+
},
|
|
2027
|
+
"exchanges": [
|
|
2028
|
+
{
|
|
2029
|
+
"retry": false,
|
|
2030
|
+
"request": {
|
|
2031
|
+
"method": "POST",
|
|
2032
|
+
"path": "/api/v1/integration/customers/batch",
|
|
2033
|
+
"query": {},
|
|
2034
|
+
"body": {
|
|
2035
|
+
"items": [
|
|
2036
|
+
{
|
|
2037
|
+
"external_id": "ERP 1042",
|
|
2038
|
+
"kind": "pj",
|
|
2039
|
+
"legal_name": "Estrela Panificação e Comércio Ltda",
|
|
2040
|
+
"state_registration": "ISENTO",
|
|
2041
|
+
"municipal_registration": "1.234.567-8"
|
|
2042
|
+
},
|
|
2043
|
+
{
|
|
2044
|
+
"external_id": "ERP 2001",
|
|
2045
|
+
"kind": "pf",
|
|
2046
|
+
"name": "João da Silva",
|
|
2047
|
+
"id_document": "MG-12.345.678 SSP/MG"
|
|
2048
|
+
}
|
|
2049
|
+
]
|
|
2050
|
+
}
|
|
2051
|
+
},
|
|
2052
|
+
"response": {
|
|
2053
|
+
"status": 200,
|
|
2054
|
+
"headers": {},
|
|
2055
|
+
"body": {
|
|
2056
|
+
"code": 200,
|
|
2057
|
+
"data": {
|
|
2058
|
+
"results": [
|
|
2059
|
+
{
|
|
2060
|
+
"index": 0,
|
|
2061
|
+
"status": "updated",
|
|
2062
|
+
"external_id": "ERP 1042",
|
|
2063
|
+
"merged_into": null,
|
|
2064
|
+
"linked": false,
|
|
2065
|
+
"error": null,
|
|
2066
|
+
"code": null
|
|
2067
|
+
},
|
|
2068
|
+
{
|
|
2069
|
+
"index": 1,
|
|
2070
|
+
"status": "created",
|
|
2071
|
+
"external_id": "ERP 2001",
|
|
2072
|
+
"merged_into": null,
|
|
2073
|
+
"linked": false,
|
|
2074
|
+
"error": null,
|
|
2075
|
+
"code": null
|
|
2076
|
+
}
|
|
2077
|
+
],
|
|
2078
|
+
"summary": {
|
|
2079
|
+
"created": 1,
|
|
2080
|
+
"updated": 1,
|
|
2081
|
+
"unchanged": 0,
|
|
2082
|
+
"error": 0
|
|
2083
|
+
}
|
|
2084
|
+
},
|
|
2085
|
+
"message": "Executado com sucesso"
|
|
2086
|
+
}
|
|
2087
|
+
}
|
|
2088
|
+
}
|
|
2089
|
+
],
|
|
2090
|
+
"expect": {
|
|
2091
|
+
"result": {
|
|
2092
|
+
"results": [
|
|
2093
|
+
{
|
|
2094
|
+
"index": 0,
|
|
2095
|
+
"status": "updated",
|
|
2096
|
+
"external_id": "ERP 1042",
|
|
2097
|
+
"merged_into": null,
|
|
2098
|
+
"linked": false,
|
|
2099
|
+
"error": null,
|
|
2100
|
+
"code": null
|
|
2101
|
+
},
|
|
2102
|
+
{
|
|
2103
|
+
"index": 1,
|
|
2104
|
+
"status": "created",
|
|
2105
|
+
"external_id": "ERP 2001",
|
|
2106
|
+
"merged_into": null,
|
|
2107
|
+
"linked": false,
|
|
2108
|
+
"error": null,
|
|
2109
|
+
"code": null
|
|
2110
|
+
}
|
|
2111
|
+
],
|
|
2112
|
+
"summary": {
|
|
2113
|
+
"created": 1,
|
|
2114
|
+
"updated": 1,
|
|
2115
|
+
"unchanged": 0,
|
|
2116
|
+
"error": 0
|
|
2117
|
+
}
|
|
2118
|
+
}
|
|
2119
|
+
}
|
|
2120
|
+
},
|
|
1622
2121
|
{
|
|
1623
2122
|
"id": "people.batch/partial_failure",
|
|
1624
2123
|
"op": "people.batch",
|
|
@@ -1754,6 +2253,120 @@
|
|
|
1754
2253
|
}
|
|
1755
2254
|
}
|
|
1756
2255
|
},
|
|
2256
|
+
{
|
|
2257
|
+
"id": "people.batch/document",
|
|
2258
|
+
"op": "people.batch",
|
|
2259
|
+
"args": {
|
|
2260
|
+
"items": [
|
|
2261
|
+
{
|
|
2262
|
+
"customer_external_id": "ERP 1042",
|
|
2263
|
+
"external_id": "app-77",
|
|
2264
|
+
"document": "529.982.247-25"
|
|
2265
|
+
},
|
|
2266
|
+
{
|
|
2267
|
+
"customer_external_id": "ERP 1042",
|
|
2268
|
+
"external_id": "app-91",
|
|
2269
|
+
"name": "Paula Reis",
|
|
2270
|
+
"document": "52998224725"
|
|
2271
|
+
}
|
|
2272
|
+
]
|
|
2273
|
+
},
|
|
2274
|
+
"exchanges": [
|
|
2275
|
+
{
|
|
2276
|
+
"retry": false,
|
|
2277
|
+
"request": {
|
|
2278
|
+
"method": "POST",
|
|
2279
|
+
"path": "/api/v1/integration/people/batch",
|
|
2280
|
+
"query": {},
|
|
2281
|
+
"body": {
|
|
2282
|
+
"items": [
|
|
2283
|
+
{
|
|
2284
|
+
"customer_external_id": "ERP 1042",
|
|
2285
|
+
"person": {
|
|
2286
|
+
"external_id": "app-77",
|
|
2287
|
+
"document": "529.982.247-25"
|
|
2288
|
+
}
|
|
2289
|
+
},
|
|
2290
|
+
{
|
|
2291
|
+
"customer_external_id": "ERP 1042",
|
|
2292
|
+
"person": {
|
|
2293
|
+
"external_id": "app-91",
|
|
2294
|
+
"name": "Paula Reis",
|
|
2295
|
+
"document": "52998224725"
|
|
2296
|
+
}
|
|
2297
|
+
}
|
|
2298
|
+
]
|
|
2299
|
+
}
|
|
2300
|
+
},
|
|
2301
|
+
"response": {
|
|
2302
|
+
"status": 200,
|
|
2303
|
+
"headers": {},
|
|
2304
|
+
"body": {
|
|
2305
|
+
"code": 200,
|
|
2306
|
+
"data": {
|
|
2307
|
+
"results": [
|
|
2308
|
+
{
|
|
2309
|
+
"index": 0,
|
|
2310
|
+
"status": "updated",
|
|
2311
|
+
"external_id": "app-77",
|
|
2312
|
+
"merged_into": null,
|
|
2313
|
+
"linked": false,
|
|
2314
|
+
"error": null,
|
|
2315
|
+
"code": null
|
|
2316
|
+
},
|
|
2317
|
+
{
|
|
2318
|
+
"index": 1,
|
|
2319
|
+
"status": "updated",
|
|
2320
|
+
"external_id": "app-77",
|
|
2321
|
+
"merged_into": "app-77",
|
|
2322
|
+
"linked": false,
|
|
2323
|
+
"error": null,
|
|
2324
|
+
"code": null
|
|
2325
|
+
}
|
|
2326
|
+
],
|
|
2327
|
+
"summary": {
|
|
2328
|
+
"created": 0,
|
|
2329
|
+
"updated": 2,
|
|
2330
|
+
"unchanged": 0,
|
|
2331
|
+
"error": 0
|
|
2332
|
+
}
|
|
2333
|
+
},
|
|
2334
|
+
"message": "Executado com sucesso"
|
|
2335
|
+
}
|
|
2336
|
+
}
|
|
2337
|
+
}
|
|
2338
|
+
],
|
|
2339
|
+
"expect": {
|
|
2340
|
+
"result": {
|
|
2341
|
+
"results": [
|
|
2342
|
+
{
|
|
2343
|
+
"index": 0,
|
|
2344
|
+
"status": "updated",
|
|
2345
|
+
"external_id": "app-77",
|
|
2346
|
+
"merged_into": null,
|
|
2347
|
+
"linked": false,
|
|
2348
|
+
"error": null,
|
|
2349
|
+
"code": null
|
|
2350
|
+
},
|
|
2351
|
+
{
|
|
2352
|
+
"index": 1,
|
|
2353
|
+
"status": "updated",
|
|
2354
|
+
"external_id": "app-77",
|
|
2355
|
+
"merged_into": "app-77",
|
|
2356
|
+
"linked": false,
|
|
2357
|
+
"error": null,
|
|
2358
|
+
"code": null
|
|
2359
|
+
}
|
|
2360
|
+
],
|
|
2361
|
+
"summary": {
|
|
2362
|
+
"created": 0,
|
|
2363
|
+
"updated": 2,
|
|
2364
|
+
"unchanged": 0,
|
|
2365
|
+
"error": 0
|
|
2366
|
+
}
|
|
2367
|
+
}
|
|
2368
|
+
}
|
|
2369
|
+
},
|
|
1757
2370
|
{
|
|
1758
2371
|
"id": "customers.identifiers.add/with_label",
|
|
1759
2372
|
"op": "customers.identifiers.add",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|