Журнал изменений
Что нового.
Каждое усовершенствование платформы, как только она появится.
· kamo-internal
Расскажите людям, когда им нужен счет, и пусть они перестанут платить
Баннер на главной странице, когда платеж, за который несет ответственность это лицо, имеет Не удалось, ссылаясь прямо на их платежную страницу. До сих пор неудавшийся платеж Появились только приложения, которые больше не открывались — ограничение без объяснения причин. который читается как сломанное программное обеспечение, а не как неоплаченный счет. Воспитывается только для счета, по которым они могут действовать: их собственное место и группы, которыми они управляют. Это делает Ничего, когда ничего не должно. Отмена теперь видна там, где человек может видеть, кто платит: "Отмена автоматического «платежи» действуют на своем месте, а в тексте справки прямо говорится, что они Держите место до конца периода, за который они уже заплатили. The Подтверждение называет дату, потому что страх при нажатии этой кнопки заключается в том, что Доступ немедленно прекращается. Переключатель «Пусть плательщики сами выбирают свой план» исчез. План принадлежит организации и всех, кто платит внутри нее — индивидуально или в составе группы — Купить такой же план. Группа теперь заявляет план организации скорее чем предложить выборщику.
· BillingService
Один план на организацию, 25-местный потолок предприятия и способ перестать платить
План теперь является решением на уровне организации, и ничто другое не может его отменить. Позволить самостоятельному плательщику или менеджеру группы выбирать свои собственные чтения, как доброту и доброту. Это ошибка корректности: **************** Ответы "делает эта организация иметь это приложение" через OR-ing через каждую живую подписку, ориентированную на организацию, так что один человек на одном месте, выбрав более высокий план, включил приложения этого плана для всей организации. Пиннинг каждого плательщика плана организации делает это ИЛИ безвредный — все подписки называются одним и тем же планом, так что в зависимости от того, что выигрывает ответы Идентично. OrgPlanService читает план по той же подписке, что и Plans & Платежная консоль называет «ваш план», поэтому правило и экран не могут не согласиться. Предприятие должно иметь более 25 мест, отсчитанных по всей организации. Биллинговая группа. Подсчет плательщика сделал бы разделение на группы способом Купить пятьдесят мест двадцать пять одновременно. Редактирование исключает собственную подписку, поэтому Сокращение измеряется новым размером, а не старым. GET/self/alerts управляет баннером домашней страницы. Ограниченный доступ без объяснения причин Это худшая версия этого продукта — приложения перестают открываться, и никто не говорит, почему. Читатель – это тот, кто может это исправить. Только для законопроектов это Член несет ответственность за: свое место и группы, которыми он управляет. Рассказать кому-нибудь Карта их организации не удалась, когда они не могут заплатить, это шум. Как перестают читать баннеры POST/self/seat/cancel останавливает автоматическую оплату на купленном месте самих себя. Всегда в конце периода: они заплатили за текущий период, и Немедленная отмена отнимет этот доступ, ничего не возвращая, поскольку Этот путь не требует от Стрип прораций. Две ошибки в отмене () найдены при подключении: - Это был молчаливый запрет для КОМП и ТРИАЛ. Все тело находится позади StripeSubscriptionId нулевая проверка, поэтому выкупленная или пробная подписка возвращается 200 с строкой по-прежнему ACTIVE — звонящий сказал, что это сработало, когда ничего не изменилось. Теперь он отказывается и говорит, почему. Непосредственное = истинное остается опасным и намеренно не подвергается воздействию: оно устанавливается Затем CANCELED вызывает FallbackToFree, который устанавливает ACTIVE / FREE с расчётом сидений 1, так что 25-местная организация будет содержать одного работающего человека и сообщит 24, что их место было отрезано. Причина, по которой этого никогда не было. Право.fail-open установлено ложным здесь, чтобы соответствовать SecurityService, который служит /api/security/features - это то, что читает экран приложений и функций. Два сервиса Ответить на один и тот же вопрос о праве по-разному хуже, чем ответить на любой из них. Проверенный сейф: все шесть активных планов имеют явную строку для всех 21 услуг Так что ничего ранее предоставленного не отказывают.
· SecurityService
Эстафета уровня одобрения с ролью, урегулированной из прав
Роль определяется здесь, от прав абонента и их отношения к Субъект - никогда из органа запроса. Тело, которое может назвать свою роль Пусть кто-нибудь будет претендовать на зарплату. PAYROLL (широкий, правит в любом состоянии), затем MANAGER, затем EMPLOYEE для собственного рекорда. Быть сфотографированным менеджером субъекта рассчитывает на себя Линейный менеджер, одобряющий свой собственный отчет, является обычным делом и не должен Право должно быть общеорганизованным; право существует для всех, кто его рассматривает. IsManagerOf терпит неудачу: неразрешимая линия отчетности не является авторитетом.
· kamo-shared-library
APPROVE TIMECARD ADJUSTMENTS (197) и FINALIZE PAY PERIODS (198)
Разделить таким образом разделение обязанностей выразимо: тот, кто одобряет временную карту, не является автоматически тот, кто может закрыть период оплаты. MANAGE TIMECARDS (183) Остается модульный шлюз и намеренно ни того, ни другого. Зачисление по-прежнему не является правом — это постоянный факт трудоустройства. Право Протекает через четыре отгруженных поведения и исчезает из ТЕРМИНАЦИОННОГО члена Именно тогда HR должен выпустить свою окончательную карту времени. Умышленно отсутствующий в NEW RIGHT SEEDS: что несет Существующий грант Впереди, и у этих ворот не было возможности. Добавление правильного требует только Перезапуск службы безопасности - без пропуска KamoInitializer, без DDL. Идентификаторы прикреплены тестом, потому что идентификатор - это то, что хранит Member rights applied.
· kamo-shared-library
Машина официального утверждения
Работник представляет -> менеджер утверждает -> заработная плата закрывается, по решению владельца. Четыре правила, соблюдаемые в чистой таблице переходов и закрепленные 25 тестами: 1 Менеджер не может одобрить, пока работник не подаст заявку. Представление является собственное утверждение работника о том, что часы являются их полными; Одобрение без него не одобряет ничего из того, что засвидетельствовано. 2.Одобрение менеджера исключает сотрудника из дальнейших правок. 3. Менеджер может действовать от имени - представлять или утверждать - и это единственное Санкционированный маршрут, прошедший правило 1. Требуется письменная причина, и строка записывает как менеджера, который щелкнул, так и сотрудника. 4.Расчет заработной платы может редактироваться в любом штате, включая заблокированный, всегда с основанием. Поправки после закрытия являются обычными и требуются по закону; запрещение их Просто выводит редактирование из следа аудита. Разделение обязанностей живет в таблице переходов, а не в названии ролей: никто Одобряет собственную карту времени, и менеджер тоже является чьим-то сотрудником. Неодобрительные каскады от PAYROLL LOCKED до SUBMITTED Отзыв разрешения аннулирует замок, построенный на нем. Одобрения распространяются на диапазон дат, поэтому одобрение в середине периода выживает позже. редактировать за пределами его объема, а не молча покрывать работу, которую он никогда не видел.
· kamo-internal
Вкладка Timecard и вкладка настроек HRS Timecards
Вкладка участника - это только самообслуживание и закрыта для идентификации, точно так же, как и юридическое соответствие: его конечные точки не принимают идентификатор участника вообще, поэтому он структурно Невозможность показать чужие часы. CheckRight здесь неприменим. Возвращается верно для всего в режиме бога, и страница сама по себе CanViewOtherMemberУчетные записи в несвязанных правах, включая **************************** HR, достигающий карты времени конкретного человека другая поверхность при посещении /hr/, приписываемая HR-актеру. Размещенный перед составлением планов, так что он остается в левой группе вкладок - что угодно после Он наследует ту вкладку, что выравнивает правильный мл: 'auto'. Страница HRS получает свою первую реальную вкладку рядом с ComingSoonTab. SETTINGS MENU в качестве теста покрытия требуется в обоих направлениях. Оба планшета На каждом из них есть свой путь, свой путь, свой путь, свой путь. Поставка ноль.
· kamo-internal
/hr/attendance roster and the NavTop clock control
Заменяет корпус HrTabPlaceholder. Маршрут, вход HR TABS, MANAGE TIMECARDS Ключи i18n уже существовали; здесь ничего не регистрируется. Часы реестра выводятся на стороне сервера из неизменного журнала ударов на каждом прочтении. Вместо того, чтобы храниться в виде бегущего целого, поэтому исправленный удар показывает сразу и Ошибка производит неправильное число один раз вместо того, чтобы составлять. Управление часами фиксировано рядом с Legal & Compliance, а не NAV REGISTRY. запись: реестр не может выразить позицию между двумя фиксированными элементами управления, его BadgeKey - это мертвый код, и каждая запись в реестре перетаскивается и не поддается восстановлению. Часы соответствия не должны быть чем-то, что кто-то может скрыть от себя. Это врата на ПЕРСИВНОЙ регистрации, никогда не проверить право, которое возвращается истинно для Все права в режиме бога и показывали бы часы в каждой организации оператора. Посещал. TimecardControlApplies разделяется контролем и его опросами. Идите тихо вместе - две копии этого дрейфа предикатов, и режим отказа Скрытая кнопка, которая работает вечно. Часовое состояние – это ЧЕТВЕРТЫЙ независимый сигнал: отсутствие присутствия (пульс 60-х, 300-е годы). TTL), и недоступность status, который автоматически устанавливается на выход из системы и ворота Руководитель и поддержка маршрутизации. Пока только опрос с этажом 60-х. Эстафета STOMP приземляется вместе с MediaService изменение; ядро NATS непотоковое и потеряно, поэтому семя REST в любом случае обязательно.
· kamo-shared-library
Доступ к базе данных-часам в punch-хранилище
Каждый момент удара исходит от DB, а не от JVM: стручки перезапускают и узел Часы перекошены, и запись заработной платы, порядок которой зависит от того, какая подушка ответила Не рекорд. SQL-стандарт CAST, потому что:: литье бесшумно изуродовано - Hibernate читается как префикс с поименованным параметром и превращается теперь()::timestamp в :timestamp.
· kamo-internal
BFF маршрут для /api/security/timecards
TimecardService - это ClusterIP без входа, поэтому без этого маршрута Функция 404 в браузере, в то время как каждая услуга полезна и каждая сборка Зеленый — точный провал, который уже дважды случался на этой платформе. Никакого разрешения здесь нет, намеренно: этот слой транспортный, и полупроверка Это вызовет убеждение, что это контроль. forwardToApi владеет строкой запросов. 204 возвращается как 204, а не проходит через .json(), который бросает.
· SecurityService
Ретрансляция службы безопасности в службу Timecard
Граница авторизации. TimecardService содержит данные и двигатель, но не Сессия; это проводит сессию и решает, кто может что делать, а затем передает. The Двигатель никогда не может быть достигнут без прохождения через него. Служба безопасности запускает любой запрос (.permitAll) с ручной рулонной перманентной ручкой, Таким образом, каждый метод открывается охранником, который возвращает ненулевой отказ. Самообслуживание конечные точки не принимают идентификатор участника вообще - участник приходит с сессии, делая Они структурно неспособны действовать на кого-то другого. HR конечные точки Gate on MANAGE TIMECARDS (183). Зачисление отвечает из сохраняющегося ряда занятости, а не справа, поэтому Бого-режимный оператор не появляется в каждой организации, на которую он смотрит. SUDO MEMBER ID переносится через: isSelf() вверх по течению относится к имперсонифицированным сеанс в качестве целевого участника, поэтому без него удар имитатора был бы Записано как личное дело работника. Timecard.service.url устанавливается в конфигмапе. Commission.service.url Он нигде не установлен, и производство зависит от буквального языка Java, который является сервисом. Переименование будет прерываться во время выполнения без каких-либо конфигураций для поиска.
· kamo-shared-library
Рабочий день, этап 2 трубопровода
Разрешенные интервалы становятся за бизнес-дату секундами, готовыми к выделению. Интервал SPLIT на каждой границе рабочего дня, которую он пересекает: смена 22:00-06:00 В полночь рабочий день составляет 2 часа на одну дату и 6 на следующую. приписывать весь отрезок времени до даты его начала делает ежедневные сверхурочные и правило седьмого дня Неправильно для ночных работников. Это намеренно отличающаяся атрибуция от бизнес-даты, сохраняющейся на удар. Удар имеет одну дату - для оценки еды / отдыха, исключение Очередь и то, что сотрудник видит в качестве своей смены - при подсчете сверхурочных потребностей Часы, распределенные по рабочим дням и рабочим неделям, в которые они фактически попали. Оба Они правы, и то, и другое необходимо, и смешение их является ловушкой. Сдвиг, пересекающий границу рабочей недели, также способствует двум неделям. Сверхурочная сумма; считать все это в одном из них неправильно для обоих. Накопляется в считанные секунды. Тесты охватывают оба перехода DST, 50 часов Промежуток и удары сквозные через выделение на калифорнийскую неделю.
· InitializerService
Регистрация KI и схема миграции
Таблицы приходят из ddl-auto; этот бегун поставляет только то, что Hibernate не может - частичные уникальные индексы на одну открытую первичную уступку и одну открытую ставку вознаграждения; Окно, и REVOKE, что является базой данных только половина приложения. @Order(0) так что он приземляется перед любым более поздним бегуном JPA SELECT, с 40001 повторением потому что Yugabyte делает онлайн-схему изменения и заявление, выпущенное во время ddl-auto И все же он проигрывает гонку. Регистрация com.kamo.z.shared.hr.timecard в @EnableJpaRepositories является явным массивом, в то время как @EntityScan является wildcard и опускает пакет прерывает контекст, поэтому ни один бегун не бежит, пока сборка все еще сообщает об успехе.
· kamo-shared-library
Границы рабочей недели и рабочего дня
Рабочая неделя - это овертайм FLSA - фиксированный, регулярно повторяющийся 168-часовой рабочий день. Срок – это не срок оплаты. Двухнедельный период длится ровно два рабочие недели; полумесячный или месячный период всегда имеет дробные, поэтому вычисление овертайма на период суммарно как недоплачивают, так и переплачивают и Нефиксируемые, когда периоды экспортируются. Граница рабочего дня проводится отдельно и не обязательно в полночь. А. Старт в 06:00 - это стандартное исправление для ночного персонала: он поддерживает смену с 22:00 до 06:00. Один рабочий день вместо того, чтобы разделить его на два полудня. Ежедневная сверхурочная работа и правило седьмого дня работают для них вообще. Границы - это настенные часы, разрешенные через ZonedDateTime, поэтому 06:00 остается 06:00 в 23- или 25-часовой день. Тесты закрепляют оба перехода и закрепляют тот Мгновение - это другая дата в Лос-Анджелесе и Калькутте - вот почему Зона записи сохраняется на ударе, а не выводится позже.
· kamo-shared-library
Разрешение интервала, этап 1 расчетного трубопровода
Удары становятся разрешенными пролетами. Чистые, полные и более ценные типы, а не Таким образом, каждая стадия является проверяемой без контекста настойчивости. Длительность происходит от Duration.between на мгновения, никогда не вычитание настенных часов. Вот и вся история DST и тесты закрепляют ее: смена 22:00-06:00 Семь. Часы в пружине и девять в осеннем отставании. Вычитание настенных часов вычисляет 8 для обоих — один недоплачивает, один переплачивает, и в ежедневной сверхурочной работе 9-часовая ночь молча теряет свой сверхурочный час. Все несправедливое возвращается как неразрешенное, а не угаданное. Незакрытый Сдвиг — это исключение: оставляя его открытым, начисляется абсурдные часы, автоматически закрываясь на некоторое время. Запланированные отчеты о конце, и фиксированная кепка изобретает число, которое никто не видел. Он никогда не должен заканчиваться как ноль, который ничего не платит за день, который был отработан. Питание прокалывается, никогда не вычитается автоматически. Трансфер закрывает один пролет и открывает следующий без окончания смены, поэтому время приема пищи и право на смену длины Продолжайте движение в середине смены между центрами затрат.
· kamo-shared-library
Непирамидирующий распределитель сверхурочных с предустановленной юрисдикцией
Правила - это DATA на форме RequirementRule, которая уже используется в этой библиотеке. Ветви кода, поэтому Калифорния — это строка конфигурации вместо перезаписи. Порядок распределения грузоподъемности: ежедневные правила с самым высоким порогом (13 часов) День CA составляет 1 час в 2 раза и 4 часа в 1,5 раза, а не 5 часов в 1,5 раза, затем седьмой последовательный день, затем еженедельная NET часов уже с ежедневной премией. Этот последний шаг предотвращает пирамидирование, и это единственный наивный двигатель. опустить. Пять 10-часовых дней в Калифорнии - это 10 премиальных часов, а не 20 - наивный Двигатель платит ежедневно и еженедельно в течение тех же десяти часов, и каждое индивидуальное правило Тест проходит, пока это происходит. Попечитель также утверждает часовую охрану на Выйти и бросить вместо того, чтобы вернуть неправильную зарплату. Пресеты: FLSA Federal, California, Alaska, Nevada, Colorado.
· kamo-internal
Доставить часовую зону Org в браузер
Модель организации-клиента не имела поля часового пояса, использования Formatters и next-intl. Они оба настроены без TimeZone, а бэкэнд-звонок TimezoneService 404'd - Таким образом, каждая метка времени отображается в зоне браузера и сервера во время SSR. Зеркала всех 27 значений TimezoneType, а не подмножество: частичная карта - это тихое полузеркало, где ненарисованная организация попадает в зону браузера с Нет сигнала. Карты GMT в Европу/Лондон, а не UTC - он наблюдает BST, так сливается Они смещают целые дневные часы на час в течение половины года. Зона орга является только резервным вариантом DISPLAY. Произведенная перепись показала, что все 13 организаций Нетронутый PACIFIC по умолчанию, в то время как члены охватывают PACIFIC/EASTERN/ARIZONA/UTC/ INDIA, поэтому вместо этого с рабочего места поступает зона записи с временной картой.
· SecurityService
****************************
timezoneService.ts называет эту конечную точку с момента ее написания и существования. В отсутствие Java-сервиса клиент проглотил 404 и решил перейти на UTC. Между тем UseFormatters и next-intl настроены без TimeZone, поэтому каждый Восстановление меток времени в зоне браузера - и *** обратная связь - строка GMT, который является Европой / Лондоном и наблюдает BST. Идентификация приходит только с сеанса: Служба безопасности работает разрешительно ручной рулон per-handler auth, так что обработчик, который считывает личность из запроса не имеет никакого контроля вообще. Регистрация com.kamo.z.shared.hr.timecard в @EnableJpaRepositories. Этот список явный массив, в то время как @ComponentScan / @EntityScan являются wildcard и опускают Пакет является документально подтвержденной причиной двух предыдущих развертываний CrashLooping.
· kamo-shared-library
WorkSite, якорь юрисдикции
Рабочий сайт, а не рабочее место: TeamMember.workLocation Office/remote enum и второй символ под этим именем столкнутся в каждом грепе. ZoneId - это бесплатная строка IANA, а не TimezoneType, потому что это число 27. Ценности не могут охватывать работодателя из нескольких штатов, и это НЕ НУЛЬНО, потому что это Только надежный слой зоны - каждая организация в производстве сидит на нетронутом Пацифический дефолт.
· kamo-shared-library
Изменения в области занятости и назначения с даты вступления в силу
Удары будут ссылаться на требование, а не на члена. Вот что делает параллельные позиции, 29 CFR 778.115 средневзвешенная регулярная ставка, многопрофильная юрисдикция и стоимость работы вообще выразимы. ManagerMemberId сфотографирован из TeamMember.manager во время доработки. Реорганизация не может переписать, кто что одобрил. Поиск реестра намеренно не построен на члене rights applied: этот запрос Это тип TeamMember, поэтому он опускает владельцев грантовых организаций и ничего не возвращает за УТВЕРЖДЕННЫЙ член, чьи прикладные права были лишены - именно лицо Который последний тайм-кард HR еще должен произвести.
· kamo-shared-library
Ставка заработной платы с датой вступления в силу и только с приложением
На этой платформе до этого предприятия не существовало никакой компенсации работникам. Требуется: сверхурочные рассчитываются по регулярной ставке FLSA, требуется CA ставка по декларации о заработной плате, а экспорт без ставок дает заработную плату Нечего потреблять. Повышение - это новый рост. Ставка, эффективная в течение экспортируемого периода, создает Ретро-регулировка, никогда молчаливое переписывание. Никогда не обнажается через /api/security/members/{id} - эта конечная точка не проверяется Таким образом, включение ставки в него приведет к утечке каждой зарплаты в компании.
· kamo-shared-library
Append-only punch log and audit event (недоступная ссылка)
Оба устройства обслуживаются интерфейсами NARROW Repository, а не JpaRepository: deleteAllInBatch. и объемный JPQL обходит обратные вызовы сущности, поэтому форма интерфейса - это то, что делает Реальный, а не консультативный. Мгновенная + IANA зона + дата бизнеса сохраняется, поэтому вычисляется продолжительность от моментов и DST является правильным бесплатно - 22:00-06:00 смена составляет 7 часов по весне вперед и 9 по осени назад, в то время как вычитание настенных часов Вычислить 8 для обоих. Updatable=false намеренно НЕ используется на замороженных столбцах удара: Hibernate Они будут молча опускать их из Обновления, а не терпеть неудачу.
· kamo-shared-library
Решитель временных зон
Официальный заказ рабочего сайта -> член -> организация -> UTC. Сайт выигрывает потому, что Правила оплаты труда следуют там, где работа выполнена. Произведенная на этой сессии производственная перепись выявила все 13 нетронутых организаций дефолт и 38 из 63 членов без часового пояса вообще, в то время как населенные Пацифик, Эстерн, Аризона, UTC и Индия — 13,5-часовой спред. Орг Поэтому дефолт не является полезным источником истины, поэтому WorkSite.zoneId Он не является полноценным и имеет вес. Возвращается к UTC, а не к строке *** GMT, которая называется Европа / Лондон. и соблюдает BST. Неразборчивая зона участка проходит, а не бросает: Отказ в разрешении зоны откажется от записи фактически отработанного времени.
· kamo-shared-library
Охранник отказа WORM
@Column (обновляемый = ложный) НЕ обеспечивает неизменность - Hibernate молча Опускает колонку из UPDATE, и устаревшая запись выглядит так, как будто это удалось. Единственный работающий охранник - это @PreUpdate, который бросает.
· kamo-shared-library
Domain enums и point-in-time версия
Все номера @Enumerated (STRING) на сайте вызова: ORDINAL испускает цифру диапазон CHECK, содержащий AND, который включается в список SchemaCleanupRunner Он сознательно пропускает и затем должен быть расширен рукой на каждую новую ценность. Решитель решает за окном, которое связывает момент, никогда Последний ряд, и держит закрытые окна в наборе кандидатов - закрытие суперсессии Каждое окно, кроме текущего, поэтому запрос с открытыми строками ничего не возвращает. любой исторический момент, нарушение ретро-платежа и реконструкция аудита. наклон Бросок вместо угадывания.
· kamo-internal
Покажите участников, которые платят за свое место, и прекратите предлагать второе
Конечная точка покрытия поставляется с ключами перевода и без компонента, поэтому Вопрос, на который он отвечает — кто платит за мое место — все еще не был задан. SeatCoveragePanel спрашивает об этом, и ответ подает панель самооплаты рядом с ней: человек, место которого уже занято его организацией или группой, не является Дальше предлагалась возможность купить еще одну по собственной карте. Это предложение не было Знания о существующем охвате вообще, поэтому его показали всем. План группы также может быть отменен сейчас, что делает группу с план удаляемый - удаление одного, который все еще указывает на прямую подписку Отказывали, чтобы обвинение не было сиротским. Добавление кого-то, за кого организация уже платит, возвращается с отказом. Безмолвно ничего не делая, кнопка объясняет сама себя.
· BillingService
Пусть план группы будет отменен, и прекратите двойную оплату за одного человека
Три пробела в том, что было отправлено последним: Группа с планом никогда не может быть удалена. Удалить() Отказаться пока жив подписка существует — правильно, так как групповой ряд — это единственное, что указывает на подписка на Stripe, но не было возможности отменить ее, поэтому гарантия была dead end. cancelPlan() освобождает места первым, поэтому список не может продолжаться Люди занимают места, которых больше не существует. Добавление кого-то, для кого организация уже покупает место, теперь отказано, если только TakeOverFromOrg говорит обратное. Это второй способ быть обвиненным дважды. Один человек и ничего не поймали его: уникальные подписки участника Per-subscription и AccountLicense не декларируют ничего. Переместить кого-то из счет организации на счет группы - это реальная вещь, которую делает менеджер. Разрешено — намеренно, а не случайно. BillingGroupScopeInterceptor связывает каждый запрос /api/billing/groups/{uuid}/** в организацию звонящего. Руководители уже проверяют, и это не заменить их; он существует потому, что эти чеки являются перманентными, и группа теперь имеет Подресурсы, которые тратят деньги. Следующий маршрут ничего не наследует, если только Что-то выше этого правила. Умышленно более узкие, чем обработчики: Это решает, какая организация, а не кто в ней может действовать, поэтому они не могут Двигайтесь к несогласным ответам. Неизвестная группа проходит через Обработчик отвечает «не найден», а не подтверждает, что идентификатор где-то существует.
· kamo-internal
Группа, на которую вы можете положить людей и заплатить за
Создание группы произвело имя и ничего больше — ни одного способа добавить кого-либо, ни одного способа. Чтобы его менеджер выбрал план, некуда платить. Открытие группы показывает, кто платит, кто на нем, кто еще ждет места, и план контролирует, что Купите эти места. Создавая один спрашивает, кто платит, используя канонический член сборщика. Раньше он посылал учетной записи организации, именно поэтому каждая группа была выставлена на счет организация; плательщик теперь решается на стороне сервера от менеджера и AccountUid больше не находится на проводе. Список отличает наличие места от ожидания одного. Менеджер, который ставит Восемь человек на пяти местах сказали, что у трех коллег нет доступа. узнать от них.
· BillingService
Заставьте группы по выставлению счетов работать до конца и прекратите взимать плату за самообслуживание ни за что
Группа теперь может собирать людей, покупать план на собственной карточке своего менеджера. его местами. Ничего из этого не существовало: только операции создавались, одобрялись И удалите, чтобы владелец, который создал группу, получил ярлык и не мог его использовать. BillingGroupSeatService - это место, где деньги перемещаются, а право выдается и сохраняется. Кроме ведения учета, поэтому не может быть добавлен новый маршрут, который пропускает ворота. Отказ от подписки () до создания () называется, а не после, потому что создание () Открывает подписку Live Stripe — неодобренная группа, наследственная, менеджер Без карточки или пробоины крышки сиденья все останавливается там. Два дефекта сделали группу не тем человеком: Плательщиком был какой-либо счетUid органа запроса, названный, непроверенный, и Консоль прислала организацию. Группа, представленная организации, не является Биллинговая группа; это второе название для собственной подписки организации. Плательщик теперь является производным от управляющего, и оба утверждают, что согласны. Прежде чем что-либо будет предъявлено. Отправка аккаунта Uid полностью отвергается. - обеспечить повторное использование самой старой ссылки участника AccountMember, которая для Любой, кто когда-либо был добавлен на счет организации, является счетом организации. Убедитесь, что PersonalAccountForMember идентифицируется первичным участником, который Единственное поле, где говорится, что счет принадлежит человеку. Где владелец управляет своей группой, «своей картой» и «организацией». Карта" - это действительно один и тот же счет и один и тот же клиент Stripe, и нет Код может отличить их. Отказано, если не подтверждено, а не задокументировано конец. Отдельно два живых жука, найденных здесь: - /self/seat заряжал члена и никогда не выдавал ему места. Называется Create() и вернулся; не было подписки участника строка и не Лицензия на учетную запись, так что Покупатель оставался нелицензированным, пока его карта оплачивалась каждый месяц. - @Transactional в AccountBillingService перешла на частный метод, поэтому Весна проигнорировала его и гарантировала, что AccountForMember будет работать без каких-либо транзакций. А. Провал между двумя его сейвами осиротел аккаунт, следующий поиск не мог См., и следующий призыв создал второй. /self/coverage - это новое: оно отвечает "кто платит за мое место", что ничего не сделало. Это также то, что останавливает кого-то, уже покрытого предложением второго места на собственную карточку.
· InitializerService
Схема для групп, которые действительно могут платить
Три бегуна: BillingGroupRosterMigration создает Billing pay group members - кого группа Это значит заплатить, прежде чем что-то купить. Org id денормализуется с тем чтобы база данных могла обеспечивать соблюдение принципа "член состоит максимум в одной активной группе по выставлению счетов на «Организация» как частичная уникальная. Две группы, которые платят за одного человека, это две Плата за одно место, и ничто другое в схеме не поймает его: Уникальные подписки Участника являются по подписке, а у AccountLicense их нет. **************** Добавляет в аккаунт подписки billing group uid и заменяет трехколонный уникальный двумя частичными уникальными. Расширить его до Четыре столбца не сработают — NULL отличаются внутри уникального индекса. Каждый негрупповой ряд перестает быть ограниченным. BillingPayGroupColumnsMigration добавляет market id, seat limit и статус существующих групп. Они были выставлены на любой счет в соответствии с запросом. Тело перевозили, а консоль отправляла организации, поэтому их аккаунт uid Почти наверняка неправильно. Нет безопасного способа угадать, какая карта была предназначена. Угадывать неправильные счета не тому человеку, поэтому им отказывают в пункте зарядки вместо ремонта. Первый прогон показал, почему важна повторная проверка: оба индекса замены не сработали. 40001 не мог сериализовать доступ, бегун входил в систему и продолжал. DROP старого ограничения тогда преуспел — оставив подписки на аккаунт без какой-либо уникальности, которая строго хуже, чем столкновение это фиксирует. Утверждения DDL теперь повторяются при сбое сериализации, и падение пропускается. полностью, если обе замены не подтверждены.
· kamo-shared-library
Пусть биллинговая группа будет собственным плательщиком
Можно назвать группу и ничего больше. Его подписка никогда не была установлена. Ничего в платформе под названием setSubscription — так что подписка uid осталась Ноль навсегда, и группа не могла купить или удержать ни одного места. В модели пришлось изменить три вещи: BillingGroupMember - новый проект. Seat Truth Stays Where It Was (альбом) и AccountLicense, но SubscriptionMember.subscription НЕ НУЛЬНЫЙ, поэтому до тех пор, пока Группа покупает план, в котором нет места, чтобы записать людей, которых она существует, чтобы покрыть. Собрание людей перед покупкой мест для них — вот в чем суть. Это Намерение – это право. AccountSubscription выигрывает BillingGroupUid и (счет, рынок, целевая организация) Уникальное ограничение выходит из сущности. Группа выставляет счет своему менеджеру на Собственный счет менеджера, ориентированный на ту же организацию на том же рынке, что и любое место Этот менеджер уже купил для себя — тот же кортеж. Итак, первая группа Покупка не провалилась, в ней нашли личную подписку менеджера и переписали Это: план, места, Stripe id. Нет исключений, нет второго ряда. Правило теперь живет как два частичных уникальных индекса, которые JPA не может выразить, созданных KamoInitializer; (ddl-auto) должна была бы воссоздать старое ограничение. Перед бегуном, который бросает его. **************************************************** Унизительно. Это возвращает Факультативность на силу ограничения, которое больше не существует, поэтому, как только одна учетная запись имеет как личную, так и групповую подписку, она Сопоставляет два ряда и бросает на всех пяти сайтах вызова через три службы. Оставлять его на автозаполнение было более опасным вариантом. Также: позволяет группам () теперь включает REQUIRES APPROVAL. За исключением того, что он сделал Путь одобрения недостижим — создание группы было отвергнуто, в то время как Код, устанавливающий утвержденный флаг, требует одобрения (), и поэтому может только Ответ: «Уже утвержден». Владелец, выбравший опеку, вообще не получал никаких групп.

Ваша вселенная ждет.
Начните бесплатно через несколько минут. Добавляйте продукты, когда будете готовы — без миграции, без новых логинов.
Бесплатно навсегда — не требуется кредитная карта