KEPLIN Docs

Logik och automatisering

Att skriva Python-skriptet som sammanfattar säljpipelinen, köra det för hand och schemalägga det till varje morgon.

Appen visar redan data och låter dig redigera dem. Det som fattas är delen som arbetar av sig själv: ett skript som varje morgon tittar på pipelinen, räknar det som är öppet och registrerar de avslut som är planerade för veckan.

I den här etappen skriver du det skriptet i Python, kör det för hand för att se resultatet, och sätter en tid på det — varje dag kl. 07:00.

Vad skriptet ska göra

atualizar_indicadores svarar på tre frågor, och returnerar dem i ett resultat som hamnar i historiken:

Fråga Vad den returnerar
Hur många affärsmöjligheter är öppna? oportunidades_abertas
Hur mycket är pipelinen värd? valor_pipeline
Hur många avslut är planerade för de närmaste 7 dagarna? fechos_proximos_7_dias

Utöver resultatet skriver det loggar — en rad per avslut under veckan — så att den som öppnar historiken förstår, utan att räkna, vad som var inbokat den dagen.

Skapa skriptet

  1. Välj panelen Kod i sidofältet.
  2. På raden Skript, klicka på + (Nytt skript). Dialogrutan Nytt skript öppnas — ”Välj runtime och skapa — koden redigerar du sedan, med kontraktet framför dig.”
  3. I Namn, skriv atualizar_indicadores. Namnet identifierar skriptet överallt — i schemana, i API-stegen, i andra skripts beroenden.
  4. Runtime är låst till Python.
  5. I Beskrivning, skriv Räknar om säljindikatorerna och varnar när det finns avslut den här veckan.
  6. I Tidsgräns, lämna 1 minut. Det är körningens tak: efter den tiden klipper plattformen av.
  7. Klicka på Skapa skript. Editorn öppnas med main.py färdig.

Dialogrutan Nytt skript — namn, runtime, beskrivning och tidsgräns.
Dialogrutan Nytt skript — namn, runtime, beskrivning och tidsgräns.

Dica

En generös tidsgräns är ingen artighet: om det här skriptet används som steg i ett API får klienterna vänta så länge i värsta fall. En minut räcker mer än väl för det vi ska göra.

Skriva main.py

Ett skripts kontrakt är kort: en funktion main(input) som returnerar något. Det du returnerar hamnar i körhistoriken och, om skriptet anropas av ett API, är det API:ets svar.

Skriv det här i editorn:

from datetime import date, timedelta

from api_manager import db, log


def main(input):
    """Räknar om säljpanelens indikatorer.

    Körs varje dag kl. 07:00 (schemat "Indicadores diários") och returnerar
    sammanfattningen — körhistoriken får en läsbar post per dag.
    """
    crm = db("Dados CRM")

    abertas = crm.query(
        "select count(*) as n, coalesce(sum(valor), 0) as total "
        "from oportunidades where fase not in ('fechada_ganha', 'fechada_perdida')"
    )[0]

    limite = (date.today() + timedelta(days=7)).isoformat()
    fechos_semana = crm.query(
        "select titulo, data_fecho from oportunidades "
        "where fase not in ('fechada_ganha', 'fechada_perdida') "
        "and data_fecho <= ? order by data_fecho",
        [limite],
    )

    log("pipeline:", abertas["n"], "affärsmöjligheter /", abertas["total"], "EUR")
    for op in fechos_semana:
        log("avslut denna vecka:", op["titulo"], "(", op["data_fecho"], ")")

    return {
        "oportunidades_abertas": abertas["n"],
        "valor_pipeline": abertas["total"],
        "fechos_proximos_7_dias": len(fechos_semana),
    }

Editorn för skriptet atualizar_indicadores — main.py och, nedanför, panelen Körningens resultat.
Editorn för skriptet atualizar_indicadores — main.py och, nedanför, panelen Körningens resultat.

Fyra saker att komma ihåg från den här koden:

Rad Vad den gör
from api_manager import db, log Plattformens åtkomst: db öppnar databaser, log skriver i historiken.
db("Dados CRM") Databasen via datakällans interna namn — samma som du registrerade i modelletappen. Ändra namnet där och den här raden slutar fungera.
crm.query(sql, [värden]) Parametriserad fråga. Värdena skickas alltid separat från frågan — aldrig klistrade in i texten.
return { … } Körningens resultat. Det hamnar i historiken och är det som ett API skulle returnera.

Det input som funktionen får in bär körningens argument — de från ett API, de från ett schema eller de du skriver in för hand härnäst. Här använder vi inga.

Nota

Det finns ingen sparaknapp: editorn sparar av sig själv. Reglaget Aktivt i övre högra hörnet är något annat — ett inaktivt skript finns kvar men körs inte, varken för hand eller via ett schema.

Köra skriptet för hand

  1. Högst upp i editorn, klicka på Kör nu.
  2. Dialogrutan öppnas — ”Ange argumenten för den här körningen (valfritt). Värdena når skriptet som text.” Vi behöver inga.
  3. Klicka på Kör.

Dialogrutan Kör nu — valfria argument för den här körningen, som når skriptet som text.
Dialogrutan Kör nu — valfria argument för den här körningen, som når skriptet som text.

Panelen Körningens resultat, nedtill, fylls: märket Lyckades med varaktigheten, det returnerade värdet i JSON och blocket Loggar med de rader som log() skrev.

