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
- Välj panelen Kod i sidofältet.
- 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.”
- I Namn, skriv
atualizar_indicadores. Namnet identifierar skriptet överallt — i schemana, i API-stegen, i andra skripts beroenden. - Runtime är låst till Python.
- I Beskrivning, skriv
Räknar om säljindikatorerna och varnar när det finns avslut den här veckan. - I Tidsgräns, lämna 1 minut. Det är körningens tak: efter den tiden klipper plattformen av.
- Klicka på Skapa skript. Editorn öppnas med
main.pyfärdig.

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),
}

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
- Högst upp i editorn, klicka på Kör nu.
- Dialogrutan öppnas — ”Ange argumenten för den här körningen (valfritt). Värdena når skriptet som text.” Vi behöver inga.
- Klicka på Kör.

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.

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:

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.
- I trädet i panelen Kod, fäll ut noden för skriptet
atualizar_indicadores. Tre avsnitt visas: Filer, Beroenden och Scheman. - För musen över Scheman och klicka på + (Nytt schema).
- Ge det namnet
Indicadores diáriosoch skapa. Schemats editor öppnas i en flik. - I Frekvens, välj Vid bestämda tidpunkter — ”Vid en tidpunkt på dygnet, på de dagar du väljer.”
- I Upprepas, välj Varje dag (på de valda dagarna).
- I Vid tidpunkten, skriv
07:00. - I Dagar, låt alla sju vara markerade (eller klicka på Vardagar om helgen inte är intressant).
- 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. - I Om en körning missas, välj Ignorera.
- Kontrollera att reglaget Aktiv är påslaget och klicka på Spara.

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.