Value Objects nos SDKs SUOT — tipagem de campos fiscais
Os Value Objects dos SDKs SUOT encapsulam campos fiscais e regulatórios com validação embutida, imutabilidade e autocomplete total em IDEs e agentes de IA.
Em vez de strings e inteiros soltos, todos os campos de domínio nos SDKs SUOT são representados por Value Objects — objetos imutáveis que carregam um valor validado, transmitem o significado exato do campo e são completamente compreensíveis por IDEs, PHPStan e agentes de IA. Se um CNPJ inválido for fornecido, o erro acontece na construção do objeto, não em algum ponto imprevisível durante a execução.
Um Value Object é um objeto cujo valor define sua identidade — dois Cnpj com o mesmo número são equivalentes, independentemente de serem instâncias diferentes. Nos SDKs SUOT, Value Objects têm três propriedades fundamentais:
Imutabilidade — após construído, o valor não pode ser alterado
Validação no construtor — dados inválidos lançam exceção imediatamente, na origem
Tipagem explícita — Cnpj não é intercambiável com Cpf, mesmo que ambos sejam strings por baixo
Essa abordagem elimina uma categoria inteira de bugs: passar um CPF onde um CNPJ é esperado torna-se um erro de tipo detectado pelo PHPStan, não um erro em produção.
A tabela abaixo lista os Value Objects presentes nos SDKs SUOT. Consulte a documentação de cada SDK para o conjunto completo.
Value Object
Representa
Exemplo de construção
Cnpj
CNPJ válido (14 dígitos, com ou sem formatação)
new Cnpj('12345678000195')
Cpf
CPF válido (11 dígitos, com ou sem formatação)
new Cpf('12345678909')
ChaveCTe
Chave de acesso do CT-e (44 dígitos)
new ChaveCTe('35240112345678000195570010000000011000000014')
ChaveMDFe
Chave de acesso do MDF-e (44 dígitos)
new ChaveMDFe('41240112345678000195580010000000021000000025')
Protocolo
Número de protocolo de autorização SEFAZ
new Protocolo('135240000012345')
InscricaoEstadual
Inscrição Estadual do emitente
new InscricaoEstadual('110042490114')
Rntrc
Registro Nacional de Transportadores Rodoviários de Cargas
new Rntrc('12345678')
Placa
Placa de veículo no padrão Mercosul ou antigo
new Placa('ABC1D23')
Value Objects aceitam strings com ou sem formatação (pontos, barras, hífens). A normalização ocorre internamente — você não precisa limpar a string antes de construir o objeto.
A validação acontece no construtor, não em um método validate() separado que você precisa lembrar de chamar. Isso significa que um Value Object que existe em memória é, por definição, válido.
<?phpuse Suot\Fiscal\ValueObjects\Cnpj;use Suot\Fiscal\ValueObjects\ChaveCTe;use Suot\Fiscal\ValueObjects\Protocolo;use Suot\Fiscal\Exceptions\InvalidValueException;// ✅ Construção bem-sucedida — CNPJ válido$cnpj = new Cnpj('12345678000195');// ❌ Lança InvalidValueException imediatamente — CNPJ com dígito verificador erradotry { $cnpjInvalido = new Cnpj('12345678000100');} catch (InvalidValueException $e) { // O erro está aqui, na origem, não dentro do Handler ou no retorno da SEFAZ. echo $e->getMessage(); // "CNPJ inválido: dígito verificador incorreto."}// ❌ Lança InvalidValueException — chave com comprimento erradotry { $chaveIncompleta = new ChaveCTe('35240112345678');} catch (InvalidValueException $e) { echo $e->getMessage(); // "ChaveCTe deve ter exatamente 44 dígitos."}
Nunca capture InvalidValueException para silenciar o erro e continuar o fluxo. Essa exceção indica que os dados de entrada são inválidos — a aplicação deve rejeitá-los antes de tentar qualquer operação fiscal ou regulatória.
Os SDKs SUOT são desenvolvidos com PHPStan ao nível máximo. Todos os métodos de Commands, Handlers e Results usam tipos concretos de Value Objects em suas assinaturas — nunca string onde um Cnpj é esperado.
<?php// O PHPStan detecta esse erro antes da execução:// Argument #1 ($emitente) of CteAutorizacaoCommand::__construct()// expects Suot\Fiscal\ValueObjects\Cnpj, string given.$command = new CteAutorizacaoCommand( emitente: '12345678000195', // ← erro de tipo detectado estaticamente chave: new ChaveCTe('35240112345678000195570010000000011000000014'), xml: $xmlAssinado,);
Isso significa que erros de integração que normalmente só apareceriam em produção são detectados no pipeline de CI — ou diretamente na sua IDE, antes mesmo de rodar o código.
A combinação de Value Objects e named arguments torna o código de integração autoexplicativo. Não é necessário consultar a documentação para entender o que cada argumento representa.
<?phpuse Suot\Antt\Rntrc\ConsultaRntrcCommand;use Suot\Antt\ValueObjects\Rntrc;use Suot\Antt\ValueObjects\Cnpj;// Named arguments + Value Objects = intent clara, sem ambiguidade$command = new ConsultaRntrcCommand( transportador: new Cnpj('98765432000188'), rntrc: new Rntrc('87654321'),);// Comparação: o mesmo código sem Value Objects e sem named arguments// $command = new ConsultaRntrcCommand('98765432000188', '87654321');// ↑ Qual é o transportador? Qual é o RNTRC? Qual é a ordem dos argumentos?// Isso só pode ser respondido consultando a assinatura do construtor.
Se a sua IDE exibir o tipo incorreto para um Value Object (por exemplo, inferir mixed em vez do tipo concreto), verifique se o PHPStan e o servidor de linguagem PHP da sua IDE estão usando a mesma versão do php.ini e do autoloader. Editores como PhpStorm e VS Code com Intelephense resolvem tipos de Value Objects automaticamente quando o Composer autoload está configurado corretamente.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"SUOT Developers","description":"Documentação técnica da SUOT para SDKs fiscais e Developer Platform. Da ordem ao resultado.","colors":{"primary":"#FB0927","light":"#FF2741","dark":"#001145"},"logo":{"light":"https://mintcdn.com/cysar-2d1c3643/NaGnsg2R12tXDxVA/logo/light.png?fit=max\u0026auto=format\u0026n=NaGnsg2R12tXDxVA\u0026q=85\u0026s=8ec5c03474e4475b58f018d87dbb9969","dark":"https://mintcdn.com/cysar-2d1c3643/NaGnsg2R12tXDxVA/logo/dark.png?fit=max\u0026auto=format\u0026n=NaGnsg2R12tXDxVA\u0026q=85\u0026s=57fc8b2883f71b8645b426d674b3235c","href":"/"},"favicon":"https://mintcdn.com/cysar-2d1c3643/NaGnsg2R12tXDxVA/logo/favicon.png?fit=max\u0026auto=format\u0026n=NaGnsg2R12tXDxVA\u0026q=85\u0026s=600ac178ef3f1fd7ae26df54736ea38c","appearance":{"default":"system","strict":false},"background":{"color":{"light":"#F5F7FA","dark":"#0c0c0c"}},"navbar":{"links":[{"href":"https://developers.suot.dev","label":"Developer Portal"}],"primary":{"type":"button","label":"Começar integração","href":"https://developers.suot.dev"}},"footer":{"socials":{"github":"https://github.com/suothub","website":"https://suot.com.br"}},"search":{"prompt":"Buscar na documentação…"},"seo":{"metatags":{"og:locale":"pt_BR"}},"fonts":{"family":"Inter"},"icons":{"library":"lucide"},"styling":{"eyebrows":"breadcrumbs","latex":false},"contextual":{"options":["copy","view","chatgpt","claude","cursor","vscode"],"display":"header"},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"cysar-2d1c3643","hasAudioNarration":false,"actualSubdomain":"cysar-2d1c3643","customDomains":["docs.suot.dev"],"gitSource":{"type":"github","owner":"suothub","repo":"developer-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae95c19cb76ddd761cc6712:success","clientVersion":"0.0.4087","searchFilterCounts":[{"language":"default","tag":"Fiscal SDK","count":59},{"language":"default","tag":"CT-e","count":18},{"language":"default","tag":"Consultas","count":14},{"language":"default","tag":"MDF-e","count":14},{"language":"default","tag":"BP-e","count":11},{"language":"default","tag":"Eventos","count":11},{"language":"default","tag":"Guias \u0026 Conceitos","count":10},{"language":"default","tag":"Início","count":7},{"language":"default","tag":"CT-e OS","count":6},{"language":"default","tag":"Visão geral","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":":root{--suot-midnight: #001145;--suot-signal: #fb0927;--suot-ink: #111827;--suot-slate: #475569;--suot-mist: #e8edf3;--suot-fog: #f5f7fa;--suot-error: #d21f2f;--suot-success: #0f9f68}#navbar img.nav-logo,#navbar .nav-logo{height:3.5rem;max-height:3.5rem;width:auto}"}],"page":{"pagePath":"conceitos/value-objects","slug":"/conceitos/value-objects","pageMetadata":{"title":"Value Objects nos SDKs SUOT — tipagem de campos fiscais","sidebarTitle":"Value Objects","description":"Os Value Objects dos SDKs SUOT encapsulam campos fiscais e regulatórios com validação embutida, imutabilidade e autocomplete total em IDEs e agentes de IA.","href":"/conceitos/value-objects"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Os Value Objects dos SDKs SUOT encapsulam campos fiscais e regulatórios com validação embutida, imutabilidade e autocomplete total em IDEs e agentes de IA.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Info,Table,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Em vez de strings e inteiros soltos, todos os campos de domínio nos SDKs SUOT são representados por `,_jsx(_components.strong,{children:`Value Objects`}),` — objetos imutáveis que carregam um valor validado, transmitem o significado exato do campo e são completamente compreensíveis por IDEs, PHPStan e agentes de IA. Se um CNPJ inválido for fornecido, o erro acontece na construção do objeto, não em algum ponto imprevisível durante a execução.`]}),`\n`,_jsx(Heading,{level:`2`,id:`o-que-é-um-value-object`,children:`O que é um Value Object`}),`\n`,_jsxs(_components.p,{children:[`Um Value Object é um objeto cujo valor define sua identidade — dois `,_jsx(_components.code,{children:`Cnpj`}),` com o mesmo número são equivalentes, independentemente de serem instâncias diferentes. Nos SDKs SUOT, Value Objects têm três propriedades fundamentais:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Imutabilidade`}),` — após construído, o valor não pode ser alterado`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Validação no construtor`}),` — dados inválidos lançam exceção imediatamente, na origem`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Tipagem explícita`}),` — `,_jsx(_components.code,{children:`Cnpj`}),` não é intercambiável com `,_jsx(_components.code,{children:`Cpf`}),`, mesmo que ambos sejam strings por baixo`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Essa abordagem elimina uma categoria inteira de bugs: passar um CPF onde um CNPJ é esperado torna-se um erro de tipo detectado pelo PHPStan, não um erro em produção.`}),`\n`,_jsx(Heading,{level:`2`,id:`value-objects-disponíveis`,children:`Value Objects disponíveis`}),`\n`,_jsx(_components.p,{children:`A tabela abaixo lista os Value Objects presentes nos SDKs SUOT. Consulte a documentação de cada SDK para o conjunto completo.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Value Object`}),_jsx(_components.th,{children:`Representa`}),_jsx(_components.th,{children:`Exemplo de construção`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Cnpj`})}),_jsx(_components.td,{children:`CNPJ válido (14 dígitos, com ou sem formatação)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`new Cnpj('12345678000195')`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Cpf`})}),_jsx(_components.td,{children:`CPF válido (11 dígitos, com ou sem formatação)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`new Cpf('12345678909')`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ChaveCTe`})}),_jsx(_components.td,{children:`Chave de acesso do CT-e (44 dígitos)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`new ChaveCTe('35240112345678000195570010000000011000000014')`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ChaveMDFe`})}),_jsx(_components.td,{children:`Chave de acesso do MDF-e (44 dígitos)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`new ChaveMDFe('41240112345678000195580010000000021000000025')`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Protocolo`})}),_jsx(_components.td,{children:`Número de protocolo de autorização SEFAZ`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`new Protocolo('135240000012345')`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`InscricaoEstadual`})}),_jsx(_components.td,{children:`Inscrição Estadual do emitente`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`new InscricaoEstadual('110042490114')`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Rntrc`})}),_jsx(_components.td,{children:`Registro Nacional de Transportadores Rodoviários de Cargas`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`new Rntrc('12345678')`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Placa`})}),_jsx(_components.td,{children:`Placa de veículo no padrão Mercosul ou antigo`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`new Placa('ABC1D23')`})})]})]})]}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`Value Objects aceitam strings com ou sem formatação (pontos, barras, hífens). A normalização ocorre internamente — você não precisa limpar a string antes de construir o objeto.`})}),`\n`,_jsx(Heading,{level:`2`,id:`validação-embutida`,children:`Validação embutida`}),`\n`,_jsxs(_components.p,{children:[`A validação acontece no construtor, não em um método `,_jsx(_components.code,{children:`validate()`}),` separado que você precisa lembrar de chamar. Isso significa que um Value Object que existe em memória é, por definição, válido.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`24`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`24`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c?`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`php`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Suot\\\\Fiscal\\\\ValueObjects\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Cnpj`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Suot\\\\Fiscal\\\\ValueObjects\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`ChaveCTe`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Suot\\\\Fiscal\\\\ValueObjects\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Protocolo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Suot\\\\Fiscal\\\\Exceptions\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`InvalidValueException`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// ✅ Construção bem-sucedida — CNPJ válido`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$cnpj`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Cnpj`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'12345678000195'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// ❌ Lança InvalidValueException imediatamente — CNPJ com dígito verificador errado`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`try`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $cnpjInvalido`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Cnpj`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'12345678000100'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`} `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`catch`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`InvalidValueException`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $e`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // O erro está aqui, na origem, não dentro do Handler ou no retorno da SEFAZ.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` echo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $e`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getMessage`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(); `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// \"CNPJ inválido: dígito verificador incorreto.\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// ❌ Lança InvalidValueException — chave com comprimento errado`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`try`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $chaveIncompleta`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` ChaveCTe`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'35240112345678'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`} `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`catch`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`InvalidValueException`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $e`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` echo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $e`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getMessage`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(); `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// \"ChaveCTe deve ter exatamente 44 dígitos.\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Nunca capture `,_jsx(_components.code,{children:`InvalidValueException`}),` para silenciar o erro e continuar o fluxo. Essa exceção indica que os dados de entrada são inválidos — a aplicação deve rejeitá-los antes de tentar qualquer operação fiscal ou regulatória.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`value-objects-e-phpstan`,children:`Value Objects e PHPStan`}),`\n`,_jsxs(_components.p,{children:[`Os SDKs SUOT são desenvolvidos com PHPStan ao nível máximo. Todos os métodos de Commands, Handlers e Results usam tipos concretos de Value Objects em suas assinaturas — nunca `,_jsx(_components.code,{children:`string`}),` onde um `,_jsx(_components.code,{children:`Cnpj`}),` é esperado.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`11`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c?`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`php`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// O PHPStan detecta esse erro antes da execução:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Argument #1 ($emitente) of CteAutorizacaoCommand::__construct()`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// expects Suot\\\\Fiscal\\\\ValueObjects\\\\Cnpj, string given.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$command`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` CteAutorizacaoCommand`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` emitente`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'12345678000195'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// ← erro de tipo detectado estaticamente`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` chave`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`new`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` ChaveCTe`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'35240112345678000195570010000000011000000014'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` xml`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$xmlAssinado`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Isso significa que erros de integração que normalmente só apareceriam em produção são detectados no pipeline de CI — ou diretamente na sua IDE, antes mesmo de rodar o código.`}),`\n`,_jsx(Heading,{level:`2`,id:`usando-value-objects-com-named-arguments`,children:`Usando Value Objects com named arguments`}),`\n`,_jsx(_components.p,{children:`A combinação de Value Objects e named arguments torna o código de integração autoexplicativo. Não é necessário consultar a documentação para entender o que cada argumento representa.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`16`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`16`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c?`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`php`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Suot\\\\Antt\\\\Rntrc\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`ConsultaRntrcCommand`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Suot\\\\Antt\\\\ValueObjects\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Rntrc`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Suot\\\\Antt\\\\ValueObjects\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Cnpj`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Named arguments + Value Objects = intent clara, sem ambiguidade`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$command`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` ConsultaRntrcCommand`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` transportador`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`new`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Cnpj`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'98765432000188'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` rntrc`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`new`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Rntrc`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'87654321'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Comparação: o mesmo código sem Value Objects e sem named arguments`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// $command = new ConsultaRntrcCommand('98765432000188', '87654321');`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// ↑ Qual é o transportador? Qual é o RNTRC? Qual é a ordem dos argumentos?`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Isso só pode ser respondido consultando a assinatura do construtor.`})}),`\n`]})})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Se a sua IDE exibir o tipo incorreto para um Value Object (por exemplo, inferir `,_jsx(_components.code,{children:`mixed`}),` em vez do tipo concreto), verifique se o PHPStan e o servidor de linguagem PHP da sua IDE estão usando a mesma versão do `,_jsx(_components.code,{children:`php.ini`}),` e do autoloader. Editores como PhpStorm e VS Code com Intelephense resolvem tipos de Value Objects automaticamente quando o Composer autoload está configurado corretamente.`]})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Value Objects nos SDKs SUOT — tipagem de campos fiscais","sidebarTitle":"Value Objects","description":"Os Value Objects dos SDKs SUOT encapsulam campos fiscais e regulatórios com validação embutida, imutabilidade e autocomplete total em IDEs e agentes de IA.","href":"/conceitos/value-objects"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"O que é um Value Object","slug":"o-que-é-um-value-object","depth":2,"children":[]},{"title":"Value Objects disponíveis","slug":"value-objects-disponíveis","depth":2,"children":[]},{"title":"Validação embutida","slug":"validação-embutida","depth":2,"children":[]},{"title":"Value Objects e PHPStan","slug":"value-objects-e-phpstan","depth":2,"children":[]},{"title":"Usando Value Objects com named arguments","slug":"usando-value-objects-com-named-arguments","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"cysar-2d1c3643","siteName":"SUOT Developers","title":"Value Objects nos SDKs SUOT — tipagem de campos fiscais - SUOT Developers","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-07-12T23:09:16.402Z","originalFileLocation":"conceitos/value-objects.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Os Value Objects dos SDKs SUOT encapsulam campos fiscais e regulatórios com validação embutida, imutabilidade e autocomplete total em IDEs e agentes de IA.\">\u003cmeta data-mint-head name=\"application-name\" content=\"SUOT Developers\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/cysar-2d1c3643/s6hVf3EOJbdwT70f/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/cysar-2d1c3643/s6hVf3EOJbdwT70f/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/cysar-2d1c3643/s6hVf3EOJbdwT70f/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/cysar-2d1c3643/s6hVf3EOJbdwT70f/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/cysar-2d1c3643/s6hVf3EOJbdwT70f/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/cysar-2d1c3643/s6hVf3EOJbdwT70f/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/cysar-2d1c3643/s6hVf3EOJbdwT70f/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/cysar-2d1c3643/s6hVf3EOJbdwT70f/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/cysar-2d1c3643/s6hVf3EOJbdwT70f/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Value Objects nos SDKs SUOT — tipagem de campos fiscais - SUOT Developers\">\u003cmeta data-mint-head property=\"og:description\" content=\"Os Value Objects dos SDKs SUOT encapsulam campos fiscais e regulatórios com validação embutida, imutabilidade e autocomplete total em IDEs e agentes de IA.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"SUOT Developers\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.suot.dev/conceitos/value-objects\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://cysar-2d1c3643.mintlify.site/_mintlify/api/og/v2?division=Conceitos\u0026amp;title=Value+Objects+nos+SDKs+SUOT+%E2%80%94+tipagem+de+campos+fiscais\u0026amp;description=Os+Value+Objects+dos+SDKs+SUOT+encapsulam+campos+fiscais+e+regulat%C3%B3rios+com+valida%C3%A7%C3%A3o+embutida%2C+imutabilidade+e+autocomplete+total+em+IDEs+e+agentes+de+IA.\u0026amp;theme=092dbeb471abad1215f4a1f4\u0026amp;signature=cd6c3edb4952c7657be3c8fcddfa1d0bff0b5f0c03188433abe54271d133ddfa\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Value Objects nos SDKs SUOT — tipagem de campos fiscais - SUOT Developers\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Os Value Objects dos SDKs SUOT encapsulam campos fiscais e regulatórios com validação embutida, imutabilidade e autocomplete total em IDEs e agentes de IA.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://cysar-2d1c3643.mintlify.site/_mintlify/api/og/v2?division=Conceitos\u0026amp;title=Value+Objects+nos+SDKs+SUOT+%E2%80%94+tipagem+de+campos+fiscais\u0026amp;description=Os+Value+Objects+dos+SDKs+SUOT+encapsulam+campos+fiscais+e+regulat%C3%B3rios+com+valida%C3%A7%C3%A3o+embutida%2C+imutabilidade+e+autocomplete+total+em+IDEs+e+agentes+de+IA.\u0026amp;theme=092dbeb471abad1215f4a1f4\u0026amp;signature=cd6c3edb4952c7657be3c8fcddfa1d0bff0b5f0c03188433abe54271d133ddfa\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/cysar-2d1c3643/s6hVf3EOJbdwT70f/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"SUOT Developers\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#FB0927\">\u003cmeta data-mint-head name=\"og:locale\" content=\"pt_BR\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.suot.dev/conceitos/value-objects\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/conceitos/value-objects.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.suot.dev/#organization\",\"name\":\"SUOT Developers\",\"url\":\"https://docs.suot.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/cysar-2d1c3643/NaGnsg2R12tXDxVA/logo/light.png?fit=max\u0026auto=format\u0026n=NaGnsg2R12tXDxVA\u0026q=85\u0026s=8ec5c03474e4475b58f018d87dbb9969\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.suot.dev#website\",\"name\":\"SUOT Developers\",\"url\":\"https://docs.suot.dev\",\"publisher\":{\"@id\":\"https://docs.suot.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.suot.dev/conceitos/value-objects#webpage\",\"url\":\"https://docs.suot.dev/conceitos/value-objects\",\"name\":\"Value Objects nos SDKs SUOT — tipagem de campos fiscais\",\"description\":\"Os Value Objects dos SDKs SUOT encapsulam campos fiscais e regulatórios com validação embutida, imutabilidade e autocomplete total em IDEs e agentes de IA.\",\"dateModified\":\"2026-07-12T23:09:16.402Z\",\"isPartOf\":{\"@id\":\"https://docs.suot.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.suot.dev/conceitos/value-objects#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.suot.dev/conceitos/value-objects#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Conceitos\",\"item\":\"https://docs.suot.dev/conceitos/arquitetura\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Value Objects nos SDKs SUOT — tipagem de campos fiscais\",\"item\":\"https://docs.suot.dev/conceitos/value-objects\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.suot.dev/conceitos/value-objects#article\",\"headline\":\"Value Objects nos SDKs SUOT — tipagem de campos fiscais\",\"name\":\"Value Objects nos SDKs SUOT — tipagem de campos fiscais\",\"description\":\"Os Value Objects dos SDKs SUOT encapsulam campos fiscais e regulatórios com validação embutida, imutabilidade e autocomplete total em IDEs e agentes de IA.\",\"url\":\"https://docs.suot.dev/conceitos/value-objects\",\"mainEntityOfPage\":{\"@id\":\"https://docs.suot.dev/conceitos/value-objects#webpage\"},\"dateModified\":\"2026-07-12T23:09:16.402Z\",\"publisher\":{\"@id\":\"https://docs.suot.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.suot.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"SUOT Developers\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"SUOT Developers","nav":{"global":null,"tabs":[{"tab":"Início","pages":[{"title":"Início","href":""}]},{"tab":"Fiscal SDK","pages":[{"title":"Fiscal SDK","href":"/fiscal/visao-geral"}]},{"tab":"Guias \u0026 Conceitos","groups":[{"group":"Guias","pages":[{"title":"Guia de homologação — teste o SUOT SDK antes da produção","sidebarTitle":"Homologação","href":"/guias/homologacao"},{"title":"Checklist de produção — deploy do SUOT SDK em produção","sidebarTitle":"Produção","href":"/guias/producao"},{"title":"Usando os SDKs SUOT com IDEs e agentes de IA","sidebarTitle":"IDEs \u0026 IA","href":"/guias/ides-ia"}]},{"group":"Conceitos","pages":[{"title":"Arquitetura dos SDKs SUOT — Command, Handler e Result","sidebarTitle":"Arquitetura","description":"Entenda a arquitetura dos SDKs SUOT baseada em CQRS: Command imutável, Handler que executa a operação e Result tipado que encapsula o resultado.","href":"/conceitos/arquitetura"},{"title":"Value Objects nos SDKs SUOT — tipagem de campos fiscais","sidebarTitle":"Value Objects","href":"/conceitos/value-objects"},{"title":"Padrão CQRS nos SDKs SUOT — Command, Query e Result","sidebarTitle":"CQRS","description":"Veja como os SDKs SUOT aplicam o padrão CQRS: Commands imutáveis, Handlers especializados e Results tipados para todas as operações fiscais e regulatórias.","href":"/conceitos/cqrs"},{"title":"Licenciamento SUOT — organização, tokens e vencimento","sidebarTitle":"Licenciamento","href":"/conceitos/licenciamento"}]},{"group":"Suporte","pages":[{"title":"Glossário SUOT — termos fiscais, regulatórios e de SDK","sidebarTitle":"Glossário","href":"/suporte/glossario"},{"title":"Atualizações dos SDKs SUOT — versionamento e upgrade","sidebarTitle":"Atualizações","href":"/suporte/atualizacoes"},{"title":"Suporte técnico SUOT — canais e como abrir solicitações","sidebarTitle":"Contato","href":"/suporte/contato"}]}]}]},"basePath":"","title":"Value Objects nos SDKs SUOT — tipagem de campos fiscais - SUOT Developers","buildId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","deploymentId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","dynamics":[],"chunks":[]}