Ir para o conteúdo principal

15.2 Caso de Uso: Cotação para Pedido de venda

No manual de como "Cadastrar e visualizar" seu kanban, vimos que é possível criarmos diversos cenários flexiveis de acordo com o fluxo e alvo da empresa.

5. Estrutura básica

O cenário que disponibilizaremos abaixo, consiste em um Kanban de Cotações (OQUT), que trata vínculos com o Pedidos de Venda (ORDR). O objetivo foi:

  • Mostrar as últimas cotações de cada cliente.

  • Calcular valores de conversão em pedidos.

  • Exibir saldos, progresso e status da conversão.

  • Usar cores e prioridades dinâmicas para destacar casos críticos.

  • Mostrar, em Campo 1, se a cotação já virou pedido (com número do PV) ou não.

Query inicial

WITH Cot AS (
  SELECT
    OQ."DocEntry",
    OQ."DocNum",
    OQ."CardCode",
    OQ."CardName",
    OQ."SlpCode",
    OQ."DocDate",
    OQ."DocDueDate", -- vencimento
    OQ."DocTotal",
    ROW_NUMBER() OVER (
      PARTITION BY OQ."CardCode"
      ORDER BY OQ."DocDate" DESC, OQ."DocEntry" DESC
    ) AS rn
  FROM OQUT OQ
  WHERE OQ."DocDate" BETWEEN '{[Data1CRMOne][Data inicial]}' AND '{[Data2CRMOne][Data final]}'
),

OrdFromCot AS (
  SELECT 
    D."BaseEntry" AS "DocEntryCot",
    SUM(O."DocTotal") AS "OrderTotal",
    STRING_AGG(CAST(O."DocNum" AS NVARCHAR), ', ') AS "OrderNums"
  FROM (
    SELECT DISTINCT R1."BaseEntry", R1."DocEntry"
    FROM RDR1 R1
    WHERE R1."BaseType" = 23
  ) D
  JOIN ORDR O ON O."DocEntry" = D."DocEntry"
  GROUP BY D."BaseEntry"
)

SELECT
  C."CardCode" || ' - ' || C."CardName" AS "Agrupador",
  '#E6F6FE'                             AS "CorAgrupador",

  C."DocEntry"                          AS "IdDoc",
  '23'                                  AS "TipoObjeto",
  'Cotação ' || C."DocNum"              AS "Titulo",

  C."DocDate"                           AS "Data1",
  CURRENT_DATE                          AS "Data2",
  C."DocDueDate"                        AS "Data3",

  'Origem: Cotação → Pedido'            AS "Observacao",
  S."SlpName"                           AS "Responsavel",

  CASE
    WHEN C."DocTotal" > 20000 THEN 'Prioritário'
    WHEN C."DocTotal" > 10000 THEN 'Elevada'
    WHEN C."DocTotal" >  5000 THEN 'Normal'
    ELSE 'Baixa'
  END                                   AS "Prioridade",

  CASE
    WHEN C."DocTotal" > 20000 THEN '#FF0000'
    WHEN C."DocTotal" > 10000 THEN '#FFA500'
    WHEN C."DocTotal" > 5000  THEN '#00CED1'
    ELSE '#808080'
  END                                   AS "CorPrioridade",

  'Cotação'                             AS "Classificacao",
  '#0ea5e9'                             AS "CorClassificacao",

  CAST(C."DocTotal" AS DECIMAL(19,2))               AS "Valor1",
  CAST(COALESCE(O."OrderTotal",0) AS DECIMAL(19,2)) AS "Valor2",
  CAST(COALESCE(O."OrderTotal",0) - C."DocTotal" AS DECIMAL(19,2)) AS "Valor3",

  CASE WHEN COALESCE(O."OrderTotal",0) = 0 THEN 50 ELSE 100 END AS "Progresso",

  CASE
    WHEN COALESCE(O."OrderTotal",0) = 0 THEN 'Pedido não gerado'
    ELSE 'PV(s): ' || O."OrderNums"
  END                                   AS "CampoUsuario1",

  ''                                    AS "CampoUsuario2",

  CASE
    WHEN COALESCE(O."OrderTotal",0) = 0 THEN '#EF4444'
    WHEN COALESCE(O."OrderTotal",0) < C."DocTotal" THEN '#F59E0B'
    ELSE '#16A34A'
  END                                   AS "CorDoCard",

  CASE
    WHEN COALESCE(O."OrderTotal",0) = 0 THEN '#F9D9D9'
    WHEN COALESCE(O."OrderTotal",0) < C."DocTotal" THEN '#FFECCC'
    ELSE '#D7FDDE'
  END                                   AS "CorDoCardTotal"

FROM Cot C
LEFT JOIN OrdFromCot O ON O."DocEntryCot" = C."DocEntry"
LEFT JOIN OSLP S        ON S."SlpCode"    = C."SlpCode"
WHERE C.rn <= 5
ORDER BY C."CardCode", C."DocDate" DESC, C."DocEntry" DESC;

3. Explicação dos recursos

Filtros

  • Você pode usar filtros no formato:

    WHERE DocDate BETWEEN '{[Data1CRMOne][Data Inicial]}' AND '{[Data2CRMOne][Data Final]}'
    

    image.png

  • Também há suporte para texto, checkbox e combobox.

Cores dinâmicas

Exemplo de lógica para mudar cor do card:

CASE
  WHEN COALESCE(O."OrderTotal",0) = 0 THEN '#EF4444'
  WHEN COALESCE(O."OrderTotal",0) < C."DocTotal" THEN '#F59E0B'
  ELSE '#16A34A'
END AS "CorDoCard"

Prioridade

  • Baseada no valor total da cotação.

  • Com cor vinculada ao nível:

    • > 20.000Prioritário (vermelho)

    • > 10.000Elevada (laranja)

    • > 5.000Normal (azul)

    • ≤ 5.000Baixa (cinza)

Progresso

  • Se sem pedido vinculado → 50.

  • Se com pedido vinculado → 100.

Campo 1

Mostra o status do vínculo:

  • “Pedido não gerado” se não houver pedido.

  • “PV(s): nº do pedido” quando houver.

Campo 2

Livre para uso adicional (ex.: origem, status interno, área responsável, campos de usuário).


4. Cenário criado

No exemplo final, montamos um Kanban de Cotações → Pedidos de Venda com os seguintes objetivos:

  1. Monitorar as últimas 5 cotações por cliente.

  2. Comparar o valor da cotação com os pedidos vinculados.

  3. Mostrar saldos positivos/negativos.

  4. Definir prioridade automática com cores.

  5. Exibir progresso (50/100).

  6. Indicar no Campo 1 se já houve conversão para pedido.

Esse modelo pode ser adaptado para qualquer tabela do SAP B1 (ex.: OCRD para PN, OINV para NF, etc.), tornando o Kanban altamente flexível.

image.png