Changelog
Co nowego.
Każde ulepszenie platformy, jak to wysyła.
· kamo-shared-library
Linia, uwaga, sprzedawca, podpis i zegar pisze w pracy
SW6b Zadanie 3, biblioteka połowa. Osiem nowych operacji na ServiceJobService, plus Rejestry przewodowe dla nich, a trzy czytają szczegóły potrzeb strony. Trzy rzeczy, które posiada serwer i żaden klient nie może wysłać: - Suma. PracaTottal, materialalne i całkowite są rekomplikowane z Linie pracy na każdym pisaniu linii, a suma własnej linii to ilość x JednostceAmount. LineInput nie ma żadnego członka, a JobInput nie ma już - Praca jest trzy. Byli na JobInput, gdy SW6a został wysłany, ponieważ Nie ma się z nimi nic, z czego by je czerpać; zostawiając je, gdy będzie sekunda. Drzwi tuż za regułą. – jest tym, co jest tym, co Z drugiej strony tych drzwi wygląda tak - usuwa sumę z żądania ORAZ Dodaje do niego swoje sumy, więc klient wysyłający oba obie otrzymuje liczbę, która I nie pasuje ani, co jest porażką, że javadoc QuoteTotals istnieje, aby wymienić. - Znak Off stampsZaznaczaczeWs, gdy flaga się stanie, gdy flaga się stanie i Czyści go, gdy staje się fałszywy, więc para nigdy się nie zgadza. SignoffInput (ujednoznacznienie) Nosi boolean i darmowy tekst i nie ma czasu. - Zegar. Zegar Odwiedź znaczniki rzeczywisteStart/actualEnd AND przenosi wizytę Status z nimi - ON_SITE w, COMPLETED. Wycieczka bez zegar-in Jest to nielegalna wyjątek określająca stan wizyty (409 przy kontrolerze): Koniec bez początku przyczynia się zero do totalnościLabourMinutes, więc Objawem byłoby prześcieradło czasowe krótkie o jeden dzień, nie mówiąc tak. Druga Odmówiono też zegara; drugi przejazd jest drugą wizytą. Każde dziecko jest rozwiązywane swoją pracą uid AND the org jako predykaty w jednym Zapytanie -- ZnajdźByUidForJob na linii, sprzedawca i odwiedź repozytoria. Rozwiązywanie Samotnie po uid i org sprawiłyby, że DELETE / obieUid/lina/lineUid-doszłoby do dowolnej linii W org przez adres URL, który wygląda całkowicie poprawnie. JobView zyskuje linie/noty/sprzepisy/sprzepisy: null w projekcji listy (nienaładowany), Zawsze wypełniana jest projekcja szczegółów (pusty oznacza brak). Załadunek ich w drugim rzędzie Czytałby cztery stoły, aby pomalować siatkę, która nie pokazuje żadnej z nich. Przetestowane mutacje: 9 mutacji tego pliku, z których każdy wytwarza odrębny nazwany Porażka - upuszczenie recompute, dodanie sumy linii na górze przechowywanego figura, upuszczanie zegara, nie przesuwanie statusu wizyty, nie stemplowanie Podpisanie, nie oczyszczenie go i rozwiązanie każdego z trójki dzieci przez uid - Sam w pojedynkę.
· VOIPService
Wdrożenie rozszerzenia KamoPBX, zarządzania użytkownikiem i urządzeniem
Dostawca reklamował rozszerzenieManagement, zajęcie użytkownika i urządzenie Tak prawdziwe, podczas wdrażania żadnego z nich, jak UI pokazałby przyciski, które Rzuć 501. Zdolność teraz dopasowywania do zachowań. Rozszerzeniem w KamoPBX są trzy dokumenty – użytkownik, urządzenie należące do tego użytkownika, I przepływ połączeń mapujący numer do użytkownika. Tworzenie tylko niektórych z nich plonów Albo liczba, która nic nie dzwoni, albo telefon nie ma do czego się nie odbija, więc wszystkie trzy Powstają razem, a częściowa awaria cofa to, co zostało stworzone. Usuwanie rozszerzenia usuwa tylko przepływ połączeń. Członek może posiadać kilka Urządzenia i usuwanie czyjegoś zarejestrowanego telefonu, ponieważ usunięto numer To byłaby o wiele gorsza niespodzianka niż osierocony dokument. 253 testami, 5 nowych urządzeń do tworzenia, cofania, walidacji, usuwania zakresu i Zdolność uczciwość.
· kamo-shared-library
Linie pracy, notatki i sprzedawcy, dzięki czemu zakładki zamówień pracy mogą się utrzymywać
Praca i części stają się wierszami ServiceJobLine w pracy, a nie wiersze ServiceLineItem, ponieważ order.order jest opcjonalny - false: a ServiceLineItem nie może istnieć bez zamówienia, a zapisy technika Praca na długo przed tym, zanim cokolwiek zostanie rozliczenie. Uczynienie tego rodzica znieważy się Pozwól, aby PurchaseLineItem istniał również poza zamówieniem, więc test mapowania Zamiast tego przypina niezmiennych. ServiceJobNote jest nagrany i tylko dołącza - brak aktualizacjiAt, createdAtAt Upliponowalne - fałszywe i ostemplowane w "PrePersist". ServiceJobVendor jest Wiele stron karta Sprzedawców zawsze wyświetlała; rola pozostaje darmowy tekst Ponieważ nie istnieje słownictwo typu sprzedającego, aby zamrozić w schemacie. Każde repozytorium dociera do org poprzez przystąpienie do pracy EXPLICIT. Ukryty l.job.organization.id renderuje jako INNERER dołącza i po cichu Upuszcza rzędy, których skojarzenie jest nieważne; ServiceJPLineMappingTest twierdzi Kształt zamiast ufać mu.
· kamo-internal
Nieudane obciążenie kliniczne nie może być puste
Dwa z nich zostały wysłane, zanim ktokolwiek zauważył, a strażnik znalazł jeszcze dwóch w Najnowszy panel w momencie, gdy działał – nie załadunku, jakie inne praktyki pacjenta Wysłali już lektur z napisem "nic jeszcze otrzymane" i nie załadunku partnera Lista czytana jako "bez-kochanie partnerów giełdowych", co wysłałoby kogoś do dodania Partnerzy, którzy już istnieją. Dlatego jest to strażnik budowlany, a nie notatka przeglądowa. Porażka jest cicha przez Konstrukcja: bez błędu, bez dziennika, nic na ekranie, i wygląda dokładnie tak, jak Zdrowy pusty stan. Nikt nigdy nie zgłosi tego jako robaka. Na wykresie pusta lista jest stwierdzeniem - "bez pomiarów", "nikt nie spóźniony", "Brak alergii" - a ludzie działają na nią. To samo rozróżnienie już biegnie przez Moduł po stronie serwera: "nie mają nic" w porównaniu z "nie mogliśmy zapytać", i 503 zamiast pustej listy z transportu wymiany. To go egzekwuje na Klient. Zdobyte powierzchnie kliniczne, ponieważ inne pionowe mają swoje własne Konklony. Połów, który ustawia błąd, dzienniki, rzuca, zwraca lub przeładowuje Przechodzi – i tak, kto niesie komentarz wyjaśniający, dlaczego cisza jest słuszna, Na którym PatientCommsPanel polega: jego linia czasowa rodzeństwa zgłasza tę samą awarię Drugi sztandar nie mówi czytelnikowi nic nowego. Przykuty do testu npm.
· SecurityService
Ustawienia platformy Expose za pośrednictwem interfejsu API system-config
toDto jest wyraźną listą dozwolona i aktualizacja Konfig przyjmuje maszynę do ciała, więc siedem Nowe kolumny SYSTEM_CONFIGURATION byłyby niewidoczne i nieobjątkowe — Karta ustawień platformy sprawiłaby, że stałaby się pusta, a oszczędzanie by to zrobiło Nic. Hasło administratora nigdy nie jest zwracane. To jest mistrzowskie poświadczenia za Każde konto najemcy, więc GET daje sentylon "" po uruchomeniu i wysyłaniu "" zapleczu oznacza utrzymanie - w inny sposób ratowanie jakiegokolwiek innego pola w formularzu Nadpisać poświadczenia literalnym sznurkiem. Gated by MANAGE_VOIP_SMS wraz z istniejącymi polami VoIP, więc MANAGE_DOKUMENT_AI Nie może do niego dotrzeć.
· VOIPService
Odszyfrowanie poświadczenia KamoPBX; przetestuj ścieżkę odmowy
Poświadczenia główne są przechowywane jako szyfrogram przez interfejs użytkownika ustawień platformy, więc Musi być odszyfrowany przed użyciem — przekazanie szyfrogramu do API jako hasła Obecny jako zły referencja i wysyła każdego, kto go debuguje w niewłaściwy sposób. Dwa nowe testy obejmują ścieżkę odmowy, która wcześniej ujawniła surowe Kubernetes Błąd DNS do administratora org: brak konta głównego id, a nie administrator Poświadczenia. Obaj twierdzą, że wiadomość nazywa stronę ustawień. 248 egzaminów przechodzi.
· KlusterServices
Zamień powitanie na KamoCRM-Main-Intro-3
Trzecie ujęcie, 40s (spadek z lat 60-tych). Wysłane obok poprzednich dwóch raczej niż nad nimi, więc cofnięcie się do obu jest jednoliniową zmianą na KAMO_ATTENDANT_INTRO plus przeładunek dialplanu — bez ponownego załadunku. 48 kHz źródło stereo przekonwertowane na 8 kHz wymaga Asterisk. Zerfikowany live: suma kontrolna pasuje do lokalnego pliku, Asterisk zdekodował go do 319914 bajtów U-law (39,99 s przy 8000 B/s) i pokazy CDR BackGround custom/kamocrm-main-intro-3.
· InitializerService
Przechowywanie na miejsce i płaski basen Enterprise
2 GB na miejsce za darmo, 4 na początku, 5 w firmie. Enterprise przestaje skalować Z całkowicie fotelami - płaska 150 GB dla organizacji - które "N GB na Siedzenie" nie może wyrazić, więc rzęd niesie prozę nadpisuje powierzchnie kupna Teraz preferować więcej niż numer. Jednostka fabularna to GB / siedzenie. Jednostka rozliczeniowa jest miejscem siedzącym przez cały czas; liczba pracowników pozostaje Użytkownicy, by być ludźmi, a nie jednostkami.
· kamo-internal
Karta ustawień platformy i przestań wyświetlać kopię FreePBX
Trzy problemy na stronie telefonicznej KamoPBX, wszystkie moje: - Karta PHONE_SERVER_ID została wywieszona, więc każdy dostawca — KamoPBX, RingCentral W tym zespoły – kazano im wklejać id do kamasterisk-supports Konfiguracja na gospodarza FreePBX. Jest to tylko FreePBX, a teraz renderuje tylko tam. - KamoPBX nie miał żadnych treści specyficznych dla dostawcy. Ig zobaczył nazwę, numer, Aktywny przełącznik i instrukcja FreePBX. Teraz dostaje kartkę mówiącą Kamo Prowadzi go, jego adres SIP, stanem rezerwacyjnym i co robić dalej. - Nie było konfiguracji platformy dla KamoPBX w dowolnym miejscu, co sprawiło, że Dostawca nie do nadużycie: nic nie może ustawić konta głównego ani poświadczenia. Karta Na ?tab'voip-sms jest teraz właścicielem ich i ostrzega, gdy nie jest skonfigurowany. Klucze słownikowe naciśnięte jako pierwsze (wiadomość/ jest gitiggnored tutaj).
· VOIPService
Odczyt Platformy KamoPBX konfig z bazy danych
Dodanie serwera telefonicznego KamoPBX nie powiodło się z powodu surowego błędu Kubernetes DNS — 'błąd I/O na PUT ... - pokazany do a Organizacja admin, która nie może ani czytać, ani działać na niej. Dwie przyczyny, obie naprawione: - Przepisujący próbował połączenia bez konfiguracji platformy w ogóle. To się stało. Teraz najpierw sprawdza i odmawia z przyciskiem komunikatem nazewnictwa ustawień Strona zamiast nie otwierać się na błąd DNS. - Ustawienia były tylko .Valuely, więc nie było sposobu na skonfigurowanie KamoPBX bez Przesunięcie. Pochodzą teraz z SYSTEM_CONFIGURATION singleton, który Ustawienia platformy NaI pisze; domyślne domyślne .Value pozostaje awaryjnym, więc Serwis wciąż uruchamia się przed migracją.
· kamo-shared-library
Ustawienia platformy KamoPBX w SYSTEM_CONFIGURATION
KamoPBX jest własną platformą Kamo, więc cała jego konfiguracja jest na całej platformie: Adres URL bazowy, id konta głównego, nazwa konta, poświadczenia admin, sufiks SIP I adres URL WSS. Zasiadają na singleton SYSTEM_CONFIGURATION obok istniejącego VoIP tunables, dzięki czemu operator może ustawić je z UI ustawień platformy Potrzeba przesunięcia w celu zmiany zmiennej środowiska. Kolumna haseł admin jest szyfrogramem AES-256-GCM i przewozi .JsonIgnore: Ten wiersz serializuje bezpośrednio do ustawień platformy UI, a bez niego Poświadczenia mistrzowskie dla każdego najemcy byłyby na drutach.
· InitializerService
Seed Platforma KamoPBX domyślnie
Hibernate ddl-auto dodaje kolumny SYSTEM_CONFIGURATION; tylko Dotyczy to nowo włożonych wierszy, więc istniejący singleton wymaga zastrzęgania. Nasiona niesekretne niewykonuje tylko. Id z konta głównego i poświadczenia admin Celowo opuścili NULL – to właśnie sprawia, że raport przepisujący "Nie skonfigurowane jeszcze" i odrzuć, zamiast zawieść, czy otworzyć lub wynurzyć Błąd Kubernetes DNS do administratora org, który nie może ani odczytać, ani działać na nim. Każde oświadczenie wypełnia tylko NULL, więc edytowanie interfejsu użytkownika operatora przetrwa przesunięcia.
· kamo-internal
Sieć zamówień pracy czyta realne miejsca pracy w służbie
Każdy rząd w tej sieci był martwym ogniwem przez budowę. Wybite ids String (8000 + i), kliknięcie w wierszu naciśnięte /commerce /service/8001, i Obsługa zadeklarowała „PathVariable UUID Id” – więc id nie powiodło się konwersji przed Każdy prowadzący biegał, a strona szczegółów renderowała swój nieodkryty stan. Piętnaście rzędów, Piętnaście martwych linków, na ekranie, który wyglądał na skończony. Obie powierzchnie teraz czytają ServiceJob przez . Eksport pełnomocnika GET, PUT i PATCH — dokładnie, jakie mapy ServiceJobController, I żaden z pełnomocników handlowych nie był bezpiecznym szablonem: eksport kwotowań GET/POST/PATCH/DELETE bez PUT, service-task-books eksport GET/POST/PUT/DELETE Bez PATCH. Skopiuj albo jedno, jak i jeden zapisz odpowiedzi 405 podniesionych przez samego Next, z Nic w logach serwera, podczas gdy każda lektura nadal działa. servicePobWireContract.test.ts przypina czasownika ustawionych na kontrolerze adnotacje w obu kierunkach i porównuje każdy JobView/VisitView/AddressView Rejestruj komponent do członka TypeScript według nazwy. To porównanie nazwy jest drugą poprawką. posApi.WorkOrder deklarowana serwisName, serviceId i engagementId przeciwko usłudze wysyłania DTOOOfertaName, ServiceOfferingUid i zaangażowanieUid. Te trzy nigdy nie pasowały, więc szczegóły Podtytuł strony i jej wiersz podsumowania "Service" były nieokreślone na całe życie ekran i spadł z powrotem do em dash - który odczytuje jako "nic nie nagranego" Zamiast jako literówki, dlatego nikt go nie znalazł. Usunięto 489 linii szczegółów Dialog, które nie mogły się otworzyć: detailOpen było Intuicjonalny false, ustawDetailOpen(true) nie pojawił się nigdzie w pliku, i Ordynariusz wybrany był zawsze nieważny. Sześciu opiekunów karmiło go i nic I poszedł z nim. Jego zakładki Notatki były jedynymi w bazie kodu, więc tak było Wypromieniowany pierwszy – ;) Wyjazdy warte poznania: - Nie ma nazwiska technika. ServiceJApi prowadzi wizyty[]assignedMemberId I nic więcej, i żaden punkt końcowy nie rozwiązuje partii idów członków do nazw — CzłonekDirectory to wyszukiwanie stronniczo, którego własna notatka zabrania przetrzymywania personelu Lista. Kolumna zniknęła, zamiast pokazywać id przebranego za osobę. - "Time Attended", a nie "godziny pracy". Serwer sumuje łączną pracęCzterulatność z Rzeczywiste okno każdej wizyty, ponieważ kosztowana siła robocza zwisa z rozkazu bez Link do pracy. Renderowane z formatemLabourMinutes; bez pola float-hours Po obu stronach. - handel zastępuje dziesięć strun kategorii wolnych, które nigdy nie były słownictwem Wszystko może w obie strony: "Naprawa plumbing" jest PLUMBING plus WorkClass.REPAIR. - Status masek wydaje teraz jeden PATCH na pracę i zgłasza częściowe odmowy, ponieważ Maszyna stanu sprawdza każde przejście. Stary uchwyt ustawia pole Lokalnie na wszystkich i zgłoszono sukces. - Praca, części, wpisy czasu i sprzedawcy pozostają lokalnie. Żaden podmiot nie cofa się Każdy z nich; SW6b je buduje. Słownik wylądował pierwszy: kamo-translation-dictionary 947e585.
· kamo-marketing
Karty planu pokazują, jaki poziom ADDS, a nie wszystko, co ma
Karty wymienione w zestawie - 16 na Free, 30 na Starter, 52 w Biznes, 57 na Enterprise. Cztery karty o szalenie nierównej wysokości, każda ściana Tekst, a między nimi niemal całkowite przetworzenie tabeli porównawczej - Siedź bezpośrednio pod spodem. Plany są kumulatywne, więc jedyne pytanie, na które musi odpowiedzieć karta, brzmi: "Co Czy to sprawia, że ta tańsza nie ma”. Każda karta teraz prowadzi z Linia siedzenia (jedyna liczba, która się nie gromadzi), mówi, który poziom buduje Na, listy co najwyżej sześć różnych różnicowców, a resztę wysyła do porównania Stół przez "i N więcej funkcji". Biznes spada z 52 linii do ośmiu, Cztery karty wychodzą prawie równe, a stół przestaje być duplikatem i zaczyna To jest cel podróży. Zamówienie funkcji następuje teraz według własnego zamówienia katalogowego. Została posortowana Alfabetycznie według nazwy kategorii, która stawia "AI & Intelligence" powyżej "Core" Platforma" i zakopany to, co faktycznie sprzedaje poziom. CONTRAST: biały na akcencie oliwkowym zmierzonym 3.78:1 na ciemnym końcu gradientu i 3.01:1 na jego końcu światła - oba pod 4,5, które wymagają etykiety półbodowe 14px, Dlatego przyciski i odznaki odczytywane zostały zmyte. Każda powierzchnia akcentu teraz Używa koloru tła strony jako atrament: 4.53:1 i 5.68:1, z zielonym Utrzymywany w pełni sił, a nie błotnisty, aby uratować biały tekst. Liczba miejsc siedzących Fallback i JSON-LD skorygowanych do 25/100 do katalogu; Nadal powiedzieli 5 / 25 z tego samego zamieszania, które miał nagłówek kart. Zweryfikowany za pomocą pełnej produkcji, która złapała dwa otwory typu tsc -noEmit tego nie zrobił.
· kamo-internal
Wyciągnij historię pacjenta z praktyk, w których uczęszczali
Wychodząca połowa wymiany, na karcie rekordów obok powierzchni uwalniania — Odejście od nagrań i przybycie rekordów to praca jednej osoby, a ktoś, kto ma Właśnie wysłano streszczenie do innej praktyki jest osobą, która najprawdopodobniej chce swojej. Trzy kroki pokazane jako trzy kroki, ponieważ takie są standardy: zapytaj Czy znają tę osobę, zapytaj, co trzymają, przynieś tych, których warto mieć. Przycisk "importuj wszystko" ukryłby środkową decyzję i pociągnie dekadę od Duplikaty pacjenta, który dwukrotnie przeniósł praktyki. Mecz nigdy nie jest Auto-wybrano: niewłaściwa osoba odczytuje historię innej osoby na tym wykresie. Posączane i pojednane nigdy nie wyglądają podobnie. Dokument z innej praktyki jest ich twierdzenie — siedzi przywiązany i czytelny, i nic w nim nie dociera do tego Problem wykresu, leki lub alergia wymienia, dopóki klinicysta nie zapisze, co oni Wziął i co zostawili. Pusty stan tak mówi, bo "przyjęte" cicho Czytanie jako "stosowane" jest sposobem, w jaki rozwiązany stan 2019 staje się aktywnym problemem. Praktykę bez onboardingu sieciowego mówi się kiedyś, wyraźnie, zamiast być Podana jest przycisk, który zawsze zawodzi - i "nie mają rekordu pasującego do tego Pacjent" jest oznaczony jako jego odpowiedź, a nie nie pytać. Te dwa muszą Nigdy nie wyglądaj podobnie: pierwszy to fakt kliniczny, że ktoś może przestać patrzeć, ponieważ Z czego. Również złapany przez strażnika i18n i naprawiony: przekazałem wartość „partner” do wiadomości Nie ma takiego zastępczego, a wartością był identy pacjenta.
· SecurityService
Wychodząca połowa TEFCA – zapytaj, nie odpowiadaj tylko
Wszystko, co do tej pory nagromadzone, odpowiada na pytania innych ludzi: odkrycie, dokument Zapytanie, pobieranie dokumentów, kolejka do gry, księgowość. Praktyka Może być zachłanny i nie może zapytać – a pytanie jest kierunkiem, w którym jest lekarz W rzeczywistości potrzeby, ponieważ historia nowego pacjenta jest w każdym przypadku, w którym ćwiczy. Kiedyś chodził. ExchangeRequest przez cały czas nosił kolumnę kierunkową I tylko InbOUND kiedykolwiek do niej napisał. Zapytanie wychodzące jest warunkiem braku połączenia, a nie ujawnieniem. PHI podróżuje w kierunku my, więc nic tutaj nie dotyka księgi ujawniania - nagranie, które by ją tam umieścił Linia w księgowości pacjenta nr 164.528 mówiąca, że ich rekord poszedł gdzieś w to miejsce Przyszedł OD. Discovery odczytuje dane demograficzne z NASZEJ płyty, nigdy od dzwoniący. Punkt końcowy To, kto akceptuje wpisane nazwy, jest sposobem na pytanie sieci "czy masz kogoś, kto Nazywamy to, co jest inną i znacznie gorszą zdolnością niż "uciek mój Historia pacjenta”. Każdy krok wymaga VIEW_CHART i relacji opiekuńczej, Odkrycie obejmowało: które praktyki posiadają zapisy dla kogoś samego Informacje o nich. Odzyskany dokument jest składany bez rekolekcje i pozostaje w ten sposób, dopóki nie zostanie klinicystą Mówi, co z tego zabrali. Podsumowanie innej praktyki jest ich twierdzenie, a nie Rekord tej praktyki; auto-wyłącz się z nim jest sposobem rozwiązania warunku z 2019 roku Staje się aktywnym problemem, a przerwany lek pojawia się ponownie na liście kogoś Przepisuje się przeciwko. Pogodzenie wymaga notatki, ponieważ "pojednanie" w pojedynkę Pozostawia następnego czytelnika, który nie jest w stanie stwierdzić, czy historia zewnętrzna znajduje się na wykresie Albo nadal tylko w przywiązaniu. Nieudane zapytania są rejestrowane tak mocno, jak udane, we własnym zakresie Transakcja. "Zapytaliśmy, a oni odmówili" - ktoś badający lukę w Historia pacjenta potrzebuje, a przewrócenie rzędu z powrotem z niewykonającą się Dokładnie ta sprawa jest warta zatrzymania. TRANSPORT jest DELIBERATE SEAM. W ramach TEFCA uczestnik uwierzytelnia się z Certyfikat X.509 wydany na podstawie Wspólnej Umowy – uzyskany poprzez podpisanie umowy Umowa uczestnika i wypełnienie onboardingu QHIN, a nie poprzez umieszczenie łańcucha Baza danych. Ta platforma nie ma szyfrowania w spoczynku dla tajemnicy tego rodzaju i Brak relacji QHIN, aby uzyskać jeden, więc wymyślanie kolumny tokena i wywołanie TEFCA wyprodukuje coś, co wygląda na federację i nie łączy się z niczym. Jakie statki są transportem, który odrzuca każde połączenie z wyrokiem nazywającym Brakuje onboardingu i 503 zamiast pustej listy – „brak dokumentów” Fakt kliniczny, na który klinicysta może działać i „nie mogliśmy zapytać” nie, a „nie mogliśmy) być nie, a System, który odpowiada zarówno na pustej liście, uczy ludzi ufać nieobecności. Nigdy nie ustalono tego. Pobrane dokumenty dostają własne wiadro i własną linię przechowywania, klucz Najemca, który pierwszy, jak eksport, ponieważ nic ich nie usuwa i praktyka, która Na pytania sieci gromadzi każde podsumowanie, jakie kiedykolwiek wysłano. 16 testów na wszystko nad szwem.
· kamo-shared-library
Linia dokumentów pobranych z innych organizacji
Własna domena, a nie udział w DOKUMENTS, z tego powodu masowy eksport został Po pierwsze: praktyka, która zadaje zalega z siecią informacyjną w zakresie zdrowia, które rutynowo się gromadzi Każde podsumowanie zostało kiedykolwiek wysłane i nic ich nie usuwa - odzyskany dokument Jest to dowód na to, co powiedziano tej praktyce i kiedy, co później Czytnik sprawdza, kiedy wykres i historia zewnętrzna się nie zgadzają. Billed, mimo że bajty pochodziły z innego miejsca. Przechowywanie jest prawdziwe, jest Przechowywany dla tej praktyki i jest ona utrzymywana, ponieważ ta praktyka o nią prosiła.
· VOIPService
Zapewnij konto KamoPBX po utworeniu serwera telefonicznego
Dodanie serwera telefonicznego KamoPBX tworzy teraz konto bazowe i pisze Id i themer wracają do configJson. Każdy configJson, który wysłał klient, jest DISCARDED zamiast łączyć: nie ma legalnego pola do noszenia, i Akceptacja jednego byłaby sposobem na wskazówkę na org na konto innego najemcy. Awaria rezerwy pozostawia rząd za oznaczonym niepołączonym z Powód, zamiast go usuwać – id może już mieć konto utworzone Na jego rzecz, a operator może ponownie spróbować ze strony instancji. Klient jest wspólną fasoli, więc token cache jest ponownie używany; konstruowanie jednego na Na każde żądanie wywołanie wywołania ponownego uwierzytelnienia się przed KamoPBX. kamo.pbx. to ustawienia platformy z pustymi domyślnymi domyślnymi uwierzytelnianiami, więc Niekonfigurowane raporty z platformy „nie są skonfigurowane” zamiast niepowodzenie. 246 egzaminów przechodzi.
· kamo-internal
KamoPBX jest do wyboru
Dostawca jest wdrożony w VOIPService, więc brama nadchodzi-prąd. Opis nie wymienia już projektu upstream i mówi, co naprawdę ma znaczenie Do kupującego: Kamo prowadzi go i nie ma na co się zapisać. Tylko edycjaryczna. Ta tablica zawiera teraz również billingClass i feeds Uprawnienie do zablokowania Reasonu z równoczesnej pracy, więc pozostaje na miejscu Zamiast wydobywać – dwa źródła prawdy dla katalogu dostawców Gorzej niż długi plik. Kluczowe dostawcy słownikówBullet1 został przesunięty jako pierwszy (c822cfeb); wiadomości / to Zgłuszana tu, więc zielona lokalna budowa nie dowodzi niczego w produkcji.
· SecurityService
Prawy łagoręczny interfejs pracy w usłudze
- lista, pozyskiwanie, aktualizacja i status PATCH. Idiom idiom ServiceTaskBookStroller: orgdId(req) lub 401, odpowiednia kontrola lub 403, zmienna ścieżka ciągną przez parseUuid lub 400, a jeden nieudany() pomocnik Podzielenie nielegalnego naruszenia znaczenia usługi na 404 dla brakującego rzędu 400 za wszystko inne. Brakująca praca to 404, które pasuje do każdego opiekuna rodzeństwa — strona szczegółów Uniemożliwia swoje nieodkryte państwo z tego kodeksu, a 400 tam ukryłoby się "nie" Im dłużej istnieje” za „towa prośba została zniekształcona”. Odmowa statusu Przejście jest dobrze uformowanym wnioskiem przeciwko istniejącej pracy, a więc SerwisPracaStatusMachine's komunikat, w którym oba państwa docierają do klienta jako Czytelność 400. Czytaj JEST bierz VIEW_SERVICE_WORK i pisze: MANAGE_SERVICE_WORK, który jest a DZIECI WIDZENIE w drzewie praw – więc napis, który osiadł na VIEW, byłby Cichy spadek, który nadal wyglądał na ogrodzonego w przeglądzie. Test bramy wzywa każdego Napisuj sesję tylko z widokiem, aby udowodnić, że tak się nie dzieje. Test napędza prawdziwych kierowcom, a nie zaczerpnąć źródła. ServiceTaskBookRightsGateTest mówi we własnym javadocie, że skanowanie źródłowe "Nie może udowodnić, że czek działa przed pracą"; BaseLosController rozwiązuje problem Sesja z atrybutu request, więc MockHttpServletRequest niosący Lista praw do praw wystarczy, aby odczytać prawdziwy kod statusu z powrotem - i potwierdzić Usługa nigdy nie została osiągnięta, co jest pół skanem, którego nie widzi skanowanie: obsługi, który Czyny, a następnie sprawdzają zwroty 403 po napisaniu wiersza. Testowane mutacje: prawo zarządzane, które zamieniło się na widok, właściwy czek usunięty Sprawiedliwy czek został przesunięty po wywołaniu serwisowym, nieudany() spłaszczony do Zawsze-400, PATCH /status zamienił się w PUT, a org sesji zastąpiony przez Dosłownie. Każdy z nich wytworzył wyraźną awarię, nadając winę uchwytowi.
· kamo-shared-library
API odczytu/zapisu lubg-chwytania dla zadań serwisowych
ServiceJob był zmapowanym podmiotem z repozytoriami i zdawaniem testów oraz Nie ma sposobu, aby przeczytać wiersz. To daje nagłówkowi gotowy UI zlecenia roboczego Daje już render, dzięki czemu sieć może przestać generować własne. Kształtowanie w ServiceTaskBookApi/Service: Ids i stringi ISO-8601 na Drut, orgId najpierw na każdej metodzie, każdy odczyt zmapowany do widoku INSIDE Transakcja, ponieważ ServiceJob.visits jest LAZY, a najemca predysponuje w JPQL zamiast czeku po obciążeniu. SerwisJobRepository już Przeprowadziło wszystkie cztery zapytania, więc jest nietknięte. Dwie decyzje kształtu, które DTO musiał podjąć: - totalLabourMinutes jest intelistrem, nigdy nie unosi się godzinami. 20-minutowe zadanie to 0.333 godziny i trzy z nich to nie godzina; ServiceLineItem.labourMinutes Argumentuje argument za kolumną i utrzymuje się również na przewodzie. Jest to suma Z rzeczywistych okien wizyt, które są jedynym pracownikiem pracy, do której może dotrzeć: ServiceLineItem zwisa z zamówienia bez połączenia z pracą. Czas wzięty, Nie czas ogłoszony. - Handel nie jest kategorią UI. Dziesięć wolnych ekścieli kompozytowych przeciwko piętnaście ServiceTrade stałe, nie 1:1 — "Naprawa plumbing" jest PLUMBING plus WorkClass.REPAIR, a klasa pracy żyje na pozycji liniowej. Przewodzie przenosiją Handel i klient wydaje etykietę. Status porusza się przez ServiceJobStatusMachine i nigdzie indziej, dlatego JobInput nie ma członka statusu, a StatusInput jest jego własnym rekordem. Status osiągalne dzięki ogólnej aktualizacji byłoby drugie drzwi na kolumnę, A drugie drzwi to te, których nikt nie sprawdza. Testy są behawioralne, a nie skany źródłowe: repozytorium jest proxy, którego ZnajdźByIdForOrg honoruje org i którego znalezisBById celowo nie, więc Nieczysta czytana jest raczej przeciekiem niż jako przerwa. Mutacja testowana — dochodzenie Przejmowanie usunięte, stwierdzenie Przejście przeniesione po setStatusie, Zapytanie lubg-scoped zamienione na findById, minuty zamienione na godziny, Filtr stanu wymyka się z SQL, getVisits() left unread, .Transactional Usunięto i komponent "status" dodany do JobInput. Każdy z nich wyprodukował odrębną Awaria nazywająca nieruchomość, którą chroni.
· kamo-login
Ujawniaj wstępnie wybrane miejsce pracy i podawaj listę paska przewijania org
Dwie rzeczy o pickerze przestrzeni roboczej, obie na tej samej liście. Przestrzeń pracy, której ostatni członek jest wstępnie wybrany i nazwany na przycisku, ponieważ Ten ekran jest raczej potwierdzeniem niż ankietą. Ale nic do niego nie przewinęło. A A Członek dwudziestu organizacji, których zwykła jedna znajduje się czternastym, otworzyła listę Pokazując podświetlony rząd, którego nie mogli zobaczyć, pod nagłówkiem, nad przyciskiem Nazwanie miejsca pracy, które nie pojawiło się nigdzie na ekranie. Czy preselekcja była Widoczne sprowadzało się tam, gdzie ten org znalazł się na liście. Jest on widoczny raz, otwarty i tylko wtedy, gdy jest naprawdę poza zasięgiem Widzenie - wiersz już na ekranie pozostaje tam, gdzie jest, ponieważ przewijanie listy, która Nie trzeba czytać przewijania, ponieważ strona porusza się pod tobą. Sśrodkowe zamiast spłukiwania Do krawędzi, więc wiersze powyżej i poniżej nadal mówią "to jest pozycja na liście". "scrollTop" zamiast "scrollIntoView": który przewija każdego przewijanego przodka, I na ekranie logowania może zabrać ze sobą stronę. Lista jest już dostępna „pozycja: względna” więc „offsetTop” wiersza jest mierzona w stosunku do samej listy – Dokładne, i w przeciwieństwie do granicy cofania się, nie jest przesunięty przez wejście do rzędów Przekształć się. Szkło do przewijania to druga rzecz. Każdy akcent na tym ekranie jest mieszany z "--color-primary", który arkusz stylów tematu już ustawił w dowolnym momencie Organizacja ekranu jest oznaczony jako: kolej do wyboru, odcień rzędu, "Ostatnio użyta" pigułka, przycisk. Kradzieżek był jednym kawałkiem chromu wciąż Renderowanie w domyślnej szarości przeglądarki, która na silnie markowym najemcy jest Jedyny szary na panelu. To są tony tego samego symbolu teraz – przezroczyste Kciuk, który pogłębia się na zawisła, słabym torze, oba zaokrąglone. Napisany jako element "style" zamiast inline style reszty tego Element wykorzystuje, ponieważ pasek przewijania jest dostępny tylko przez pseudo-elementy. Obie słownictwo są tam i nie ma też upadku dla drugiego: WebKit i WebKit Chromium czyta pseudo-elementy i ignorować "scrollbar-color", Firefox czyta "scrollbar-color" i nie ma pseudo-elementów.
· VOIPService
Wdrożenie dostawcy KamoPBX
Zastępuje stub. KamoPBX jest własną platformą Kamo, więc organizacja nie posiada Poświadczenia w ogóle: KamoPBXAccountProvisioner tworzy konto, gdy telefon Dodano serwer, a KamoPBXClient miętuje krótkotrwały token z przeszklonym na Oddzwonić z jednego mistrzowskiego poświadczenia Kamo. Auth używa OWN api_key konta dziecięcego, czytaj z głównym tokenem i Wymienione – udokumentowane i schemate. Nieudokumentowane jako:-account_id,owner_id Roszczenie nie jest celowo używane: zawodzi otwarcie, zwracając pełne przywileje Token PARENT bez błędu, gdy owner_id jest pominięty. scopedToken() twierdzi, że Zwrócony token jest rozdzielony dla dziecka i odrzuca rodzica-ośmielonego jako Eskalacja przywilejów jest. Również naprawiony od stub: - getCallHistory zwróciła null, co NPE każdego dzwonię do tego, który jest esata. - CDR są na nogi, więc historia jest załamana w interakcji lub jednym pokazie połączeń W górę dwa lub trzy razy. - callResult jest przypinany przez test dokładnie na ANSWERED/NO ANSWER/BUSY/FAILED; Wszystko inne po cichu sprawia, że liczniki chybionych dzwonią, czytają zero, tak nieznane Powieszenie powoduje załamanie się do FAILED, a nie przechodzenie. Ustawienia platformy (adres URL bazy, konto główne, poświadczenia administratora, adres URL WSS) Wstrzyknięcie do wstrzyknięcia i nigdy nie perorg. 246 testów przechodzi, z czego 29 nowych.
· KlusterServices
Aplikacje, media, manifesty brzegowe i polityka sieciowa
- config.ini niesie blok [strefy] od pierwszego dnia, więc drugi region jest konfiskatą Edycja, nie operacja. Tajemnice są zastępowane punktem wejścia na początek kontenera Zamiast piec w ConfigMap. - ecallmgr jest współlokowany z FreeSWITCH w ONE str: surowa dystrybucja Erlang, Współdzielone ciasteczko, brak TLS i ich dzielenie przekracza granicę MTU 1500/1420. - Kamailio reklamuje 47.181.8.87 podczas słuchania na 192.168.4.36. - Cilium jest domyślnie opowiedzianych i punktach końcowych:[] jest imitem przestrzeni, więc Wyraźna kamo/kamovoip -> kamopbx-apps: 8000 jest tym, co zatrzymuje fazę 3 Jak cichy czas.
· kamo-internal
- i zablokowaj kartę Enterprise
Rejestruje odpowiednią stronę klienta - lista, kolor, ikona - i dodaje ją do Nietabowy zestaw z taśmą z notatką na to, co faktycznie obnosi, ponieważ Strzeża akcję w dwóch usługach, a nie w zakładce Konfiguracja. Czarnoksiężnik zamówili każdy aktywny plan, w zestawie Enterprise, z ceną Czytaj prosto z katalogu. Serwer wstrzymuje teraz tę cenę i odmawia Subskrypcja wprost, więc karta miała pokazać plan, że nie ma numeru Za i nie można go kupić. Jest niepełnosprawny z nutą, zamiast pozwolić komuś Przejść cały czarodziej i spotkaj się z odmową na końcu. Serwer jest granicą w obie strony - EnterprisePlanGuard w BillingService, I POSController za cenę. To tylko oszczędza zmarnowana podróż.
· BillingService
Odmowa subskrypcji firmy Enterprise
Enterprise jest negocjowane. Ukrywanie się w cenę jest prezentacją; to jest Granica. Prośba o nazwanie planu Enterprise zostanie odrzucona, chyba że dzwoniący Przechwytywanie - więc odgadywanie kodu planu i publikowanie go Bezpośrednio otrzymuje taką samą odpowiedź jak czytanie konsoli. Pożary tylko na kodzie planu CALLER-SUPPLIED. Nocni pojednawcy zmieniają się na żywo Subskrypcje za pośrednictwem tej samej ścieżki aktualizacji z pustym ciałem i bez HTTP Żądanie w ogóle - strzeżenie nieważkiego przestałoby rozliczać każdego wynegocjowanego klienta. Zasada jest taka, że „nie możesz NAZWAć ten plan”, a nie „ten plan może nie zostać dotknięty”. Tożsamość jest rozwiązywana dokładnie tak, jak PlatformAdminInterceptor rozwiązuje ją, a Wyrok pozostawia się wspólnemu PlatformRightsResolver, więc nie może to dryfować Co SecurityService decyduje o tej samej osobie. Odmowa nie wymienia pozwolenia. Klient dostaje to, na co może działać - Skontaktuj się z nami - nie jest to wskazówka, że prawo istnieje i mogą je uzyskać.
· SecurityService
Wstrzymaj ceny dla przedsiębiorstw z katalogu
Enterprise jest negocjowany bezpośrednio z KamoCRM, więc jego stawka nie jest nasza. Publikuj. Każda powierzchnia, która podaje cenę planu, odczytuje ten jeden punkt końcowy - Publiczna strona cenowa za pośrednictwem serwera proxy APIService, kreator zamówienia w aplikacji i lejek rejestracyjny - więc ceny są spadane z ładowności tutaj raczej Poproszenie trzech klientów, aby pamiętali o specjalnym planie. Wewnętrzne połączenie (publiczne (publiczne proksymowe) nie ma odpowiedniej platformy i zawsze jest redagowane. Rozmowa sesyj jest redagowana, chyba że dzwoniący się nie odbędzie - ;) Sam rząd planu pozostaje: czytelnik nadal musi zobaczyć, czym jest Enterprise IS i Powiedziano mi, żeby z nami porozmawiać. Tylko liczby idą. To jest prezentacja. EnterprisePlanGuard w BillingService jest granicą, która jest granicą Odmawia zakupu - ktoś, kto odgaduje kod planu i publikuje go bezpośrednio Otrzymuje tę samą odpowiedź, co ktoś czytający konsolę.
· kamo-internal
Pokaż, co mówi wykres przed zapisem recepty
Serwer odmawia teraz recepty, która jest sprzeczna z alergią, a Lek, pacjent jest już nałączony, lub pacjent, o którego nikt nigdy nie pytał Alergia – i zwraca to, co znalazła. To to czyni. Karta poniżej formularza, a nie błąd inline, ponieważ recepta jest Nienaruszone i następne działanie jest decyzją kliniczną, a nie korektą. Wysokie ryzyko Oznaczono ostrzeżenia: "penicylina" i "penicylina, wysoka krytyczność" nie są To samo ostrzeżenie. Pole przełoży się pytanie: "dlaczego i tak to przepisujesz?" — A jego pomocnik mówi, po co jest odpowiedź. Przepisywanie narejestrowaną alergię Jest to decyzja kliniczna, której ktoś może potrzebować później, a powodem jest to, co Broni się go. Przycisk pozostaje nieruchomy, dopóki nie będzie. "Nie przepisuj" siedzi obok niego. Ostrzeżenie z tylko jednym wyjściem jest ostrzeżenie Ludzie uczą się klikać. Ostrzeżenia są usuwane z każdej nowej próby, chyba że jest przenoszona powód, więc Uznanie napisane dla jednego leku nie może być ponownie użyta przeciwko innej.
· KlusterServices
CouchDB i RabbitMQ na k3m1
CouchDB q 8 / n-1, zweryfikowany na żywo. q jest stały przy tworzeniu bazy danych i KamoPBX Tworzy bazę danych na konto plus comiesięczne MODB, więc q jest teraz wielkości dla Imperualna gromada 3-node; n można ją podnieść później poprzez edycję map shard, q nie może. Automatyczne urządzenie włączone — wysyłka w górę wysyła ją i wzorzec zapisu KamoPBX Fragmenty źle. Trzy błędy wdrożeniowe znalezione i stałe na żywo: - Montaż ConfigMap przez /opt/couchdb/etc/local.d sprawia, że jest to tylko odczyt i Punkt wejścia umiera pisząc docker.ini. Używa subPath dla pojedynczego pliku. - Świeża objętość Longhorn jest własnością korzenia; couch bęb działa jako uid 5984 i wyszedł 1 Bez wyjścia dziennika w ogóle. Dodano fsGroup plus chown initContainer. - Rabbitmq-diagnostics potrzebuje więcej niż domyślny czas próbny 1s; serwer Był zdrowy (9s startup), ale sonda zawiodła. RabbitMQ działa jako kamopbx, a nie wysłany gość: gośż z loopback_users off.
· kamo-shared-library
Powiedz "tytesy zniknęły" z wyjątkiem "zasłoniowe magazyny"
OpenRange zawalił każdą porażkę w jednym IOExcepcji, więc dzwoniąc mógł to zrobić Z nim nic nie ma, tylko powróć 500. Przeglądarce "img"/video>/aaudio> nie może renderować 500 – dostaje jeden bit, "nie powiodło się", i zatrzaskuje się - więc przywiązanie, którego przedmiot Nigdy nie został napisany, odpowiedział na przycisk odtwarzania członka, milcząc. Porażka Dotarliśmy do nas tylko dlatego, że ktoś powiedział: „Wysłał, ale nie może tego zagrać”. Obie przyczyny zasługują na przeciwstawne odpowiedzi. Treść nieobecna jest stała i wartość Mówienie wyraźnie; przechowywanie nieosiągalne jest przejściowe i warte ponownego przepróbowania. Wychwyt ObjectNottoredException tylko wtedy, gdy flota WHO odpowiedziała i każda odpowiedź była NoSuchKey: aant, do którego nie można dotrzeć, może być tym, który trzyma obiekt, Tak więc mieszanka pozostaje zwykłym IOException. Powiedzenie członkowi ich akta jest Na stałe utracone podczas częściowej awarii jest tutaj jedynym błędem, którego nie może być Cofnęli się. Rozszerza IOExcepcję, więc wszystkie siedem istniejących witryn telefonów nadal działa nietknięte I zrezygnuj z rozróżnienia, łapiąc go pierwszy.

Twój wszechświat czeka.
Rozpocznij bezpłatnie w kilka minut.Dodaj produkty, kiedy tylko będziesz gotowy — bez migracji, bez nowych logowań.
Bezpłatne na zawsze — nie wymaga karty kredytowej