bfocus 0.2.4 → 0.2.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 81fd7ca10ae4eb62028ffbc3e5470247f3017717fdfdc9dc2e6f7563be832df3
4
- data.tar.gz: 76800d60498520cb5d3d05870f1b11b5bae78fff6e3036a32807c03f451ab811
3
+ metadata.gz: a1002f7169bb429c47c8e0b664f24498fca553c8dbe00a694a5f73269b125169
4
+ data.tar.gz: cfa713f8914a6071c813f3a2bfd6dbd4093421570c36895897a6d151582d4075
5
5
  SHA512:
6
- metadata.gz: 521f1c6a0ee7b7faa0b9ea653382cad776041ce9be204d66574a6de500402f551e91e54cfb0a2f619e0ee6e0584598cdde1a4dcff721a1df7c59da0c1c4461fb
7
- data.tar.gz: 7937ef07106aea158c7c55b8fb313bbd69e3dd9b862c39bd64c682cd2a28d312d2b6bd7a63b928dc41a3fd649057227feba31f092cc8b61300556fd9e7f1e8cc
6
+ metadata.gz: c26cd338fb79a94dadab4d5d1d045efc6fd36c0c149e4dd819c95aff74ff6e651e0ddf2b17e59e85ad56d41dcc1adc87fb3b0290dad9347c07b506874c8773be
7
+ data.tar.gz: 8da928fb019d68836af2d6fef305a2b898054d6975773a4c7974324c2f79529543c2eb0a98876f81c7674814ab3dcbd52c5f9d58354af5f6dd831f3394106f4b
data/README.md CHANGED
@@ -195,11 +195,12 @@ client.people.upsert("erp-1042", "app-77", access: true) # devolve o acesso
195
195
  - **O acesso é do vínculo.** `delete` (e `access: false`) tira o acesso dela NESTE cliente, não nos
196
196
  outros: `"unlinked" => true` na resposta quer dizer que ela segue ativa em algum outro.
197
197
  - Como no resto da SDK, só o que você passa muda; `nil` limpa (`phone: nil`).
198
- - Campos: `name`, `email`, `phone`, `role`, `access` (pode usar o atendimento), `is_primary`
198
+ - Campos: `name`, `email`, `phone`, `document` (CPF), `role`, `access` (pode usar o atendimento), `is_primary`
199
199
  (contato principal), `extra_emails`, `extra_phones`, `custom_fields`, `clear`.
200
200
  - Erros comuns (`code`): `CUSTOMER_NOT_FOUND`, `NAME_REQUIRED` (ao criar), `PERSON_EMAIL_TAKEN`,
201
201
  `PERSON_PHONE_TAKEN`, `PERSON_CONTACT_OTHER_CUSTOMER`, `PERSON_EMAIL_STAFF`,
202
- `PERSON_CLEAR_FIELD_INVALID`, `PERSON_CLEAR_NOT_OWN_RECORD`.
202
+ `PERSON_CLEAR_FIELD_INVALID`, `PERSON_CLEAR_NOT_OWN_RECORD`, `PERSON_DOCUMENT_INVALID`,
203
+ `PERSON_DOCUMENT_CONFLICT`.
203
204
 
204
205
  ### Campos personalizados da pessoa
205
206
 
@@ -252,6 +253,30 @@ Três regras que parecem contraintuitivas e são de propósito:
252
253
 
253
254
  Vale no `people.upsert` e no `people.batch` (`"clear" => ["phone"]` no item).
254
255
 
256
+ ### CPF: a pessoa é única
257
+
258
+ `document` é o CPF da pessoa. É por ele que dois sistemas que conhecem a mesma pessoa por ids
259
+ diferentes chegam ao MESMO cadastro.
260
+
261
+ ```ruby
262
+ p = client.people.upsert("erp-1042", "app-91", name: "Paula Reis", document: "529.982.247-25")
263
+ p["document"] # "52998224725"
264
+ p["merged_into"] # "app-77" se o CPF já era de outra ficha; nil se não
265
+ ```
266
+
267
+ Regras (valem no upsert e no lote):
268
+
269
+ - **A pessoa é única.** O mesmo CPF é sempre o mesmo cadastro, em qualquer produto e cliente. Mande
270
+ com ou sem máscara; a resposta traz só os 11 dígitos em `document`.
271
+ - **Id desconhecido + CPF que já existe** → a API acha a ficha, o seu id vira identificador extra
272
+ dela e a resposta vem com `merged_into` = o id principal. Guarde esse id do seu lado.
273
+ - **Id de uma ficha + CPF de OUTRA** → as duas são mescladas na hora; `merged_into` = a que tinha o CPF.
274
+ - **`document: nil` NÃO apaga** o CPF (e `document` não é campo do `clear`). Omitir é o mesmo que "não mexe".
275
+ - Erros: 422 `PERSON_DOCUMENT_INVALID` (CPF inválido, `Bfocus::ValidationError`) e 409 `PERSON_DOCUMENT_CONFLICT` (a
276
+ ficha já tem OUTRO CPF — a API nunca troca sozinho; `Bfocus::ConflictError`).
277
+
278
+ No lote: `"document" => "529.982.247-25"` no item.
279
+
255
280
  ### Contato já usado: um 409 que você consegue resolver
