Notas de Cobrança de Serviço / Produto CRM
Nota
Para um guia completo de ponta a ponta cobrindo definição de produto,
provisionamento, complementos e desprovisionamento com exemplos detalhados
de Ansible e estratégia de preços, veja
Complete Product Lifecycle Guide <guide_product_lifecycle>.
Para informações detalhadas sobre provisionamento de serviços móveis com cartões SIM,
veja SIM Card Provisioning <concepts_sim_provisioning>.
Visão Geral de Produtos e Serviços
Produto (Item do Menu):
Um Produto é como um prato específico em um menu de restaurante, como um "Spaghetti Carbonara."
Ele tem uma descrição clara, uma lista de ingredientes (como massa, creme, ovos, queijo e bacon) e um preço.
No OmniCRM, um Produto contém de forma semelhante os detalhes do que está incluído — recursos, especificações e preços.
Frequentemente, os clientes podem querer modificações, como "sem cebolas" ou "adicionar queijo extra" ao seu prato. Dentro do OmniCRM, isso corresponde a personalizar um serviço antes da criação. O nível de personalizações ou modificações a um serviço fica a seu critério (o operador) para definir.
No OmniCRM, os clientes ou funcionários podem modificar um Produto para melhor atender às necessidades de um cliente específico, como aumentar a velocidade da Internet ou adicionar recursos específicos. Essa personalização é refletida no Serviço específico fornecido.
Um produto é essencialmente uma oferta que os clientes podem escolher para solicitar, semelhante a ler e escolher um prato no menu.

Catálogo de Produtos (Menu do Restaurante):
O Catálogo de Produtos é como o menu completo em um restaurante, que lista todos os pratos disponíveis — de aperitivos a sobremesas.
É a coleção completa de tudo que o restaurante (ou, no seu caso, o Provedor de Serviços) tem a oferecer.
No contexto empresarial, o Catálogo de Produtos fornece aos clientes todos os Produtos disponíveis, para que possam escolher aquele que melhor atende às suas necessidades.


Serviço (Prato Preparado):
Quando um cliente solicita um item do menu, o prato é preparado na cozinha. Isso é semelhante a criar um Serviço a partir de um Produto.
No OmniCRM, quando um cliente seleciona um Produto, uma instância desse Produto é criada e entregue como um Serviço.
Ele é personalizado e preparado especificamente para aquele cliente, assim como uma refeição preparada para um cliente.
Por exemplo, quando alguém seleciona o "Plano de Internet Bronze" do Catálogo de Produtos, o sistema de provisionamento "prepara" uma instância desse plano a partir dos ingredientes (endereços IP, Modems e Portas) — ou seja, ativa o plano e o entrega ao cliente específico.
Produtos Agrupados (Refeições Combinadas):
O Catálogo de Produtos também pode oferecer pacotes, como uma refeição combinada que inclui um aperitivo, prato principal e sobremesa juntos por um preço especial.
No OmniCRM, Produtos agrupados combinam vários Produtos individuais em um pacote conveniente — como um "Pacote de Essenciais para o Lar" que inclui serviços de Internet, TV e telefone a uma taxa com desconto.
Uma vez selecionado, esse pacote é transformado em vários Serviços adaptados para o cliente.
Definições de Produto
Um produto é um modelo que é usado para criar um serviço / complemento / desconto / adicional, etc.
Dentro da definição incluímos:
-
Informações sobre o produto (recursos, inclusões, T&Cs, duração do contrato, ícone, etc.) que são exibidas para o usuário do CRM (Cliente ou Funcionário).
-
A lógica de negócios sobre quem pode comprar o produto (Empresarial ou Residencial), se depende de ter um serviço pai provisionado (como complementos móveis disponíveis apenas para clientes com um serviço móvel), se pode ser solicitado diretamente por um cliente via autoatendimento ou apenas por um agente de atendimento ao cliente, e quando o produto pode ser adquirido (permitindo que um produto esteja disponível apenas por um período definido).
-
Quando itens de Inventário devem ser incluídos (como Modems ou Cartões SIM) estes são especificados como Lista de Itens de Inventário, por exemplo, o serviço abaixo requer um Cartão SIM e um Número de Telefone a serem atribuídos:
['SIM Card', 'Phone Number']Estes correlacionam-se com osInventory Items <administration_inventory>definidos no CRM. -
Referenciar um Playbook Ansible para provisionar o serviço
Provisioning Play <concepts_ansible>assim como as variáveis a passar para o Ansible. Essas variáveis a passar são mágicas, pois podem ser variáveis comoservice_idque são definidas pelo produto ao qual estamos adicionando, ou podem ser comoICCID&MSISDNonde temos selecionado itens de inventário que são passados ao atribuir o inventário. O agrupamento é tratado no playbook de provisionamento para conter vários serviços, por exemplo, um produto de internet residencial, TV e Voz pode provisionar um serviço para cada.

Categorias de Produto e Tipos de Serviço
Os produtos usam dois campos de classificação para ajudar a organizar e filtrar ofertas:
Categorias de Produto
O campo category controla onde os produtos são exibidos na interface do usuário.
Valores comuns incluem:
- standalone - Exibido como uma opção de serviço base ao criar um novo serviço
- addon - Exibido ao adicionar a um serviço existente
- bundle - Exibido como uma opção de serviço agrupado (provisionado como um complemento a serviços existentes)
- promo - Ofertas promocionais especiais
Essas categorias são puramente organizacionais e não ditam o que é
provisionado. O comportamento real de provisionamento é determinado inteiramente pelo
playbook Ansible referenciado em provisioning_play.
Por exemplo: - Um produto standalone tipicamente cria um novo objeto de serviço - Um produto addon ou bundle é tipicamente adicionado a um
serviço existente - Mas isso fica a critério do implementador que escreve o
playbook - você pode criar múltiplos objetos de serviço a partir de um complemento, ou
modificar serviços existentes a partir de um produto autônomo, se necessário
A categoria simplesmente controla o fluxo da interface do usuário e onde os clientes/funcionários veem a opção de produto.
Tipos de Serviço
O campo service_type categoriza que tipo de serviço está sendo
fornecido.
Esses são definidos inteiramente pelo usuário, mas valores comuns incluem:
- mobile - Serviços de telefone móvel com voz, SMS e dados
- fixed - Serviços de internet fixa sem fio ou com fio
- fixed-voice - Serviços de voz fixa (VoIP, linha fixa)
- hotspot - Dispositivos móveis de hotspot ou de aluguel
- dongle - Serviços de modem USB ou dongle
- voice - Serviços apenas de voz
- data - Serviços apenas de dados
Assim como as categorias, os tipos de serviço são personalizáveis com base em suas ofertas. Eles ajudam em:
- Filtrar quais complementos se aplicam a quais serviços base
- Organizar produtos no portal do cliente
- Correspondência de requisitos de inventário
- Determinar fluxos de trabalho de provisionamento
Exemplo: Um cliente com um serviço mobile pode ver complementos móveis, enquanto
um cliente com um serviço fixed vê complementos de linha fixa.
Gerenciando Produtos
Os produtos são gerenciados através da página de Gerenciamento de Produtos, onde você pode visualizar, pesquisar, filtrar e editar todos os produtos disponíveis.

Interface Modal de Produto
Clicando em qualquer produto, abre uma interface de abas aprimorada que organiza todas as configurações do produto em grupos lógicos para facilitar a navegação e edição.

O modal de gerenciamento de produtos possui cinco abas organizadas:
- 📋 Informações Básicas - Informações principais do produto (nome, slug, categoria, ícone, recursos, termos)
- 💰 Preços - Todos os campos relacionados a custos, incluindo custos recorrentes, custos de configuração e porcentagem de imposto
- ⚙️ Configuração - Configurações de renovação, tipos de clientes e dependências
- 🔧 Provisionamento - Configuração do playbook Ansible e requisitos de inventário
- 📅 Disponibilidade - Intervalos de datas e timestamps do sistema

