Kameleon Solutions
| Client / Project | Created by | Last modified by | Total hours | Status | Trend | Created | Modified | |
|---|---|---|---|---|---|---|---|---|
| Loading... | ||||||||
quote_group_id, pa ga INNER JOIN u listi nije prikazivao. Posle kloniranja, kalkulator se sada automatski otvara sa novom procienom.user_email u request body-ju. Ako taj email postoji u allowed_users, koristi se kao created_by umesto API client name-a. Time Slack DM i prikaz kreatora u listi ispravno pokazuju stvarnog korisnika.blur), ne samo pri kucanju. Sprečava slučaj gde Save upisuje 0 ako browser nije okinuo oninput.NULL umesto praznog stringa koji MySQL strict mode odbija.?quote=40) dok si izlogovan sada vodi direktno na tu procenu posle Google login-a, umesto na početni ekran.ukupni sati ÷ 7 (umesto ÷ 8). Prikaz dana u TOTAL redu tabele je premešten ispod sati.setSelectionRange ne radi na type=number inputima pa je kursor padao na početak; polje je promenjeno u type=text.POST /api/oauth/token i pozivaju API bez korisničke sesije. Tokeni traju 1 sat i čuvaju se u bazi.POST /api/quotes/quick-create prima samo client_name i project_name i vraća { id, url } sa direktnim linkom do kalkulatora. Dostupan i sa Bearer tokenom.api_clients (client credentials) i api_tokens (aktivni tokeni) — auto-migracija pri prvom pozivu OAuth endpointa.client_secret se čuva isključivo kao bcrypt hash; nikad plaintext.quotes.status proširen sa client_approved — auto-migracija pri prvom API pozivu.sent → client_approved | archived su jedine dozvoljene; archived i client_approved su terminalni (dalja promena blokirana).loadQuote već interno renderuje sve stavke.quote_group_id INT — vezuje sve verzije iste procene. Migracija automatski postavlja quote_group_id = id za postojeće procene.quote_version INT DEFAULT 1 — redni broj verzije unutar grupe.POST /api/quotes/{id}/new-version — kreira sledeću verziju; vraća novi quote objekat. Dozvoljeno samo za procene u statusu sent ili archived.quote_get vraća versions[] array sa svim verzijama grupe (id, quote_version, status, created_at)./estimate status:approved filtrira procene po statusu. Kombinuje se sa pretragom: /estimate Sport Vision status:sent. Nevalidna vrednost vraća poruku sa validnim opcijama.GET /api/quotes/clients?q=xxx — vraća do 10 distinktnih naziva klijenata koji matchuju query (min 2 karaktera).api/slack/actions.php — obrađuje Slack interactive component payload (load_more_quotes action), sa istom signature verifikacijom kao search.php.SlackNotifier::formatStatusText() — novi helper koji vraća status label bez emoji-ja (za Slack header tekst).slack.php Request URL — nema izmena u Slack App konzoli. load_more_quotes akcija je dodata kao nova grana u handleLoadMore().#estimations) o brisanju. Ako je brisač neko drugi od kreatora, kreator dobija i privatnu DM poruku sa detaljima procene.allowed_users.slack_user_id (VARCHAR 20) — auto-migracija pri pokretanju; mapira korisnika na Slack ID za DM poruke.api/slack/digest.php — poziva se iz cPanel Cron Jobs (0 9 * * *), nema HTTP input niti Slack signature verifikaciju.SlackNotifier::quoteDeleted() i SlackNotifier::sendDigest() implementirani u api/slack/SlackNotifier.php.quote_delete() sada čita podatke pre DELETE-a i prosleđuje ih notifikatoru; greška u Slack pozivu nikad ne vraća 500 frontendu./estimate [tekst] in Slack to search estimations by client or project name. Returns up to 5 results with status, hours, date, and editor. Empty query returns the 5 most recently modified. Results are ephemeral (visible only to you).POST /api/slack/search — Slack signature verification, direct Block Kit response (no async needed for LIMIT 5 queries).PATCH /api/quotes/{id}/status — direct status update with validation.api/slack/SlackNotifier.php (static helper, file_get_contents based), api/slack/search.php.quotes.status now includes sent and archived via auto-migration.APP_URL_BASE in auth_config.php — single source for application URL in Slack links.max-width povećan sa 980px na 1280px za listu i kalkulator; sadržaj je bolje centriran na savremenim monitorima (1440px+).assets/style.css and assets/app.js for leaner diffs and faster context loading.slack.php (webhook handler with Slack signature verification). New file: slack_config.php (credentials, blocked via .htaccess and .gitignore).quotes: slack_message_ts, slack_channel_id. Slack Block Kit messages with interactive buttons and modal for rejection.quotes: status, approved_by, approval_comment, reviewed_at. New column on allowed_users: role. Auto-migration on first API call.POST /quotes/{id}/submit, /approve, /reject. New GET /quotes/role for current user's role..json fajl, uključujući sve doc podatke.quotes (auto-migracija pri prvom pozivu).x.y.z.quote_overrides. Nova kolona total_hours na quotes.POST /api/quotes/{id}/duplicate, GET /api/quotes/users.allowed_users tabeli.?quote=ID nakon čuvanja; direktan link otvara procenu..htaccess rewriting, session-based auth sa CSRF zaštitom.Math.ceil.Korak 1: unesi development taskove i postavi scope za ostale aktivnosti · Korak 2: proceni rizik · Korak 3: rezultat
Unesite osnovne podatke pre nego što počnete sa estimacijom.