Panelen Körningens resultat, med det returnerade värdet och loggarna.
Panelen Körningens resultat, med det returnerade värdet och loggarna.

Dica

Den första körningen av ett Python-skript är alltid den långsammaste — miljön förbereds i det ögonblicket. De följande körs på millisekunder.

Körhistoriken

Resultatet i editorn gäller bara den aktuella sessionen. Hela historiken ligger under knappen Körningar, bredvid Kör nu:

Skriptets historik Körningar — start, utlösare, status och varaktighet för varje körning.
Skriptets historik Körningar — start, utlösare, status och varaktighet för varje körning.

Varje rad visar Start, Utlösare (Manuell, när det var du; Schema, när det var den utsatta tiden), Status och Varaktighet, och länken Detaljer öppnar körningen: argumenten, det returnerade resultatet och loggarna från just den körningen. Det är här man tre veckor senare förstår vad skriptet såg den morgon då ingen tittade.

Schemalägga till varje morgon

Ett skript som bara körs när någon trycker på en knapp är ingen automatisering. Det är dags att sätta en tid på det.

  1. I trädet i panelen Kod, fäll ut noden för skriptet atualizar_indicadores. Tre avsnitt visas: Filer, Beroenden och Scheman.
  2. För musen över Scheman och klicka på + (Nytt schema).
  3. Ge det namnet Indicadores diários och skapa. Schemats editor öppnas i en flik.
  4. I Frekvens, välj Vid bestämda tidpunkter”Vid en tidpunkt på dygnet, på de dagar du väljer.”
  5. I Upprepas, välj Varje dag (på de valda dagarna).
  6. I Vid tidpunkten, skriv 07:00.
  7. I Dagar, låt alla sju vara markerade (eller klicka på Vardagar om helgen inte är intressant).
  8. I Tidszon, välj Europe/Lisbon. Det är tidszonen som avgör vad ”sju på morgonen” betyder — utan den flyttar sig den rätta tiden när klockan ställs om.
  9. I Om en körning missas, välj Ignorera.
  10. Kontrollera att reglaget Aktiv är påslaget och klicka på Spara.

Schemat Indicadores diários — varje dag kl. 07:00 (Europe/Lisbon), med panelen Körningar till höger.
Schemat Indicadores diários — varje dag kl. 07:00 (Europe/Lisbon), med panelen Körningar till höger.

De tre frekvenserna

Frekvens När den används
Upprepa Var N:e minut eller timme, utan uppehåll. Synkroniseringar, avfrågningar.
Vid bestämda tidpunkter Vid en tidpunkt på dygnet, på de valda dagarna. Det är vårt fall — och det vanligaste.
Bevakningsfönster Avfrågar var N:e minut mellan två tidpunkter och slutar när dagens arbete är gjort. För att vänta på en fil som kommer ”på morgonen, vid varierande tid”.

Den som föredrar att skriva schemauttrycket för hand har länken Skriv uttrycket för hand under de tre alternativen.

Vad man gör med det som missades

Servern låg nere klockan sju på morgonen. Vad händer med det missade tillfället när den kommer tillbaka? Det är vad Om en körning missas avgör:

Alternativ Vad det gör
Ignorera Tar inte igen något. Att körningen missades registreras ändå.
Bara den senaste Tar igen den senast missade körningen; de tidigare registreras som missade.
Alla Tar igen alla körningar som missats, i den ordning de var schemalagda.

För en daglig sammanfattning är Ignorera det rätta: att köra tisdagens sammanfattning på torsdagen tjänar ingen. För en månatlig fakturering är Alla helt rimligt.

Schemats körningspanel

Till höger i editorn ligger panelen Körningar, med de planerade tiderna och vad som hände med var och en: Klar, Väntar, Missad eller Överhoppad.

Atenção

Om den här panelen varnar för att ”Schemaläggaren körs inte i den här installationen — ingenting kommer att köras.” står de utsatta tiderna och väntar och ingenting körs. Schemaläggaren slås på i installationen, inte i appen — prata med den som administrerar plattformen.

Och sedan?

Skriptet är redo för mer än den utsatta tiden: det kan bli ett steg i ett API (så att sammanfattningen beräknas på begäran), det kan anropa andra skript som beroende, och det kan installera de Python-paket det behöver. Kapitlet Skript går igenom allt det, och Skriptens SDK dokumenterar api_manager — databaser, filer, secrets, aviseringar och HTTP-anrop.

Varför inte…?

  • Varför misslyckas skriptet med ”datakällan hittades inte”? Namnet i db("…") måste vara exakt datakällans Internt namn, versaler inkluderade.
  • Varför ser jag inte knappen Kör nu? Skriptet är inaktivt — slå på reglaget högst upp.
  • Varför klipptes körningen av på halva vägen? Den slog i Tidsgräns. Antingen tar skriptet verkligen så lång tid, och då höjer du gränsen, eller så gör det för mycket arbete för det ställe där det anropas.
  • Varför kördes schemat aldrig? Kontrollera, i tur och ordning: är schemat Aktiv? Är skriptet Aktivt? Körs schemaläggaren i den här installationen? Och är Tidszon den du tror att den är?

CRM:et är komplett. Nu återstår att lägga ut det: publicera och använda.