Organização da Aba de Preços:
A aba de Preços agrupa campos de custo em seções lógicas:
- Custos Recorrentes - Custos mensais de varejo e atacado lado a lado
- Custos de Configuração - Taxas de ativação únicas para varejo e atacado
- Imposto - Configuração da porcentagem de imposto com cálculo automático
Recursos do Modo de Edição:
- Selecionador de Ícone - Pesquisar e selecionar ícones do FontAwesome visualmente
- Selecionador de Itens de Inventário - Selecionar a partir de tipos de itens de inventário disponíveis
- Selecionador de Data/Hora - Seleção fácil de janelas de disponibilidade
- Formatação de Moeda - Prefixo automático $ para campos de custo
- Seletores de Dropdown - Opções pré-definidas para categorias e campos booleanos

Selecionador de Ícone:
Ao editar o campo de ícone, uma interface de seletor de ícone pesquisável aparece permitindo que você navegue visualmente e selecione entre milhares de ícones do FontAwesome.
![]()
Recursos: * Pesquisar ícones por palavra-chave (por exemplo, "chave inglesa", "móvel", "wifi") * Visualizar a aparência do ícone em tempo real * Mostra o nome da classe do ícone para referência * Seleção de dropdown para acesso rápido
Aba de Configuração:
A aba de Configuração organiza as configurações de comportamento do produto em grupos lógicos.

Seções de Configuração:
- Configurações de Renovação:
- Auto Renovar - Comportamento padrão de renovação (Prompt/Sim/Não)
- Permitir Auto Renovar - Se os clientes podem habilitar a renovação automática
- Dias do Contrato - Duração mínima do contrato (por exemplo, 30 para mensal, 365 para anual)
- Tipos de Clientes:
- Residencial - Disponível para clientes consumidores
- Empresarial - Disponível para clientes comerciais
- Dependências:
- Lista de Dependências - IDs de produtos ou tipos de serviço necessários antes que este produto possa ser adicionado
- Usado para dependências de complementos (por exemplo, complementos móveis requerem serviço móvel ativo)
Aba de Provisionamento:
A aba de Provisionamento lida com automação Ansible e requisitos de inventário.

Campos de Provisionamento:
- Play de Provisionamento:
- Nome do playbook Ansible (sem extensão .yaml)
- Deve existir no diretório OmniCRM-API/Provisioners/plays/
- Chamado quando o serviço é criado, atualizado ou desprovisionado
- Variáveis JSON de Provisionamento:
- Variáveis padrão passadas para o playbook Ansible como JSON
- Podem ser substituídas durante o provisionamento
- O playbook recebe essas além de
customer_id,product_id,service_id,access_token
- Lista de Itens de Inventário:
- Seletor de múltipla seleção mostrando tipos de itens de inventário disponíveis
- Exemplos: Cartão SIM, Número de Telefone, Modem Roteador, Endereço IPv4
- O cliente/funcionário seleciona itens específicos do inventário disponível durante o pedido
- IDs de inventário selecionados são passados para o playbook com o tipo de inventário como nome da variável
Aba de Disponibilidade:
A aba de Disponibilidade controla quando o produto pode ser adquirido e exibe metadados do sistema.

Configurações de Disponibilidade:
- Disponível A Partir de:
- Data/hora quando o produto se torna disponível para compra
- Deixe em branco para disponibilidade imediata
- Útil para pré-anunciar novos produtos
- Disponível Até:
- Data/hora quando o produto não está mais disponível para compra
- Deixe em branco para disponibilidade indefinida
- Perfeito para promoções por tempo limitado ou produtos fora de linha
- Metadados do Sistema (Somente Leitura):
- Criado - Timestamp quando o produto foi criado pela primeira vez
- Última Modificação - Timestamp da atualização mais recente
- Mantido automaticamente pelo sistema
Ações do Modal:
- Modo de Visualização:
- Fechar - Descartar modal
- Clonar Produto - Criar uma cópia com sufixo "_clone"
- Editar Produto - Mudar para modo de edição
- Modo de Edição/Criar:
- Cancelar - Descartar alterações e fechar
- Salvar Alterações - Criar ou atualizar produto (botão grande para ênfase)
Campos do Produto
O modelo de Produto contém todas as informações necessárias para definir uma oferta e como ela deve ser provisionada. Esses campos são gerenciados através da interface modal de gerenciamento de produtos descrita acima.
Informações Básicas
- product_id - Identificador único atribuído automaticamente pelo sistema
- product_name - Nome exibido mostrado aos clientes e funcionários na interface do usuário
- product_slug - Identificador único usado em URLs e chamadas de API (minúsculas, sem espaços, use hífens)
- category - Controla onde este produto aparece na interface do usuário:
standalone- Exibido como uma opção de serviço base ao criar um novo serviçoaddon- Exibido ao adicionar a um serviço existentebundle- Exibido como uma opção de serviço agrupadopromo- Ofertas promocionais especiais
- service_type - Tipo de serviço sendo fornecido (por exemplo, móvel, fixo, voz-fixa, hotspot, dongle, voz, dados). Usado para filtrar quais complementos se aplicam a quais serviços.
- comment - Notas internas sobre o produto para referência dos funcionários apenas (não exibidas para os clientes)
- icon - Classe de ícone FontAwesome exibida na interface do usuário (por exemplo,
fa-solid fa-sim-card)
Campos de Preço
- retail_cost - Cobrança mensal recorrente faturada ao cliente (defina como 0 para compras únicas ou produtos pré-pagos)
- wholesale_cost - Seu custo mensal para fornecer este serviço (usado para cálculos de margem)
- retail_setup_cost - Taxa de ativação ou configuração única cobrada ao cliente
- wholesale_setup_cost - Seu custo único para configurar o serviço
- tax_percentage - Porcentagem de imposto aplicada a este produto (por exemplo, 10 para 10%, 12.5 para 12.5%). Defina como 0 para produtos isentos de impostos. Esta taxa de imposto é aplicada automaticamente a transações criadas a partir deste produto.

Aplicação de Imposto:
Quando uma transação é criada a partir deste produto, a porcentagem de imposto é automaticamente copiada para a transação e o valor do imposto é calculado. Por exemplo:
- Produto com 10% de imposto, $50.00 custo de varejo → Transação tem $5.00 de imposto
- Produto com 0% de imposto (isento de impostos) → Transação tem $0.00 de imposto
- Sobrescrição manual da transação → Funcionários podem alterar a porcentagem de imposto por transação
Visibilidade e Acesso do Cliente
- enabled - Se este produto está ativo e disponível para compra (defina como falso para ocultar sem excluir)
- residential - Se clientes residenciais (consumidores) podem comprar este produto
- business - Se clientes empresariais (comerciais) podem comprar este produto
- customer_can_purchase - Se os clientes podem se auto-adquirir via o portal (verdadeiro) ou se apenas os funcionários podem adicioná-lo (falso)
- available_from - Data/hora quando este produto se torna disponível para compra (opcional)
- available_until - Data/hora quando este produto não está mais disponível para compra (opcional, útil para ofertas por tempo limitado)
Contrato e Renovação
- contract_days - Duração mínima do contrato em dias (por exemplo, 30 para mensal, 365 para anual, 0 para sem contrato mínimo)
- auto_renew - Comportamento padrão de renovação:
prompt- Pergunta ao cliente a cada vez se deseja renovartrue- Renova automaticamente sem perguntarfalse- Requer renovação manual
- allow_auto_renew - Se os clientes podem habilitar a renovação automática (defina como falso para compras únicas)
Conteúdo Voltado para o Cliente
- terms - Termos e condições exibidos para os clientes antes da compra (inclua limitações, regras de expiração, condições de uso)
- features_list - Lista de recursos e inclusões mostradas aos clientes
(formato de lista Python:
['Feature 1', 'Feature 2'])
Configuração de Provisionamento
- provisioning_play - Nome do playbook Ansible que provisiona
este serviço (sem extensão .yaml). Deve existir em
OmniCRM-API/Provisioners/plays/. - provisioning_json_vars - Variáveis padrão passadas para o playbook
Ansible como JSON. Essas podem ser substituídas durante o provisionamento. O
playbook recebe essas junto com
customer_id,product_id,service_ideaccess_token. - inventory_items_list - Lista de itens de inventário necessários para este
produto (por exemplo,
['SIM Card', 'Mobile Number']). Quando um cliente faz um pedido, será solicitado a selecionar itens específicos do inventário disponível. IDs de inventário selecionados são passados para o playbook com o tipo de inventário como o nome da variável. - relies_on_list - Lista de IDs de produtos ou tipos de serviço que devem existir antes que este produto possa ser adicionado. Usado para dependências de complementos (por exemplo, complementos móveis requerem um serviço móvel ativo).
Metadados do Sistema
- created - Timestamp quando o produto foi criado (definido automaticamente)
- last_modified - Timestamp quando o produto foi atualizado pela última vez (atualizado automaticamente)
Exemplos de Definições de Produto
Produto Autônomo (SIM Móvel)

