@greatapps/common 1.1.798 → 1.1.799
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,3 +1,4 @@
|
|
|
1
|
+
import { isValidCNPJ, isValidCPF } from "../../../utils/validators/common";
|
|
1
2
|
const REQUIRED_BILLING_FIELDS = [
|
|
2
3
|
"financial_document",
|
|
3
4
|
"financial_name",
|
|
@@ -17,12 +18,18 @@ function isBrazilianBillingAccount(account) {
|
|
|
17
18
|
function isFilled(value) {
|
|
18
19
|
return typeof value === "string" && value.trim().length > 0;
|
|
19
20
|
}
|
|
21
|
+
function hasValidDocument(document) {
|
|
22
|
+
const digits = (document ?? "").replace(/\D/g, "");
|
|
23
|
+
if (digits.length === 11) return isValidCPF(digits);
|
|
24
|
+
if (digits.length === 14) return isValidCNPJ(digits);
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
20
27
|
function hasCompleteBillingData(account) {
|
|
21
28
|
if (!account) return false;
|
|
22
29
|
for (const field of REQUIRED_BILLING_FIELDS) {
|
|
23
30
|
if (!isFilled(account[field])) return false;
|
|
24
31
|
}
|
|
25
|
-
return
|
|
32
|
+
return hasValidDocument(account.financial_document);
|
|
26
33
|
}
|
|
27
34
|
export {
|
|
28
35
|
hasCompleteBillingData,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/accounts/utils/billing-data.ts"],"sourcesContent":["import type { Account } from '../types';\n\nexport type BillingDataSnapshot = Pick<\n Account,\n | 'financial_document'\n | 'financial_name'\n | 'financial_email'\n | 'zipcode'\n | 'address'\n | 'address_number'\n | 'neighborhood'\n | 'city'\n | 'state'\n | 'country'\n>;\n\ntype BillingField = keyof BillingDataSnapshot;\n\n/**\n * Campos exigidos pra emitir a NF-e — sem qualquer um deles a nota não sai.\n *\n * `financial_email` NÃO entra: o backend cai no e-mail do usuário quando ele está\n * vazio (`financial_email || userDocument.email`, accounts/services.js), então a\n * nota sai do mesmo jeito. Exigi-lo aqui bloquearia 4.7k contas pagantes da wl 1\n * em vez das ~460 que de fato estão sem cadastro fiscal. O campo continua no\n * formulário, pré-preenchido — só não é critério de bloqueio.\n *\n * `address_complement` é opcional de verdade.\n */\nconst REQUIRED_BILLING_FIELDS: readonly BillingField[] = [\n 'financial_document',\n 'financial_name',\n 'zipcode',\n 'address',\n 'address_number',\n 'neighborhood',\n 'city',\n 'state',\n 'country',\n];\n\n/**\n * Conta sujeita à NF-e brasileira. Só ela entra no bloqueio: o formulário pede\n * CPF/CNPJ e CEP de 8 dígitos, que um cliente de fora não tem como fornecer —\n * e o modal é bloqueante, então seria tranca sem saída.\n *\n * País vazio conta como Brasil: é o default do cadastro e a origem da esmagadora\n * maioria da base (155 contas pagas da wl 1 estão assim).\n */\nexport function isBrazilianBillingAccount(\n account: Pick<BillingDataSnapshot, 'country'> | null | undefined,\n): boolean {\n if (!account) return false;\n const country = account.country?.trim().toUpperCase();\n return !country || country === 'BR';\n}\n\nfunction isFilled(value: string | null | undefined): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\n/**\n * A conta tem todos os dados de cobrança/fiscais necessários pra emissão de nota.\n * Retorna `false` quando a conta ainda não carregou — quem decide bloquear é o\n * chamador, que checa o loading antes (ver `useRequiredBillingData`).\n */\nexport function hasCompleteBillingData(\n account: BillingDataSnapshot | null | undefined,\n): boolean {\n if (!account) return false;\n\n for (const field of REQUIRED_BILLING_FIELDS) {\n if (!isFilled(account[field])) return false;\n }\n\n return
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/accounts/utils/billing-data.ts"],"sourcesContent":["import type { Account } from '../types';\nimport { isValidCNPJ, isValidCPF } from '../../../utils/validators/common';\n\nexport type BillingDataSnapshot = Pick<\n Account,\n | 'financial_document'\n | 'financial_name'\n | 'financial_email'\n | 'zipcode'\n | 'address'\n | 'address_number'\n | 'neighborhood'\n | 'city'\n | 'state'\n | 'country'\n>;\n\ntype BillingField = keyof BillingDataSnapshot;\n\n/**\n * Campos exigidos pra emitir a NF-e — sem qualquer um deles a nota não sai.\n *\n * `financial_email` NÃO entra: o backend cai no e-mail do usuário quando ele está\n * vazio (`financial_email || userDocument.email`, accounts/services.js), então a\n * nota sai do mesmo jeito. Exigi-lo aqui bloquearia 4.7k contas pagantes da wl 1\n * em vez das ~460 que de fato estão sem cadastro fiscal. O campo continua no\n * formulário, pré-preenchido — só não é critério de bloqueio.\n *\n * `address_complement` é opcional de verdade.\n */\nconst REQUIRED_BILLING_FIELDS: readonly BillingField[] = [\n 'financial_document',\n 'financial_name',\n 'zipcode',\n 'address',\n 'address_number',\n 'neighborhood',\n 'city',\n 'state',\n 'country',\n];\n\n/**\n * Conta sujeita à NF-e brasileira. Só ela entra no bloqueio: o formulário pede\n * CPF/CNPJ e CEP de 8 dígitos, que um cliente de fora não tem como fornecer —\n * e o modal é bloqueante, então seria tranca sem saída.\n *\n * País vazio conta como Brasil: é o default do cadastro e a origem da esmagadora\n * maioria da base (155 contas pagas da wl 1 estão assim).\n */\nexport function isBrazilianBillingAccount(\n account: Pick<BillingDataSnapshot, 'country'> | null | undefined,\n): boolean {\n if (!account) return false;\n const country = account.country?.trim().toUpperCase();\n return !country || country === 'BR';\n}\n\nfunction isFilled(value: string | null | undefined): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\n/**\n * Documento preenchido não é documento bom. O caso que originou isto: uma conta pagava desde\n * junho/2025 com um CNPJ de um dígito trocado, a prefeitura recusava a NFS-e todo mês e o modal\n * nunca abria, porque o campo estava preenchido. Conferir o dígito verificador aqui é o que faz\n * o cliente ser levado a corrigir — o backend já recusa a escrita de um documento inválido desde\n * 28/05/2026, então o formulário não tem como salvar um valor ruim por cima.\n */\nfunction hasValidDocument(document: string | null | undefined): boolean {\n const digits = (document ?? '').replace(/\\D/g, '');\n if (digits.length === 11) return isValidCPF(digits);\n if (digits.length === 14) return isValidCNPJ(digits);\n return false;\n}\n\n/**\n * A conta tem todos os dados de cobrança/fiscais necessários pra emissão de nota.\n * Retorna `false` quando a conta ainda não carregou — quem decide bloquear é o\n * chamador, que checa o loading antes (ver `useRequiredBillingData`).\n */\nexport function hasCompleteBillingData(\n account: BillingDataSnapshot | null | undefined,\n): boolean {\n if (!account) return false;\n\n for (const field of REQUIRED_BILLING_FIELDS) {\n if (!isFilled(account[field])) return false;\n }\n\n return hasValidDocument(account.financial_document);\n}\n"],"mappings":"AACA,SAAS,aAAa,kBAAkB;AA6BxC,MAAM,0BAAmD;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUO,SAAS,0BACd,SACS;AACT,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,UAAU,QAAQ,SAAS,KAAK,EAAE,YAAY;AACpD,SAAO,CAAC,WAAW,YAAY;AACjC;AAEA,SAAS,SAAS,OAA2C;AAC3D,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAC5D;AASA,SAAS,iBAAiB,UAA8C;AACtE,QAAM,UAAU,YAAY,IAAI,QAAQ,OAAO,EAAE;AACjD,MAAI,OAAO,WAAW,GAAI,QAAO,WAAW,MAAM;AAClD,MAAI,OAAO,WAAW,GAAI,QAAO,YAAY,MAAM;AACnD,SAAO;AACT;AAOO,SAAS,uBACd,SACS;AACT,MAAI,CAAC,QAAS,QAAO;AAErB,aAAW,SAAS,yBAAyB;AAC3C,QAAI,CAAC,SAAS,QAAQ,KAAK,CAAC,EAAG,QAAO;AAAA,EACxC;AAEA,SAAO,iBAAiB,QAAQ,kBAAkB;AACpD;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Account } from '../types';
|
|
2
|
+
import { isValidCNPJ, isValidCPF } from '../../../utils/validators/common';
|
|
2
3
|
|
|
3
4
|
export type BillingDataSnapshot = Pick<
|
|
4
5
|
Account,
|
|
@@ -59,6 +60,20 @@ function isFilled(value: string | null | undefined): boolean {
|
|
|
59
60
|
return typeof value === 'string' && value.trim().length > 0;
|
|
60
61
|
}
|
|
61
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Documento preenchido não é documento bom. O caso que originou isto: uma conta pagava desde
|
|
65
|
+
* junho/2025 com um CNPJ de um dígito trocado, a prefeitura recusava a NFS-e todo mês e o modal
|
|
66
|
+
* nunca abria, porque o campo estava preenchido. Conferir o dígito verificador aqui é o que faz
|
|
67
|
+
* o cliente ser levado a corrigir — o backend já recusa a escrita de um documento inválido desde
|
|
68
|
+
* 28/05/2026, então o formulário não tem como salvar um valor ruim por cima.
|
|
69
|
+
*/
|
|
70
|
+
function hasValidDocument(document: string | null | undefined): boolean {
|
|
71
|
+
const digits = (document ?? '').replace(/\D/g, '');
|
|
72
|
+
if (digits.length === 11) return isValidCPF(digits);
|
|
73
|
+
if (digits.length === 14) return isValidCNPJ(digits);
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
|
|
62
77
|
/**
|
|
63
78
|
* A conta tem todos os dados de cobrança/fiscais necessários pra emissão de nota.
|
|
64
79
|
* Retorna `false` quando a conta ainda não carregou — quem decide bloquear é o
|
|
@@ -73,5 +88,5 @@ export function hasCompleteBillingData(
|
|
|
73
88
|
if (!isFilled(account[field])) return false;
|
|
74
89
|
}
|
|
75
90
|
|
|
76
|
-
return
|
|
91
|
+
return hasValidDocument(account.financial_document);
|
|
77
92
|
}
|