Módulo: DDO - Documentos de Descentralização Orçamentária
📋 Módulo: DDO - Documentos de Descentralização Orçamentária
Sistema completo de gestão de DDOs com funcionalidades de solicitação, controle, geração de documentos e acompanhamento de status
📋 Visão Geral do Módulo
ℹ️ Sobre este Módulo
- Função Principal: Gerenciar todo o ciclo de vida dos DDOs
- Telas: 4 telas
- Tipos de DDO: Novo (Programação), Novo (Demanda), Passivo
- Integração: SEI (Sistema Eletrônico de Informações)
🗂️ Telas do Módulo
🎯 DDO_Controle_1
Controle e acompanhamento geral
➕ DDO_Novo
Solicitar DDO (origem: programação)
➕ DDO_Novo_1
Solicitar DDO (origem: demanda)
📊 DDO_Passivo
DDOs passivos e histórico
🎯 Tela: DDO_Controle_1
Controle Geral de DDOs
Tipo: Tela de Controle e Listagem
Acesso: APMD e Gestores
📊 Estatísticas da Tela
🎯 Gallery_ControleDDO
📋 Gallery Principal
Template: a416f0ee-80e6-4045-8071-082efbc05963
Items: BaseControleDDO_PorObjeto
Colunas Exibidas
| Controle | Campo | Descrição |
|---|---|---|
| ID_Destino_DDO | ID Destino | ID da programação/demanda destino |
| Objeto_DDO | Objeto | Nome/descrição do objeto |
| ObjetosAssociados_DDO | Objetos Associados | Lista de objetos vinculados |
| Sei_DDO | SEI | Número do processo SEI |
| TextID_Destino_DDO | ID Destino (Text) | Versão texto do ID |
| TextOBJAssociados_DDO | Objetos (Text) | Texto dos objetos associados |
| TextObjeto_DDO | Objeto (Text) | Texto do objeto principal |
| TextSEI_DDO | SEI (Text) | Texto do número SEI |
🔍 Sistema de Filtros
| Controle | Tipo | Campo Filtrado |
|---|---|---|
| scObjeto_11 | TextInputCanvas | Objeto do DDO |
| scObjeto_DDO | TextInputCanvas | Objeto (alternativo) |
| scSiafiEntrada_8 | TextInputCanvas | SIAFI Entrada |
| ButtonCanvas30_1 | ButtonCanvas | Aplicar filtros |
Lógica de Filtro da Gallery:
Filter(
BaseControleDDO_PorObjeto,
If(!IsBlank(scObjeto_DDO.Text),
StartsWith(Objeto, scObjeto_DDO.Text),
true
),
If(!IsBlank(scSiafiEntrada_8.Text),
'SIAFI Entrada' = scSiafiEntrada_8.Text,
true
)
)
🎬 Botões de Ação
➕ Button_AdicionarNovo
Função: Solicitar novo DDO (origem: programação)
OnSelect:
Navigate(DDO_Novo, ScreenTransition.Fade)➕ Button_AdicionarPassivo
Função: Acessar DDOs passivos
OnSelect:
Navigate(DDO_Passivo, ScreenTransition.Fade)➕ Tela: DDO_Novo
Solicitar DDO - Origem: Programação
Tipo: Seleção e Solicitação
Origem dos Dados: PlanejamentoGeral2025
📊 Estatísticas da Tela
⚙️ Evento OnVisible
ClearCollect(
colBaseDDO,
Filter(
PlanejamentoGeral2025,
Status = "Ativo",
IsBlank('DDO Gerado') || 'DDO Gerado' = false
)
)
🎯 Gallery4_3 - Seleção de Programações
📋 Gallery de Seleção
Template: galleryTemplate4_3
Items: colBaseDDO (filtrada)
Componentes da Gallery:
// CheckboxCanvas1 - Seleção
OnCheck: Collect(colDDO, ThisItem)
OnUncheck: Remove(colDDO, LookUp(colDDO, ID = ThisItem.ID))
// Campos exibidos
TextCanvas4_112: ThisItem.ID
TextCanvas4_21: ThisItem.Ação
TextCanvas4_22: ThisItem.'E.I.'
TextCanvas4_23: ThisItem.Objeto
TextCanvas4_24: ThisItem.'U.A'
TextCanvas4_25: Text(ThisItem.Replanejado, "R$ #,##0.00")
TextCanvas4_60: ThisItem.'SIAFI entrada'
TextCanvas4_63: ThisItem.Status
🔍 Filtros Disponíveis
🔢 scID
Items: Distinct(colBaseDDO, ID)
OnChange:
Set(searchIDelecionado, Self.Selected.Result);
Set(searchIDValor, Self.Selected.Result)📊 scEI_1
Items: Distinct(colBaseDDO, 'E.I.')
💰 scFonte_1
Items: Distinct(colBaseDDO, Fonte)
📋 scGrupo_1
Items: Distinct(colBaseDDO, Grupo)
🎯 scObjeto_1
Type: TextInputCanvas
🏢 scProcedencia_1
Items: Distinct(colBaseDDO, Procedência)
🔢 scSiafiEntrada_1
Type: TextInputCanvas
🔢 scSiafiSaida_1
Type: TextInputCanvas
📝 Campos do Formulário
📄 TextInputCanvas7 - Número SEI
Hint: "Digite o número do processo SEI"
Obrigatório: ✅ Sim
📋 TextInputCanvas7_1 - Observações
Mode: MultiLine
Obrigatório: ❌ Não
🎯 textModalidade
Hint: "Modalidade do DDO"
💰 TextInputCanvas6 - Valor Total
Default:
Text(Sum(colDDO, Replanejado), "R$ #,##0.00")DisplayMode: View
📊 TextInputCanvas6_2 - Quantidade
Default:
Text(CountRows(colDDO))DisplayMode: View
✅ CheckboxCanvas3 - Selecionar Todos
Default: false
OnCheck:
ClearCollect(colDDO, Gallery4_3.AllItems)
OnUncheck:
Clear(colDDO)
🎬 Ações Principais
💾 ButtonCanvas10 - Gerar DDO
OnSelect:
If(
CountRows(colDDO) = 0,
Notify("Selecione ao menos um item", NotificationType.Warning);
Exit(),
IsBlank(TextInputCanvas7.Text),
Notify("Informe o número do processo SEI", NotificationType.Warning);
Exit()
);
UpdateContext({visLoading: true});
Set(varImagem, First(Shuffle(colImagensLoading)).Imagem);
ForAll(
colDDO,
Patch(
BaseControleDDO,
Defaults(BaseControleDDO),
{
‘ID Programação’: ThisRecord.ID,
Objeto: ThisRecord.Objeto,
‘Número SEI’: TextInputCanvas7.Text,
Modalidade: textModalidade.Text,
Observações: TextInputCanvas7_1.Text,
‘Valor Total’: ThisRecord.Replanejado,
Status: “Pendente”,
‘Data Criação’: Now(),
‘Criado Por’: UsuáriosdoOffice365.MyProfileV2().mail,
Ação: ThisRecord.Ação,
‘E.I.’: ThisRecord.‘E.I.’,
‘U.A’: ThisRecord.‘U.A’,
Fonte: ThisRecord.Fonte,
Grupo: ThisRecord.Grupo,
Procedência: ThisRecord.Procedência,
‘SIAFI Entrada’: ThisRecord.‘SIAFI entrada’,
‘SIAFI Saída’: ThisRecord.‘SIAFI saida’
}
);
Patch(
PlanejamentoGeral2025,
LookUp(PlanejamentoGeral2025, ID = ThisRecord.ID),
{
'DDO Gerado': true,
'Data DDO': Now()
}
)
);
Clear(colDDO);
Reset(CheckboxCanvas3);
Reset(TextInputCanvas7);
Reset(TextInputCanvas7_1);
Reset(textModalidade);
Set(Timer3.Start, true);
UpdateContext({visLoading: false});
Notify(“DDO(s) gerado(s) com sucesso!”, NotificationType.Success)
📄 ButtonCanvas10_2 - Gerar HTML/PDF
OnSelect:
If(
CountRows(colDDO) = 0,
Notify("Selecione itens para gerar o documento", NotificationType.Warning);
Exit()
);
Set(varlinkSEI, TextInputCanvas7.Text);
‘Teste_DDO_Html’.Run(
JSON(colDDO),
varlinkSEI,
textModalidade.Text,
TextInputCanvas7_1.Text
);
Notify(“Documento sendo gerado…”, NotificationType.Information)
⏱️ Timer3
Duration: 3000
AutoStart: false
OnTimerEnd:
UpdateContext({visLoading: false})
➕ Tela: DDO_Novo_1
Solicitar DDO - Origem: Demanda
Tipo: Seleção e Solicitação
Origem dos Dados: BaseDemandasOrcamentarias2025
📊 Estatísticas da Tela
⚙️ Evento OnVisible
ClearCollect(
colBaseDDO,
Filter(
BaseDemandasOrcamentarias2025,
Status = "Ativo",
IsBlank('DDO Gerado') || 'DDO Gerado' = false
)
)
🎯 Gallery_SolicitarDDO
📋 Gallery de Seleção
Template: 36367dcc-ea5b-4ae5-a3d3-a274dbbebf4b
Items: colBaseDDO (filtrada)
Componentes:
// Checkbox_Gallery_SolicitarDDO
OnCheck: Collect(colDDO, ThisItem)
OnUncheck: Remove(colDDO, LookUp(colDDO, ID = ThisItem.ID))
// Campos exibidos
Text_AcaoDDO: ThisItem.Ação
Text_EI_DDO: ThisItem.'E.I.'
Text_ID_DDO: ThisItem.ID
Text_ObjetoDDO: ThisItem.Título
Text_ValorLOA: Text(ThisItem.'Valor LOA', "R$ #,##0.00")
Text_ValorNaoComprometido: Text(
ThisItem.'Valor LOA' - ThisItem.'Valor Comprometido',
"R$ #,##0.00"
)
// Text_Valor_SolicitarDDO - Campo editável
Value: Text(ThisItem.'Valor Disponível', "R$ #,##0.00")
Format: Currency
🔍 Filtros Disponíveis
| Controle | Items/Fonte |
|---|---|
| scID_1 | Distinct(colBaseDDO, ID) |
| sc_EI3 | Distinct(colBaseDDO, ‘E.I.’) |
| scFonte_6 | Distinct(colBaseDDO, Fonte) |
| scGrupo_16 | Distinct(colBaseDDO, Grupo) |
| scObjeto_8 | TextInputCanvas (busca texto) |
| scProcedencia_6 | Distinct(colBaseDDO, Procedência) |
| scSiafiEntrada_7 | TextInputCanvas |
| scSiafiSaida_5 | TextInputCanvas |
| sc_Acao3 | Distinct(colBaseDDO, Ação) |
OnChange dos Filtros:
// sc_EI3.OnChange
Set(searchIDelecionado, Self.Selected);
Set(searchIDValor, Self.Selected.Result);
📝 Formulário
📄 TextInput_SEI_DDO
Obrigatório: ✅ Sim
📝 TextInput_Objeto_DDO
Mode: MultiLine
💰 TextCanvas_ValorTotal_DDO
Text:
"Valor Total: " & Text(
Sum(colDDO, Value(Text_Valor_SolicitarDDO.Text)),
"R$ #,##0.00"
)📊 TextCanvas6_5
Text:
"Total de Itens: " & CountRows(colDDO)🎬 Ações Principais
💾 Button_GerarDDO
OnSelect:
If(
CountRows(colDDO) = 0,
Notify("Selecione ao menos uma demanda", NotificationType.Warning);
Exit(),
IsBlank(TextInput_SEI_DDO.Text),
Notify("Informe o número do processo SEI", NotificationType.Warning);
Exit()
);
UpdateContext({visLoading: true});
Set(varImagem, First(Shuffle(colImagensLoading)).Imagem);
ForAll(
colDDO,
Patch(
BaseControleDDO,
Defaults(BaseControleDDO),
{
‘ID Demanda’: ThisRecord.ID,
Objeto: ThisRecord.Título,
‘Número SEI’: TextInput_SEI_DDO.Text,
‘Valor Solicitado’: Value(
LookUp(
Gallery_SolicitarDDO.AllItems,
ID = ThisRecord.ID
).Text_Valor_SolicitarDDO.Text
),
Status: “Pendente Demanda”,
‘Data Criação’: Now(),
‘Criado Por’: UsuáriosdoOffice365.MyProfileV2().mail,
Ação: ThisRecord.Ação,
‘E.I.’: ThisRecord.‘E.I.’,
‘U.A’: ThisRecord.‘U.A’,
Fonte: ThisRecord.Fonte,
Grupo: ThisRecord.Grupo,
Procedência: ThisRecord.Procedência
}
);
Patch(
BaseDemandasOrcamentarias2025,
ThisRecord,
{
'DDO Gerado': true,
'Data DDO': Now(),
'Valor Comprometido': ThisRecord.'Valor Comprometido' +
Value(
LookUp(
Gallery_SolicitarDDO.AllItems,
ID = ThisRecord.ID
).Text_Valor_SolicitarDDO.Text
)
}
)
);
Clear(colDDO);
Reset(CheckboxCanvas3_2);
Reset(TextInput_SEI_DDO);
Set(Timer3_1.Start, true);
UpdateContext({visLoading: false});
Notify(“DDO(s) de demanda gerado(s)!”, NotificationType.Success)
🧪 ButtonTeste
OnSelect:
Set(varlinkSEI, TextInput_SEI_DDO.Text);
‘Teste_DDO_Html’.Run(
JSON(colDDO),
varlinkSEI,
TextInput_Objeto_DDO.Text,
""
);
Notify(“Teste de geração iniciado”, NotificationType.Information)
🔄 Button_LimparFiltros3
OnSelect:
Reset(scID_1);
Reset(sc_EI3);
Reset(scFonte_6);
Reset(scGrupo_16);
Reset(scObjeto_8);
Reset(scProcedencia_6);
Reset(scSiafiEntrada_7);
Reset(scSiafiSaida_5);
Reset(sc_Acao3);
ClearCollect(
colBaseDDO,
Filter(
BaseDemandasOrcamentarias2025,
Status = “Ativo”,
IsBlank(‘DDO Gerado’) || ‘DDO Gerado’ = false
)
)
✅ CheckboxCanvas3_2 - Selecionar Todos
OnCheck: ClearCollect(colDDO, Gallery_SolicitarDDO.AllItems)
OnUncheck: Clear(colDDO)
📊 Tela: DDO_Passivo
DDOs Passivos e Histórico
Tipo: Visualização e Edição
Função: Gerenciar DDOs já processados ou passivos
📊 Estatísticas da Tela
🎯 Gallery4_5 - DDOs Passivos
📋 Gallery Principal
Template: galleryTemplate4_5
Items:
Filter(
BaseControleDDO,
Status = "Passivo" || Status = "Concluído"
)
SortByColumns(Filter(...), "Created", Descending)Componentes da Gallery:
// CheckboxCanvas1_1 - Seleção
OnCheck: Collect(colDDO, ThisItem)
OnUncheck: Remove(colDDO, LookUp(colDDO, ID = ThisItem.ID))
// Campos exibidos
TextCanvas4_32: ThisItem.ID
TextCanvas4_33: ThisItem.Objeto
TextCanvas4_34: ThisItem.'Número SEI'
TextCanvas4_35: ThisItem.Status
TextCanvas4_36: Text(ThisItem.'Valor Total', "R$ #,##0.00")
TextCanvas4_45: Text(ThisItem.Created, "dd/mm/yyyy")
// TextInputCanvas6_3, 6_4, 6_5 - Campos editáveis
Value: valores do ThisItem
🔍 Filtros
| Controle | Tipo | Items/Fonte |
|---|---|---|
| scEI_2 | ComboboxCanvas | Distinct(BaseControleDDO, ‘E.I.’) |
| scFonte_2 | ComboboxCanvas | Distinct(BaseControleDDO, Fonte) |
| scGrupo_2 | ComboboxCanvas | Distinct(BaseControleDDO, Grupo) |
| scObjeto_4 | TextInputCanvas | Busca por texto |
| scProcedencia_2 | ComboboxCanvas | Distinct(BaseControleDDO, Procedência) |
| scSiafiEntrada_3 | TextInputCanvas | SIAFI Entrada |
| scSiafiSaida_2 | TextInputCanvas | SIAFI Saída |
| scID_3 | ComboboxCanvas | Distinct(BaseControleDDO, ID) |
| scEI_14 | ComboboxCanvas | Items alternativos |
📋 Modo Detalhamento (visDetalhar)
📦 Visibilidade
Variável: visDetalhar
Ativação: ButtonCanvas5_4.OnSelect
Campos Detalhados Visíveis:
Botões de Campo (Button1_95 a 1_136)
15 botões de campo para labels/títulos
Dropdowns (DropdownCanvas10_4, 10_5)
2 dropdowns para seleção de classificação
TextInputs (TextInputCanvas5_16 a 5_22)
7 campos de entrada de texto editáveis
TextCanvas (TextCanvas4_20, 4_30, 4_31)
3 labels informativos
📱 Menus Laterais
Controle de Visibilidade dos Menus:
// AppLogo1_31.OnSelect - Toggle menu principal
UpdateContext({
visMenu: !visMenu,
visMenu2: false,
visMenu3: false,
visMenu4: false,
visMenu5: false
})
// Button5_3.OnSelect - Navegar entre menus
UpdateContext({
visMenu: false,
visMenu2: !visMenu2
})
// Rectangle5_8.OnSelect - Fechar menus (overlay)
UpdateContext({
visMenu: false,
visMenu2: false,
visMenu3: false,
visMenu4: false,
visMenu5: false
})
🎬 Ações Principais
👁️ ButtonCanvas5_4 - Detalhar
OnSelect:
UpdateContext({visDetalhar: !visDetalhar})💾 ButtonCanvas10_1 - Salvar Alterações
OnSelect:
UpdateContext({visLoading: true});
Set(varImagem, First(Shuffle(colImagensLoading)).Imagem);
ForAll(
Filter(Gallery4_5.AllItems, CheckboxCanvas1_1.Value = true),
Patch(
BaseControleDDO,
ThisRecord,
{
// Atualiza campos editados
Campo1: TextInputCanvas5_16.Text,
Campo2: TextInputCanvas5_17.Text,
Campo3: TextInputCanvas5_18.Text,
Campo4: TextInputCanvas5_19.Text,
Campo5: TextInputCanvas5_20.Text,
Campo6: TextInputCanvas5_21.Text,
Campo7: TextInputCanvas5_22.Text,
‘Última Modificação’: Now(),
‘Modificado Por’: UsuáriosdoOffice365.MyProfileV2().mail
}
)
);
UpdateContext({visLoading: false});
Notify(“Alterações salvas!”, NotificationType.Success);
Refresh(BaseControleDDO)
🗑️ Button1_129 - Excluir DDO
OnSelect:
If(
Confirm("Tem certeza que deseja excluir este(s) DDO(s)?"),
Set(varAcao, "Excluir");
ForAll(
Filter(Gallery4_5.AllItems, CheckboxCanvas1_1.Value = true),
Remove(BaseControleDDO, ThisRecord)
);
Notify("DDO(s) excluído(s)", NotificationType.Warning);
Refresh(BaseControleDDO)
)
📊 Button5_3 - Abrir Submenu
OnSelect:
UpdateContext({
visMenu: false,
visMenu2: true,
visMenu3: false,
visMenu4: false,
visMenu5: false
})🎨 Elementos Visuais
📐 Rectangle5_7
Container do modo detalhamento
Visible: visDetalhar
📐 Rectangle5_8
Overlay dos menus laterais
Visible: visMenu || visMenu2 || ...
OnSelect: Fecha todos os menus
📐 Rectangle7_12, 7_13
Separadores visuais do detalhamento
Visible: visDetalhar
🎨 TextCanvas3_6
Título do menu lateral
Visible: visMenu
📊 Variáveis Globais do Módulo
| Variável | Tipo | Escopo | Função |
|---|---|---|---|
| colBaseDDO | Table | Global | Dados base para seleção (Programação ou Demanda) |
| colDDO | Table | Global | Itens selecionados para gerar DDO |
| varlinkSEI | Text | Global | Número do processo SEI |
| varImagem | Text | Global | Imagem de loading selecionada |
| varAcao | Text | Global | Ação atual (Excluir, Editar, etc.) |
Variáveis de Contexto
| Variável | Tipo | Tela | Função |
|---|---|---|---|
| visLoading | Boolean | Todas | Mostra/oculta tela de loading |
| visDetalhar | Boolean | DDO_Passivo | Mostra/oculta campos detalhados |
| visMenu | Boolean | DDO_Passivo | Menu lateral principal |
| visMenu2 | Boolean | DDO_Passivo | Submenu 1 |
| visMenu3 | Boolean | DDO_Passivo | Submenu 2 |
| visMenu4 | Boolean | DDO_Passivo | Submenu 3 |
| visMenu5 | Boolean | DDO_Passivo | Submenu 4 |
Variáveis de Filtro
🔍 Padrão de Filtros
Similar aos outros módulos, com variáveis search* para cada campo filtrável
📊 Collections do Módulo
| Collection | Criada em | Função |
|---|---|---|
| colBaseDDO | OnVisible (DDO_Novo, DDO_Novo_1) | Base de dados disponíveis para DDO |
| colDDO | Durante seleção | Itens selecionados temporariamente |
| colImagensLoading | OnStart (App) | Imagens para loading |
📚 Fontes de Dados Utilizadas
| Fonte de Dados | Tipo | Função no Módulo |
|---|---|---|
| BaseControleDDO | SharePoint List | Registro principal de DDOs |
| BaseControleDDO_PorObjeto | SharePoint List View | Vista agrupada por objeto |
| PlanejamentoGeral2025 | SharePoint List | Fonte para DDOs de programação |
| BaseDemandasOrcamentarias2025 | SharePoint List | Fonte para DDOs de demanda |
| Teste_DDO_Html | Power Automate Flow | Geração de documento HTML/PDF |
| UsuáriosdoOffice365 | Office 365 Connector | Informações do usuário |
🔗 Fluxo de Navegação do Módulo
graph TD
A[Capa_Nova] --> B[DDO_Controle_1]
B --> C[DDO_Novo]
B --> D[DDO_Passivo]
C --> E[Seleciona Programações]
D --> F[Visualiza/Edita DDOs Passivos]
E --> G[Gera DDO]
G --> H[Atualiza BaseControleDDO]
G --> I[Marca Programação]
J[Demandas] --> K[DDO_Novo_1]
K --> L[Seleciona Demandas]
L --> M[Gera DDO]
M --> H
M --> N[Atualiza Demanda]
H --> O[Power Automate]
O --> P[Gera HTML/PDF]
P --> Q[Processo SEI]
style A fill:#667eea
style B fill:#28a745
style C fill:#17a2b8
style D fill:#ffc107
style E fill:#6f42c1
style F fill:#fd7e14
style G fill:#20c997
style K fill:#17a2b8
style O fill:#dc3545💡 Dicas de Uso do Módulo
📋 Duas Origens de DDO
O sistema permite criar DDOs de duas formas:
- DDO_Novo: A partir de programações já aprovadas
- DDO_Novo_1: A partir de demandas orçamentárias
Cada tipo tem seu próprio fluxo e controle de valores.
✅ Seleção Múltipla
Use o checkbox "Selecionar Todos" para agilizar a criação de DDOs com múltiplos itens. Isso é especialmente útil para DDOs que agrupam várias programações/demandas relacionadas.
📄 Geração de Documentos
O botão "Gerar HTML/PDF" chama um flow do Power Automate que:
- Formata os dados em HTML
- Converte para PDF
- Pode anexar automaticamente ao processo SEI
🔍 Filtros Inteligentes
Os filtros são específicos para cada tipo de DDO. Use-os para encontrar rapidamente programações/demandas elegíveis para descentralização.
📊 DDOs Passivos
A tela DDO_Passivo mantém histórico completo de todos os DDOs já processados, permitindo consulta e edição quando necessário.
💰 Controle de Valores
Em DDOs de demanda, o valor pode ser editado individualmente para cada item. O sistema calcula automaticamente o valor total e atualiza o "Valor Comprometido" da demanda.
🔗 Vínculo com SEI
O número SEI é obrigatório e cria o vínculo entre o DDO e o processo no Sistema Eletrônico de Informações.
⏱️ Loading com Variedade
As imagens de loading são escolhidas aleatoriamente da collection, tornando a experiência mais agradável durante operações demoradas.
⚠️ Considerações Importantes
🔐 Número SEI Obrigatório
Não é possível gerar DDO sem informar o número do processo SEI. Este campo é validado antes de qualquer operação.
🔄 Marca Permanente
Ao gerar um DDO, a programação/demanda é marcada com 'DDO Gerado' = true. Isso impede que o mesmo item seja usado novamente para gerar outro DDO.
💾 Collections Temporárias
As collections colBaseDDO e colDDO são recriadas a cada vez que a tela é aberta. Sair da tela sem gerar o DDO limpa toda a seleção.
📄 Power Automate
A geração de HTML/PDF depende do flow Teste_DDO_Html estar ativo e configurado corretamente. Verifique o status do flow se a geração falhar.
🗑️ Exclusão de DDOs
Excluir um DDO NÃO reverte a marca na programação/demanda original. Se necessário reverter, edite manualmente o campo 'DDO Gerado' na lista.
📊 Valores em DDOs de Demanda
Ao gerar DDO de demanda, o sistema adiciona o valor ao campo 'Valor Comprometido'. Certifique-se de que há saldo disponível antes de gerar.
🎯 Status dos DDOs
DDOs de programação recebem status "Pendente", enquanto DDOs de demanda recebem "Pendente Demanda". Isso permite filtrar e acompanhar cada tipo separadamente.
🔧 Troubleshooting
❓ Problema: Programação não aparece na seleção
Causas Possíveis:
- Status diferente de "Ativo"
- Já possui DDO gerado (DDO Gerado = true)
- Filtros muito restritivos aplicados
Solução:
// Verificar no SharePoint
Status = "Ativo" E
('DDO Gerado' = false OU IsBlank('DDO Gerado'))❓ Problema: Erro ao gerar DDO
Verificar:
- Número SEI foi preenchido?
- Há itens selecionados em colDDO?
- Permissões de edição na lista BaseControleDDO?
Debug:
// Adicionar label temporário
"SEI: " & TextInputCanvas7.Text &
" | Itens: " & CountRows(colDDO)❓ Problema: Documento HTML não é gerado
Verificar:
- Flow 'Teste_DDO_Html' está ativo?
- Flow tem permissões corretas?
- JSON da collection está sendo gerado corretamente?
Teste:
// ButtonTeste.OnSelect
Set(varlinkSEI, TextInput_SEI_DDO.Text);
'Teste_DDO_Html'.Run(
JSON(colDDO),
varlinkSEI,
"Teste",
"Observação teste"
)❓ Problema: Menu lateral não abre
Causa: Variáveis de visibilidade não inicializadas
Solução:
// No OnVisible da tela
UpdateContext({
visMenu: false,
visMenu2: false,
visMenu3: false,
visMenu4: false,
visMenu5: false
})📝 Checklist de Implementação
✅ Antes de Usar o Módulo
- ☐ Listas SharePoint criadas (BaseControleDDO, BaseControleDDO_PorObjeto)?
- ☐ Flow 'Teste_DDO_Html' configurado e ativo?
- ☐ Permissões de edição nas listas?
- ☐ Campos 'DDO Gerado' e 'Data DDO' existem em PlanejamentoGeral2025?
- ☐ Campos 'DDO Gerado', 'Valor Comprometido' existem em BaseDemandasOrcamentarias2025?
- ☐ Collection colImagensLoading foi criada no OnStart?
- ☐ Conexão Office 365 está ativa?
- ☐ Teste de geração de DDO de programação?
- ☐ Teste de geração de DDO de demanda?
- ☐ Teste de geração de documento HTML/PDF?
- ☐ Validação do vínculo com SEI?
- ☐ Teste de edição de DDOs passivos?
- ☐ Teste de exclusão de DDOs?
📈 Fluxo Completo de Geração de DDO
🔄 Processo Completo
1️⃣ Seleção
Usuário acessa DDO_Novo ou DDO_Novo_1 e seleciona programações/demandas
2️⃣ Preenchimento
Informa número SEI, modalidade e observações
3️⃣ Validação
Sistema valida campos obrigatórios e itens selecionados
4️⃣ Gravação
Cria registros em BaseControleDDO para cada item selecionado
5️⃣ Atualização
Marca programações/demandas como tendo DDO gerado
6️⃣ Documento (Opcional)
Gera documento HTML/PDF via Power Automate
7️⃣ SEI (Opcional)
Documento pode ser anexado automaticamente ao processo SEI
8️⃣ Acompanhamento
DDO aparece em DDO_Controle_1 para acompanhamento
9️⃣ Conclusão
Após processado, DDO passa para status "Passivo" ou "Concluído"
🔟 Histórico
DDO concluído fica disponível em DDO_Passivo para consulta