{
"product_id": 1,
"product_slug": "Mobile-SIM",
"product_name": "Mobile SIM Only",
"category": "standalone",
"service_type": "mobile",
"provisioning_play": "play_psim_only",
"provisioning_json_vars": "{\"iccid\": \"\", \"msisdn\": \"\"}",
"inventory_items_list": "['SIM Card', 'Mobile Number']",
"retail_cost": 0,
"retail_setup_cost": 0,
"wholesale_cost": 3,
"wholesale_setup_cost": 1,
"contract_days": 0,
"residential": true,
"business": true,
"enabled": true,
"customer_can_purchase": true,
"icon": "fa-solid fa-sim-card",
"features_list": "['Australian Phone Number (04xxx)', 'Fastest speeds', 'Best coverage', 'Roaming on the Mainland']",
"terms": "Must be activated within 6 months. All credit lost if service is not used for 12 months.",
"comment": "Physical SIM card for use with Mobile Phones"
}
Este produto autônomo requer dois itens de inventário (Cartão SIM e Número Móvel) e cria um novo serviço quando provisionado.
Produto Adicional (Plano de Dados Mensal)
{
"product_slug": "norfone-mobile-prepaid-mini",
"product_name": "Norfone Mini Plan",
"category": "addon",
"service_type": "mobile",
"provisioning_play": "play_topup_charge_then_action",
"provisioning_json_vars": "",
"inventory_items_list": "[]",
"retail_cost": 30,
"retail_setup_cost": 0,
"wholesale_cost": 5.84,
"contract_days": 30,
"residential": true,
"business": false,
"enabled": true,
"customer_can_purchase": true,
"auto_renew": "prompt",
"icon": "fa-solid fa-sim-card",
"features_list": "['8GB of Ultra fast data', 'Unlimited Calls & Texts to Norfone users', '100 Minutes of Talk to Australia', '100 SMS to Australia', '30 Day Expiry']",
"terms": "Credit expires after 30 days. Once data, voice or sms is used up, you will need to top up to continue using the service.",
"comment": "Our smallest plan for light users"
}
Este produto adicional não requer inventário e é aplicado a um serviço existente. Ele cobra o cliente e adiciona créditos/saldos ao seu serviço.
Produto Agrupado (Pacote para Idosos)
{
"product_slug": "Bundle-Seniors",
"product_name": "Seniors Bundle",
"category": "bundle",
"service_type": "fixed",
"provisioning_play": "play_seniors_package",
"provisioning_json_vars": "{\"IPTV_Service_ID\": \"SeniorBundle\"}",
"inventory_items_list": "['Modem Router']",
"retail_cost": 30,
"retail_setup_cost": 0,
"wholesale_cost": 10,
"wholesale_setup_cost": 11,
"contract_days": 180,
"residential": true,
"business": false,
"enabled": true,
"icon": "fa-solid fa-person-walking-with-cane",
"features_list": "['20Mbps Download', '5Mbps Upload', 'Unlimited Data', 'Home Voice', 'TV: Extra +£5 per month', '£60 Installation Fee']",
"terms": "6 Month Contract, must show senior citizen's card to qualify",
"comment": "20Mbps/2Mbps GPON Service + IPTV + Phone"
}
Este produto agrupado provisiona múltiplos serviços (Internet + IPTV + Telefone) usando um único playbook. Ele requer um item de inventário (Modem Roteador).
Produto Adicional (Recarga Simples)
{
"product_slug": "Mobile-Topup-5",
"product_name": "PAYG £5 Topup",
"category": "addon",
"service_type": "mobile",
"provisioning_play": "play_topup_monetary",
"provisioning_json_vars": "{\"service_id\": \"\"}",
"inventory_items_list": "[]",
"retail_cost": 5,
"retail_setup_cost": 0,
"wholesale_cost": 0,
"contract_days": 0,
"residential": true,
"business": false,
"enabled": true,
"customer_can_purchase": true,
"icon": "fa-solid fa-coins",
"features_list": "['£5 credit', 'Valid for 180 days']",
"terms": "Valid for 180 days or until all credit is used. See our website for full rates",
"comment": "£5 to use for Calls, SMS & Data"
}
Este complemento simplesmente adiciona crédito monetário a um serviço existente. Nenhum
inventário é necessário, e ele usa service_id para identificar qual serviço
deve ser recarregado.
Como as Variáveis são Passadas para o Ansible
Entender como as variáveis fluem da definição do produto através da API para o playbook Ansible é crítico para escrever playbooks de provisionamento eficazes.
Fontes de Variáveis e Mesclagem
Quando um trabalho de provisionamento é criado, as variáveis vêm de várias fontes e são mescladas nesta ordem (fontes posteriores substituem as anteriores):
- Variáveis de provisioning_json_vars do Produto - Variáveis padrão da definição do produto
- Corpo da Solicitação - Variáveis passadas na chamada da API (podem substituir os padrões do produto)
- Variáveis adicionadas pelo Sistema - Adicionadas automaticamente pelo sistema de provisionamento
- Seleções de Inventário - IDs dos itens de inventário selecionados (se
inventory_items_listnão estiver vazio)
Processo de Mesclagem de Variáveis
O sistema mescla variáveis de todas as fontes, com fontes posteriores substituindo as anteriores. Isso permite uma personalização flexível no momento do provisionamento.
Por exemplo, se seu produto tiver:
"provisioning_json_vars": "{\"monthly_cost\": 50, \"data_gb\": 100}"
E sua solicitação API incluir:
{
"product_id": 10,
"customer_id": 456,
"monthly_cost": 45,
"custom_param": "value"
}
As variáveis finais extra_vars passadas para o Ansible serão:
{
"monthly_cost": 45, # Substituído pela solicitação
"data_gb": 100, # Da provisioning_json_vars
"product_id": 10, # Da solicitação
"customer_id": 456, # Da solicitação
"custom_param": "value", # Da solicitação
"access_token": "eyJ..." # Adicionado pelo sistema
}
Variáveis Adicionadas pelo Sistema
O sistema de provisionamento adiciona automaticamente:
access_token- Token JWT para autenticar chamadas de API de volta ao CRM (fornecido diretamente para autenticação IP/API key, ou gerado a partir derefresh_tokenpara autenticação de usuário)initiating_user- O ID do usuário que acionou o provisionamento (ou primeiro administrador para sistemas automatizados)- Quaisquer campos do corpo da solicitação (
product_id,customer_id,service_id, etc.)
Variáveis de Inventário
Quando um produto requer itens de inventário (por exemplo,
inventory_items_list: "['SIM Card', 'Mobile Number']"), o processo
funciona da seguinte forma:
- UI/API solicita seleção - O usuário seleciona itens de inventário específicos do estoque disponível
- IDs de Inventário são adicionados às variáveis - Os IDs dos itens de inventário selecionados são adicionados com o tipo de inventário como o nome da variável
- Playbook acessa IDs de inventário - O playbook de provisionamento pode então recuperar detalhes completos do inventário da API do CRM
Por exemplo, se um usuário selecionar: - Cartão SIM com inventory_id: 789 - Número Móvel com inventory_id: 101
As variáveis passadas para o playbook incluem: - SIM Card: 789 -
Mobile Number: 101
O playbook pode então usar esses IDs para buscar os registros completos de inventário (ICCID, IMSI, MSISDN, etc.) da API do CRM e usar essas informações para provisionar o serviço em equipamentos de rede.
Como o Ansible Recebe Variáveis
O sistema de provisionamento passa todas as variáveis mescladas para o playbook Ansible como extravars. Dentro do playbook, essas variáveis estão
disponíveis através do sistema padrão de variáveis do Ansible e podem ser usadas em
tarefas.
As variáveis podem ser referenciadas diretamente nas tarefas do playbook usando a
sintaxe {{ variable_name }}. Por exemplo, {{ product_id }},
{{ customer_id }}, {{ monthly_cost }}, etc.
Variáveis Passadas para Produtos Adicionais
Quando um produto adicional é provisionado, o sistema passa automaticamente:
product_id- O ID do produto adicional sendo provisionadocustomer_id- O cliente que possui o serviçoservice_id- O ID do serviço ao qual este complemento está sendo adicionado (crítico para complementos)access_token- Token de autenticação para chamadas de API- Quaisquer variáveis de
provisioning_json_vars - Quaisquer variáveis adicionais da solicitação API
Exemplo de Fluxo de Provisionamento de Complemento
Quando um cliente adiciona o complemento "£5 Topup" ao seu serviço móvel (service_id: 123), o playbook recebe variáveis incluindo:
product_id: 45 (o produto de recarga)customer_id: 456 (o cliente)service_id: 123 (o serviço para o qual adicionar crédito)access_token: Token de autenticação- Além de quaisquer variáveis de
provisioning_json_varsdo produto
O playbook então usa essas variáveis para:
- Buscar detalhes do serviço da API do CRM usando o
service_id - Extrair o UUID do serviço e outras informações do registro do serviço
- Adicionar crédito ao sistema de faturamento (OCS) usando o UUID do serviço
- Registrar a transação no CRM para fins de faturamento
Esse fluxo permite que o complemento identifique exatamente qual serviço modificar e aplique as alterações de forma apropriada.
Diferença Entre Variáveis de Produtos Autônomos e Adicionais
Produtos Autônomos recebem:
product_id- O produto sendo provisionadocustomer_id- O cliente que está solicitando o serviço- IDs de itens de inventário (por exemplo,
SIM Card,Mobile Number) se o produto os requer access_token- Para autenticação da API
Produtos Adicionais recebem:
product_id- O produto adicional sendo provisionadocustomer_id- O cliente que possui o serviçoservice_id- O ID do serviço existente a ser modificado (essa é a diferença chave)access_token- Para autenticação da API
A diferença chave é service_id - isso informa ao playbook qual
serviço existente modificar ou adicionar a.
Produtos Agrupados
Produtos agrupados são provisionados como complementos, mas seu playbook pode criar múltiplos registros de serviço. Eles recebem as mesmas variáveis que complementos, incluindo:
product_id- O produto agrupadocustomer_id- O clienteservice_id- Serviço pai (se aplicável)- IDs de itens de inventário (por exemplo,
Modem Router) se necessário access_token- Para autenticação da API
O playbook de agrupamento (por exemplo, play_seniors_package) então cria múltiplos
serviços relacionados (Internet, IPTV, Telefone) e os vincula.
Serviços
Um serviço é uma instância de um produto que pertence a um cliente, pelo qual eles são cobrados.
É essencialmente um link para uma conta OCS (Online Charging
System) que lida com a geração de cobranças e os saldos e usos reais da conta. O OCS é alimentado pelo CGRateS e
gerencia saldos monetários, saldos unitários (dados, voz, SMS),
ActionPlans para renovação automática e ThresholdS para limites de gastos.
Adicionando um Serviço: Seleção e Filtragem de Produto
Ao adicionar um serviço a um cliente (seja um novo serviço autônomo ou um complemento a um serviço existente), o sistema exibe produtos disponíveis em uma interface de carrossel. Os produtos mostrados são filtrados com base em vários critérios:
Filtragem de Produto para Serviços Autônomos
Ao criar um novo serviço para um cliente, a interface do usuário exibe produtos filtrados por:
- Tipo de Cliente - Os produtos são categorizados como:
- Individual (Residencial): Produtos onde
residential = trueoubusiness = false - Empresarial: Produtos onde
business = true
- Individual (Residencial): Produtos onde
- Categoria - Os produtos são separados em:
- Planos de Serviço: Produtos com
category=standaloneoubundle - Complementos: Produtos com
category=addon(exibidos em carrossel separado)
- Planos de Serviço: Produtos com
- Disponibilidade - Os produtos são mostrados apenas se:
enabled = true- O produto está ativo e não desativado- A data atual está entre
available_fromeavailable_until- O produto está dentro de sua janela de disponibilidade customer_can_purchase = true(se o cliente estiver se auto-adquirindo) - O produto permite a compra direta pelo cliente
Nota
Filtragem em Nível de API: A API filtra automaticamente produtos por status habilitado e datas de disponibilidade em dois níveis:
- Endpoints de Compra/Seleção (
/crm/product/) - Usado pelo modal de Complementos e PlanList para seleção de produtos. Filtra automaticamente para mostrar APENAS produtos habilitados dentro de seu intervalo de datas de disponibilidade. Isso garante que clientes e funcionários só possam selecionar produtos que estão atualmente disponíveis para compra. - Endpoints de Gerenciamento (
/crm/product/paginated) - Usado pela página de Gerenciamento de Produtos. Mostra TODOS os produtos, incluindo desativados e fora das datas de disponibilidade, permitindo que administradores gerenciem o catálogo completo de produtos, incluindo produtos inativos.
Passe include_disabled=true para o endpoint base de produtos para ignorar
a filtragem (apenas para uso administrativo).
A interface do usuário exibe carrosséis separados para:
- Planos de Serviço Individuais - Produtos residenciais para clientes consumidores
- Planos de Serviço Empresariais - Produtos comerciais para clientes empresariais
- Complementos Individuais - Pacotes de complementos residenciais
- Complementos Empresariais - Pacotes de complementos comerciais
Filtragem de Produto para Serviços Adicionais
Ao adicionar um complemento a um serviço existente, filtragens adicionais são aplicadas:
- Correspondência de Tipo de Serviço - Apenas complementos com
service_typecorrespondente são mostrados:- Se o serviço existente tem
service_type = "mobile", apenas complementos comservice_type = "mobile"são exibidos - Isso garante que clientes móveis vejam apenas complementos móveis, clientes de internet vejam apenas complementos de internet, etc.
- Se o serviço existente tem
- Verificação de Dependências - Se um complemento tiver uma
relies_on_list:- O sistema verifica se o cliente possui os produtos/serviços necessários
- Apenas complementos cujas dependências estão satisfeitas são mostrados
- Filtro de Mesmo Tipo de Cliente - Os complementos ainda são filtrados por
residentialvsbusinesspara corresponder ao tipo de cliente
Exemplo de Cenário de Filtragem
Para um cliente empresarial com um serviço móvel existente
(service_type = "mobile"):
- Produtos Autônomos Exibidos: Todos os produtos autônomos/agrupados empresariais
(
business = true,category != "addon") - Produtos Adicionais Exibidos: Apenas complementos móveis empresariais
(
business = true,category = "addon",service_type = "mobile") - Produtos Ocultos: Produtos residenciais, complementos para outros tipos de serviços (internet, voz, etc.), produtos desativados
Campos de Serviço
O modelo de Serviço contém campos que rastreiam a instância de serviço provisionada e sua relação com o cliente, produto e sistema de faturamento.
Informações Básicas do Serviço
- service_id - Identificador único atribuído automaticamente pelo sistema (somente leitura)
- customer_id - Link para o cliente que possui este serviço (somente leitura após a criação)
- product_id - Link para o produto do qual este serviço foi criado (somente leitura após a criação)
- service_name - Nome exibido mostrado aos clientes (editável)
- service_type - Tipo de serviço: móvel, internet, voip, iptv, pacote, etc. (editável)
- service_uuid - Identificador único usado no OCS/CGRateS para faturamento (somente leitura, gerado automaticamente)
- icon - Classe de ícone FontAwesome para exibição no portal de autoatendimento (editável)
Status e Datas do Serviço
- service_status - Status atual: Ativo, Inativo, Suspenso, etc. (editável)
- service_provisioned_date - Quando o serviço foi provisionado pela primeira vez (definido automaticamente, somente leitura)
- service_active_date - Quando o serviço se tornou ativo (editável)
- service_deactivate_date - Quando o serviço expira ou será desativado (editável)
- contract_end_date - Data de término do compromisso do contrato (editável)
Faturamento e Preços
- retail_cost - Cobrança mensal recorrente ao cliente (editável)
- wholesale_cost - Seu custo para fornecer o serviço (editável)
- service_billed - Se este serviço aparece nas faturas (editável, padrão: verdadeiro)
- service_taxable - Se os impostos se aplicam a este serviço (editável, padrão: verdadeiro)
- invoiced - Se o serviço foi faturado (definido automaticamente pelo sistema de faturamento)
- promo_code - Código promocional usado quando o serviço foi criado (editável)
Visibilidade do Cliente
- service_visible_to_customer - Se o cliente pode ver este serviço no portal de autoatendimento (editável, padrão: verdadeiro)
- service_usage_visible_to_customer - Se o cliente pode visualizar detalhes de uso/saldo (editável, padrão: verdadeiro)
Configuração de Provisionamento
- provisioning_play - Playbook Ansible usado para provisionar este serviço (herdado do produto, somente leitura)
- provisioning_json_vars - Variáveis passadas para o playbook de provisionamento (herdadas do produto, somente leitura)
- deprovisioning_play - Playbook Ansible a ser executado quando o serviço é desprovisionado (somente leitura)
- deprovisioning_json_vars - Variáveis para o playbook de desprovisionamento (somente leitura)
Relações de Serviço
- bundled_parent - Se este serviço faz parte de um pacote, o service_id do serviço pai (somente leitura)
- site_id - Link para o local físico onde o serviço é entregue (editável)
Notas e Metadados
- service_notes - Notas internas sobre o serviço para referência dos funcionários (editável)
- created - Timestamp quando o serviço foi criado (definido automaticamente, somente leitura)
- last_modified - Timestamp da última atualização (atualizado automaticamente, somente leitura)
Campos Editáveis vs Somente Leitura
Editáveis via API/UI:
Os serviços podem ser atualizados via PATCH /crm/service/{service_id} com esses
campos:
- service_name, service_type, service_status
- service_notes
- retail_cost, wholesale_cost
- service_billed, service_taxable
- service_visible_to_customer, service_usage_visible_to_customer
- service_active_date, service_deactivate_date, contract_end_date
- icon, promo_code, site_id
Somente Leitura (Definido Automaticamente):
Esses campos não podem ser modificados diretamente após a criação:
- service_id, customer_id, product_id
- service_uuid (gerado durante o provisionamento)
- service_provisioned_date
- provisioning_play, provisioning_json_vars
- deprovisioning_play, deprovisioning_json_vars
- bundled_parent
- invoiced (gerenciado pelo sistema de faturamento)
- created, last_modified (gerenciado automaticamente)
Provisionando Produtos em Serviços
O processo de provisionamento converte um Produto (modelo) em um Serviço (instância específica do cliente) através de uma série de etapas coordenadas envolvendo a interface Web, API e playbooks Ansible.
Fluxo de Provisionamento de Alto Nível
- Configuração de Pré-Provisionamento - Produto criado na API com configuração de provisionamento, e playbooks Ansible correspondentes escritos e testados
- Seleção de Serviço - A partir da Página do Cliente, funcionários ou clientes selecionam "Adicionar Serviço"
- Filtragem de Produto - Produtos exibidos filtrados com base em:
- Tipo de cliente (residencial/empresarial)
- Serviços existentes (para dependências de complementos em
relies_on_list) - Datas de disponibilidade (
available_from/available_until) - Flags
enabledecustomer_can_purchase
- Personalização - Opção para substituir variáveis de provisionamento (para ajustes de preço, configurações personalizadas, etc.)
- Seleção de Inventário - Se o produto requer inventário
(
inventory_items_listnão está vazio), o usuário seleciona itens específicos (por exemplo, qual cartão SIM, qual número de telefone) - Início do Provisionamento - Quando o botão "Provisionar" é clicado, a API cria um trabalho de provisionamento
Fluxo Detalhado de Integração da API e Ansible
Quando um serviço é provisionado, a seguinte sequência ocorre:
Passo 1: Criação do Trabalho de Provisionamento
A API recebe a solicitação de provisionamento e cria um trabalho de provisionamento com:
provisioning_play- Nome do playbook Ansible (por exemplo,play_psim_only)provisioning_json_vars- String JSON de variáveis do produto ou substituídas pela solicitaçãocustomer_id- ID do cliente que solicita o serviçoproduct_id- ID do produto sendo provisionadoservice_id- (Opcional) ID do serviço existente para complementos- Seleções de Inventário - IDs dos itens de inventário selecionados
Passo 2: Montagem de Variáveis
O serviço de provisionamento mescla variáveis de várias fontes nesta ordem:
provisioning_json_varsdo Produto (padrões da definição do produto)- Parâmetros do corpo da solicitação (podem substituir os padrões do produto)
- Variáveis adicionadas pelo Sistema:
access_token- Token JWT para autenticação da API de volta ao CRMinitiating_user- ID do usuário que acionou o provisionamentocustomer_id,product_id,service_id
- Seleções de Inventário - Adicionadas como pares
{inventory_type: inventory_id}
Exemplo de variáveis mescladas:
{
"customer_id": 123,
"product_id": 456,
"service_id": 789, # Apenas para complementos
"SIM Card": 1001, # Da seleção de inventário
"Mobile Number": 1002, # Da seleção de inventário
"monthly_cost": 30, # Da provisioning_json_vars
"data_gb": 50, # Da provisioning_json_vars
"access_token": "eyJ...", # Adicionado pelo sistema
"initiating_user": 5 # Adicionado pelo sistema
}
Passo 3: Criação do Registro de Provisionamento
Um registro de Provision é criado no banco de dados com:
provision_id- Identificador único para rastreamentoprovisioning_play- Nome do arquivo do playbookprovisioning_json_vars- Variáveis mescladas como string JSONtask_count- Número de tarefas no playbook (extraído do YAML)provisioning_status- Código de status (inicialmente definido como 1 = em execução, depois atualizado para 0 = sucesso, 2 = falhou, ou pode permanecer 1 se ainda estiver em progresso)product_id,customer_id,service_id- Referências de contexto
Passo 4: Execução do Playbook em Segundo Plano
A API gera uma thread em segundo plano que:
- Carrega o YAML do playbook de
OmniCRM-API/Provisioners/plays/{playbook_name}.yaml - Chama
ansible_runner.run()com:playbook- Caminho para o arquivo YAML carregadoextravars- Todas as variáveis mescladas (passadas para o Ansible)inventory- Definido como'localhost,'(execução local)event_handler- Manipulador personalizado para capturar eventos de execução de tarefas
- Monitora a execução do playbook em tempo real
Passo 5: Captura de Eventos e Registro (ProvisioningEventHandler)
À medida que cada tarefa Ansible é executada, eventos são capturados e armazenados como
registros de Provision_Event:
event_name- Nome da tarefa do playbookevent_number- Número de sequênciaprovisioning_status- Código de status indicando o resultado da tarefa:- 0 = Sucesso - Tarefa concluída com sucesso
- 1 = Em Execução - Tarefa está atualmente executando
- 2 = Falhou - Falha crítica que interrompe o provisionamento
- 3 = Falhou (ignorado) - Tarefa falhou, mas erros foram ignorados
(
ignore_errors: trueno playbook)
provisioning_result_json- Resultados da tarefa com dados sensíveis redigidos
O manipulador de eventos automaticamente remove senhas, chaves, segredos e outros dados sensíveis dos registros.
Passo 6: Execução do Playbook Ansible (Provisioners/plays/*.yaml)
O playbook Ansible é executado localmente e geralmente realiza as seguintes ações:
-
Buscar Definição do Produto - Solicitação GET para
/crm/product/product_id/{{ product_id }}usando{{ access_token }} -
Buscar Informações do Cliente - Solicitação GET para
/crm/customer/customer_id/{{ customer_id }} -
Processar Itens de Inventário (se necessário) - Solicitação GET para
/crm/inventory/inventory_id/{{ inventory_id }}para cada item selecionado para recuperar detalhes completos (ICCID, MSISDN, números de série, etc.) -
Configurar Sistemas Externos - Fazer chamadas de API para:
- HSS (Home Subscriber Server) para provisionamento de assinantes
- IMS (IP Multimedia Subsystem) para registro de voz
- CGRateS/OCS para criação de conta, configuração de cobrança, planos de tarifas
- Servidores ENUM para mapeamento de números de telefone
- Equipamentos de rede (roteadores, switches, etc.)
-
Adicionar Custos de Configuração (se aplicável) - POST para
/crm/transaction/para registrar cobranças únicas -
Cobrar o Cliente - POST para OCS/CGRateS para cobrar retail_setup_cost se configurado
-
Criar Conta OCS - POST para OCS/CGRateS para criar conta de faturamento com UUID
-
Configurar Cobranças Recorrentes - Criar Ações e ActionPlans no OCS/CGRateS para cobranças mensais recorrentes
-
Criar Registro de Serviço - PUT/POST para
/crm/service/para criar o registro de serviço no CRM:{
"customer_id": 123,
"product_id": 456,
"service_name": "Mobile SIM - 0412345678",
"service_uuid": "generated-uuid-for-ocs",
"service_status": "Active",
"service_type": "mobile",
"retail_cost": 30,
"wholesale_cost": 5,
"provisioning_play": "play_psim_only",
"provisioning_json_vars": "{...}"
} -
Atribuir Inventário - PATCH para
/crm/inventory/inventory_id/{{ inventory_id }}para marcar o inventário como "Atribuído" ao serviço -
Enviar Notificações (opcional) - E-mail ou SMS para o cliente com detalhes do serviço
Passo 7: Conclusão e Atualização de Status
Quando o playbook é concluído:
- Sucesso:
Provision.provisioning_statusatualizado para 0 (Sucesso) - Falha Crítica:
Provision.provisioning_statusatualizado para 2 (Falhou), e e-mail de falha enviado paracrm_config.provisioning.failure_list - Falhas Não Críticas: Tarefas que falham com
ignore_errors: truesão marcadas com status 3 (Falhou, mas ignorado) e não interrompem o provisionamento
O serviço provisionado agora é visível no CRM e ativo para o cliente (se o provisionamento foi bem-sucedido).
Diferenças Chave: Provisionamento de Produtos Autônomos vs Adicionais vs Agrupados
Produtos Autônomos (category: standalone):
- Recebem
customer_ideproduct_id - Tipicamente requerem itens de inventário (cartões SIM, números de telefone, modems)
- Criam um registro de serviço novo via API PUT
/crm/service/ - Provisionam novos recursos em sistemas externos (HSS, OCS, equipamentos de rede)
- Exemplo: Ativação de novo SIM móvel, nova conexão de internet
Produtos Adicionais (category: addon):
- Recebem
customer_id,product_ideservice_id(serviço existente a ser modificado) - Tipicamente NÃO requerem inventário (ou inventário mínimo)
- Modificam um serviço existente ou adicionam cobranças à conta OCS existente
- Podem executar ações no OCS (adicionar pacote de dados, adicionar crédito, habilitar recurso)
- Não criam novos registros de serviço (ou criam registros de serviço filho vinculados ao pai)
- Exemplo: Recarga de plano de dados mensal, pacote de roaming internacional, crédito extra
Produtos Agrupados (category: bundle):
- Semelhante a complementos em termos de variáveis recebidas
- Podem exigir alguns itens de inventário (por exemplo, modem para pacote residencial)
- Criam múltiplos registros de serviço relacionados (Internet + TV + Telefone)
- Provisionam múltiplos recursos em diferentes sistemas
- Vinculam serviços no CRM para faturamento/gerenciamento unificado
- Exemplo: Pacote residencial (Internet + IPTV + telefone VoIP)
Requisitos do Playbook de Provisionamento
Para que um playbook funcione corretamente, ele deve:
- Estar localizado em
OmniCRM-API/Provisioners/plays/{playbook_name}.yaml - Aceitar variáveis via
extravarsdo Ansible (acessadas como{{ variable_name }}) - Autenticar chamadas de API usando
Authorization: Bearer {{ access_token }}header - Lidar com falhas de forma graciosa usando blocos
rescueeignore_errorsonde apropriado - Criar registro de serviço para produtos autônomos, ou modificar serviço existente para complementos
- Atribuir inventário se itens de inventário foram selecionados
- Retornar mensagens de erro significativas via módulo
failquando erros críticos ocorrem
Variáveis Comuns Disponíveis em Playbooks
Todo playbook recebe essas variáveis:
customer_id- Inteiro, cliente que solicita o serviçoproduct_id- Inteiro, produto sendo provisionadoservice_id- Inteiro (apenas complementos/agrupamentos), serviço existente a modificaraccess_token- String, token JWT para autenticação da API do CRMinitiating_user- Inteiro, usuário que acionou o provisionamento- Além de quaisquer IDs de itens de inventário:
{{ inventory_type }}: inventory_id - Além de quaisquer variáveis de
provisioning_json_vars - Além de quaisquer variáveis passadas na solicitação de provisionamento
Os playbooks podem usar essas para:
- Buscar detalhes completos do produto:
GET /crm/product/product_id/{{ product_id }} - Buscar detalhes do cliente:
GET /crm/customer/customer_id/{{ customer_id }} - Buscar detalhes do inventário:
GET /crm/inventory/inventory_id/{{ SIM_Card }} - Criar transações:
POST /crm/transaction/ - Criar serviços:
PUT /crm/service/ - Atualizar serviços:
PATCH /crm/service/{{ service_id }} - Atribuir inventário:
PATCH /crm/inventory/inventory_id/{{ inventory_id }}
Exemplo: Fluxo de Playbook de Complemento Simples
Para um complemento de recarga de dados móveis:
- O playbook recebe:
customer_id,product_id,service_id,access_token - Buscar detalhes do serviço:
GET /crm/service/{{ service_id }}para obterservice_uuid - Buscar detalhes do produto:
GET /crm/product/product_id/{{ product_id }}para obter preços e quantidade de dados - Cobrar o cliente no OCS:
POST para CGRateSpara deduzir retail_cost do saldo - Adicionar crédito de dados no OCS:
POST para CGRateSpara adicionar saldo de dados com expiração - Registrar transação no CRM:
POST /crm/transaction/com detalhes da cobrança - Completar com sucesso
Todo o processo é rastreado nas tabelas Provision e Provision_Event
para fins de depuração e auditoria.
Envolvimento do OCS
OCS (Online Charging System), implementado via CGRateS, lida com todas as
cobranças em tempo real e rastreamento de uso para serviços. O registro de serviço do CRM
atua como um ponteiro para a conta OCS, que gerencia:
- Cobranças recorrentes - Taxas mensais, aluguel de DID, cobranças de assinatura
- Cobrança baseada em uso - Chamadas de voz por minuto, dados por MB, cobranças por SMS
- Gerenciamento de saldo - Saldos monetários (crédito pré-pago) e saldos unitários (dados GB, minutos de voz, contagem de SMS)
- Conversões de saldo - Convertendo saldos monetários em saldos unitários (por exemplo, gastando $30 para obter pacote de dados de 10GB)
- Estado da conta - Ativo, suspenso, desativado com base em limites de crédito e thresholds
O registro de serviço do CRM contém metadados e configuração (cliente, produto, preços, visibilidade), enquanto o OCS contém o estado de faturamento ao vivo (saldos, uso, cobranças).
Recuperando Uso e Saldos de Serviço
As informações de uso do serviço são recuperadas do OCS/CGRateS e exibidas para clientes e funcionários em tempo real.
Como o Uso é Recuperado
Quando o uso de um serviço é solicitado (via UI ou API), o seguinte fluxo ocorre:
-
Solicitação API - O frontend chama
GET /crm/service/{service_id}ou visualiza detalhes do serviço na interface do usuário -
Busca do Serviço - A API recupera o registro do serviço do banco de dados, extrai
service_uuid -
Chamadas da API CGRateS - O sistema faz duas chamadas para CGRateS:
- Get_Balance(service_uuid) - Recupera saldo da conta com
BalanceMap- Retorna saldos organizados por tipo: DADOS, VOZ, SMS, MONETÁRIO, DADOS_DONGLE
- Cada saldo inclui: ID, Valor, Data de Expiração, Peso, DestinationIDs
- O sistema adiciona campos legíveis por humanos:
custom_Name_hr,custom_Expiration,custom_Description_String
- Get_ActionPlans(service_uuid) - Recupera planos de ação de renovação automática ativos (cobertos na próxima seção)
- Get_Balance(service_uuid) - Recupera saldo da conta com
-
Mesclagem de Resposta - Os dados do CGRateS são mesclados na resposta do serviço:
{
"service_id": 123,
"service_name": "Serviço Móvel",
"service_uuid": "abc-123-def",
"cgrates": {
"BalanceMap": {
"DATA": [{
"ID": "DATA_10GB",
"Value": 5368709120,
"ExpirationDate": "2025-02-01T00:00:00Z",
"custom_Name_hr": "Pacote de Dados de 10GB",
"custom_Expiration": "1 de Fevereiro de 2025",
"custom_Description_String": "5 GB restantes"
}],
"VOICE": [{
"ID": "VOICE_UNLIMITED",
"Value": 999999999,
"custom_Name_hr": "Chamadas Ilimitadas",
"custom_Description_String": "Minutos ilimitados"
}],
"MONETARY": [{
"ID": "PREPAID_CREDIT",
"Value": 25.50,
"custom_Description_String": "Crédito de \$25.50"
}]
},
"ActionPlans": [...]
}
} -
Exibição da UI - Componentes do frontend exibem os dados de uso:
- ServiceUsage.js - Componente principal de exibição de uso com atualização automática a cada 3 segundos
- UsageCard.js - Cartões de resumo para cada tipo de saldo
- UsageProgress.js - Barras de progresso mostrando porcentagem usada/restante
- Saldos são codificados por cores e formatados para legibilidade
Estrutura de Dados de Uso
Cada saldo no BalanceMap contém:
Campos Nativos do CGRateS:
ID- Identificador único para o saldo (por exemplo, "DATA_10GB_2025_01")Value- Montante do saldo:- Para DADOS: bytes (5368709120 = 5 GB)
- Para VOZ: segundos (3600 = 1 hora)
- Para SMS: contagem (100 = 100 mensagens)
- Para MONETÁRIO: unidades de moeda (25.50 = $25.50)
ExpirationDate- Timestamp ISO 8601 quando o saldo expiraWeight- Prioridade para consumo de saldo (peso maior consumido primeiro)DestinationIDs- Destinos aos quais este saldo se aplica (por exemplo, ["AU", "INTERNATIONAL"])
Campos Legíveis por Humanos (adicionados pelo CRM):
custom_Name_hr- Nome legível por humanos extraído do IDcustom_Expiration- Data de expiração formatada (por exemplo, "15 de Janeiro de 2025" ou "em 11 dias")custom_Description_String- Descrição do saldo legível por humanos:- DADOS: "5 GB restantes" ou "10 GB totais"
- VOZ: "60 minutos restantes" ou "Ilimitado"
- SMS: "50 SMS restantes"
- MONETÁRIO: "$25.50 de crédito"
Controle de Visibilidade de Uso
A visibilidade do uso do serviço é controlada por dois campos:
- service_visible_to_customer - Se falso, o serviço é ocultado completamente do portal de autoatendimento do cliente
- service_usage_visible_to_customer - Se falso, o serviço é visível mas os detalhes de uso/saldo estão ocultos (o cliente pode ver que possui o serviço, mas não quanto usou)
Isso permite que os operadores:
- Oculte serviços internos/testes dos clientes
- Mostre que o serviço existe sem revelar o uso (útil para planos ilimitados ou serviços sensíveis)
- Exibição totalmente transparente de uso (padrão)
Atualizações de Uso em Tempo Real
A interface Web atualiza automaticamente os dados de uso:
- Intervalo: A cada 3 segundos (configurável no componente ServiceUsage)
- Método: Faz polling de
GET /crm/service/{service_id}que busca dados ao vivo do CGRateS - Eficiência: Apenas visualizações de serviços ativos são atualizadas; visualizações de lista usam dados em cache
Isso garante que clientes e funcionários vejam atualizações de saldo em quase tempo real à medida que o uso ocorre.
Cobranças Recorrentes / AutoRenovação
Cobranças recorrentes, como uma Cobrança Mensal de Serviço ou uma Cobrança por DID,
são primeiro criadas como Ações dentro do OCS e seguem o formato
Action_ServiceUUID_ServiceName_WhatitDoes.
Por exemplo, para um serviço GPON de $60 por mês que inclui 1TB de uso, a Ação seria algo como:
Action_kj49-adsf-1234-9742_60_GPON_1TB_MonthlyExpiry
- Redefinir Saldo Monetário para $0
- Enviar um POST HTTP para
/simple_provisionno CRM para provisionar algo - Adicionar um Crédito para 1TB de Uso expirando em 1 mês
Se quisermos que a MRC seja recorrente (queremos), então criaríamos um
ActionPlan chamado ActionPlan_{{ service_uuid }}_Monthly_Charge que
teria o tempo definido para mensal para acionar todo mês, e atribuiríamos
o ActionPlan à conta.
Podemos definir com base no parâmetro Ano / Meses / Dias uma data de expiração para quando a MRC também parará, por exemplo, para um serviço fixo de 12 meses que parou após esse ponto.
Como as Ações e ActionPlans são únicas para o serviço,
elas não compartilham nada com nenhum outro serviço.
Isso significa que podemos provisioná-las com valores ajustados, e isso não impactará nenhum outro serviço.
Complementos e Adicionais
Complementos / Adicionais como comprar dados extras, pacotes de roaming, minutos internacionais, etc., são tratados de forma muito semelhante. Uma Ação é criada para fazer o que é necessário, como cobrar um valor monetário e depois conceder um saldo unitário com uma expiração definida.
Em vez de usar ActionPlans para adicionar isso automaticamente ao ocorrer na
conta, apenas acionamos ExecuteAction para a Ação que acabamos de
criar uma única vez a partir do Ansible.
Adicionando Saldos Monetários Pré-pagos
Para saldos monetários pré-pagos, como um plano PAYG de $10, isso é adicionado como um saldo monetário, mas com uma prioridade maior.
O limite de crédito nesses serviços para o saldo padrão seria $0.
Limites de Crédito / Prevenindo Gastos Excessivos
ThresholdS são usados em cada conta para definir o gasto máximo para um
dado período de tempo.
Para clientes PAYG / Pré-pagos, isso é $0.
Interagindo com OCS via CRM
Para cada Serviço, você pode ver os Balances e ActionPlans, Actions
e ThresholdS do OCS a partir da API do CRM.
ActionPlans podem ser removidos conforme necessário da API do CRM, acionados via
Playbooks Ansible. ActionPlans podem ser adicionados conforme necessário, a partir do CRM,
adicionando um Complemento/Serviço e acionados via Playbooks Ansible.
Contas OCS podem ser desativadas, o que interromperá a execução de ActionPlans
e a capacidade de consumir serviços.
Para Limites de Crédito, um valor de ThresholdS é definido conforme a política para o
produto.
Visualizando e Gerenciando ActionPlans no CRM
ActionPlans (configurações de renovação automática) são exibidos e gerenciados através da interface do CRM, permitindo que funcionários e clientes vejam renovações automáticas futuras e as gerenciem.
Como ActionPlans são Recuperados e Exibidos
Ao visualizar um serviço no CRM, ActionPlans são automaticamente buscados e exibidos:
-
Chamada API - Quando
GET /crm/service/{service_id}é chamado, a API:- Recupera o registro do serviço do banco de dados
- Extrai o
service_uuid(identificador da conta OCS) - Chama a API CGRateS para buscar ActionPlans por UUID do serviço
- Isso chama internamente
Get_ActionPlans(service_uuid)no CGRateS
-
Estrutura de Dados do ActionPlan - Cada ActionPlan retornado contém:
{
"ActionPlanId": "ServiceID_abc-123-def__ProductID_456__...",
"PlanName": "Plano de Renovação Mensal",
"NextExecTime": "2025-02-01T00:00:00Z",
"custom_NextExecTime_hr": "em 11 dias",
"ActionPlanId_split_dict": {
"ServiceID": "abc-123-def",
"ProductID": 456,
"CustomerID": 789,
...
}
}ActionPlanId- Identificador único contendo informações codificadas de serviço/produto/clientePlanName- Nome do plano de ação (tipicamente o nome do playbook de renovação)NextExecTime- Timestamp ISO quando o ActionPlan será executado a seguircustom_NextExecTime_hr- Tempo legível por humanos até a execução (por exemplo, "em 11 dias", "amanhã", "1 de Fevereiro de 2025")ActionPlanId_split_dict- Dicionário com componentes analisados do ActionPlanId
-
Exibição da UI - ActionPlans são mostrados no componente ActionPlansTable:
Colunas da Tabela:
- Nome do Produto - Recuperado buscando
ProductIDdo ActionPlanId - Custo - Mostra
retail_costda definição do produto - Data de Renovação - Exibe
custom_NextExecTime_hr(legível por humanos) - Ações - Dois botões:
- Renovar Agora - Provisionar imediatamente o complemento/renovação (ignora a espera pela execução programada)
- Remover Renovação Automática - Cancela a renovação automática
Quando Nenhum ActionPlan Existe:
- A tabela mostra a mensagem: "Nenhuma renovação automática habilitada para este serviço"
- O cliente pode adicionar complementos de renovação automática para habilitar a renovação automática
- Nome do Produto - Recuperado buscando
Gerenciando ActionPlans
Funcionários e clientes podem gerenciar ActionPlans através da interface:
Removendo um ActionPlan (Cancelando Renovação Automática):
- Clique no botão "Remover Renovação Automática" na ActionPlansTable
- Modal de confirmação aparece: "Você tem certeza que deseja remover esta renovação automática?"
- Na confirmação, o frontend chama:
DELETE /crm/oam/remove_action_plan/{action_plan_id} - A API remove o ActionPlan do CGRateS via
ocs.Remove_ActionPlan() - A atividade é registrada: "Removed ActionPlan {ActionPlanId} from service {service_id}"
- ActionPlan desaparece da tabela
Renovando Imediatamente (Renovação Manual):
- Clique no botão "Renovar Agora" na ActionPlansTable
- Modal de confirmação aparece: "Você tem certeza que deseja renovar isso agora?"
- Na confirmação, o sistema:
- Extrai product_id do ActionPlanId
- Cria um novo trabalho de provisionamento para esse produto
- Provisiona o complemento imediatamente (executa o playbook de provisionamento)
- O serviço recebe os benefícios do complemento sem esperar pela renovação programada
- Modal de status de provisionamento mostra progresso
- Em caso de sucesso, saldos são atualizados imediatamente
Adicionando Renovação Automática:
A renovação automática é habilitada ao provisionar um produto complementar que tem
auto_renew definido:
- Produtos com
auto_renew = "true"- Criam automaticamente ActionPlans durante o provisionamento - Produtos com
auto_renew = "prompt"- Perguntam ao cliente se ele deseja renovação automática (diálogo modal) - Produtos com
auto_renew = "false"- Nunca criam ActionPlans (compra única)
O playbook de provisionamento cria o ActionPlan no CGRateS com:
- ActionPlanId único codificando IDs de serviço, produto e cliente
- Cronograma de renovação (mensal, anual, intervalo personalizado)
- Ação a ser executada (tipicamente reprovisionamento do mesmo complemento)
- Data de expiração (se o contrato tiver um prazo fixo)
Convenção de Nomenclatura de ActionPlan
ActionPlans seguem uma convenção de nomenclatura padronizada para codificar metadados:
Formato:
ServiceID_{service_uuid}__ProductID_{product_id}__CustomerID_{customer_id}__...
Exemplo:
ServiceID_abc-123-def__ProductID_456__CustomerID_789__MonthlyRenewal
Essa codificação permite que o CRM:
- Identifique a qual serviço o ActionPlan pertence
- Busque detalhes do produto (nome, preços) para exibição
- Rastreie a propriedade do cliente
- Analise o tipo de renovação e cronograma
O CRM analisa automaticamente esses componentes em
ActionPlanId_split_dict para fácil acesso.
ActionPlans na Visualização de Serviço
Ao visualizar um serviço no CRM, a tabela de ActionPlans é exibida nos detalhes do serviço:
Visualização do Funcionário (ServiceView.js):
- Mostra a tabela completa de ActionPlans com todas as opções de gerenciamento
- Exibe nomes de produtos, custos, datas de renovação
- Permite remoção e renovação imediata
Visualização do Cliente no Autoatendimento:
- Mostra renovações futuras em uma visualização simplificada
- Exibe a próxima data de renovação e valor
- Pode permitir que os clientes desativem a renovação automática (configurável por produto)
Estado Vazio:
- Se nenhum ActionPlan existir: "Nenhuma renovação automática habilitada para este serviço"
- Sugere adicionar um complemento de renovação automática para habilitar renovações automáticas