Mergi la conținut
KAMOUniverse

Jurnal de schimbări

Ce e nou.

Fiecare îmbunătățire a platformei, pe măsură ce se livrează.

  1. · VOIPService

    Servește URL-ul webhook de intrare, dintr-o singură definiție

    Un administrator care adaugă un furnizor de text trebuie să lipească URL-ul de intrare Kamo în Consola proprie a transportatorului şi nimic nu le-a spus ce era. Lipseşte acel pas. nici un simptom pe partea oricine testează mai întâi: mesaje trimite perfect și fiecare Răspunsul este scăzut. Răspunde. Servit mai degrabă decât hardcoded în browser pentru motivul pentru care RingCentral redirecţionare URI este servit: valoarea provine dintr-o proprietate de desfășurare, și o copie în frontend păstrează cu încredere afişarea vechii gazde după cea reală se mută. URL-ul are acum o definiţie. TelnyxProvisioner-l scrie în clientului Profilul de mesagerie și ecranul de setări SHOWS-l la cineva lipirea de mână; atunci când acestea au fost două siruri de caractere nimic nu ar fi eșuat în cazul în care au plutit administratorul ar fi fost pur și simplu instruit pentru a configura un URL nimic ascultă. InboundWebhookUrls este această definiție, și testul său afirmă că fiecare melc se construiește se rezolvă înapoi prin InboundSmsNormalizer, astfel încât cele două părți sunt de acord prin construcţie, nu printr-o masă pe care cineva trebuie să-şi amintească să o actualizeze. Obiectivul final raportează, de asemenea, dacă intrarea unui transportator este cu adevărat conectată la un fir verificarea semnăturii şi un parser. Oferind cuiva un URL pentru un transportator ale cărui sarcini utile nimic nu poate citi ar fi o instrucțiuni pentru a configura ceva care apoi refuză fiecare mesaj, care este mai rău decât a spune clar că nu este sprijinit încă.

  2. · kamo-internal

    Un set care acoperă fiecare număr dintr-un sistem telefonic

    Designul de rutare aprobat avea trei niveluri și doar două dintre ele erau accesibile. Un număr ar putea numi propriul furnizor de text, și în lipsa că serverul telefonului a fost a cerut să se text, dar nivelul de mijloc, "dacă un număr nu spune altfel, nostru texte trece prin Telnyx," a fost implementat în TextRouter și settable nicăieri. An organizaţie cu 200 DIDS pe un FreePBX a trebuit să editeze două sute de rânduri la exprima un fapt, care este treaba de intrare date ecranul Numere trebuia să Evită. Acesta este acum un dropdown pe serverul telefonului în sine. Trei lucruri care merită numite: - Unirea ruleaza LAST in salve (). Fiecare sucursală de furnizori de mai sus este ASSENSS Config Json mai degrabă decât fuzionarea în ea, astfel încât prima versiune a acesteia a fost scăzut în tăcere pe serverele Telnyx să vină după locul unde a stat iniţial. - "Nimic Dropdown gol este mai degrabă nesetat decât o decizie. - Cheia este un șir de caractere în două limbi în două depozite, și derivă este SILENT: setarea salveaza, scaderea inca arata furnizorul care a fost Ales, și fiecare număr bazându-se pe retragerea în liniște se încadrează prin texting prin intermediul serverului telefonic Deci formularul importă DEFAULT TEXT INSTANCE KEY, și textRoute Contractment.test.ts pini ea împotriva TextRouter.java modul de facturareCycles.test.ts pins facturare enum. Gardianul ăla e în mod deliberat cinstit în legătură cu ceea ce dovedeşte. Crucea-repo jumătate sare ori de câte ori checkout-ul frate este absent sau vechi aşa că se numeşte "când acea sursă este disponibilă" şi o trecere acolo înseamnă "nu." contrazis, niciodată "verificat." Afirmaţia că întotdeauna se execută este cea care Am prins o redenumire când paznicul a fost cercetat prin ruperea ei intenţionat. Doc de proiectare actualizat: cele două limite pe care le-a listat ca fiind detaliate organizaţie în imposibilitatea de a fir un răspuns, şi MMS prin Telnyx sunt ambele închise în voipservice 8eaebfb.

  3. · kamo-internal

    Reacționează la o schimbare a statutului, nu numai la un comentariu

    " Fir de bug, și oferind reacții numai pe comentarii a însemnat tastarea unul să-l spun. Centrul sub pilula eveniment, și ascuns până când rândul este plutit, cum ar fi chips-uri la un comentariu.

  4. · kamo-internal

    Actualizări live ale firului, și reacții care sunt de fapt accesibile

    Două jumătăți ale firului au fost construite și apoi lăsate neconectate. Serverul a publicat fiecare comentariu și eveniment de stare la din moment ce caracteristica a aterizat, și nimic abonat Atunci când cititorul a postat ceva ei înșiși, și doi oameni triaj la fel Raportul a văzut diferite istorii până când unul dintre ele a reîncărcat. Acum aboneaza prin acelaşi context cadru care ajunge la mijlocul-fetch nu este suprascris de pagina deja în zbor. Reciteste pagina in loc sa adauga rama, care este opusul a ceea ce chat face și deliberat: un chat rulează la sute de mesaje, un fir de bug este o mână, iar cadrul nu poartă nici cotația de răspuns și nici lista de reacție Rândul appended ar reda fără cotația sa până când altceva forțat o reîncărcare. Criteriul final de evaluare a reacţiilor a fost mai rău: serverul, serviciul şi câmpul DTO au fost expediate şi nu Clientul ar putea ajunge la orice. Nu era nici o rută, nici o metodă Api şi nimic desenat. Ea are toate cele trei acum, și este Reactionata calatorii ca statul fiind CERUT MAI DEgraba decât o delta, astfel încât o cursă dublu-click converge în loc de flipping de două ori; Raspunsul serverului inlocuieste lista randului mai degraba decat fuzionarea in ea. Patru emoji, oferit inline. Un fir de bug nu este un chat "Am lovit asta prea," "uitându-mă la ea" şi un culegător complet ar fi mai mult control decât conversația are utilizări pentru. Cipurile nefolosite sunt trase doar pe plan de lor comentarii, astfel încât zece comentarii nu sunt patruzeci de butoane gri. Testele fals context websocket pe scop: cel real DEFAULT este un no-op care doar avertizează, astfel încât un test fără un furnizor în domeniul de aplicare ar fi trecut în timp ce abonamentul a fost absent în întregime.

  5. · MediaService

    Paginile cu fir îi numesc cititorul şi aruncă un ajutor nefolosit

    reacţiile celorlalţi fără un al doilea apel către /api/utilizator-info. Un arbitru completat de un al doilea asinc aduce este gol pentru primul rend, și o reacție cip care începe ne-umplut și se corectează un moment mai târziu citește ca un eșec click. Un șir, pentru motivul pentru fiecare ID în această caracteristică este unul: un Int64 de 19 cifre pierde precizie prin JSON.parse. Nu este un caz gol și niciodată numit.

  6. · VOIPService

    De fapt, creați configurarea contului Telnyx, transporta MMS, și să un transport-doar org deține fire

    Trei goluri, și primul a fost caracteristica nu funcționează deloc. PROCESUL TELNYX A FOST DEFINAT SI NU S-A NUMIT NIMIC TelnyxProvider. provider. provider. Toti au existat si n-au avut apelanti. Deci... Administratorul a lipit o cheie API, salvat, a fost spus serverul telefonului a fost creat, şi nimic nu a fost creat în contul lor Telnyx. furnizorul a raportat apeluri vocale=fals și sms=fals cu un remediu care le spune să Presa Salvare, care nu ar fi făcut nimic pentru totdeauna. TelnyxSetupService rulează acum pe crearea și pe fiecare actualizare, idepotently, modul în care Înregistrarea de pe site-ul lui JustCall o face deja. Scrie conexiunea şi Mesaj-profil ID-uri înapoi în configJson, motiv pentru care este un serviciu și nu o linie în furnizor: un furnizor este construit din care config și nu are Depozit. Atribuirea unui număr acum ments că SIP credibile membru și ataşează numărul profilului de mesagerie cel fără simptom, pentru că un număr neataşat trimite perfect şi niciodată Primeşte. MMS Telnyx ia media urls, niciodată octeți. Doar Call a rezolvat deja exact acest lucru cu o legătură publică susţinută de Redis; a fost numită pentru JustCall. Acum se extinde. un neutru OutboundMediaHandoff, astfel încât o fasole servește atât și nici un site de apel DoarCall sau testul s-a schimbat. Ambele șine Telnyx transporta mass-media, și fiecare refuz este declarat MMS pe transportator, nu handoff configurat, sau un fişier persoana respinge membru nu se uită niciodată un text ajunge cu imaginea lipsește în tăcere. O ORG ONLY CARRY poate organiza acum o conversație Aceasta este limita comisă anterior documentată mai degrabă decât fixată. VOIP CONVERSATIONS.INSTANCE ID este nulable (kamo-shared-library ae95b01e), astfel încât un org cu numere și un transportator și nici un server telefon poate fir un răspuns în loc de că a căzut. Două lucruri care au trebuit să se miște cu ea: - Dedupe. SQL tratează NULLs ca DISTINCT, astfel încât indicele unic existent se oprește care acoperă exact rândurile pe care le introduce. Un indice unic parțial pe (ORG ID, MEMBRU ID, EXTERN PHONE NUMBER) În cazul în care INSTANCE ID este NULL acoperă. - Două NPE-uri aşteaptă primul nul. Evenimentul NATS a fost construit cu Map.of, care aruncă pe o nulă astfel încât fereastra SMS a membrului să nu se actualizeze niciodată. SmsController numit .to String() pe ea pur și simplu. DDL pentru ambele este în docs/ sql / şi aplicat manual; IniţializatorService nu este desfăşurat în acest grup.

  7. · kamo-shared-library

    O conversație text poate exista fără un server telefon

    VOIP CONVERSATIONS.INSTANCE ID nu a fost NULL, care a decis în liniște că fiecare firul de text aparține unui PBX. O organizaţie care cumpără numere şi mesaje de la un transportator și răspunde la nici un apel, la toate doar texting-, nici un server telefon undeva nu are VoipProviderrück pentru un fir care să aparțină. Aceste orgi ar putea SEND (propria rută de text a unui număr are nevoie de nici un server telefon) și a avut fiecare răspuns A căzut, pentru că ingerarea nu a putut construi o conversație să-l depună sub. Null este acum un stat real și javadoc spune ce înseamnă, inclusiv lucru nu trebuie să fie niciodată: un id BulkTextProviderInvestment. Ambele mese sunt cu cheie UUID și Înmânarea unui ID la fabrica greșit nu este "nici un astfel de caz" mai degrabă decât care cedează tare. Dedupe supravieţuieşte nulului, dar nu gratuit SQL tratează NULLs ca distincte, astfel încât indexul unic existent încetează să acopere aceste rânduri. DDL alături de VOIPService adaugă o indice unic parțial privind (ORG ID, MEMBRU ID, EXTERN PHONE NUMBER) INSTANCE ID este NULL pentru exact acest caz.

  8. · kamo-internal

    Planul pe care l-ai ales călătoreşte pe pagina care îl vinde

    "Move to Business" a deschis consola de facturare cu nimic selectat. Alegerea persoanei Tocmai a făcut a fost scăzut pe podea și au fost rugați să-l facă din nou, pe un ecran listare patru planuri și deschiderea pe nici unul deja a decis. Codul merge acum același șir de interogare ca sub-tab, construit și citit de planLinks.ts pentru motivul pentru care sub-tabul este: o valoare nerecunoscută este ignorată prin proiectare, astfel încât o scriere produce o Legătura care funcţionează, aterizează undeva plauzibil şi nu este unde se spune că se duce. Unu. Modulul care deţine ambele jumătăţi este ceea ce permite unui test să prindă asta. Cazul superior pe drum în, deoarece codurile de plan sunt comparate cu egalitatea împotriva catalog oriunde altundeva și o legătură nu este un loc pentru a inventa o a doua ortografie. Nevalidat aici şi consola ignoră ceea ce nu se poate potrivi, mai degrabă decât eroare la cineva care a urmat un link au fost date. Partea consolei aterizează separat, într-un permis de trecere al unei sesiuni concurente peste acel fișier.

  9. · kamo-shared-library

    Cele două scrisori pe care le primeşte un client când cardul lor eşuează

    BillingService a vrut să trimită astea de când DunningNotifier a fost scris. Acesta Le-am postat la ************************* la un obiectiv care nu a avut niciodată a existat pe E-mailService, în cazul în care singurul controler sub acel prefix servește director fotografii nu face Stripe retry a webhook. Deci un client al cărui card a expirat are o bază de date. Nici o scrisoare, nici un banner, nimic. Prima dată au ştiut de asta. aplicații care refuză să deschidă o săptămână mai târziu, când perioada de grație a expirat. Două șabloane canonice, urmând constanta / punctat-cheie împărțit HR și Familiile de e-semnătură folosesc deja facturare. plată a eșuat și Billing.service suspendat, însămânţat per-org ca oricare altul. Ambele merg la adresa BILLING pe cont mai degrabă decât la un membru, deoarece persoana care plătește nu este de obicei o persoană care semnează în, și ambele link-ul direct la factura găzduită a lui Stripe: cineva al cărui acces tocmai s-a oprit nu trebuie să intre în produs pentru a plăti produsul. Formularea face munca suprafetele nu au putut. Primul spune ce este Excelent, ce se opreşte, şi exact în ziua în care se opreşte. Al doilea conduce cu "Nimic nu a fost şters," pentru că asta e teama în acel moment şi nu Ecranul răspundea. Jumatate de BillingService care există și este în spatele InternAuthFilter .

  10. · kamo-internal

    O carte de plan spune ceea ce se adaugă la cel de mai jos ea

    Culegatorul a dat un preţ, un plafon de scaun şi o propoziţie. Alegerea între $46 și $80 a loc pe care este o decizie cu un singur răspuns evident, și pentru cele mai multe echipe este greșită catalogul a purtat întreaga matrice de capacitate de-a lungul și pagina de cumpărare niciodată a arătat o linie de ea. Fiecare carte de acum denumeste ceea ce planul sau comuta pe care cel anterior nu, patru la un timp cu un număr pentru restul. Derived, nu scris în jos: planAddsOver citește același caracteristici rânduri / miplan redă, astfel încât o schimbare catalog se mișcă atât și nici nu poate merge vechi. Numele numai SHARED MAILBOXES pentru cineva care nu a mai văzut acest produs înainte.

  11. · kamo-internal

    O modalitate de a ajunge la vânzări, și un control al scaunului care cunoaște limita planului

    ContactSalesDialog deține KamoCRM Detaliile proprii ale Inc. (949) 298-9960 x1 Fiecare altă adresă de pe această platformă aparține la chiriaș, și rezolvarea acestuia în același mod ar trimite un client întrebând despre un KamoCRM plan înapoi la propria linie de vânzări a organizației lor. Ambele sunt legături live, precum și text, cu butoane de copiere; Href telefon poartă extensia ca ;ext=1 astfel încât un robinet îl formează. O componentă, utilizată de pagina de plan și consola, pentru că un număr de telefon nimeni nu observă este vechi este exact ceea ce produce două copii. Cardurile de plan ale consolei au fost greşite în trei moduri pentru pagina care ia clienţi noi. Enterprise a tipărit o firmă $99 pe scaun "Custom," astfel încât o companie a fost spune o perspectivă două lucruri diferite și a purtat un insigna "33% off aplicat" sub un preț nu a avut. Acum citeşte Preţul pe aplicaţie, nu poartă nici o cifră, și oferă singurul lucru care poate avansa de fapt: a conversaţie. Starter and Business nu a menţionat niciodată taxa de pornire de 99$ pe scaun, care este $495 pe un ordin de cinci locuri Stepper scaun a fugit la 9,999 orice plan a fost selectat. - Nu. a aplicat întotdeauna tavanele reale, astfel încât cineva ar putea construi un ordin Starter patruzeci de locuri, urmăriți un total adăuga pentru ea, și să fie refuzat la excepția cu nimic care indică la numărul care A fost greşit. Acum se oprește la limita planului și spune ce plan îl stabilește și ce duce mai mult; este dezactivat până la alegerea unui plan, deoarece plafonul este proprietatea acestei alegeri; și alegerea unui plan mai mic aduce numărul în jos cu ea mai degrabă decât preţ cinci locuri pentru 12 oameni până la obiectele serverului. clemSeatsToPlan este împărţit cu culegatorul şi testate, pentru că aceeași regulă trebuie să dețină atunci când se mișcă SEATS și atunci când planul nu. De asemenea: CTA primar a fost albastru implicit MUI pe o consola alb-eticheta, o culoare pe pagina aparţinând nimănui, pe cel mai important buton.

  12. · kamo-internal

    Un ecran de numere, astfel încât apelurile și textele pot veni de la diferite companii

    O organizație cumpără numerele sale de la o singură companie și răspunde la apelurile cu Altul. Acest lucru este obişnuit, iar Kamo nu a putut să-l descrie: textul a fost o proprietate a unui membru de telefon SERVER, astfel încât un orga ale cărui DIDS și SMS a venit de la Telnyx și ale căror apeluri au fost răspunse prin FreePBX propriu nu au putut trimite niciun mesaj. Configurări → Telefon → Numerele sunt acolo unde se spune acum, și se află între Furnizori și Extensii, deoarece acesta este ordinul în care se desfășoară activitatea. Un rând se citește ca o propoziție "+1 (949) 555-1212 Office PBX · Texts trece prin Telnyx" Numărul iar persoana pe primul loc, pentru că acestea sunt cele două lucruri un administrator De fapt, ştie. Decizia în valoare de apărare, și un NumbersTab.test. tsx există pentru a proteja: un server telefonic care nu poate fi trimis text este OFFERED în dropdown Texts, dezactivat, cu motivul pe lângă ea. Filtrarea este implementarea evidentă și este cel care lasă pe cineva blocat sistemul din această listă concluzionează că ecranul este spart, în timp ce unul care citește "FreePBX nu poate trimite mesaje text" știe să adauge un furnizor de text în schimb. Motivele vin de pe server, în cazul în care fiecare furnizor scrie propriul său. "Gaseste numerele mele" importa ceea ce furnizorii stiu deja, pentru ca dactilografierea treizeci DIDs corect nu este un lucru de a cere de oricine și un tip greșit nu în tăcere. Telnyx se alătură ambelor culegătoare. Cardul își petrece majoritatea cuvintelor pe webhook public cheie: este pe o pagină diferită a portalului Telnyx de tasta API, și lipsește nu are nici un simptom pe trimiterea de texte ies perfect și fiecare răspuns este refuzat. Cardul spune, de asemenea, în avans ceea ce Telnyx nu are, astfel încât este o decizie cineva face înainte de a comite mai degrabă decât o descoperire după aceea. Nave kamo fără logo-ul Telnyx; o iniţială fumegândă este sinceră despre a fi a noastră, unde ceva desenat să arate ca marca lor nu ar fi. Două lucruri găsite în timp ce o construiesc: - NumbersTab reload a depins de identitate stabilă Am terminat de încărcat. Nu este o eroare, doar un spinner permanent. Testul l-a prins. - Meniul de setări și harta etichetei furnizorului ambele au teste de acoperire care a cerut întreținere pentru o nouă filă și un nou furnizor. Ambele au avut dreptate.

  13. · VOIPService

    Trasee texte pe numere, și adăugați Telnyx pe ambele părți ale acestuia

    O organizație poate cumpăra DID-uri sale și texting de la o singură companie și răspunde Mai sună cineva. Kamo nu a putut exprima acest lucru: mesajul unui membru a fost un proprietatea telefonului lor SERVER, astfel încât un org ale căror numere au venit de la Telnyx și ale căror apeluri au fost răspunse prin FreePBX propriu nu a putut textul la toate declară sms (fals), poarta de acces a refuzat înainte de a fi atins orice furnizor și sfatul "adauga unui furnizor de SMS" a condus la o cale ferată care nu a putut deschide o conversaţie. Aşa că întrebarea a trecut de la furnizor la număr. ORG PHONE NUMBER spune cine deține un număr, ce răspunde la apelurile sale și ce poartă textele sale. TEXT ROUTE KIND se află mai degrabă lângă instanţă decât să fie dedus din aceasta, pentru că cele două mese candidate sunt ambele cu cheie UUID și predarea unui ID la fabrica greşită nu eşuează cu voce tare. textul nu este niciodată trimis. InboundRail deja a documentat acest pericol. TextRouter rezolvă în trei niveluri: ruta proprie a numărului, apoi un nume implicit de către serverul telefonului (deci 200 DID pe un singur PBX este o setare, nu 200 de rânduri), apoi serverul telefonului în sine niciodată nu deschide ecranul Numerele continuă să lucreze având configurat nimic. Calea ferată în vrac moşteneşte contractul de trimitere. TextSender are două adaptoare și SmsGateway vorbește cu ea, așa că BulkTextProvider.send Text a cărui eroareMesaj este întotdeauna unele transportor e.getMessage () în faţa cuiva care încearcă să trimită un mesaj unui client. Și BulkTextInboundController acum Înmânează mesajele către VoipMessage Service. ingerează în loc să înregistreze un cuvânt cheie și oprirea, astfel încât un răspuns pe un număr de transport devine o conversație. Cuvânt cheie manevrarea nu s-a miscat; s-a mutat in jos, in secventa fiecare alta cale ferata deja acţiuni. VoipNumberOwnnership câștigă SOURCE ORG NUMBER la cea mai mare prioritate: celelalte două surse deduce proprietatea dintr-o coloană care se întâmplă să dețină un număr, în timp ce acest lucru Unul citeşte un rând al cărui scop e să spună cine e proprietarul. Telnyx soseşte atât ca server telefonic cât şi ca purtător. Ca un server telefon este Primul sincer despre a nu fi un PBX: nici un mesaj vocal, nici dispozitive, nici cozi, nu Agent spune că fiecare dintre aceste steaguri false poartă acum o sentinţă un membru poate citi, deoarece o capacitate care este fals, fără nici un motiv scris face ca o Ecran gol. Aceasta este ceea ce capacitateaLimit și telefon Capability sunt pentru; SMS a avut acest tratament deoarece smsNedisponibilReason(), și restul Acum şi suprafaţa o are. Credința sa softphone este bătut cu propria ORG API cheie, astfel încât spre deosebire de RingCentral nimeni nu trebuie să la bord fiecare membru într-un transportator Portalul. Două lucruri care merită cunoscute: - OrgPhoneNumberService ia telefonProviderFactory @Lazy. Ciclul este real și legitim, și Spring Boot a interzis referințe circulare în mod implicit, deoarece 2.6 În lipsa acestuia, contextul nu începe, iar aici niciun test al unităţii nu ar prinde Asta, pentru că toţi îşi trimit doctorii manual. - Un org text-doar (numere și un transportator, nici un server telefon) poate trimite, dar nu poate file un răspuns: VOIP CONVERSATIONS.INSTANCE ID nu este NULL și o parte din index dedupe. Această picătură este acum o ERROR numeste numarul în loc de un avertisment. DDL-ul ORG PHONE NUMBER este aplicat de mână. IniţializatorService nu este desfăşurat în acest grup.

  14. · kamo-shared-library

    Telnyx, primul furnizor care este atât un server telefonic cât și un transportator

    Telnyx vinde trunchiuri SIP, DIDS și mesagerie, și o organizație poate cumpăra cele Jumatate independent. Cazul acesta este pentru: DID și texte cumpărate de la Telnyx, cu apelurile primite de la FreePBX. Să-l transformi într-unul. Intrarea le-ar forţa pe acestea să fie aceeaşi decizie, aşa că TELLYX este anexat la ambele VoipProviderType și BulkTextProviderType. Ambele enume sunt EnumType.ORDINAL, deci ambele anexe sunt la final. Textul în vrac Aveam acea proprietate documentată în javadocul său şi pusă în aplicare de nimic. are același test ordinal enum telefonului, a afirmat în cazul în care cineva adaugă un furnizorul este deja făcut să se oprească și să gândească. Facturi Telnyx Third PARTY: org deține propriul cont Telnyx și plătește Telnyx Pe minut și pe mesaj, deci ceea ce face Kamo este integrarea. An linia nealocată Telnyx nu costă nimic, ceea ce este corect. Cu care nu facem nimic. Nici o versiune cucui. 17 servicii pin 1,6.0 și fiecare serviciu Dockerfile reconstruiește această bibliotecă de la principal, astfel încât un cucui ar lăsa toate acestea rezolvarea o versiune care nu există nicăieri. Suplimente recente la tipuri / expediate în același mod.

  15. · kamo-internal

    Raftul înlocuiește cărțile per-app și patru seturi pe rândurile sale

    Launchpad a fost un perete de o carte pe aplicație. Perioada de valabilitate a aplicației enumeră fiecare dintre aceste aplicații într-un singur geam, cu ceea ce face fiecare și totul în interiorul acestuia, astfel încât grila de gresie spunea aceleasi nume de doua ori. Cărţile au dispărut. stânga pe raftul de lansare este raftul, widget-uri și note fixate de membru. Re-pinning o aplicație nepinned mutat cu ei Iar broşa raftului e acum. HomeCardPinControl și aplicațiePanes a mers cu cărți;fore TOOL KEYS a fost singurul lucru din aplicație care le-a supraviețuit și acum Sta in navRegistry, pe langa optiunile descrise. Patru fixaţii pe raft în sine: - Chevronul vine înainte de ac, astfel încât fiecare ac stă pe aceeași linie verticală dacă rândul său se deschide sau nu pe orice. Verificat la 8 rânduri, un x. - Jumătatea deschisă creşte acum: este un flex de rând, deci axa sa principală este lățimea și întinde doar a atins vreodată înălțimea sa oprit scurt de coloana au fost date. - Un buton Open App singuratic este centrat pe ambele axe, și dimensiuni la eticheta sa mai degrabă decât întins pe panou. Lista de 8px plumb-in este scăzut cu ea, sau 8px de compensare unilaterală împiedică centrul să fie centrat. - Butonul citeşte acum "Deschide aplicaţia.".

  16. · BillingService

    Taxa de pornire a unui plan, și oferta live, pe fir

    PlanDto transporta doar rata recurentă, astfel încât fiecare suprafață citând un plan a citat un preț client nu ar fi taxate: taxa de pornire KamoCRM este $99 un loc, care este $495 pe o 5 locuri comanda Starter înainte ca o lună să fie facturată. Pagina de prețuri publice a avut întotdeauna a arătat-o; suprafeţele în aplicaţie nu aveau cum. Încărcătura utilă a planului poartă, de asemenea, oferta care rulează pe piață, rezolvată de aceeași Predicate care de fapt reduceri un ordin. O pagină care citează prețul listei lângă un live 33%-off promovarea este greșită în disfavour clientului și unul citând discount după ce cade este greșit în a noastră .

  17. · kamo-internal

    Ață de raport în sertar, rafturi, și Problema Persists

    statusul prin care a trecut, sub apelul de stare curentă: răspunsurile apelului "de ce este aici acum," care este ceea ce majoritatea cititorilor venit pentru, și transcrierea răspunsuri "cum a ajuns aici," care este ceea ce are nevoie a patra încercare la o fix. Se citeşte ******************* şi nu criteriile de evaluare ale sesiunii de presă toate celelalte transcrieri folosite în consolă. Cei autorizaţi de membrii sesiunii; un fir de bug este lizibil de toată lumea raportul este vizibil pentru, care este un departe set mai larg decât oamenii care au postat pe ea. Un dialog colectează acum comentariul pentru toate cele trei statute care poartă unul. Ei... diferă în formulare și în cazul în care câmpul poate fi lăsat gol, și ambele sunt citite în afara statutului Nu. Titlul urmează exemplul: o negare explică o decizie, un raft explică o întârziere, și un raport fix eșuat ceea ce este încă rupt, și poziția toate Trei motive pentru negare l-au făcut pe ultimul să-şi ceară scuze. Problema Persists este propriul buton lângă Fix Verificat și propriul său obiectiv, tras de la Publicul este mai larg decât Fix Verified's și statutul său de plecare sunt diferite, astfel încât un client Invocând-o de la Colega pentru care există. Acesta este dezactivat în scădere triaj pentru același motiv: Redeschiderea unui raport ar sări peste motivul pentru care există statut. o textarea pe aceeași pagină și vine pe primul loc în ordinea documentelor, și nu spune două în afară, deoarece sertarul poartă acest rol prea. Un necunoscut Lookup tastat motivul de negare în caseta de comentarii și a trimis negarea gol.

  18. · EmailService

    Variabilele de previzualizare pentru SYSTEM BUG COMMENT

    Fără ele editorul șablonului redă noua literă cu găuri în care numărul raportului, expeditorul și butonul merg, care citește ca un șablon rupt Mai degrabă decât ca o previzualizare lipsă. Nici un organism de comentariu printre ei, în mod deliberat: scrisoarea nu citează unul. A firul raportului este lizibil de toată lumea raportul este vizibil pentru, dar această scrisoare este adresată unei persoane și transmite mai departe ca orice altă scrisoare.

  19. · InitializerService

    System bug.media session guid și indexul de căutare

    Articolul 4 alineatul (1) litera (a) punctul (ii) din CRR ******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** în sine se găsește o coloană de șir de 36 de caractere și o neconcordanță de tip pentru unire la timp de interogare de către oricine este ghinion. Nulable, și nu backfill. Înființarea unei sesiuni per raport existent înseamnă scrierea a patru tabele în ordinea corectă cu guide dreapta, care aparține în serviciul care deja stie cum Un nul Aici înseamnă "nu s-a deschis încă," nu o eroare.

  20. · SecurityService

    Trimite la AI spune tuturor pe fir, nu doar reporterului

    Dispeceratul trimite aceeaşi scrisoare pe care o face MediaService, aşa că publicul trebuie să se mute. în același mod: fiecare participant în firul raportului minus oricine a acționat, fiecare cu propriul lor salut şi propriul lor fus orar, mai degrabă decât reporterul singur. Mersul pe jos participant este duplicat aici mai degrabă decât împărtășit, și duplicarea este In mod deliberat acest serviciu nu are nici un client MediaService, si adaugand unul astfel o expediere poate adresa un e-mail ar pune un apel HTTP pe calea scrierii statutului. ă Regula se repetă este de două linii, și ambele părți trec prin aceeași .

  21. · MediaService

    Firul din spatele unui raport, și cele două statute care au nevoie de unul

    evenimente scrise în ea cu motivul pentru care autorul lor a dat, comentarii oricine care se poate vedea raportul poate pleca, răspunsuri, reacții și per-membru mut. Fiecare punct de intrare este SystemBugController, niciodată MediaController. Asta nu este ordine firul este lizibil de toată lumea raportul este vizibil pentru, care este un set mult mai larg decât oamenii care au postat pe ea. Calitatea de membru aici înseamnă "a luat parte" și există pentru a decide cui este scris. Rutarea firul prin propriul bug Regula vizibilităţii ţine acea regulă în singurul loc care o deţine. Firele sunt create leneşe şi însămânţate, nu umplute. Au existat rapoarte înainte fire a făcut, așa că "media session guid" este nulă și "Thread" umple pe primul punct de contact și mutarea oricărui Eliberează coloana. Fără această însămânţare, înlocuind coloana cu un fir ar fi aruncat în tăcere o propoziție pe raport vechiul design a făcut Reuseste sa o pastrezi. doar pentru că este calea fierbinte. care nu se îngustează de către vizualizator: oricine poate vedea poate spune un fix eșuat, Pentru că persoana care intră într-un fix rupt nu este foarte des persoana care Am completat raportul. Acesta se îngustează de către STATUS în loc de un raport care nu a pretins a fi Nu are nimic de contrazis. E-mailul de stare planifică acum o literă pentru fiecare participant. publicul ca parametru astfel încât regula rămâne testabilă fără context de primăvară și comentarii libere plimbare ChatEmailNoticeService lui registru existent sub lor tasta șablon propriu .

  22. · kamo-shared-library

    Shelving, remedieri eșuate, și istoria întregului comentariu al unui raport

    Un raport a ţinut exact o propoziţie. fiecare mutare ulterioară a statutului, astfel încât un bug care a fost refuzat, explicat, redeschis, fix și găsit încă rupt încheiat cu un motiv din patru și nici o modalitate de a citi Odihneşte-te. Fix-ul evident este un tabel Masa aceea. apoi trebuie să crească filetare, editare istorie, reacții, atașamente, per-membru mut și starea necitită fiecare bilet de sprijin au deja. Deci, un raport devine o MediaSesssion loc, sub un nou tip SYSTEM BUG sunt scrise ca mesaje de sistem care poartă motivul pentru care autorul lor a dat, comentarii ca pe cele obişnuite. Două statute vin cu ea. SHELVED este parcat-nu-retras, care ar putea nu spun că unul este o poziție coadă și celălalt este o decizie, și un reporter a spus "am decis să nu" despre locul de muncă care este doar așteptare opri depunerea rapoartelor. ECHIPA PERSISTES este contragreutatea sa: o fixare expediată care nu deține. Ambele necesită un motiv; o negare în mod deliberat încă nu, pentru că forțând o singură acolo învaţă oamenii să tasteze o oprire completă. Calitatea de membru pe un fir de bug nu înseamnă ceea ce înseamnă pe un chat. Firul este se poate citi de către toată lumea raportul este vizibil pentru; "a luat parte," și să decidă cine este trimis prin e-mail și cine a schimbat. De aceea nimic Aici este servit prin MediaController, a cărui regulă de acces este calitatea de membru. Publicul scrisorii de stare urmează: fiecare participant minus actorul, mai degrabă decât reporterul singur. Vechiul "reporter l-a mutat, deci nu trimite nimic" ar fi făcut Problema Persiştii să nu anunţe pe nimeni. fix care tocmai a eșuat.

  23. · kamo-internal

    Un document contur, și un schelet în propria formă a paginii

    Numai eroul a fost un adevărat titlu. Orice altceva panourile de cont, legamantul, fiecare optiune de upgrade a fost un div stil, deci un cititor de ecrane utilizator a avut un reper pe cea mai lungă pagină în zona de setări și nici o modalitate de a muta între categorii. Acestea sunt h2 și h3 acum, și registrul urmează modelul de acordeon ARIA cu titlul înfăşurat: cuibărit în cealaltă parte a categoriei este anunţat ca parte a controlul și nu mai fi undeva puteți sari la. Statul de încărcare a fost un spinner centrat, care este instrumentul greșit aici. O cerere umple tot ecranul, astfel încât spinnerul așezat în mijlocul de nimic și aspectul terminat apoi a sosit imediat şi a schimbat totul sub cititor. Scheletul detine real proportii panouri de lângă ea Nu are nici o mişcare proprie. dincolo de valul MUI; pagina are exact o animație deliberată și nu ar trebui să Concurează cu ceea ce a fost pe ecran un moment mai devreme. Testele pun conturul şi acordeonul în cuib, plus două lucruri pe care registrul le face bine şi ar opri în tăcere obtinerea dreapta: catalogului "100.0000" redat ca 100, și a caracteristica boolean nu a descris ca nelimitat.

  24. · kamo-internal

    Desenează zeul conduce serverul acum deține

    Users tab blocat fiecare rând de Dumnezeu pentru toată lumea, și ambele jumătăți au fost greșite. Prea slăbit, pentru că încuietoarea a trăit doar în această componentă, obiectivele din spatele a răspuns la un apel direct de la oricine deține manageri. Prea strâns, pentru că De asemenea, a blocat singurul apelant care avea dreptul la editare. GodAccountGuard este autoritate acum, și sertarul citește apelerIsGod din același răspuns ca Rând: blocat pentru oricine altcineva, trăiesc pentru un egal, și a spus cu voce tare în Ton de avertizare atunci când este viu, pentru că un rând zeu editabil arată obișnuit. Steagul sintetic a fost singurul control care a rămas viu pe un rând de Dumnezeu, și este cel mai greu de pe ecran Acesta Se îndreaptă spre aceeaşi poartă ca şi restul. Nepersonat este retras pe o țintă a lui Dumnezeu. Serverul refuză pe ambele uși, și un buton care este oferit și apoi refuză citește mai degrabă ca o greșeală decât ca Regula este. contIsGod urcă din profil în modul membruType Deja face, iar serverul spune doar un cititor-Dumnezeu eligibil.

  25. · SecurityService

    Doar un zeu poate administra un zeu, şi nici un zeu nu se poate preface

    Managerii au ajuns la identitatea de sticlă spartă. UserAdminController păzit Numai Utilizatorul Sistemului, astfel încât un titular non-zeu ar putea dezactiva un cont de Dumnezeu și să-și revoce sesiunile live, să-și rescrie identificatorii de sign-in, să-i semnaleze sintetic; sau mail o resetare parola pentru ea care altfel ar anula-o. Consola a atras deja rândul ca de neatins și a spus acest lucru într-un comentariu; nimic din spatele ecranului a fost de acord. GodAccountGuard aplică regula peerage PlatformAdministratorController deja a avut loc peste o platformă a lui Dumnezeu drepturi la contul aceste drepturi atârnă pe. Contul a fost cel mai slab dintre cele două uși: luând parola cuiva este o Super set de a lua drepturile lor. Păzeşte toate cele cinci căi şi UserAccountEditPolicy's PLATFORM ADMIN braț, care este același drept celuilalt suprafață criteriile finale. Citirile rămân deschise, astfel încât consola poate explica refuzul. Ţinta eşuează închisă şi apelantul eşuează deschis, în mod deliberat: un rând care nu poate fi citit este Dumnezeu, un rând care nu există nu este, și un apelant care nu poate fi rezolvată. Numai vreodată ridicarea unei restricții este ceea ce decide Încotro merge fiecare parte. Ipersonalizarea devine aceeași țintă refuzată, fără nici un egal. ă Întotdeauna a refuzat un zeu. aceeasi usa din spatele paginii de setari nu a facut-o niciodata, ceea ce a facut-o mai ieftina dintre cele două moduri în. Să te dai drept un zeu, să-i dai ultimul telefon. cale de întoarcere în, astfel încât să nu admite nici o excepție nici măcar pentru un alt zeu. Raspunsurile transporta acum apelantIsGod, iar sarcina utila membru poarta contIsGod pentru un cititor autorizat de Dumnezeu. Fără ele, consola trebuie să blocheze fiecare rând al lui Dumnezeu. pentru toată lumea, inclusiv pentru singurul apelant care are dreptul la editare.

  26. · kamo-internal

    Personalul poate scrie propoziţia pe care o citeşte clientul

    Nota de client-vizibil a avut o coloană, un câmp DTO și o pagină de plan gata să-l facă, și nici o cale pentru cineva să-l setați pentru că a fost însămânţată cu mâna. Este o a doua cutie mai degrabă decât un "arată acest lucru clientului" comuta pe nota internă. Un comutator invită refolosirea unei fraze scrise pentru colegi, iar nota internă este unde personalul înregistrează ceea ce a fost admis și cui; poate rămâne sincer doar dacă publică ceva este un act separat de scriere. Gol rămâne răspunsul normal nota încă redă în întregime din termenii săi structurate. Ambele note sunt acum etichetate în listă, deoarece diferența dintre ele este întregul punctul și un al doilea paragraf neetichetat se referă mai mult la primul.

  27. · kamo-internal

    Softphone-ul primeşte o casetă, şi o fereastră SMS este un fir

    Fereastra s-a deschis pe un dialpad de 12 taste şi apoi a devenit un tri-tab fereastra -- Chat / Templates / CRM -- intitulat "Conversation #a3f1c8de-..." Niciunul dintre Acesta este modul în care cineva folosește mesaje text, și două dintre cele trei file nu au fost reale: SmsCrmTab a fost DUMMY CONTACT și DUMMY ACTIVITATE ("John Smith, Acme Corp," hardcoded, arătat fiecărui membru despre fiecare client) în timp ce un revers autentic Lookup a existat deja în SoftphoneCRM, și SmsTemplatesTab citit un cinci-post constant în timp ce SmsTemplateController VOIPservice a mers nenumit de nimic. Nu a fost, de asemenea, nicăieri pentru a vedea textele: fereastra a arătat o conversație și nu a putut ajunge la altul, astfel încât singurele rute spre un fir au fost o intrare notificare popping o fereastră la tine, sau Centrul de interacţiune. Fereastra - Două state, fără file: un culegător destinatar sau un fir. Șabloane mutate la butonul de blocare al compozitorului pe API real; detalii de contact pentru informațiile antetului Tablou de redare SoftphoneCRM. SmsCrmTab, SmsTemplatesTab, smsTemplateData și SmsNewConversation se elimină. - Compusul este primit-primul şi nu are nici un mesaj. Aceasta este ceea ce face seif caz de închidere și concentrare: o fereastră care se închide în favoarea unuia deja deschis Se închide gol prin construcție, așa că "o fereastră instrument nu trebuie să piardă ceea ce un membru tastat" deține fără nici o manipulare atentă. - Pana de contact swap-uri cu l-ar distruge pe compozitor de fiecare dată când cineva s-ar uita la el. eșecul barei de file vechi a continuat să producă. O conversaţie, o fereastră Magazinul de scule s-a dezmembrat mereu pe recuzită. conversațieId - ne-minimize, Ridică, străluceşte. Nu a putut vedea o fereastră de SMS deschisă de numărul de telefon, deoarece SmsTool a rezolvat ID-ul în statul local şi nu a spus niciodată magazinului, aşa că deschiderea Conversaţia din altă parte a construit o a doua fereastră deasupra primei. SmsTool patch-uri acum ID-ul pe propriile sale recuzite (ca ChatTool nu pentru sale SessionGuid) și titluri fereastra cu contactul. Culegerea unui destinatar stabilește trei moduri: crea aici, adopta aici, sau ridica fereastra care are Şi închide asta. Softphone A cincea filă de TEXTS insignată, compusă din ceea ce a existat deja pentru Centrul de Interacţiuni -- utilizaţi găleata de text ConversaţiiRows, ConversaţiaRow, necititForRow, openConversation -- plus căutare și un buton nou-mesaj. ă insigna citește UnreadContext.bySurface.sms, deja trăiesc peste priza, așa că nu costă nimic. Nume de contact ConversationRow a recunoscut "nu există nici un server-side de căutare inversă dintr-un număr unui nume de contact, astfel încât un rând text este intitulat de numărul său." Nou *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** contacte prin telefon canonic, în browser, deoarece destinatarul de căutare sarcini Ei oricum. Un index re-titlează antetul, lista TEXTS și navigatorul. De asemenea, fix: SmsNotificareAscultător ştampilat fiecare cadru de priză INBOUND şi a ignorat direcţia în care s-a desfăşurat întotdeauna evenimentul, aşa că un membru a plecat textul a fost redat ca fiind al clientului și a ridicat o fereastră la ei pentru Ceva ce tocmai au făcut. Fereastra poartă acum întreaga suprafaţă de texting pe GET /sms / Capability în loc de a lăsa o echipă sau FreePBX org descoperi de apăsarea trimite în tăcere, și o trimitere refuzată arată propria sentință furnizorului cu mesajul marcat Nu este livrat. Necesită angajamentul voipservice care adaugă /sms / Capability și rezultatul trimite.

  28. · kamo-internal

    Un plan gratuit pilula, și o pagină la /miplanul din spatele ambelor pastile

    Pastila de încercare a trăit de două ori poartă de tip membru și stil copiat între ele. Ambele poartă pe un proces viu, astfel încât o Nici o pastila, nici o explicatie, nici o explicatie. să semneze că produsul a devenit mai mic. Şi nici o pastilă nu a plecat nicăieri, aşa că un membru care Am înţeles că numărătoarea inversă nu va avea următorul pas. Acum, ambele state sunt definite o dată, în PlanPill, care păstrează cele două forme ale șinei și Launchpad e al treilea în timp ce decide ce înseamnă într-un singur loc. Arată fiecărui membru al echipei și LINKS numai pentru cineva care poate acționa pe planul; pentru toți ceilalți vârful de instrument este întreaga caracteristică, motiv pentru care fiecare stat are un nume doar-citit gemene care să ceară în schimb. /miplanul răspunde în cazul în care organizația se află, cât timp are, ce poate folosi, ce o un plan mai mare adaugă și termenii pe care i-a negociat. Trei lucruri care merită păstrate: Termenul de cale ferată este eroul, și este un dispozitiv cu trei sensuri termenul limită, un plan plătit care trece prin perioada de facturare, un proces expirat la sfârșitul acestuia. Acesta este prevăzut la adevărata lățime și animat cu un keyframe mai degrabă decât de stat, astfel încât script lent sau o hidratare eșuată încă arată figura reală în loc de un bar gol. Registrul imprimă valori, nu căpuşe. Catalogul poartă numerele reale două conducte, 4 GB un scaun, nelimitat Excludet rândurile rămân, se lasă și se sortează mai jos: ele sunt argumentul pentru modernizare și ascunderea lor ar face ca planul liber să pară complet. Upgrade-urile sunt o diferență, nu o grilă de preț. Cititorul are deja un plan; întrebarea lor este ceea ce primesc şi nu au. Comandat prin pret luminarea este echivalentă și nu este, deoarece un plan mai mare care se suprapune poate adăuga mai puțin. Cumpărarea încă se întâmplă în BillingConsole, în care acest adânc-legături în de sub-tab. Reconstrucție Checkout aici ar fi o a doua implementare a unui lucru care nu trebuie să aibă două. Paleta urmeaza conventia casei o excepţie: culorile de stat sunt fixate, deoarece o organizaţie a cărei marcă este chihlimbar altfel ar purta o insignă de probă în culoarea sa plătită, și singurul lucru pe care această pagină există ar fi ceea ce nu se poate spune.

  29. · BillingService

    Un obiectiv din spatele paginii propriului plan al clientului

    GET /api / facturare / sine / plan raspunsuri totul / planul meu redă: planul, ceea ce organizarea poate folosi, de fapt, catalogul pentru a compara cu, scaune și lista lor, depozitare, reînnoire și orice acord negociat. O cerere mai degrabă decât șase, pentru un motiv dincolo de statele de încărcare: nivelul de acces nu poate fi sincer decis în browser. Decide acolo înseamnă listarea Contului membrii, precum și un membru le pot lista numai dacă dețin deja accesul fiind decis. Deci se decide aici, de două ori poarta clientului decide ce OFERTA, acest lucru decide ce ar putea fi citeste si un apelant self PAY primeste o sarcina utila lista scaunului, totaluri de organizare si Acordul nu a fost niciodată pus în. Reținerea bate ascunde: cineva citește fila de rețea a o pagină pe care li se permite să o deschidă ar trebui să afle nimic din ce nu li se permite să li se spună. Procesul este capcana care merită numită. Un abonament la proces stă pe plan cod = GRATUIT, deoarece TrialAdminService convertește rândul liber-default în vigoare, în timp ce bursa de servicii de drepturi întregul catalog nelimitat. Servirea propriilor rânduri de caracteristici ale planului în timpul unui proces ar spune unui client că nu au AI, e-semnături sau SSO în timp ce acestea sunt în mijlocul folosind toate cele trei în săptămâna ei decid dacă să cumpere. Deci, un raport de studiu activ Uniunea catalogului, astfel cum este inclusă. Un proces de PECHING în mod deliberat nu: ceasul său nu a început, și promitând altfel este o minciună produsul contrazice pe primul clic. Acordul este returnat derivat, nu transcris. Proza este clientVizibleNote și numai că; note interne nu părăsesc niciodată serviciul. Iar următorul loc costă un număr. de la SetupFees.forAdded Până la același cod care ridică taxa mai degrabă decât un teză care descrie regula, deoarece o propoziție este o a doua punere în aplicare care va În cele din urmă nu sunt de acord cu primul.

  30. · SecurityService

    Spune ce plan are o organizaţie şi cine o poate schimba

    Consola ar putea spune că un proces a fost difuzate și nimic altceva. rightSource is "TRIAL" sau nul, deci gratuit, expirate-proces, plătite și comped organizații au fost toate la fel valoare Explicație, și nici un semn că produsul a devenit mai mic. PlanMode denumeste statul si numele PlanAccessTier care pot actiona pe el. Ambele plimbare dreptul de încărcare utilă fiecare pagină deja încarcă, astfel încât pastilele care le citesc nu costa suplimentar cerere pe orice traseu Sursa drepturilor este în mod deliberat neatinsă. Are două valori astăzi şi este citit de două Site-uri de pastile plus, pre-autentificare, ***************care pictează ecranele de conectare și înregistrare; lărgirea acesteia ar schimba ceea ce toate cele trei înseamnă la O dată. Preceda este PAID > COMP > TRIAL SUBSTANŢĂ > TRIAL PENSII > TRIAL EXPIRID > GRATUIT Abonamente filtrate de regula comună esteLive DreptulModeRezolvator folosește, astfel încât cele două nu pot fi de acord cu privire la un cont PAST DUE în interiorul perioada de graţie. Este portantă: un rând GRATUIT DEFAULT este însămânțat la înscriere și nu este niciodată eliminat atunci când un plan este cumpărat, astfel încât "primul rând găsit" raportează gratuit pentru cele mai multe plăți clienţi. Nivelul este rezolvat aici mai degrabă decât în browser, deoarece browser-ul nu poate rezolva Sincer: a decide din rândurile de membru al contului înseamnă listarea membrilor, care deja cere ca accesul să fie decis. Un delegat se bazează doar pe un cont de finanțare Acest lucru organizaţie .

Universul tău te așteaptă.

Începeți gratuit în câteva minute.Adăugați produse oricând sunteți pregătit — fără migrare, fără autentificări noi.

Gratuit pentru totdeauna — nu este necesar un card de credit