256
281
 
257
282
  `PERSON_EMAIL_TAKEN` e `PERSON_PHONE_TAKEN` (409) não são "tente de novo": o e-mail (ou o
@@ -291,10 +316,13 @@ rescue Bfocus::ConflictError => e
291
316
  end
292
317
  ```
293
318
 
294
- `PERSON_CONTACT_OTHER_CUSTOMER` (409) é o mesmo assunto pelo outro lado, e é **recusa
295
- definitiva**: a API não move mais uma pessoa de um cliente para outro só porque o e-mail (ou o
296
- telefone) casou. Repetir a chamada não resolve trate como caso para o cadastro, nunca como
297
- falha temporária.
319
+ `PERSON_CONTACT_OTHER_CUSTOMER` (409) é o mesmo assunto pelo outro lado: o e-mail (ou o telefone) é
320
+ de uma pessoa de **outro cliente**. A API **não liga duas fichas sozinha** só porque o contato casou
321
+ dois cadastros podem dividir um e-mail ou um telefone, e ligar por palpite destruiu fichas.
322
+ Repetir a chamada não resolve. Se for **mesmo a mesma pessoa** (confirme antes), o erro traz o dono
323
+ nos dados, como os outros dois conflitos: registre o seu id como identificador extra da ficha dele
324
+ (`owner_external_id`) e o próximo envio **liga** a pessoa ao seu cliente (`linked: true`), sem
325
+ sobrescrever os dados da outra ficha.
298
326
 
299
327
  ## Lotes — `customers.batch` e `people.batch`
300
328
 
@@ -73,6 +73,13 @@ module Bfocus
73
73
  # transferida: fica ligada também a este (cadastro único, `"linked" => true` na resposta).
74
74
  # `access: true` devolve o acesso retirado por {#delete}.
75
75
  #
76
+ # @param document [String] CPF da pessoa, com ou sem máscara (a resposta traz só os 11
77
+ # dígitos). A PESSOA É ÚNICA: o mesmo CPF é sempre o mesmo cadastro, em qualquer produto.
78
+ # Id desconhecido + CPF de uma ficha existente → `"merged_into"` = id principal dela (o
79
+ # seu id vira identificador extra). Id de uma ficha + CPF de OUTRA → as duas são mescladas
80
+ # na hora (`"merged_into"` = a que tinha o CPF). `nil`/vazio NÃO apaga (não é campo do
81
+ # `clear`). Erros: 422 `PERSON_DOCUMENT_INVALID` (CPF inválido) e 409
82
+ # `PERSON_DOCUMENT_CONFLICT` (a ficha já tem OUTRO CPF — nunca troca sozinho).
76
83
  # @param access [Boolean] pode abrir chamados/usar o widget.
77
84
  # @param is_primary [Boolean] contato principal do cliente.
78
85
  # @param extra_emails [Array<String>] e-mails adicionais.
@@ -93,12 +100,13 @@ module Bfocus
93
100
  # ligada a este também) e `"merged_into"` (o id que você mandou era um apelido; este é o
94
101
  # principal do cadastro).
95
102
  def upsert(customer_external_id, person_external_id, name: UNSET, email: UNSET, phone: UNSET,
96
- role: UNSET, access: UNSET, is_primary: UNSET, extra_emails: UNSET, extra_phones: UNSET,
103
+ document: UNSET, role: UNSET, access: UNSET, is_primary: UNSET, extra_emails: UNSET, extra_phones: UNSET,
97
104
  custom_fields: UNSET, clear: UNSET, idempotency_key: nil, timeout: nil)
98
105
  cid = segment(customer_external_id, "customer_external_id")
99
106
  pid = segment(person_external_id, "person_external_id")
100
107
  person = compact(
101
- "name" => name, "email" => email, "phone" => phone, "role" => role, "access" => access,
108
+ "name" => name, "email" => email, "phone" => phone, "document" => document, "role" => role,
109
+ "access" => access,
102
110
  "is_primary" => is_primary, "extra_emails" => extra_emails, "extra_phones" => extra_phones,
103
111
  "custom_fields" => custom_fields, "clear" => clear
104
112
  )
@@ -3,5 +3,5 @@
3
3
  module Bfocus
4
4
  # Versão da gem. O `scripts/release-sdks.sh` do monorepo bumpa esta linha por regex e o
5
5
  # `bfocus.gemspec` lê daqui — mantenha o formato exato `VERSION = "X.Y.Z"`.
6
- VERSION = "0.2.4"
6
+ VERSION = "0.2.5"
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bfocus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Berni Software