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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: bfocus
3
- Version: 0.2.3
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, e é **recusa
299
- definitiva**: a API não move mais uma pessoa de um cliente para outro só porque o e-mail (ou o
300
- telefone) casou. Repetir a chamada não resolve — trate como caso para o cadastro, nunca como
301
- falha temporária.
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, e é **recusa
272
- definitiva**: a API não move mais uma pessoa de um cliente para outro só porque o e-mail (ou o
273
- telefone) casou. Repetir a chamada não resolve — trate como caso para o cadastro, nunca como
274
- falha temporária.
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,
@@ -1,3 +1,3 @@
1
1
  """Versão da SDK. O ``scripts/release-sdks.sh`` bumpa esta linha e o ``pyproject.toml``."""
2
2
 
3
- __version__ = "0.2.3"
3
+ __version__ = "0.2.5"
@@ -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.3"
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