Parâmetro de Obrigatoriedade do Técnico nas Horas Trabalhadas
Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Pedidos / O.S. → Opção 1 → "Horas Trabalhadas Obrigatório [MPD005]" Tabela:
PARMFATUR.ST_OBRIGATECNICOValor padrão:N(Não — técnico não obrigatório)
Parâmetro dependente de
ST_ORDEMSERVICO: este parâmetro só é visível e editável em MFA001 quando o Modelo de Ordem de Serviço (ST_ORDEMSERVICO) está definido comoH(Horas Trabalhadas). Em qualquer outro modo (KouO), oAfterPostdo MFA001 forçaST_OBRIGATECNICO = 'N'e oOnChangeoculta o componente.
Telas impactadas
| Módulo | Código | Papel | Descrição |
|---|---|---|---|
| Parâmetros de Faturamento | MFA001 | Produtor (grava) | Tela onde o parâmetro é definido. Gravação está condicionada ao valor de ST_ORDEMSERVICO |
| Aplicação de Serviços / Ordem de Serviço | MPD005 | Consumidor (lê) | Carrega ST_OBRIGATECNICO ao abrir a tela e usa o valor para validar a aba de Horas Trabalhadas (tabela ORDEMSERVHORA) |
| Replicação de Parâmetros (Recapadora) | RCA006 | Replicador | SELECT/INSERT/UPDATE completos de PARMFATUR para replicação entre empresas (sem lógica de negócio sobre o campo) |
| Replicação de Parâmetros (Pedido) | CPD009 | Replicador | SELECT/INSERT/UPDATE completos de PARMFATUR (sem lógica de negócio sobre o campo) |
Campos envolvidos
| Campo | Tabela | Descrição |
|---|---|---|
ST_OBRIGATECNICO | PARMFATUR | Parâmetro booleano (S/N) — exige técnico nas horas trabalhadas da OS |
ST_ORDEMSERVICO | PARMFATUR | Parâmetro pai — define o modelo de medição da OS (H/K/O). Só permite habilitar ST_OBRIGATECNICO quando = 'H' |
CD_PESSOA | ORDEMSERVHORA | Código do técnico/mecânico que executou as horas. Quando ST_OBRIGATECNICO = 'S', não pode ficar em branco |
QT_HORAS | ORDEMSERVHORA | Quantidade de horas registradas. Quando ST_OBRIGATECNICO = 'S', também é validada ao salvar a aba |
Opções disponíveis
O componente é um
TwwDBComboBoxcomStyle = csDropDownList(somente seleção). As duas opções exatas estão emUMFA001.dfm(linhas 9224-9226):
Sim→SNão→N
S - Sim (técnico obrigatório)
| O que faz | Detalhe |
|---|---|
| Efeito em MFA001 | Grava ST_OBRIGATECNICO = 'S' quando ST_ORDEMSERVICO = 'H'. Caso ST_ORDEMSERVICO seja alterado para K ou O antes de salvar, o valor é revertido para N automaticamente (UMFA001.pas:1052-1056) |
Efeito em MPD005 — ao salvar registro de horas (tabORDEMSERVHORAAfterPost / gravação) | Se CD_PESSOA estiver em branco, lança W-2061 = "É Obrigatório Informar o Técnico!" e move o foco para a aba pagORDEMSERVITEM (UdmMPD005.pas:1870-1876) |
| Efeito em MPD005 — validação de horas | Se QT_HORAS estiver em branco, lança W-2062 = "É Obrigatório Informar a quantidade de Horas do Técnico!" (UdmMPD005.pas:1880-1883) |
Efeito em MPD005 — ao fechar OS (btnFecharClick) | Percorre todos os itens da OS (tabORDEMSERVITEM) e verifica, para cada item, se existe pelo menos uma linha em tabORDEMSERVHORA com CD_PESSOA preenchido. Se algum item não tiver técnico vinculado, impede o fechamento da OS (UMPD005.pas:1838-1866) |
Simulação passo a passo
- Em MFA001 → aba Parâmetros de Pedidos/Ordem de Serviço → combo Modelo Ordem Serviço defina
Horas Trabalhadas(ST_ORDEMSERVICO = 'H') - O label
"Horas Trabalhadas Obrigatório [MPD005]"e o combocmbST_Obrigatecnicoficam visíveis - Selecione
Simno combocmbST_Obrigatecnico - Salve (F6) — o
AfterPostpermite a gravação porqueST_ORDEMSERVICO = 'H' - Abra MPD005 (Aplicação/OS) e vá até a aba Horas Trabalhadas
- Tente gravar um registro de
ORDEMSERVHORAsem preencher o técnico (CD_PESSOAvazio) → sistema lançaW-2061 = "É Obrigatório Informar o Técnico!"e direciona o foco para a aba de horas - Preencha o técnico, mas deixe
QT_HORASem branco → sistema lançaW-2062 = "É Obrigatório Informar a quantidade de Horas do Técnico!" - Ao tentar fechar a OS, o sistema também valida se cada item tem pelo menos um registro de horas com técnico informado; caso contrário, exibe
W-2061
Resultado esperado: toda apropriação de horas na OS fica obrigada a informar o técnico e a quantidade de horas. O fechamento da OS também é bloqueado enquanto algum item estiver sem técnico vinculado.
N - Não (técnico opcional) - Padrão
| O que faz | Detalhe |
|---|---|
| Efeito em MFA001 | Valor default atribuído em AfterInsert (UdmMFA001.pas:572). Sempre aplicado automaticamente quando ST_ORDEMSERVICO <> 'H' (UMFA001.pas:1052-1056) |
| Efeito em MPD005 | O bloco if (dmMPD005.iST_OBRIGATECNICO = 'S') não dispara; os registros de ORDEMSERVHORA podem ser gravados sem técnico e sem horas, e a OS pode ser fechada mesmo sem horas/técnico vinculados aos itens |
Simulação passo a passo
- Em MFA001, com
ST_ORDEMSERVICO = 'H', selecioneNãoemcmbST_Obrigatecnicoe salve - Ou altere
ST_ORDEMSERVICOparaK(Controle de KM) ouO(Controle de Horímetro) — nesse caso, oOnChange(UMFA001.pas:2519-2529) e oAfterPost(UMFA001.pas:1052-1056) forçamST_OBRIGATECNICO = 'N' - Abra MPD005, na aba Horas Trabalhadas
- Grave um registro de
ORDEMSERVHORAdeixandoCD_PESSOAeQT_HORASem branco — o sistema não reclama - Feche a OS normalmente — o loop de validação em
btnFecharClicksimplesmente não é executado
Resultado esperado: a aba de Horas Trabalhadas não exige técnico nem quantidade de horas; o usuário pode registrar apontamentos parciais ou pular o registro de horas totalmente.
Interação com ST_ORDEMSERVICO
ST_OBRIGATECNICO é um sub-parâmetro dependente de ST_ORDEMSERVICO. A dependência é imposta em dois pontos do TfrmMFA001:
1. OnChange do combo de Modelo de OS (em tempo real)
UMFA001.pas:2517-2530:
procedure TfrmMFA001.cmbST_ORDEMSERVICOChange(Sender: TObject);
begin
if (cmbST_ORDEMSERVICO.Value = 'H') then
begin
lblObrigaTecnico.Visible := True;
cmbST_Obrigatecnico.Visible := True;
end
else
begin
cmbST_Obrigatecnico.Value := 'N';
lblObrigaTecnico.Visible := False;
cmbST_Obrigatecnico.Visible := False;
end;
end;
Sempre que o usuário troca o Modelo de Ordem de Serviço:
H(Horas Trabalhadas) → mostra o combocmbST_Obrigatecnicoe o labellblObrigaTecnicoK(Controle de KM) ouO(Controle de Horímetro) → zeracmbST_Obrigatecnico.Value := 'N'e oculta label/combo
Adicionalmente, PageParmChange (UMFA001.pas:2532-2536) chama este handler ao entrar na aba de Pedidos/OS para refletir o estado atual do combo pai.
2. AfterPost do tabPARMFATUR (na persistência)
UMFA001.pas:1052-1056:
if (dmMFA001.tabPARMFATURST_ORDEMSERVICO.AsString <> 'H') then
begin
dmMFA001.tabPARMFATUR.Edit;
dmMFA001.tabPARMFATURST_OBRIGATECNICO.AsString := 'N';
end;
Esta é a última barreira de consistência: independentemente do que o usuário tenha deixado em ST_OBRIGATECNICO, se na hora de salvar o ST_ORDEMSERVICO não for H, o sistema força ST_OBRIGATECNICO = 'N'. Isso garante que a base nunca terá a combinação inválida (ST_ORDEMSERVICO <> 'H' e ST_OBRIGATECNICO = 'S').
Resumo da matriz de dependência
ST_ORDEMSERVICO | ST_OBRIGATECNICO permitido em MFA001 | Valor efetivo após salvar |
|---|---|---|
H (Horas Trabalhadas) | S ou N (combo visível) | Mantém o valor escolhido pelo usuário |
K (Controle de KM) | — (combo oculto) | Forçado para N |
O (Controle de Horímetro) | — (combo oculto) | Forçado para N |
Tabela Comparativa Resumida
| Opção | Rótulo no combo | Técnico obrigatório em MPD005? | Mensagens disparadas | Bloqueio no fechamento da OS? |
|---|---|---|---|---|
| S | Sim | Sim — CD_PESSOA e QT_HORAS obrigatórios em cada registro de ORDEMSERVHORA | W-2061, W-2062 | Sim — todos os itens precisam de técnico vinculado |
| N | Não (padrão) | Não — campos opcionais | Nenhuma | Não |
Referências no Código Fonte
Tela MFA001 (produtora)
| Arquivo | Linha(s) | Descrição |
|---|---|---|
source/MFA001/UMFA001.dfm | 8248-8260 | Label lblObrigaTecnico com Caption = 'Horas Trabalhadas Obrigatório [MPD005]' |
source/MFA001/UMFA001.dfm | 9205-9231 | Definição do cmbST_Obrigatecnico: TwwDBComboBox com DataField = 'ST_OBRIGATECNICO' e Items.Strings = ('Sim'#9'S', 'Não'#9'N') |
source/MFA001/UMFA001.pas | 1052-1056 | Regra do AfterPost: força ST_OBRIGATECNICO = 'N' quando ST_ORDEMSERVICO <> 'H' |
source/MFA001/UMFA001.pas | 2517-2530 | Handler cmbST_ORDEMSERVICOChange: controla visibilidade de lblObrigaTecnico e cmbST_Obrigatecnico, zera valor para N quando modelo != H |
source/MFA001/UMFA001.pas | 2532-2536 | PageParmChange: reaplica o handler ao entrar na aba de OS |
source/MFA001/UdmMFA001.pas | 283 | Declaração do TStringField tabPARMFATURST_OBRIGATECNICO |
source/MFA001/UdmMFA001.pas | 572 | Valor padrão no AfterInsert: tabPARMFATURST_OBRIGATECNICO.AsString := 'N' (comentário: Gobo Chamado 238778) |
source/MFA001/UdmMFA001.dfm | 295, 1973-1978, 2445, 2617, 2876, 3175 | SELECT, field metadata (FixedChar = True, Size = 1), INSERT e UPDATE do registro de PARMFATUR |
Tela MPD005 (consumidora)
| Arquivo | Linha(s) | Descrição |
|---|---|---|
source/MPD005/UdmMPD005.pas | 247 | Declaração da variável de sessão iST_OBRIGATECNICO: string |
source/MPD005/UdmMPD005.pas | 372-379 | SELECT de PARMFATUR com ST_OBRIGATECNICO no final da lista de campos |
source/MPD005/UdmMPD005.pas | 405 | Atribuição dmMPD005.iST_OBRIGATECNICO := Resultado[21] após execução da consulta |
source/MPD005/UdmMPD005.pas | 1870-1885 | Validação ao salvar ORDEMSERVHORA: exige CD_PESSOA (W-2061) e QT_HORAS (W-2062), direcionando foco para pagORDEMSERVITEM |
source/MPD005/UMPD005.pas | 1838-1866 | Validação ao fechar a OS (btnFecharClick): percorre itens e verifica existência de horas com técnico informado; bloqueia o fechamento caso algum item esteja sem técnico |
Telas que replicam o campo (sem lógica)
| Arquivo | Linha(s) | Descrição |
|---|---|---|
source/RCA006/UdmRCA006.dfm | — | SELECT/INSERT/UPDATE completo de PARMFATUR (replicação de parâmetros entre empresas) |
source/CPD009/UdmCPD009.dfm | — | SELECT/INSERT/UPDATE completo de PARMFATUR (espelhamento de parâmetros) |
Mensagens do sistema (arquivo dist/mensagens.pt-BR)
| Código | Texto |
|---|---|
W-2061 | É Obrigatório Informar o Técnico! |
W-2062 | É Obrigatório Informar a quantidade de Horas do Técnico! |
Procedures / Views / Triggers
Nenhuma referência ao campo ST_OBRIGATECNICO foi encontrada no diretório Scripts/ — toda a lógica associada ao parâmetro é aplicada em código Delphi (camada cliente), não em stored procedures ou triggers no banco Firebird.