Schede attive e Void nella directory della piattaforma org
La scheda delle Organizzazioni della console ora si divide in sotto-tabs Active e Void. A organizzazione vuota è orgs.is active = FALSE (set by SecurityService'...
Tassa di avvio di un piano, e l'offerta live, sul filo
PlanDto ha portato solo il tasso ricorrente, quindi ogni superficie citando un piano citato un prezzo il cliente non sarebbe addebitato: la tassa di avvio di Ka...
Un punto finale dietro la pagina del piano del cliente
GET /api/billing/self/plan risponde a tutto /myplan rende: il piano, che cosa il l'organizzazione può effettivamente utilizzare, il catalogo per confrontare, se...
Bill la tassa di avvio su entrambi i percorsi a un piano, e record termini negoziati
Due percorsi raggiungono lo stesso piano e solo uno di loro stava per caricare il nuovo tassa di avvio per-seat. Una fattura d'ordine scritta dalle vendite tram...
Bloccare ogni spazzata denaro-moving, e eseguire due pod
BillingService ha eseguito un pod e le sue sette spazzate programmate erano corrette solo a causa di esso. Ecco. non è ShedLock ovunque su questa piattaforma, q...
Servire l'offerta in esecuzione e dire se un sedile è realmente PAID per
Aggiunge GET /markets/{id}/promozione. Non c'era modo per una superficie di acquisto in-app conoscere un'offerta era in esecuzione a tutti — il sito di marketin...
Bill il termine di tre anni, e cita il suo tasso alla console
BillingCycles guadagna TRIENNIAL, espresso a Stripe come tre ANNI piuttosto che trentasei MESE così il rinnovamento traccia l'anniversario di iscrizione — la st...
Linee per server sulla sintesi delle estensioni
La scheda delle estensioni del server del telefono ha mostrato la figura e nient'altro, quindi un server KamoPBX vuoto ha mostrato "21 estensioni fatturabili — ...
Rifiutare un abbonamento self-serve Enterprise
L'impresa è negoziata. Nascondere il prezzo è la presentazione; questo è il confine. Una richiesta che nomina il piano Enterprise viene rifiutata a meno che il ...
Servizio telefonico di Bill dall'estensione
PricingModel.PER EXTENSION, la sua chiave di quantità riservata, un allocatore, un riconciliatore notturno, un cancello di rimozione e l'API di sintesi - il gem...
Bill e-mail per casella di posta, riconciliato di notte
La quantità è server-computata sotto una chiave riservata un corpo di richiesta non può raggiungere, e spinto attraverso il percorso di modifica esistente — cos...
Fare un evento Stripe riprodotto un no-op
Aggiunge BillingWebhookEventClaimService sul proprio fagiolo, con REQUIRES NEW su ogni metodo, e lo collega in processoEvent davanti all'interruttore di spedizi...
Pubblicare la conversione a pagamento per le organizzazioni tracciate
Entrambi i percorsi che timbro BillingSourceType.PAID ora pubblicare marketing.visitor.paid, perché agganciare solo uno silenziosamente manca metà del traffico ...
Decide l'accesso alla piattaforma con il risolutore condiviso
@PlatformAdminSolo ora nomina la piattaforma giusta che richiede (di default a MANAGE ORGANIZZAZIONI, che è ciò che la superficie della piattaforma di questo se...
Portare la data di rinnovo sulla copertura e i carichi di pagamento di gruppo
Entrambe le superfici ora riportano correntePeriodEnd e annullanoAtPeriodEnd. La data è ciò una conferma di cancellazione in realtà ha bisogno di dire — "manten...
Un piano per organizzazione, un soffitto Enterprise 25 posti, e un modo per smettere di pagare
Il piano è ora una decisione a livello organizzativo e nient'altro può superarlo. Lasciare un self-payer o un manager di gruppo scegliere le proprie letture com...
Lasciate che il piano di un gruppo sia annullato e fermate il doppio pagamento per una persona
Tre lacune in quello che ha spedito ultimo: Un gruppo con un piano non potrebbe mai essere rimosso. delete() rifiuta mentre un live l'abbonamento esiste — corr...
Rendere i gruppi di fatturazione lavorare fine a fine, e smettere di pagare per nulla
Un gruppo può ora riunire le persone, comprare un piano sulla carta del suo manager, e la mano i suoi posti fuori. Nessuna di queste esisteva: le uniche operazi...
Dite alle persone che il loro pagamento è fallito e ritirate l'abbonamento
L'abbraccio che non esisteva. fattura.payment failed ha scritto una riga e ha restituito: nessuna e-mail, nessuna bandiera, nessun cambiamento di stato e fattur...
Lascia che un membro acquisti il proprio posto, e chiuda un foro di parametri del corpo
Il self-pay non aveva traccia all'interno della console. Tutto sulla superficie di fatturazione è a forma di account — è già necessario tenere una riga AccountM...
Org policy e fatturazione gruppo API
Chi all'interno di un'organizzazione può pagare Kamo ora è responsabile e impostabile. Entrambi i percorsi sono org-scoped e quindi deliberatamente fuori /api/b...
Predefinire l'obiettivo di un nuovo abbonamento
Un primo acquisto non ha abbonamento esistente per copiare targetOrganizationId da, e richiederlo incondizionatamente è quello che ha creato uno dalla console i...
Acquistare un blocco quando un org opted-in esaurisce la stanza
Corre poco dopo lo spazzamento istantanee notturno, perché questo è ciò che produce figura di utilizzo su cui decide — l'espansione contro il numero di ieri com...
Lascia un cambio di prezzo di catalogo in realtà raggiungere Stripe
Stripe I prezzi sono immutabili e la mappatura contiene una riga per (org, tipo, codice, ciclo) dietro una chiave unica, quindi una volta che un prezzo esisteva...
Capacità di report accanto all'utilizzo
Il pannello di stoccaggio riportato dates immagazzinato contro nulla — nessuna indennità, nessuna percentuale, nessun denaro — quindi un proprietario che guarda...
Fai un primo piano acquistabile, e restituire i prezzi reali del piano
Due cose hanno fermato un'organizzazione a comprare un primo abbonamento. Le liste dei piani sono raggiungibili solo tramite il submarketId su un abbonamento g...
Bill per-unit add-ons da unità acquistate, non da headcount
Filetta la nuova quantità di add-on tramite creare e aggiornare: un componente aggiuntivo FLAT prende la sua quantità Stripe da quello che l'abbonamento effetti...
Punta a YugabyteDB e usa PostgreSQLDialect
CockroachDB è stato sostituito da YugabyteDB. Le stringhe di connessione si muovono da scarroachdb-public:26257 a yb-tserver-service:5433, e il dialetto Hiberna...
Leggi l'utilizzo di immagini da un pass deduplicato
Segue la modifica della biblioteca condivisa a una carica per file distinti per organizzazione. Sia il riassunto che lo scrittore di snapshot giornaliero prendo...
Lasciare che un amministratore di piattaforma eseguire la scansione istantanea su richiesta
La spazzata è ciò che rende le rimozioni di periodo e i totali di vita per il domini discontinui rispondono a tutti, quindi i giorni persi a un outage sono pers...
Segnala cosa sta memorizzando un'organizzazione
La scheda statistiche dell'account ha sempre detto "Nessun dato di utilizzo disponibile per questo periodo", per ogni organizzazione, perché ottenereCurrentUsag...
Servire la directory org come pagina filtrata, ordinata e impaginata
GET /orgs prende pagina/dimensione/q/sort/dir più sette filtri e restituisce la casa pagina busta con aggregati immobiliari. GET /orgs/{orgId} serve tutti i det...
L'idratazione della pagina a un conteggio costante delle query
Titolo principale, dominio primario, piano/mercato dietro il diritto e abbonamenti-catalogo bandiera sono ciascuno un lotto IN (:ids) su tutta la pagina, così u...
Directory riga / pagina DTO e il repository query nativo
PlatformOrgRow trasporta le due sfaccettature separatamente: diritto (sotto in entrata mirare l'org -- che cosa lo governa) e fatturazione tenuta (conti che l'o...
Org directory SQL con per-facet CTEs
Conti ceduti, abbonamenti in entrata, membri, licenziatari e bambini ciascuno aggregati nel proprio CTE prima di essere uniti a org. Unire loro in uno pass avre...
Richiesta di directory validata, bloccata
Dimensioni morsetti a [1.100] e un tipo non riconosciuto rientra al titolo, quindi un URL a mano non può richiedere l'intera proprietà né raggiungere la SQL com...
Modalità di denunce del diritto attraverso un risolutore condiviso e deterministico
TrialAdminService ha scelto il suo abbonamento di prova con findFirst() su un elenco non ordinato, quindi un org che tiene sia un processo in sospeso e attivo p...
Expose trialExpiresAt sulla piattaforma og sommario per le prove di amministrazione UI
Piattaforma-admin applicare/escludere/status test endpoints + DTO trialExpiresAt
Lo spazzamento programmato reverte le prove scadute a Free con cache-bust
Misurazione di utilizzo E-sign + controllo self-serv del consumatore
#4 metro: - EsignMeterSubmissionService (@Scheduled day): aggrega API-origin EsignUsageRecords per org+period; primo 40/periodo incluso, il resto presentato com...
Gestire Organization.isPlatformProduct dalla piattaforma → Orgs
PlatformAccountSummary espone èPlatformProduct + hasSubscription Mercato; nuovo Ma... (platform-admin gated) imposta la bandiera e invalida i diritti dei membri...
Riscrivere BillingService attorno a BillingGroups
Elimina il livello di org. controllori, servizi e DTO. Introduce: - Gruppi di montaggio BillingGroupController, membri, abbonamenti, licenze, metodi di pagamen...
Aggiungi PlatformAdmin controller + servizio per borse di comp plan
- PlatformAdminController a /api/billing/platform (class-level @PlatformAdminOnly) - GET /orgs, GET /orgs/{orgId} - POST /orgs/{orgId}/grants, PATCH|DELETE /org...
Enforce team-member pay-fees setting at Stripe customer creation
Bumps kamo-shared-library dependency to 1.5.0 so BillingService can resolve the new AppliedModelEnforcementService, and wires team-member vs org pay-fees enforc...
Initial BillingService — Stripe-integrated billing for KamoCRM
Complete Spring Boot service for managing KamoCRM billing via Stripe: - Stripe Customer, Subscription, PaymentMethod, Invoice lifecycle management - Credit sys...
Come quello che vedi la spedizione?
Ognuno di questi aggiornamenti atterra automaticamente nello spazio di lavoro. Inizia gratis e guardalo crescere settimana dopo settimana.