Changelog
Was ist neu?
Jede Verbesserung an der Plattform, wie sie geliefert wird.
· kamo-shared-library
Seite und filter filtern Sie die Angebote eines Kontos in der Datenbank
Eine Kontoansicht benötigt jedes Zitat über alle Leads hinweg. Laden sie, um eine Seite zu machen degradiert jeden Monat das Konto in Gebrauch ist, und jede Gesamtsumme würde nur abdecken, was wurde geholt - so dass das Paging, Filtern und Sortieren alles in SQL passieren. Die Abfrage ist muttersprachlich, weil Quote nur einen weichen LeadId ohne Assoziation hält, um sich anzuschließen durch; es verbindet lead.uid = commerce_quotes.lead_id und scopes on lead.account_uid. Das Ziehen der Konto-Leads in eine IN-Liste würde nicht überleben ein großes Buch des Geschäfts. Jeder Filter ist ein null-bewachtes Prädikat, so dass eine Abfrage das ungefilterte Gitter und jede beliebige abruft. Kombination von Filtern statt einer Methode pro Permutation. Sortiertade sind zulässig: der Wert erreicht einen nativen ORDER BY, also akzeptierend ein willkürlicher Feldname vom Client wäre ein Injektionspunkt. Die Listenprojektion gewinnt auch gesendetAt, acceptAt, Version und die Option/Linie zählt . eine Übersicht liest sich ab "wie lange ist das aus, hat es gelandet", was die vorherige Felder konnten nicht antworten.
· kamo-signer-monorepo
Zeigen Sie den beauftragten Agenten auf der Kopie des Kunden
Passt die Personalvorschau ab: Der Briefkopf benennt die org, dieser nennt die Person, die gebeten werden soll.
· kamo-internal
Zeigen Sie den zugewiesenen Agenten auf der Vorschau
Ein "Ihr Kontakt"-Panel über der Fußstelle - Name, Titel, Telefon und E-Mail - so der Kunde weiß, wer nach dem Preis fragen. Ganz abwesend, wenn die Leitung nicht zugeteilt wird.
· SecurityService
Lösen Sie den Agenten neben dem Kunden, von einem Lead-Lookup
Beide Blöcke kommen aus der gleichen Blei, so dass die Controller holen es einmal und ableiten jeden von ihm, anstatt den Dienst zweimal pro Render zu treffen. Still org-scoped in beiden auf der öffentlichen Seite kommt der Geltungsbereich von der eigenen Organisation des Sharelinks.
· kamo-shared-library
Nennen Sie den zugewiesenen Agenten des Leads auf dem Dokument
Der Briefkopf identifiziert die Org, aber ein Kunde mit einer Frage über einen Preisbedarf die Person, die die Beziehung besitzt. Das Zitat trägt nun die zugewiesene Agentin des Leads Name, Berufsbezeichnung, Arbeits-E-Mail und Arbeitstelefon. Nur Arbeitskontaktdaten: ein Angebot trägt die Geschäftsidentität des Agenten, nie ein persönliche Nummer, die zufällig auf ihrer Mitgliedsakte sitzt. Job-Titel bevorzugt jobTitleOfficial, das ist, was die org wählte zu drucken, bevor die verknüpfte JobTitle. Ein nicht zugeordnetes Blei, oder ein Agent mit nichts aufgezeichnet, ergibt keinen Block statt einer "Ihr Kontakt" Überschrift über Leerstelle. Namensauflösung nutzt ************ den gleichen Weg LeadController verwendet bereits für die zugewiesenen Leih-Offizier, so dass das Zitat benennt den Agenten genau wie die Rest der Blei Ansicht tut.
· kamo-internal
Neubeauftragen Sie den Agenten mit einer Chance
Der Dialog des Zustimmungsträgers erhält einen Agenten-Picker, der aus dem gleichen Pool am Backend gezeichnet wird. bestätigt dagegen. Die Agent-Spalte des Grids zeigt nun, wer die Gelegenheit hat, mit einem Bernstein "Neuzugabe von "... Beschriftung, wenn das nicht mehr der Agent, der fragte - der Antragsteller bleibt auf der Platte und in der Geschichte so oder so. Die Lead-Header-Steuerung folgt auch dem Halter. Es war der Schlüssel aus dem Antragsteller, die nach einer Umwidmung dem Agenten den Erweiterungsdialog angeboten hätten der es nicht mehr besitzt und es vor dem, der es tut, und den Backend-Toren versteckte dieser Endpunkt auf den Halter, so dass das Angebot in einem 403 geendet hätte.
· SecurityService
Reassign der Holding-Agent, und E-Mail jede es betrifft
Ein Gefreiter kann nun eine Gelegenheit einem anderen Agenten geben. Der Antragsteller ist nie neu geschrieben - geltenPrimaryAgent erfasst den Umzug als eigene Geschichte Reihe mit beide Namen, so sechs Monate später die Aufzeichnung zeigt, dass es eher verschoben Lesen, als ob der neue Agent darum gebeten hätte. Erweiterungseigentum, der Lead-Header Steuerung und die Detailmaske folgen jetzt dem Halter; der "Agent"-Filter passt EITHER Ende einer Umwidmung, weil es vor dem Agenten, der es gefunden und von dem Agenten, der es hält, sind beide falsche Antworten. Neun Meldungen decken den Lebenszyklus ab. Anfragen und Verlängerungsanträge gehen an jeder, der sie entscheiden kann - beide Entscheidungsrechte, da kann nur ein Mitglied leugnen würde sonst nie erfahren, eine Anfrage vorliegt, um zu leugnen. Entscheidungen und Bearbeitungen gehen an den Inhaber, den ursprünglichen Antragsteller, wenn sich das unterscheidet, und jeden Kollegen auf einem Provision Split; eine Bearbeitung zusätzlich mailt, wer es verdrängt, weil verlieren eine Provisions-Aktie ist still und genau das, wofür diese E-Mails sind. Zwei Dinge tragend, wie der Senden sequenziert wird: - Auflösung und Rendering passieren EAGERLY, innerhalb der Transaktion des Anrufers, während die Entität hält immer noch die Werte, die die E-Mail ist. genehmigtExtension() klärt die Erweiterungsfelder unmittelbar danach, so dass eine spätere Lektüre "nein zusätzliche Zeit" auf eine E-Mail, deren Betreff ist, wie viel Zeit gewährt wurde. - Das SENDING wartet auf ************ dass ein späteres Scheitern zurückrollen würde Agenten halten eine E-Mail für eine Zustimmung, die nie passiert ist, und nach der Vollendung statt nachCommit bedeutet die Datenbankverbindung wird freigesetzt, bevor das ausgehende HTTP startet. Detail-Table-Werte werden an der Stelle, an der sie die Karte eingeben, entweichen: Mitgliedsnamen sind org-eingegebenen freien Text, die Tabelle wird als roh HTML injiziert, und der Renderer entweicht nichts. Eine Bearbeitung, die nichts ändert sendet keine Mail, und eine PENDING Reservierung sendet keine "aktualisiert" - niemandem wurde gesagt, dass es noch existiert. 60 Tests.
· EmailService
Vorschau-Proben für die neun Gelegenheitsbenachrichtigungen
Ohne Arm hier macht der Admin-Mail Vorlageneditor jeden Platzhalter blank, also würde jeder, der diese neun anpassen, ein leeres Skelett bearbeiten. Ein Arm für alle neun: Sie teilen eine Variable Satz nach Design, so eine einzelne Beispielkarte macht jeden von ihnen getreu. Karte.of-Entriesen weil Map.of Kappen bei zehn Paare und das Set ist größer als das.
· InitializerService
Umbevollmächtiger Primäragent auf reservierter Gelegenheit
PRIMARY_AGENT_MEMBER_ID ist, wer jetzt die Gelegenheit wahrnimmt; REQUESTED_BY_MEMBER_ID bleibt für immer unberührt. Nullable ohne Backfill absichtlich - null Mittel "Niemals neu zugewiesen", und das Kopieren des Antragers in bestehende Zeilen würde zerstören diese Unterscheidung auf jeder Reservierung, die vor der Spalte. Angewandt gegen die Produktion am 2026-08-04; Spalte und Index geprüft vorhanden.
· kamo-shared-library
Reassignable Primäragent und neun Benachrichtigungsvorlagen
Ein Bevollmächtiger kann eine Gelegenheit - und die Kommission mit ihm - zu einem anderen geben Agent. PRIMARY_AGENT_MEMBER_ID ist, wer es jetzt hält; REQUESTED_BY_MEMBER_ID ist nie wieder geschrieben, denn wer den Deal gefunden ist eine Tatsache über die Vergangenheit und Überschreiben würde es die einzige Platte löschen, die der ursprüngliche Agent brachte es in. Null bedeutet "nie neu zugewiesen", was eine andere Aussage ist als "zurückgezeichnet zurück zum Antragsteller" - so vorhandene Reihen werden in Ruhe gelassen und nicht verfüllt. effectiveAgentMemberId() ist der Halter, und es ist das, was jetzt entscheidet, wer eine Verlängerung und wen der Lead Header als Besitzer behandelt. Einst eine Chance bewegt, der ursprüngliche Antragsteller ist ein Name in der Geschichte, nicht ein Anspruch auf sie. Neun kanonische Vorlagen decken den Lebenszyklus ab: Ein Antrag oder Verlängerungsantrag geht an alle, die darüber entscheiden können; jede Genehmigung, Verweigerung, Bearbeitung, Verlängerungsentscheidung, Ablauf und in der Nähe geht an den Agenten hält es, der Agent, der gefragt, ob das jetzt ist jemand anderes, und jeder Kollege in einer Kommission gespalten. Sie teilen sich eine erzeugte Schale, so dass das Layout nicht zwischen ihnen driften kann, und eine Variable gesetzt, damit eine Vorlage alles ohne einen passenden Java-Änderungssatz referenzieren kann Welche Rolle spielt, weil eine fehlende Variable als leerer String mit nur einem WARN, und versendet eine E-Mail mit der Aufschrift "Reservierung bis ".
· kamo-internal
Gesamtprovision, Marktausfälle und keine vorgelesenen Einheiten
Drei Änderungen, wie Kommission erfasst wird. Nichts ist mehr vorgewählt. Prozent/Betrag und Einmal/Einmal/Rekur beide Start unet auf jede Kommission Split, so dass jeder seine Art sagt, weil Das hat jemand gesagt. Ein vorgewählter "Perzent" ist von einem überlegten Auswahl, und der Unterschied zwischen 15% eines Verkaufs und $15 ist die gesamte Auszahlung. Sendet bleibt deaktiviert, bis eine begonnene Reihe beendet ist. Der Bewilliger einigt sich nun auf eine OVERALL Provision - was die Organisation zahlt auf der Verkauf an den anfordernden Agenten und die Gruppe, mit der sie teilen, von denen die pro Kollege Spaltung werden geschnitzt. Es erscheint in den genehmigten und bearbeitenden Dialogen und als eine Spalte auf der reservierten Liste, und ein Markt kann eine Standardeinstellung tragen, die sie vorbefüllt. Marktstandards nur die APPROVAL vorbefüllen. Eine Bearbeitung vom Markt würde lassen Sie eine speichern, die über Daten Stempel auf einer Kommission niemand vereinbart, und würde machen "keine Provision" unmöglich zu halten. Clearing eine vorgefüllte Figur sendet jetzt eine explizite klare Kommission, verfolgt gegen das, was die Form OPENED mit was gespeichert ist - sonst eine vorgefüllte Voreinstellung sendet nichts und die server hilfreich setzt es direkt zurück. Auch: eine halbgefüllte Markteinstellung blockiert jetzt das Speichern, anstatt fallengelassen zu werden und als Erfolg ausgewiesen; die Kommissionskolonne erfindet "einmalige" nicht mehr, wenn keine Trittwert gesetzt wurde; Split-Beträge im Tooltip verwenden die gleiche Geldformatierung wie die Spalte; und Add Market löscht die Zitatfelder, die es von der letzten geerbt Markt bearbeitet.
· SecurityService
Vereinbart eine Gesamtkommission bei der Genehmigung, ausgesät aus dem Markt
Der Genehmige registriert nun, was die Organisation zahlt auf den Verkauf an die Anfrage Agent und ihre Gruppe. Auslassen Sie es auf genehmigen und der Marktführer des Leads Standard gilt . das ist, was macht den Markt Einstellung einen Standard und nicht ein Vorschlag nur die UI ehrt. applyKommission setzt die drei Felder zusammen und verschmilzt sie feldmäßig nie mit dem, was gespeichert ist. Zusammenführen sieht harmlos aus und ist nicht: eine Bearbeitung, die nur eine Share-Typ würde eine gespeicherte 15 von fünfzehn Prozent auf fünfzehn Dollar kippen, Wiederdeindienen einer Auszahlung niemand beabsichtigte zu berühren. Ein ungültiger oder halb konfigurierter Marktausfall wird protokolliert und ignoriert, anstatt geworfen. Ein Zahlungsausfall ist Bequemlichkeit, nicht Gesetz, und einer, der durch einen anderen Weg gespeichert ist mit einer Nonsens-Zahl darf sich nicht in einen nicht zulassungsfreien Marktausfall verwandeln . Der Bewilliger kann immer noch eine Kommission eintippen, und eine Genehmigung ohne eine ist legitim. clearKommission wird vor allem geehrt, auch vor dem Marktausfall: ein Genehmiger, der eine vorgefüllte Figur löscht, hat eine Entscheidung getroffen, und leise Wenn man es zurücklegt, würde es umkehren. 49 Tests, einschließlich der klaren Wege, der Merge-Wache und der beiden Bad-Default-Fälle.
· InitializerService
Kommissionskolonnen für reservierte Gelegenheiten und Marktausfälle
Sechs nicht abnehmbare Spalten: Die Gesamtkommission einigte sich auf eine reservierte Gelegenheit, und der Marktausfall, der ihn bei der Genehmigung vorfüllt. NUMERIC(19,4), um der geteilte Tabelle - Geld ist exakt dezimal oder Provisionsstreitigkeiten folgen. gegen Produktion am 2026-08-04 angewandt; alle sechs geprüften Gegenwart.
· kamo-shared-library
Die Gesamtprovision auf einen Verkauf, und Marktausfälle für sie
Eine reservierte Gelegenheit zeichnet nun auf, was die Organisation aus dem Verkauf zahlt der Antragsteller und die Gruppe, mit der sie sich teilen - der Topf der pro-Kollege Spaltungen werden herausgeschnitzt. Ein Lead-Markt trägt einen Standard, der es vorfüllt, wenn eine Genehmigung wird erteilt. Jede Spalte ist ohne Standard ungültig. Eine Reservierung, die niemand genehmigt hat keine vereinbarte Provision und ein Markt, der nicht konfiguriert hat, hat keine Standardeinstellung; Eine Null in beide zu schreiben würde eine Zahl setzen, die niemand auf eine Ausschüttungsaufzeichnung wählte. Drei Anfragefelder hätten nicht ausgereicht. Ein JSON null und ein abwesendes Feld sind die gleiche Sache nach der Enterialisation, und Abwesenheit bedeutet bereits zwei andere Dinge hier - "verwenden Sie den Markt Standard" auf genehmigen, "lassen Sie es in Ruhe" auf einer Bearbeitung. Also klarKommission sagt Entfernung laut; ohne sie ein Genehmiger, der eine Löschung Provision bekommt Schweigen, und auf Genehmigung der Standard, die sie gerade gelöscht kommt zurück. LeadIdentity gewinnt den Markt ausfallen und findIdentities buchstabiert nun seine LINKS JOINs. Geschrieben als der implizite Pfad l.market.x, Hibernate emittiert einen INNER verbinden und jede Führung ohne Markt fällt aus der Projektion vollständig - die hätte sich in genau den Reihen als "Unnamed Lead" gezeigt, die niemand zweimal anschaut.
· kamo-internal
Render die Details des Kunden auf der Vorschau, von der Führung
Entfernen der eigenen Adressatenfelder des Zitats links "Vorbereitet für" leer, weil customer Name kam immer nur von einem verknüpften Konto und bleiererte Angebote haben keine. Die Vorschau druckt nun den Block aus, den der Server aus dem Lead zusammenstießt. Firma leitet es wenn es eins gibt - ein Angebot an ein Unternehmen ist an das Unternehmen gerichtet, mit dem Kontakt genannt unten Adresse, Telefon und E-Mail, jeder weggelassen, wenn die Leitung nicht tragen.
· kamo-signer-monorepo
Zeigen Sie die Details des Kunden auf der Kopie des Kunden
Unternehmen leitet den Block, wenn es eine - ein Angebot zu einem Unternehmen ist an die Geschäft, mit dem Kontakt unter ihm benannt. Passt die Personalvorschau genau ab.
· SecurityService
Lösen Sie die Adressadresse für die Mitarbeiter und Kundenansichten
Org-scoped an beiden Orten. Auf der öffentlichen Seite kommt der Umfang von der eigenen Seite Organisation, so kann ein Token nie Oberfläche ein Blei gehören zu einem anderen Mieter.
· kamo-shared-library
Setzen Sie die Details des Kunden auf das Dokument, lesen Sie die Leisten
Dropping der Zitat eigenen Adressat Felder verließ das Dokument mit nichts zu sagen der Kunde: customerName kam immer nur von einem verknüpften Konto, das Lead-raised quoten haben nicht, so "Vorbereitet für" gedruckte leer. Der Adressat ist nun aus dem Lead-Namen, Unternehmen, Adresse, Telefon, E-Mail zusammengebaut. Es ist eine Suche und nicht eine beitreten, weil das Zitat absichtlich hält nur eine weiche leadId, so dass das Bleimodul unabhängig einsatzbereit bleibt, so dass die Controller es auflösen und übergeben Sie den Block in. Ein halbgefülltes Blei ist der Normalfall, nicht die Ausnahme: Leads kommen von Verkäufern mit was auch immer die Quelle erfasst. Die Adresse bricht an einer Linie zusammen und überspringt, was ist fehlt, so dass eine Blei hält nur eine Stadt druckt "London" statt ", London", ", ". Eine Führung die nicht gelesen werden kann, ergibt keinen Block statt zu werfen - ein Zitat, dessen Leble gelöscht sollte immer noch machen.
· kamo-internal
Zitate aus dem Handel und an die Spitze verschieben
Quoten saßen in der Commerce-Pipeline, neben Aufträgen und Wagen statt neben der Client sind sie für. Sie leben jetzt an der Leichtigkeit: ein Quotes-Tab direkt nach Client Lead Daten, nur dort, wo der Markt sie ermöglicht. Die eigenständige Zitatseite ist weg und nicht hinter einer Flagge - die Führung schon liefert die Kopfzeile, die Identität des Kunden, seine Kommunikation und seine Dokumente, so dass zweites Plattenlayout obendauf, dass das Chrom dupliziert und die Geschichte des Kunden aufgeteilt in zwei. Die Auswahl eines Zitats blättert die Liste und den Editor in, und die Lead-Header Verlässt nie den Bildschirm. Kommunikation und Docs Tabs werden aus dem gleichen Grund fallen gelassen. Die Märkte erhalten einen Schalter für die Möglichkeit, die Quoten zu ändern und die Standardbedingungen, mit denen ihre Quoten beginnen. Ohne EDIT_QUOTE_TERMS wird das Begriffsfeld deaktiviert UND aus der Nutzlast weggelassen; Server streift es auch, da eine deaktivierte Eingabe Präsentation ist, nicht Durchsetzung. Sub-Tab-IDs verlieren "Zitate"; seine Regressionsprüfung behauptet nun die allgemeine Eigenschaft - jeder tab hinter der ersten behält seinen eigenen Index - so bewacht es immer noch die Bounce-Bug ohne Benennung eines Tabs, der nicht mehr existiert.
· SecurityService
Expose pro Markt Angebot Einstellungen; Durchsetzung der Bedingungen zu gewähren
market-config sagt nun die Lead-Ansicht, ob eine Quotes-Tab bieten und welche Formulierung ein Neues Angebot beginnt mit, und der Markt Endpunkte Rundreise beide Felder. Begriffsrearbeiten sind für Anrufer ohne EDIT_QUOTE_TERMS am Server abgesputzt. Deaktivieren der Feld in der UI ist Präsentation; ein handgemachter PATCH darf nicht in der Lage sein, die org's umzuschreiben Auch die rechtliche Formulierung.
· kamo-shared-library
Quoten gehören zu Leads, konfiguriert pro Markt
Zitate waren ein Commerce-Pipeline-Artefakt, das sie eher neben Aufträgen und Karren stellte als neben dem Kunden sind sie für. Sie hängen jetzt an der Spitze: Der Markt entscheidet ob seine Leads können Zitate überhaupt tragen, und die Standard-Berechti chungser-Bedingungen in diesem Markt beginnt mit. Pro Markt und nicht per Org, weil eine Hypothekenbank Kredit-Schätzungen unter TRID ausstellt und hat keine Verwendung für ein generisches Angebot, während ein Dienstleistungsmarkt lebt auf ihnen. Die Bedingungen tragen die rechtliche Verpflichtung der Org, so dass Abweichung vom Markt Formulierung auf einer einzigen Zitat ist sein eigenes Stipendium - EDIT_QUOTE_TERMS. Ein Null-Bedingungen-Feld bedeutete schon "Verlassen unverändert" auf Update, das ist, was lässt den Controller Streifen es für Anrufer ohne die rechts. Auch lässt den eigenen Empfängernamen/Adresse/Telefon des Zitats fallen: die Leitung hält bereits die Client-Details, und Snapshotting sie dupliziert eine Platte an anderer Stelle bearbeitet, die würde von ihm abdriftet. Schema von KamoInitializer vor diesem Commit; Spalten verifiziert.
· SecurityService
Reserve, genehmigen und prüfen Lead Chance Ansprüche
REST Oberfläche hinter /leads/Opportunities/Reserved und der Reserve Opportunity Kontrolle im Lead Header, plus den Service, der die Invarianten besitzt. Rechte, ausdrücklich durchgesetzt, weil dieser Dienst erlaubtAll @EnableMethodSecurity - eine fehlende Kontrolle ist eine fehlende Kontrolle, keine Standard-Deny: VIEW_OPPORTUNITIES jede Lektüre CREATE_OPPORTUNITIES, die eine Anfrage stellen und um mehr Zeit auf eigene Faust bitten EDIT_OPPORTUNITIES Genehmigung, Bearbeitung, Schließung, Entscheidung über eine Verlängerung DELETE_OPPORTUNITIES "Deny Opportunity", das die UI hinter eine Bestätigung setzt Deny ist Terminal, aber nicht zerstörerisch: die Reservierung, seine Splits und seine ganze Die Geschichte bleibt auf dem Registerkarte Denied lesbar. Das ist der Punkt, der eher leugnet als Löschen. Details, die es wert sind, gehalten zu werden: - Der Lead-Header-Endpunkt ist nur mit CREATE lesbar, da der Button wissen, welchen Zustand zu machen, aber ein Anrufer ohne VIEW, der nicht die Holding ist Agent bekommt eine verengte Projektion. Die Kommission spaltet und Rechtfertigung, dass VIEW existiert zum Schutz werden nicht durch das erweiterte Tor offenbart. Rekonstruiert als allow-list, so dass ein später hinzugefügtes Feld nicht durchsickern kann. - Die Liste maskiert Kontakt und Unternehmen auf nicht zugeordneten Leads für Mitglieder ohne VIEW_UNASSIGNED_LEADS, passend zu LeadController. Wer behauptet, was nicht die Geheimnis, die Aussicht ist. - Extending ist gated auf der Agent, der die Reservierung hält, ohne Gott Bypass: Die Durchführung einer Reservierung ist eine Identitätsfakt, nicht ein Recht, und eine Die Erweiterung wird unter dem Namen des Antragstellers eingereicht. - Eine verfallene Reservierung, die erweiterte Neustarts statt Lebensläufe bekommt, so reserviertUntil == reserviertFrom + genehmigtDays hält . update() re-derives das Ende von Anfang an, und ein abgestandener Start würde stillschweigend das Stipendium löschen. - Der Provisions-Split-Pool ist VIEW_LEADS-Inhaber plus Grant-alle Eigentümer/Admins, identisch mit dem, was der Picker Endpunkt bietet. Rechen Sie es aus der Rechte-Tabelle allein machte das Dropdown-Angebot ein Eigentümer das Backend dann abgelehnt. - Ablauf ist ein geplanter Sweep, so dass die Tabs können auf einer echten Spalte paginat, aber jeder DTO berichtet TageRemaining gegen die Datenbankuhr, also sind die Lektüren korrekt zwischen Sweeps unabhängig. 36 Tests decken den Lebenszyklus, die Datumsrehigkeit und die geteilten Regeln ab.
· InitializerService
Tische für Bleichancen Reservierungen
Spiegel führenOpportunityReservation, LeadOpportunityCommissionSplit und ************ in Kamo-shared-Bibliothek. ddl-auto:update würde sie von den Entitäten sowieso zu erstellen; die explizite DDL ist die Hauskonvention und macht die Form hier überprüfbar, anstatt nur aus Anmerkungen abzuleiten. Auf Angewandt gegen Produktion am 2026-08-04 - alle drei Tabellen und jeden Index existieren, im Besitz des App-Benutzers.
· kamo-shared-library
Entities für Time-Boxed Blei Gelegenheit Reservierungen
Ein Agent erhebt einen exklusiven Anspruch auf das Schließen einer Leerleitung für ein begrenztes Fenster; ein Bewilliger Zuschüsse, redigiert oder verweigert es, und Kollegen können einen Anteil angeboten werden die Kommission. Drei Tabellen: die Reservierung, ihre Provisionen aufgeteilt, und eine Append-Only-Audit-Trail. Design-Punkte, die tragend sind: - Lead, Organisation und Mitgliederreferenzen sind einfache id-Spalten ohne fremde Schlüssel, passend zu LEAD_HISTORY und LEAD_TASK. Der Trail muss Blei überleben Löschung und Mitglieder tun, ohne entweder in der Lage zu blockieren oder Kaskadierung. - dbNow() verwendet CAST(now() AS-Zeitstempel). CockroachDB's now() ist TIMESTAMPTZ, die Hibernate 6 materialisiert sich als Instant, die nicht auf die deklarierten geworfen werden kann LocalDateTime - und die ::timestamp shorthand wird von der nativen Query verstümmelt Parser liest ':' als Parameter-Präfix. Beides taucht nicht zur kompilierten Zeit auf. - Die geblätterte Liste verwendet JpaSpecificationExecutor statt JPQL mit (:param IS NULL ODER ...) Wachen, weil CockroachDB eine ungetippte Bindung ablehnt -Parameter in einem bloßen IS NULL Test. - LeadIdentity ist eine Projektion, nicht die Lead-Entity: Lead Maps vier @ManyToOne Verbände, die EAGER Standard, so dass die Auflistung 100 Reservierungen von Unternehmen würde feuern Hunderte von ausgewählten Daten für Daten, die das Gitter nie zeigt. - Die Historie Timeline von Orders von (dateCreated DESC, id DESC). CockroachDB's now() ist der Transaktions-Zeitstempel, so dass Zeilen, die von einem Edit geschrieben werden, ihn genau teilen; ohne den Tiebreak mischt sich ein Audit-Trail zwischen den Seitenauszügen neu. Keine Stereotypen hier - der besitzende Service erklärt die Bohnen, so dass kein anderer Dienst zahlt für den Projektarchiv-Scan.
· kamo-internal
Adresse des Angebots an eine Person; Zusammenfassung stoppt Kosten Kopfhöhe
Das Verschieben der Zusammenfassung aus der rechten Spalte korrigierte die Breite, kaufte sie aber als Band unter dem Titel. Es sitzt jetzt in der Lücke, die bereits zwischen dem Titel und die schnellen Aktionen, so dass es überhaupt keinen Platz kostet. Diese Lücke ist endlich, so weniger zeigen inline und der Rest bleibt einen Klick entfernt - eine Bestellung trägt zwölf und würde die verdrängen Maßnahmen. Es bleibt in jeder Breite sichtbar, anstatt auf schmalen Bildschirmen zu verschwinden. Das Zitat gewinnt auch seine Adressat: wer es ist für, optional ihre Adresse und Telefon. Diese führen den ersten Abschnitt, weil es das erste ist, was Sie entscheiden, und wenn ein Konto ist verknüpft das Name-Feld zeigt, was es sonst zurückgreifen würde. Die Vorschau "Vorbereitet für" Block macht alle drei und spiegelt eher, was getippt wird als das, was zuletzt gespeichert wurde.
· kamo-shared-library
Adressieren Sie ein Angebot an jemanden, der noch kein Konto ist
Der Adressat wurde ausschließlich von einem verknüpften Konto abgeleitet, so dass jedes Angebot für eine angehoben Prospekt - das ist die meisten von ihnen - gedruckt eine leere "Vorbereitet für"-Zeier und die fertig Dokument nicht sagen, wer es war für. Das Zitat trägt nun den Namen, die Adresse und das Telefon des Empfängers in seinem eigenen Recht. Was Mitarbeiter getippt gewinnt über das verknüpfte Konto: sie haben gesagt, was gedruckt werden sollte, und ein Konto umbenannt später muss nicht stillschweigend ein Zitat umschreiben, das bereits gesendet wurde. Adresse ist frei-Form, weil Post-Formate sind nicht einheitlich genug, um in Felder, die aufgeteilt Arbeit international, und es druckt wie geschrieben. Eine Revision trägt den Adressaten vorwärts - gleiches Angebot, gleiche Person. Schema von KamoInitializer vor diesem Commit; Spalten verifiziert vorhanden.
· kamo-internal
Öffnen Sie das Profil eines Mitglieds aus der Reihe
Fügt eine vierte Aktion auf der Reihe Schwebe-Dock, Verknüpfung mit **************** Es ist ein echter NextLink und nicht ein Klick-Handler, so Mitte-Klick und "Open in new tab" verhalten und die Repo-No-Hard-Navigation Wache bleibt zufrieden; das Panel schließt auf Navigation, so dass seine Körper Scroll-Sperre nicht Die Routenänderung überleben. Die Aktion wird abgesperrt, wie sich das Ziel verortet: die Mitgliedereinstellungen Seite leitet Sie zu Ihrem eigenen Profil um, es sei denn, Sie halten MANAGE_MEMBERS, MANAGE_MEMBER_SECURITY, CONFIGURE_SYSTEM, EDIT_MEMBER_ACCESS_LEVEL, ALLOW_PROMOTING_MEMBERS oder ************ (oder Gott / Plattform admin). Ohne eine davon ist die Ikone eher versteckt als als tot angeboten Ende. Ihre eigene Zeile zeigt es immer.
· kamo-internal
Fail der Build, wenn eine Komponente ruft eine Schlüsselmeldungen/ nicht definiert
next-intl macht den Schlüsselpfad wörtlich für einen fehlenden Schlüssel, und Nachrichten/ ist gitignored hier - bevölkert bei der Bild-Build-Zeit von kamo-translation-dictionary - so eine Umbenennung, dass landet in nur einem der beiden Repos-Schiffe als sichtbares Kauderwelsch mit nichts, um es zu fangen. So kam es zu den Kontaktfeldern der Abteilung ************ auf dem Bildschirm, und wie die gesamte HMDA Demographie Form (39 Etiketten) gegen einen Namensraum, der nur enthalten .lar. scripts/check-i18n-keys.mjs löst den Namensraum jedes Übersetzers und prüft dann jede wörtliche Taste, das statische Präfix jeder Vorlage-Wörter-Schlüssel und die übergebenen Werte gegen die {Platzhalter" in der Nachricht in beide Richtungen, da eine nicht gelieferte Intensivstation Argument wirft MissingValueError und eine ungenutzte ein stilles versenkt Daten. Es versteht Intensivstations-Korsett entweicht und Plural-Unterbotschaften und behandelt <tag> als Platzhalter nur für t.rich/t.markup. 1737 Dateien in 1,4s Pfund. Verdrahtet in npm Test und in die Dockerfile vor des Builds, mit --require-messages there so ein übersprungen Wörterbuch Sync scheitert laut anstatt die Wache in eine No-Op zu verwandeln. Typisierung von t() gegen "typeof en" wurde zuerst ausprobiert und abgelehnt: ein JSON-Import erweitert die Werte zu "String", so Next-intl kann nicht Rückläufer und lehnt korrekte Anrufe wie t('...range', {Start, end, total]); es verdreifachte auch die Typcheckzeit (81s -" 249s) und hätte 150 Bearbeitungen von nicht-buggy Code benötigt. Call-Site-Fixes für das, was es gefunden: - ließ eine Option "default:" in den Chat-Komponenten und LanguageButton übergeben; next-intl hat keine solche Fallback-Option, so war es totes Gewicht. - commerce lowStock übergeben {Zählung] für {verfügbar], MultiFileUploader {Typen] für {list], und audioVideo Master-Volumen {pct] für {Prozent], alle drei warfen zur Formatzeit. - DnsSetupStudio hat eine {domain" übergeben, die der Untertitel nicht verwendet.
· kamo-internal
Pin/unpin nunfer-Optionen aus den navs und der Home Launchpad
Mitglieder könnten eine Option zwischen der Seitenleiste und der oberen Leiste verschieben, aber nie nehmen Sie eine aus den navs vollständig. Fügt eine dritte Platzierung - NONE, "unpinned" und zwei Möglichkeiten, um es zu erreichen, beide fahren das gleiche gemeinsame Menü: - Rechtsklick auf eine bewegliche Option in NavPri/NavTop: das Platzierungsmenü öffnet sich unter - die Ecksteuerung auf jeder Home-Launch-Pannen: ein leiser Chip, der ausliest wo die Option sitzt und erweitert auf Schwebe, Öffnen des gleichen Menüs Unpinned ist nie eine Sackgasse. Die Home Launchpad macht jetzt von jedem gated Option und nicht die Vereinigung der beiden Navis, so dass eine ungehängige Option hält die Pane, das es zurücksteckt; die Befehlspalette macht das gleiche, und jede Änderung wirft eine rückgängige Toast-Nensung, wo die Option ging. Das Navigation Layout Einstellungen Seite wächst eine passende Unpinned Spalte. Der Resolver behält seine invariante - jede gated Option in genau einem Eimer . und ein expliziter NONE schlägt jetzt eine abgestandene Zonenordnung, so dass ein Unpin einen Blob überlebt vor ihm geschrieben. Vermächtnis gespeicherte Layouts haben keine NONE Einträge und lösen genau wie zuvor; Reset to Standard kann nie etwas unpinned lassen. Verdeckt durch neue Tests für resolveNavLayout, die keine hatte.
· kamo-internal
Leere Abteilungen verstecken, den Statusfilter in das Verzeichnis verschieben
- Abteilungen ohne Mitglieder nicht mehr machen. Der Endpunkt der Abteilungsabteilung gibt jede Abteilung in der Org einschließlich leere zurück, so dass der Dienstplan war mit Abschnitten, die niemanden enthalten könnten. Die pro-Abteilung "nein Der Platzhalter der Mitglieder geht mit ihnen, da er jetzt nicht mehr erreichbar ist. - Der All/Online/Offline-Filter bewegt sich vom flächendeckenweiten Header unten der Tab-Streifen, so sitzt es im eigenen Bereich des Verzeichnisses mit dem Dienstplan es Filter statt zu erscheinen, um das gesamte Panel zu filtern (es hat nie angewendet Chats oder Mobile Access). - Der leere Zustand schlägt nur vor, die Suche/Filter anzupassen, wenn man tatsächlich angewendet; ein Org ohne Mitglieder hat nichts zu justieren.

Euer Universum wartet.
Fügen Sie Produkte hinzu, wann immer Sie möchten – keine Migration, keine neuen Anmeldungen.
Für immer kostenlos – keine Kreditkarte erforderlich