diff --git a/Makefile b/Makefile index af5690629..282e48cb5 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,7 @@ # Makefile para automatizar setup do projeto PHP com Docker -include .env - .PHONY: up install_dependencies generate_proxies migrate_database load_fixtures install_frontend compile_frontend generate_keys -# Função para bloquear comandos em produção -guard-not-prod: -ifeq ($(APP_ENV),prod) - $(error Este comando não pode ser executado em produção) -endif - # Inicia os serviços Docker em modo detached up: docker compose up -d @@ -28,7 +20,7 @@ container_php: # Instala dependências dentro do contêiner PHP install_dependencies: - docker compose exec -T php bash -c "composer install --ignore-platform-req=ext-mongodb" + docker compose exec -T php bash -c "COMPOSER_MEMORY_LIMIT=-1 composer install" # Gera os arquivos de Proxies do MongoDB generate_proxies: @@ -46,7 +38,7 @@ migrate_odm: docker compose exec -T php bash -c "php bin/console app:mongo:migrations:execute" # Executa as fixtures de dados -load_fixtures: guard-not-prod +load_fixtures: docker compose exec -T php bash -c "php bin/console doctrine:fixtures:load -n --purge-exclusions=city --purge-exclusions=state" # Instala dependências do frontend @@ -54,33 +46,22 @@ install_frontend: docker compose exec -T php bash -c "php bin/console importmap:install" # Compila os arquivos do frontend -compile_frontend: reset +compile_frontend: docker compose exec -T php bash -c "php bin/console asset-map:compile" -# Abre uma instância gráfica do cypress -open_cypress: load_fixtures - xhost +local: - CYPRESS_MODE=open docker compose --profile tests up - # Executa as fixtures de dados e os testes de front-end -tests_front: guard-not-prod - if [ "$(fixtures)" != "no" ]; then \ - make load_fixtures;\ - fi; +tests_front: load_fixtures docker compose up cypress # Executa as fixtures de dados e os testes de back-end -tests_back: guard-not-prod +tests_back: if [ "$(fixtures)" != "no" ]; then \ make load_fixtures;\ fi; docker compose exec -T php bash -c "php bin/paratest $(filename) --no-coverage" # Executa as fixtures de dados e os testes de back-end -tests_back_coverage: guard-not-prod - if [ "$(fixtures)" != "no" ]; then \ - make load_fixtures;\ - fi; +tests_back_coverage: load_fixtures docker compose exec -T php bash -c "php -d memory_limit=512M bin/paratest $(filename)" # Limpa o cache do projeto @@ -88,14 +69,14 @@ reset: docker compose exec -T php bash -c "php bin/console cache:clear" # Limpa a cache e o banco -reset-deep: guard-not-prod +reset-deep: rm -rf var/storage - rm -rf assets/uploads + docker compose exec -T php bash -c "rm -rf assets/uploads" rm -rf assets/vendor rm -rf public/assets - rm -rf var/cache - rm -rf var/log - docker compose exec -T php bash -c "php bin/console cache:clear" + docker compose exec -T php bash -c "rm -rf var/cache" + docker compose exec -T php bash -c "rm -rf var/log" + docker compose exec -T php bash -c "php -d memory_limit=-1 bin/console cache:clear" docker compose exec -T php bash -c "php bin/console doctrine:mongodb:schema:drop --search-index" docker compose exec -T php bash -c "php bin/console doctrine:mongodb:schema:drop --collection" docker compose exec -T php bash -c "php bin/console doctrine:mongodb:schema:drop --db" @@ -112,9 +93,6 @@ style: docker compose exec -T php bash -c "php vendor/bin/phpcs --config-set installed_paths src/Standards" docker compose exec -T php bash -c "php vendor/bin/phpcs" -create-admin-user: - docker compose exec -T php bash -c "php bin/console app:create-admin-user" - # Gera as chaves de autenticação JWT generate_keys: docker compose exec -T php bash -c "php bin/console lexik:jwt:generate-keypair --overwrite -n" @@ -124,11 +102,5 @@ copy_dist: cp phpcs.xml.dist phpcs.xml cp phpunit.xml.dist phpunit.xml -permissions: - mkdir -p var/ - mkdir -p vendor/ - mkdir -p config/jwt - chmod -R 775 assets/ config/jwt var/ vendor/ public/ - # Comando para rodar todos os passos juntos -setup: guard-not-prod up install_dependencies copy_dist reset-deep generate_proxies migrate_database load_fixtures install_frontend compile_frontend generate_keys +setup: up install_dependencies copy_dist reset-deep generate_proxies migrate_database load_fixtures install_frontend compile_frontend generate_keys diff --git a/assets/app.js b/assets/app.js index 3f297726e..fab77373f 100644 --- a/assets/app.js +++ b/assets/app.js @@ -1,3 +1,6 @@ +import 'air-datepicker/air-datepicker.css'; +import './styles/lib/air-datepicker-custom.css'; + import './styles/app.css'; import './styles/components/navbar.css'; import './styles/components/footer.css'; @@ -7,6 +10,7 @@ import './styles/components/side-bar.css'; import './styles/components/title.css'; import './styles/components/form-step.css'; import './js/modal-confirm-remove.js'; +import './js/_components/copy-id.js'; import './js/navbar-dropdown.js'; import '@iconify/iconify'; diff --git a/assets/img/banner-default-white.jpeg b/assets/img/banner-default-white.jpeg new file mode 100644 index 000000000..961d0a029 Binary files /dev/null and b/assets/img/banner-default-white.jpeg differ diff --git a/assets/img/default-image.png b/assets/img/default-image.png new file mode 100644 index 000000000..e40cc0552 Binary files /dev/null and b/assets/img/default-image.png differ diff --git a/assets/js/banner-cropper.js b/assets/js/banner-cropper.js new file mode 100644 index 000000000..53500db8f --- /dev/null +++ b/assets/js/banner-cropper.js @@ -0,0 +1,116 @@ +document.addEventListener('DOMContentLoaded', () => { + document.querySelectorAll('.js-cropper-input') + .forEach(input => new ImageCropper(input)); +}); + +class ImageCropper { + constructor(inputElement) { + this.input = inputElement; + + this.config = { + modalId: this.input.dataset.modalId, + previewSelector: this.input.dataset.preview, + aspectRatio: parseFloat(this.input.dataset.aspectRatio) || (16 / 9) + }; + + this.modalEl = document.getElementById(this.config.modalId); + + if (!this.modalEl) { + return console.error(`ImageCropper: Modal "${this.config.modalId}" não encontrado.`); + } + + this.imageEl = this.modalEl.querySelector('.image-to-crop'); + this.saveBtn = this.modalEl.querySelector('.crop-save-btn'); + this.previewEl = document.querySelector(this.config.previewSelector); + + this.cropper = null; + this.bsModal = this.getBootstrapModal(); + + this.init(); + } + + init() { + if (!this.imageEl) return console.error('ImageCropper: Imagem .image-to-crop não encontrada.'); + + this.input.addEventListener('change', (e) => this.handleInputChange(e)); + this.modalEl.addEventListener('shown.bs.modal', () => this.initCropperInstance()); + this.modalEl.addEventListener('hidden.bs.modal', () => this.destroyCropperInstance()); + + if (this.saveBtn) { + this.saveBtn.addEventListener('click', () => this.handleSave()); + } + } + + getBootstrapModal() { + if (typeof bootstrap !== 'undefined') return new bootstrap.Modal(this.modalEl); + if (window.bootstrap) return new window.bootstrap.Modal(this.modalEl); + return null; + } + + handleInputChange(e) { + const files = e.target.files; + + if (!files || files.length === 0) return; + const file = files[0]; + this.input.value = ''; + this.imageEl.src = URL.createObjectURL(file); + if (this.bsModal) this.bsModal.show(); + } + + initCropperInstance() { + if (this.cropper) this.cropper.destroy(); + + this.cropper = new Cropper(this.imageEl, { + aspectRatio: this.config.aspectRatio, + viewMode: 1, + autoCropArea: 1, + }); + } + + destroyCropperInstance() { + if (!this.cropper) return; + + this.cropper.destroy(); + this.cropper = null; + this.imageEl.src = ''; + } + + handleSave() { + if (!this.cropper) return; + + this.cropper.getCroppedCanvas({ + width: 1920, + imageSmoothingEnabled: true, + imageSmoothingQuality: 'high', + }).toBlob((blob) => this.processBlob(blob), 'image/jpeg', 0.9); + } + + processBlob(blob) { + if (!blob) return; + + const file = new File([blob], "imagem-editada.jpg", { + type: "image/jpeg", + lastModified: Date.now() + }); + + const container = new DataTransfer(); + container.items.add(file); + this.input.files = container.files; + this.updatePreview(blob); + + if (this.bsModal) this.bsModal.hide(); + } + + updatePreview(blob) { + if (!this.previewEl) return; + + const url = URL.createObjectURL(blob); + + if (this.previewEl.tagName === 'IMG') { + this.previewEl.src = url; + return; + } + + this.previewEl.style.backgroundImage = `url('${url}')`; + } +} \ No newline at end of file diff --git a/assets/js/event/period-filter.js b/assets/js/event/period-filter.js new file mode 100644 index 000000000..e86d9ffb4 --- /dev/null +++ b/assets/js/event/period-filter.js @@ -0,0 +1,74 @@ +import {getLocale} from "@symfony/ux-translator"; +import AirDatepicker from 'air-datepicker'; +import '../../styles/lib/air-datepicker-custom.css'; +const datepickerLocale = await import('air-datepicker/locale/'+getLocale()+'.js'); + +const FORM_FILTER_SIDEBAR = document.getElementById('filter-sidebar'); +const PERIOD_SELECT = document.getElementById('period'); +const BTN_APPLY_PERIOD_FILTER = document.getElementById('apply-period-filter'); +const BTN_CLOSE_CALENDAR = document.getElementById('close-calendar'); + +const datepicker = new AirDatepicker(document.getElementById('datepicker'), { + range: true, + multipleDates: true, + locale: await datepickerLocale.default.default, + onSelect: function ({ date, formattedDate }) { + const customPeriod = document.querySelector('#period option[data-name=custom]'); + customPeriod.classList.remove('d-none'); + customPeriod.innerText = formattedDate.join(' - '); + + customPeriod.value = date.map(d => { + return d.getFullYear() + '-' + + (d.getMonth()+1).toString().padStart(2, '0') + '-' + + d.getDate().toString().padStart(2, '0'); + }).join(','); + customPeriod.selected = true; + + if (date.length === 2) { + customPeriod.selected = true; + BTN_CLOSE_CALENDAR.click(); + } + }, +}); + +PERIOD_SELECT.addEventListener('change', function () { + datepicker.clear({silent: true}); + const customPeriod = document.querySelector('#period option[data-name=custom]'); + customPeriod.classList.add('d-none'); + customPeriod.innerText = ''; +}); + +BTN_APPLY_PERIOD_FILTER.addEventListener('click', function () { + const period = PERIOD_SELECT.value; + const url = new URL(window.location.href); + + url.searchParams.set('period', period); + + window.location.href = url.toString(); +}); + +(function () { + const searchParams = new URLSearchParams(window.location.search); + + new FormData(FORM_FILTER_SIDEBAR).forEach(function (value, key) { + const element = FORM_FILTER_SIDEBAR.querySelector(`[name=${key}]`); + if (element) { + element.value = searchParams.get(key); + } + }); + + if ('' === PERIOD_SELECT.value) { + const period = searchParams.get('period'); + if (period) { + const customPeriod = document.querySelector('#period option[data-name=custom]'); + const periodInnerText = period.split(',').map(date => { + const [year, month, day] = date.split('-'); + return `${day.padStart(2, '0')}/${month.padStart(2, '0')}/${year}`; + }); + + customPeriod.value = period; + customPeriod.selected = true; + customPeriod.innerText = periodInnerText.join(' - '); + } + } +})(); diff --git a/assets/js/form-accordion-validator.js b/assets/js/form-accordion-validator.js new file mode 100644 index 000000000..a51f5acbd --- /dev/null +++ b/assets/js/form-accordion-validator.js @@ -0,0 +1,205 @@ +class FormAccordionValidator { + constructor(form, customValidationFields = {}, options = {}) { + this.form = form; + this.customValidators = customValidationFields; + + this.options = { + onSuccess: options.onValidationSuccess || null, + onError: options.onValidationFailure || null, + preventDefaultSubmit: options.preventDefaultSubmit ?? true, + errorClass: 'is-invalid', + feedbackClass: 'invalid-feedback', + ...options + }; + + this._listeners = new Map(); + + this._bindMethods(); + this.init(); + } + + _bindMethods() { + this.handleSubmit = this.handleSubmit.bind(this); + } + + init() { + if (this.options.preventDefaultSubmit) { + this.form.setAttribute('novalidate', ''); + this.form.addEventListener('submit', this.handleSubmit); + } + this._setupRealtimeValidation(); + } + + _setupRealtimeValidation() { + Object.keys(this.customValidators).forEach(fieldName => { + const field = this.form.querySelector(`[name="${fieldName}"]`); + if (!field) return; + + const handler = () => { + if (field.classList.contains(this.options.errorClass)) { + this._validateSingleField(field, this.customValidators[fieldName]); + } + }; + + ['input', 'change'].forEach(evt => { + field.addEventListener(evt, handler); + this._trackListener(field, evt, handler); + }); + }); + } + + _trackListener(element, event, handler) { + if (!this._listeners.has(element)) { + this._listeners.set(element, []); + } + this._listeners.get(element).push({ event, handler }); + } + + _validateSingleField(field, validatorFn) { + const result = validatorFn(field.value, field); + if (result === true) { + this._clearError(field); + return true; + } + this._showError(field, typeof result === 'string' ? result : 'Campo inválido'); + return false; + } + + _isFieldInvalid(field) { + if (field.disabled || field.type === 'hidden') return false; + + if (field.type === 'checkbox' || field.type === 'radio') { + const group = this.form.querySelectorAll(`[name="${field.name}"]`); + const isRequired = Array.from(group).some(el => el.hasAttribute('required')); + if (!isRequired) return false; + + const isChecked = Array.from(group).some(el => el.checked); + return !isChecked; + } + + return !field.checkValidity(); + } + + validateForm() { + const errors = []; + + const nativeFields = this.form.querySelectorAll('input, select, textarea'); + nativeFields.forEach(field => { + if (this._isFieldInvalid(field)) { + this._showError(field, field.validationMessage || 'Preenchimento obrigatório'); + errors.push(field); + } else { + if (!this.customValidators[field.name]) { + this._clearError(field); + } + } + }); + + Object.entries(this.customValidators).forEach(([name, validatorFn]) => { + const field = this.form.querySelector(`[name="${name}"]`); + if (field && !this._validateSingleField(field, validatorFn)) { + if (!errors.includes(field)) errors.push(field); + } + }); + + return { + isValid: errors.length === 0, + firstInvalidField: errors[0] || null, + allErrors: errors + }; + } + + _showError(field, message) { + field.classList.add(this.options.errorClass); + + let parent = field.parentElement; + + if (parent.classList.contains('input-group') || parent.classList.contains('form-floating')) { + parent = parent.parentElement; + } + + let feedback = parent.querySelector(`.${this.options.feedbackClass}`); + + if (!feedback) { + feedback = document.createElement('div'); + feedback.className = this.options.feedbackClass; + field.parentNode.appendChild(feedback); + } + + feedback.textContent = message; + feedback.style.display = 'block'; + } + + _clearError(field) { + field.classList.remove(this.options.errorClass); + const parent = field.closest('.input-group') || field.parentNode; + const feedback = parent.querySelector(`.${this.options.feedbackClass}`); + if (feedback) { + feedback.textContent = ''; + feedback.style.display = 'none'; + } + } + + async _expandAndFocus(field) { + if (!field) return; + + const accordionItem = field.closest('.accordion-collapse'); + + if (!accordionItem || accordionItem.classList.contains('show')) { + this._focusElement(field); + return; + } + + const onShown = () => { + accordionItem.removeEventListener('shown.bs.collapse', onShown); + this._focusElement(field); + }; + + accordionItem.addEventListener('shown.bs.collapse', onShown); + + const bsCollapse = bootstrap.Collapse.getOrCreateInstance(accordionItem); + bsCollapse.show(); + } + + _focusElement(field) { + field.focus({ preventScroll: true }); + field.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } + + handleSubmit(e) { + if (this.options.preventDefaultSubmit) e.preventDefault(); + + const result = this.validateForm(); + + if (!result.isValid) { + this._expandAndFocus(result.firstInvalidField); + if (this.options.onError) this.options.onError(result); + } else { + if (this.options.onSuccess) { + this.options.onSuccess(this.form); + } else if (this.options.preventDefaultSubmit) { + this.form.submit(); + } + } + } + + destroy() { + if (this.options.preventDefaultSubmit) { + this.form.removeEventListener('submit', this.handleSubmit); + this.form.removeAttribute('novalidate'); + } + + this._listeners.forEach((events, element) => { + events.forEach(({ event, handler }) => { + element.removeEventListener(event, handler); + }); + }); + this._listeners.clear(); + } +} + +if (typeof module !== 'undefined' && module.exports) { + module.exports = FormAccordionValidator; +} else { + window.FormAccordionValidator = FormAccordionValidator; +} \ No newline at end of file diff --git a/assets/js/image-validation.js b/assets/js/image-validation.js index bc51ae999..6faf5479c 100644 --- a/assets/js/image-validation.js +++ b/assets/js/image-validation.js @@ -1,64 +1,92 @@ -const profileInput = document.getElementById('profile-input'); -const submitButton = document.querySelector('button[type="submit"]'); -const imgElement = document.getElementById('profile-img'); -const errorElement = document.getElementById('image-error'); +document.addEventListener('DOMContentLoaded', function () { + const profileInput = document.getElementById('profile-input'); + const profileImg = document.getElementById('profile-img'); -profileInput.addEventListener('change', function (event) { - const input = event.target; - const file = input.files[0]; - const maxSize = 2000000; - const allowedTypes = ['image/png', 'image/jpg', 'image/jpeg']; + const bannerInput = document.getElementById('banner-input'); + const bannerDiv = document.querySelector('.banner'); - clearError(); + const submitButton = document.querySelector('button[type="submit"]'); + const errorElement = document.getElementById('image-error'); - if (!file) { - return; + if (profileInput) { + profileInput.addEventListener('change', function (event) { + handleImageUpload(event.target, 2000000, function(readerResult) { + profileImg.src = readerResult; + }); + }); } - if (file.size > maxSize) { - showError('O tamanho da imagem não pode exceder 2MB.'); - resetInput(); - return; + if (bannerInput) { + bannerInput.addEventListener('change', function (event) { + handleImageUpload(event.target, 5000000, function(readerResult) { + bannerDiv.style.backgroundImage = `url('${readerResult}')`; + }); + }); } - if (!allowedTypes.includes(file.type)) { - showError('A imagem deve estar no formato png, jpg ou jpeg.'); - resetInput(); - return; + function handleImageUpload(input, maxSize, updatePreviewCallback) { + const file = input.files[0]; + const allowedTypes = ['image/png', 'image/jpg', 'image/jpeg', 'image/webp']; + + clearError(); + + if (!file) { + return; + } + + if (file.size > maxSize) { + const sizeInMB = maxSize / 1000000; + showError(`O tamanho da imagem não pode exceder ${sizeInMB}MB.`); + resetInput(input); + return; + } + + if (!allowedTypes.includes(file.type)) { + showError('A imagem deve estar no formato png, jpg ou jpeg.'); + resetInput(input); + return; + } + + enableSubmit(); + + const reader = new FileReader(); + reader.onload = function (e) { + updatePreviewCallback(e.target.result); + }; + reader.readAsDataURL(file); + } + + function showError(message) { + if (errorElement) { + errorElement.textContent = message; + errorElement.classList.add('text-danger', 'mt-2'); + errorElement.style.display = 'block'; + } else { + alert(message); + } + } + + function clearError() { + if (errorElement) { + errorElement.textContent = ''; + errorElement.style.display = 'none'; + } + } + + function resetInput(inputElement) { + inputElement.value = ''; + disableSubmit(); } - enableSubmit(); - - const reader = new FileReader(); - reader.onload = function () { - imgElement.src = reader.result; - }; - reader.readAsDataURL(file); -}); - -function showError(message) { - errorElement.textContent = message; - errorElement.classList.add('text-danger', 'mt-2'); -} - -function clearError() { - errorElement.textContent = ''; -} - -function resetInput() { - profileInput.value = ''; - imgElement.src = ''; - disableSubmit(); -} - -function disableSubmit() { - if (submitButton) { - submitButton.disabled = true; + function disableSubmit() { + if (submitButton) { + submitButton.disabled = true; + } } -} -function enableSubmit() { - if (submitButton) { - submitButton.disabled = false; + function enableSubmit() { + if (submitButton) { + submitButton.disabled = false; + } } -} +}); \ No newline at end of file diff --git a/assets/js/load-cities.js b/assets/js/load-cities.js index 50b1a31e0..ce583c713 100644 --- a/assets/js/load-cities.js +++ b/assets/js/load-cities.js @@ -46,8 +46,8 @@ document.addEventListener('DOMContentLoaded', () => { citySelect.refreshOptions(false); }); - const initialState = stateSelect.getValue(); - if (initialState) { - stateSelect.trigger('change', initialState); - } + // const initialState = stateSelect.getValue(); + // if (initialState) { + // stateSelect.trigger('change', initialState); + // } }); diff --git a/assets/js/navbar-dropdown.js b/assets/js/navbar-dropdown.js index 6ff5941cb..27dea4f77 100644 --- a/assets/js/navbar-dropdown.js +++ b/assets/js/navbar-dropdown.js @@ -1,25 +1,23 @@ document.addEventListener('DOMContentLoaded', () => { function toggleDropdown() { const dropdownMenu = document.getElementById("customDropdown"); - dropdownMenu.classList.toggle("show"); + dropdownMenu?.classList.toggle("show"); setTimeout(() => { - document.getElementById("dropdownMenuButton").blur(); + document.getElementById("dropdownMenuButton")?.blur(); }, 100); } const dropdownButton = document.getElementById("dropdownMenuButton"); - if (dropdownButton) { - dropdownButton.addEventListener('click', (e) => { - e.stopPropagation(); - toggleDropdown(); - }); - } + dropdownButton?.addEventListener('click', (e) => { + e.stopPropagation(); + toggleDropdown(); + }); document.addEventListener('click', (event) => { const dropdownMenu = document.getElementById("customDropdown"); - if (dropdownMenu && dropdownMenu.classList.contains('show')) { + if (dropdownMenu?.classList.contains('show')) { if (!dropdownButton.contains(event.target) && !dropdownMenu.contains(event.target)) { dropdownMenu.classList.remove('show'); } @@ -37,21 +35,4 @@ document.addEventListener('DOMContentLoaded', () => { }, 100); }); }); - - const notificationBtn = document.getElementById("notificationDropdown"); - const notificationMenu = document.querySelector(".dropdown-notification .dropdown-menu"); - - if (notificationBtn && notificationMenu) { - notificationBtn.addEventListener('click', (e) => { - e.preventDefault(); - e.stopPropagation(); - notificationMenu.classList.toggle("show"); - }); - - document.addEventListener("click", function (event) { - if (!notificationBtn.contains(event.target) && !notificationMenu.contains(event.target)) { - notificationMenu.classList.remove("show"); - } - }); - } }); diff --git a/assets/js/side-filter-load-cities.js b/assets/js/side-filter-load-cities.js new file mode 100644 index 000000000..50b1a31e0 --- /dev/null +++ b/assets/js/side-filter-load-cities.js @@ -0,0 +1,53 @@ +import TomSelect from 'tom-select'; +import 'tom-select/dist/css/tom-select.default.min.css'; + +document.addEventListener('DOMContentLoaded', () => { + const stateElement = document.getElementById('state'); + const cityElement = document.getElementById('city'); + + stateElement.classList.remove('form-select'); + cityElement .classList.remove('form-select'); + + const stateSelect = new TomSelect(stateElement, { + create: false, + sortField: { field: 'text', direction: 'asc' }, + placeholder: stateElement.dataset.placeholder || 'Selecione', + allowEmptyOption: false, + }); + + const citySelect = new TomSelect(cityElement, { + create: false, + sortField: { field: 'text', direction: 'asc' }, + placeholder: cityElement.dataset.placeholder || 'Selecione', + allowEmptyOption: false, + }); + + const fetchData = url => + fetch(url) + .then(res => res.ok ? res.json() : []) + .catch(() => []); + + const clearCities = () => { + citySelect.clearOptions(); + citySelect.clear(true); + }; + + stateSelect.on('change', async value => { + clearCities(); + if (!value) return; + + const cities = await fetchData( + `/api/states/${encodeURIComponent(value)}/cities` + ); + + cities.forEach(c => { + citySelect.addOption({ value: c.id, text: c.name }); + }); + citySelect.refreshOptions(false); + }); + + const initialState = stateSelect.getValue(); + if (initialState) { + stateSelect.trigger('change', initialState); + } +}); diff --git a/assets/js/side-filter.js b/assets/js/side-filter.js index ab2bf18ce..b5e04042b 100644 --- a/assets/js/side-filter.js +++ b/assets/js/side-filter.js @@ -16,13 +16,13 @@ function toggleSidebar() { if (SIDEBAR.classList.contains('open')) { BTN_OPEN_FILTER.style.visibility = 'hidden'; - BTN_OPEN_FILTER.style.opacity = 0; + BTN_OPEN_FILTER.style.opacity = '0'; return; } setTimeout(() => { BTN_OPEN_FILTER.style.visibility = 'visible'; - BTN_OPEN_FILTER.style.opacity = 1; + BTN_OPEN_FILTER.style.opacity = '1'; }, 300); } diff --git a/assets/js/space/opening-hours.js b/assets/js/space/opening-hours.js index feae16453..5ce6cf6fd 100644 --- a/assets/js/space/opening-hours.js +++ b/assets/js/space/opening-hours.js @@ -1,164 +1,126 @@ -import { - FRIDAY, - MONDAY, - SATURDAY, - SELECT_DAY, - SUNDAY, - THURSDAY, - trans, - TUESDAY, - WEDNESDAY -} from "../../translator.js"; - -document.addEventListener('DOMContentLoaded', function() { - - const daysOfWeek = [ - { value: 'sunday', label: trans(SUNDAY) }, - { value: 'monday', label: trans(MONDAY) }, - { value: 'tuesday', label: trans(TUESDAY) }, - { value: 'wednesday', label: trans(WEDNESDAY) }, - { value: 'thursday', label: trans(THURSDAY) }, - { value: 'friday', label: trans(FRIDAY) }, - { value: 'saturday', label: trans(SATURDAY) } - ]; - - function getUsedDays() { - const used = []; - document.querySelectorAll('select.week_days').forEach(select => { - if (select.value) { - used.push(select.value); - } - }); - return used; +import {FRIDAY, MONDAY, SATURDAY, SUNDAY, THURSDAY, trans, TUESDAY, WEDNESDAY} from "../../translator.js"; + +class OpeningHoursManager { + constructor() { + this.daysOptions = [ + { value: 'sunday', label: trans(SUNDAY) }, + { value: 'monday', label: trans(MONDAY) }, + { value: 'tuesday', label: trans(TUESDAY) }, + { value: 'wednesday', label: trans(WEDNESDAY) }, + { value: 'thursday', label: trans(THURSDAY) }, + { value: 'friday', label: trans(FRIDAY) }, + { value: 'saturday', label: trans(SATURDAY) } + ]; + + this.refs = { + container: document.getElementById('opening-hours-container'), + list: document.getElementById('opening-hours-list'), + hiddenInput: document.getElementById('opening-hours-json'), + addBtn: document.getElementById('add-opening-hours-btn'), + template: document.getElementById('opening-hours-row-template') + }; + + if (!this.refs.container) return; + + this.init(); } - function populateDropdown(selectElement, usedDays = [], currentValue = '') { - selectElement.innerHTML = ''; + init() { + this._bindEvents(); + this._loadInitialData(); + } - // Option default - const defaultOption = document.createElement('option'); - defaultOption.value = ''; - defaultOption.disabled = true; - if (!currentValue) { - defaultOption.selected = true; - } - defaultOption.textContent = trans(SELECT_DAY); - selectElement.appendChild(defaultOption); + _bindEvents() { + this.refs.addBtn.addEventListener('click', (e) => { + e.preventDefault(); + this._addRow(); + }); - daysOfWeek.forEach(day => { - if (usedDays.includes(day.value) && day.value !== currentValue) { - return; - } - const option = document.createElement('option'); - option.value = day.value; - option.textContent = day.label; - if (day.value === currentValue) { - option.selected = true; + this.refs.list.addEventListener('click', (e) => { + const removeBtn = e.target.closest('.btn-remove-row'); + if (removeBtn) { + e.preventDefault(); + removeBtn.closest('.opening-hours-row').remove(); + this._syncData(); } - selectElement.appendChild(option); }); - } - - function updateAllSelects() { - const usedDays = getUsedDays(); - const allSelects = document.querySelectorAll('select.week_days'); - allSelects.forEach(select => { - const currentValue = select.value; - populateDropdown(select, usedDays, currentValue); + this.refs.list.addEventListener('input', (e) => { + if (e.target.matches('select, input')) { + this._syncData(); + } }); } - function addRemoveButton(row) { - const existingRemove = row.querySelector('.remove-opening-hours'); - if (existingRemove) { - existingRemove.remove(); + _loadInitialData() { + try { + const rawData = this.refs.container.dataset.initialData; + const data = rawData ? JSON.parse(rawData) : {}; + + if (data.openingHours && typeof data.openingHours === 'object') { + Object.entries(data.openingHours).forEach(([day, slots]) => { + slots.forEach(slot => { + this._addRow({ day, open: slot.open, close: slot.close }); + }); + }); + } else { + this._addRow(); + } + } catch (error) { + console.error('Erro ao carregar dados iniciais:', error); + this._addRow(); } + } - const removeButton = document.createElement('a'); - removeButton.href = "#"; - removeButton.classList.add('remove-opening-hours', 'text-danger', 'ms-2'); - removeButton.innerHTML = ''; - - removeButton.addEventListener('click', function(event) { - event.preventDefault(); - row.remove(); + _addRow(data = null) { + const clone = this.refs.template.content.cloneNode(true); + const row = clone.querySelector('.opening-hours-row'); - updateAllSelects(); - }); + const select = row.querySelector('.field-day'); + this._populateDaySelect(select, data?.day); - let removeCol = row.querySelector('.remove-col'); - if (!removeCol) { - removeCol = document.createElement('div'); - removeCol.classList.add('col-md-2', 'd-flex', 'remove-col'); - row.appendChild(removeCol); + if (data) { + row.querySelector('.field-open').value = data.open || ''; + row.querySelector('.field-close').value = data.close || ''; } - removeCol.innerHTML = ''; - removeCol.appendChild(removeButton); - } - - document.querySelectorAll('select.week_days').forEach(select => { - populateDropdown(select); + this.refs.list.appendChild(row); + this._syncData(); + } - select.addEventListener('change', function() { - updateAllSelects(); + _populateDaySelect(selectElement, selectedValue = null) { + this.daysOptions.forEach(day => { + const option = document.createElement('option'); + option.value = day.value; + option.textContent = day.label; + if (day.value === selectedValue) { + option.selected = true; + } + selectElement.appendChild(option); }); - }); - - const addButton = document.getElementById('add-opening-hours'); - const container = document.getElementById('opening-hours-container'); - const templateRow = document.querySelector('.opening-hours-row'); + } - if (addButton && container && templateRow) { - addButton.addEventListener('click', function(event) { - event.preventDefault(); + _syncData() { + const rows = this.refs.list.querySelectorAll('.opening-hours-row'); + const openingHours = {}; - const newRow = templateRow.cloneNode(true); - newRow.classList.add('dynamic-row'); + rows.forEach(row => { + const day = row.querySelector('.field-day').value; + const open = row.querySelector('.field-open').value; + const close = row.querySelector('.field-close').value; - const newSelect = newRow.querySelector('select.week_days'); - if (newSelect) { - newSelect.value = ''; - } - const opensInput = newRow.querySelector('.opens_at'); - if (opensInput) { - opensInput.value = ''; + if (day && open && close) { + if (!openingHours[day]) { + openingHours[day] = []; + } + openingHours[day].push({ open, close }); } - const closesInput = newRow.querySelector('.closes_at'); - if (closesInput) { - closesInput.value = ''; - } - - addRemoveButton(newRow); - - const addButtonRow = addButton.closest('.row.mt-4'); - container.insertBefore(newRow, addButtonRow); - - populateDropdown(newSelect); - - newSelect.addEventListener('change', function() { - updateAllSelects(); - }); - - updateAllSelects(); }); - } - document.querySelectorAll('.opening-hours-row').forEach(row => { - addRemoveButton(row); - }); - - container.addEventListener('click', function(event) { - if (event.target.closest('.remove-opening-hours')) { - event.preventDefault(); - const rowToRemove = event.target.closest('.opening-hours-row'); - if (rowToRemove) { - rowToRemove.remove(); - updateAllSelects(); - } - } - }); + this.refs.hiddenInput.value = JSON.stringify(openingHours); + } +} - updateAllSelects(); -}); +document.addEventListener('DOMContentLoaded', () => { + new OpeningHoursManager(); +}); \ No newline at end of file diff --git a/assets/js/user/edit-profile/load-agent-data.js b/assets/js/user/edit-profile/load-agent-data.js index 8b6404d87..29d0af189 100644 --- a/assets/js/user/edit-profile/load-agent-data.js +++ b/assets/js/user/edit-profile/load-agent-data.js @@ -12,8 +12,8 @@ function loadAgentData() { document.getElementById('name').value = data.name; document.getElementById('short-description').value = data.shortBio; document.getElementById('long-description').value = data.longBio; - document.getElementById('cargo').value = data.extraFields.cargo; - document.getElementById('cpf').value = data.extraFields.cpf; + document.getElementById('cargo').value = data.extraFields.cargo || ''; + document.getElementById('cpf').value = data.fiscalCode || ''; }) .catch(error => console.error('Error:', error)); } diff --git a/assets/styles/app.css b/assets/styles/app.css index 862602ddd..2102b44dd 100644 --- a/assets/styles/app.css +++ b/assets/styles/app.css @@ -310,6 +310,11 @@ body { display: flex; width: var(--WIDTH_DEFAULT); margin-left: 13rem; + margin-top: 3rem; +} + +.profile-entity-wrapper { + margin: 1.563rem 8.2rem; } .entry-fee, .participants { @@ -665,10 +670,20 @@ img.card-images__entity-details { margin-bottom: 1.875rem; } +.banner-img-container { + max-height: 31.25rem; +} +.banner-img-container img { + max-width: 100%; +} + .banner { width: 100%; - height: 12.5rem; + height: 16rem; position: relative; + background-repeat: no-repeat; + background-size: cover; + background-position: center center; } .banner-label { @@ -871,7 +886,8 @@ img.card-images__entity-details { gap: 0.625rem; } -.entity-edit-submit button { +.entity-edit-submit button, +.entity-edit-submit a { font-weight: bold; border: 2px solid; width: 10rem; @@ -1025,6 +1041,27 @@ img.card-images__entity-details { box-shadow: none; } +.input-no-focus:focus { + box-shadow: none !important; + border-color: transparent !important; +} + +.btn-filter-custom { + padding-left: 1.25rem; + padding-right: 1.25rem; +} + +.card-profile-img { + width: 4.375rem; + height: 4.375rem; + object-fit: cover; +} + +.space-img-wrapper { + width: 5rem; + height: 5rem; +} + @media (min-width: 1400px) { .name__entity-details { max-width: 755px; @@ -1103,6 +1140,7 @@ img.card-images__entity-details { .entity-page-tabs { position: relative; margin-left: 1.2rem; + margin-top: 0; align-items: center; white-space: nowrap; width: var(--WIDTH_DEFAULT_MOBILE); @@ -1114,6 +1152,10 @@ img.card-images__entity-details { padding-top: 0.8rem; } + .profile-entity-wrapper { + margin: 1.5rem 1rem !important; + } + .pill-tabs { display: flex; flex-direction: row; @@ -1220,6 +1262,24 @@ img.card-images__entity-details { .entity-edit-submit div { justify-content: space-between; } + + .space-btn-mobile { + width: 100% !important; + .tag-entity { + font-size: 0.7rem; + padding: 3px 8px; + gap: 0.3rem; + } + + .tag-entity::before { + width: 0.75rem; + height: 0.75rem; + } + + .btn-mobile-100 { + width: 100% !important; + padding: 0.8rem 0 !important; + } } @media (max-width: 576px) { @@ -1278,3 +1338,20 @@ button.gridjs-sort { display: block; margin: 0 auto; } + +/* Clipboard functionality styles */ +.cursor-pointer { + cursor: pointer; +} + +.cursor-pointer:hover { + opacity: 0.8; + transition: opacity 0.2s ease; +} + +.user-select-none { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} diff --git a/assets/styles/components/breadcrumb.css b/assets/styles/components/breadcrumb.css index 16daaefb5..faa406b14 100644 --- a/assets/styles/components/breadcrumb.css +++ b/assets/styles/components/breadcrumb.css @@ -44,4 +44,13 @@ .breadcrumb { width: var(--WIDTH_DEFAULT_MOBILE); } + + .entity-banner .breadcrumb { + margin-left: 1rem !important; + } + + .entity-photo img { + max-width: 7.5rem; + height: auto; + } } diff --git a/assets/styles/components/dashboard.css b/assets/styles/components/dashboard.css index 1a769fb44..d52db3a51 100644 --- a/assets/styles/components/dashboard.css +++ b/assets/styles/components/dashboard.css @@ -1,10 +1,6 @@ .entity-dashboard { - display: flex; - justify-content: center; - gap: 0.15rem; width: var(--WIDTH_DEFAULT); margin: 0 auto; - --bs-gutter-x: 0 !important; } .dashboard-card { diff --git a/assets/styles/components/entity-header.css b/assets/styles/components/entity-header.css new file mode 100644 index 000000000..1202bc0e0 --- /dev/null +++ b/assets/styles/components/entity-header.css @@ -0,0 +1,161 @@ +.entity-banner { + position: relative; +} + +.entity-banner img { + height: 256px; + width: 100%; + object-fit: cover; +} + +.entity-profile-bio { + padding-left: 8.5rem; + padding-right: 8.625rem; + margin-top: -3.75rem; + background: linear-gradient(to bottom, transparent 20%, white 80%); + box-shadow: 0 4px 8px 0 var(--box-shadow-color); +} + +.entity-profile-bio .entity-profile-label { + height: 2rem; + border-radius: 45px; + background-color: var(--color-highlight); + font-size: 14px; + font-weight: 700; + display: flex; + align-items: center; + gap: 5px; + padding: 0.406rem 1rem; + line-height: 0; +} + +.entity-profile-bio .entity-profile-label i { + font-size: 1.5rem; +} + +.entity-profile-bio .entity-description { + margin-top: 12px; + max-width: 93.75rem; + max-height: 3.125rem; +} + +.entity-photo img { + width: 7.5rem; + height: 7.5rem; + border-radius: 50%; + border: 0.0625rem solid var(--dark-gray); + z-index: 1; +} + +.entity-profile-actions button { + width: auto; + min-width: 12.5rem; + height: 3rem; + border: none; + background-color: var(--deep-teal); + color: var(--white-color); + font-weight: 700; + border-radius: 0.5rem; + padding: 0.75rem 1.5rem; +} + +.entity-profile-actions button i { + font-size: 1.4rem; +} + +.entity-profile-actions button:first-child { + background-color: var(--white-color); + color: var(--deep-teal); + border: 2px solid var(--deep-teal); + padding: 1rem 1rem; +} + +.entity-profile-actions button:nth-child(2) i { + height: 1.0625rem; +} + +.profile-tabs, .perfil-tabs { + margin-left: -15px; +} + +.profile-tabs .entity-page-tabs, .perfil-tabs .entity-page-tabs{ + margin: 0; + padding: 0; +} + +.profile-tabs span { + color: var(--paleGray); +} + +@media (max-width: 48rem) { + .entity-profile-bio { + padding-left: 1.5rem; + padding-right: 1.5rem; + padding-bottom: 1.5rem; + } + + .entity-banner .breadcrumb { + margin-left: 1.5rem; + } + + .entity-photo { + flex-direction: column; + align-items: center; + text-align: center; + gap: 1rem; + } + + .entity-profile-bio > .d-flex.justify-content-between { + flex-direction: column; + align-items: center; + } + + .entity-profile-bio .entity-profile-label { + height: auto; + min-height: 2rem; + line-height: 1.2; + text-align: center; + justify-content: center; + white-space: normal; + } + + .entity-profile-bio .entity-description { + max-height: none; + margin-bottom: 1.5rem; + text-align: center; + } + + .profile-tabs { + flex-direction: column; + align-items: flex-start; + gap: 1rem; + } + + .entity-profile-actions { + position: absolute; + top: 3.75rem; + right: 1.5rem; + transform: translateY(-50%); + margin-top: 0 !important; + z-index: 10; + } + + .entity-profile-actions button, + .entity-profile-actions button:first-child { + width: 2.5rem; + height: 2.5rem; + min-width: 0; + padding: 0; + border-radius: 50%; + } + + .entity-profile-actions button i { + font-size: 1.2rem; + margin: 0; + height: auto; + } + + .entity-page-tabs { + width: 100%; + } +} \ No newline at end of file diff --git a/assets/styles/components/navbar.css b/assets/styles/components/navbar.css index f7137e315..2ce981902 100644 --- a/assets/styles/components/navbar.css +++ b/assets/styles/components/navbar.css @@ -161,15 +161,114 @@ background-color: var(--hover-color); } +@media (max-width: 87.49875rem) { + .offcanvas-body .navbar-nav { + align-items: stretch; + width: 100%; + margin-bottom: 0.5rem; + justify-content: flex-start; + gap: 0; + } -@media (max-width: 768px) { - .dropdown-menu { + .offcanvas-body .nav-item { width: 100%; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + margin: 0; + padding: 0; } - .dropdown-content { - flex-wrap: wrap; + .offcanvas-body .nav-item:last-child { + border-bottom: none; + } + + .offcanvas-body .nav-link { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + padding: 0.75rem 0.5rem; + margin: 0; + gap: 1rem; + width: 100%; + } + + .offcanvas-body .nav-link p { + margin: 0; + padding: 0; + line-height: 1; + } + + .offcanvas-body > .d-flex.align-items-center.gap-3, + .offcanvas-body .notifications-login { + width: 100%; + flex-direction: column; + align-items: flex-start; + border-top: 1px solid rgba(0, 0, 0, 0.2); + padding-top: 0.75rem; + margin-top: 0.25rem; + gap: 1rem; + } + + .offcanvas-body .dropdown-notification { + width: 100%; + } + + .offcanvas-body #notificationDropdown { + margin-left: 0; + background-color: transparent; + padding-left: 0.5rem; + } + + .offcanvas-body .btn.dropdown-toggle { + background-color: transparent; + border: none; + padding-left: 0.5rem; } -} + .offcanvas-body .dropdown-menu { + position: static ; + width: 100% ; + min-width: unset ; + max-width: none ; + box-shadow: none ; + border: 1px solid rgba(0, 0, 0, 0.15); + margin-top: 0.5rem; + } + + .offcanvas-body .dropdown-content { + flex-direction: column; + gap: 0.5rem; + } + + .offcanvas-body .menu-column { + width: 100%; + } + + .navbar-brand-toogle { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + } + .navbar-brand-toogle a img { + max-height: 2.1875rem; + width: auto !important; + object-fit: contain; + } + + .navbar-toggler { + border: none; + padding: 0; + } + + .navbar-toggler:focus { + box-shadow: none; + } +} + +@media (min-width: 87.5rem) { + .notification-menu-mobile { + min-width: 25rem; + } +} diff --git a/assets/styles/lib/air-datepicker-custom.css b/assets/styles/lib/air-datepicker-custom.css new file mode 100644 index 000000000..4abec6291 --- /dev/null +++ b/assets/styles/lib/air-datepicker-custom.css @@ -0,0 +1,76 @@ +.air-datepicker-cell { + border: 2px solid var(--adp-border-color-inner); +} + +.air-datepicker-cell.-day- { + aspect-ratio: 1; +} + +.air-datepicker-body--cells { + gap: .3rem; +} + +.air-datepicker-body--cells.-days- { + grid-auto-rows: initial; +} + +.air-datepicker-nav { + border-bottom: initial; +} + +.air-datepicker-nav--title, .air-datepicker-nav--action { + font-weight: bold; +} + +.air-datepicker-nav--action { + border-radius: 50%; + border: 1px solid var(--adp-accent-color); + aspect-ratio: 1; + display: block; + padding: 0; +} + +.air-datepicker-nav--action path { + stroke: var(--adp-accent-color); +} + +.air-datepicker-nav--title { + background-color: var(--adp-accent-color); + color: var(--adp-background-color); + font-size: 14px; +} + +.air-datepicker-nav--title i { + color: var(--adp-background-color); +} + +.air-datepicker-nav--title:hover, .air-datepicker-nav--title:hover i { + color: var(--adp-accent-color); +} + +.air-datepicker { + --adp-font-size: 10px; + --adp-background-color: var(--bs-body-bg); + --adp-background-color-hover: var(--bs-primary-bg-subtle); + --adp-background-color-active: var(--bs-primary-bg-subtle); + --adp-background-color-in-range: rgba(var(--bs-primary-rgb), .1); + --adp-background-color-in-range-focused: rgba(var(--bs-primary-rgb), .2); + --adp-background-color-selected-other-month-focused: var(--bs-primary-bg-subtle); + --adp-background-color-selected-other-month: var(--bs-primary-bg-subtle); + --adp-color: var(--bs-body-color); + --adp-color-secondary: var(--bs-secondary-color); + --adp-accent-color: var(--bs-primary); + --adp-color-disabled: var(--bs-dropdown-link-disabled-color); + --adp-color-disabled-in-range: var(--bs-nav-link-disabled-color); + --adp-border-color: var(--bs-secondary-border-subtle); + --adp-day-name-color: var(--adp-color); + --adp-cell-border-radius: 7px; + --adp-cell-background-color-selected: var(--bs-primary); + --adp-cell-background-color-selected-hover: var(--bs-primary); + --adp-cell-background-color-in-range: var(--bs-primary-bg-subtle); + --adp-cell-background-color-in-range-hover: var(--bs-primary-border-subtle); +} + +.air-datepicker { + border: initial; +} diff --git a/assets/styles/pages/agents.css b/assets/styles/pages/agents.css index e71a0de4c..ba731d2ca 100644 --- a/assets/styles/pages/agents.css +++ b/assets/styles/pages/agents.css @@ -25,103 +25,10 @@ min-height: 100vh; } -.entity-banner { - position: relative; -} - -.entity-banner img { - height: 256px; - width: 100%; - object-fit: cover; -} - -.entity-profile-bio { - padding-left: 8.5rem; - padding-right: 8.625rem; - margin-top: -3.75rem; - background: linear-gradient(to bottom, transparent 20%, white 80%); - box-shadow: 0 4px 8px 0 var(--box-shadow-color); -} - -.entity-photo img { - width: 7.5rem; - height: 7.5rem; - border-radius: 50%; - border: 0.0625rem solid var(--dark-gray); - z-index: 1; -} - -.entity-profile-bio .entity-profile-label { - width: 6.563rem; - height: 2rem; - border-radius: 45px; - background-color: var(--color-highlight); - font-size: 14px; - font-weight: 700; - display: flex; - align-items: center; - gap: 5px; - padding: 0.406rem 1rem; - line-height: 0; -} - -.entity-profile-bio .entity-profile-label i { - font-size: 1.5rem; -} - -.entity-profile-actions button { - width: 12.5rem; - height: 3rem; - border: none; - background-color: var(--deep-teal); - color: var(--white-color); - font-weight: 700; - border-radius: 8px; - padding: 0.75rem 0.656rem; -} - -.entity-profile-actions button i { - font-size: 1.4rem; -} - -.entity-profile-actions button:nth-child(2) i { - height: 17px; -} - -.entity-profile-actions button:first-child { - background-color: var(--white-color); - color: var(--deep-teal); - border: 2px solid var(--deep-teal); - padding: 1rem 1rem; -} - -.entity-profile-bio .entity-description { - margin-top: 12px; - max-width: 93.75rem; - max-height: 3.125rem; -} - -.profile-tabs, .perfil-tabs { - margin-left: -15px; -} - -.profile-tabs .entity-page-tabs, .perfil-tabs .entity-page-tabs{ - margin: 0; - padding: 0; -} - -.profile-tabs span { - color: var(--paleGray); -} - -.profile-entity-wrapper { - margin: 1.563rem 8.2rem; -} - .profile-entity-wrapper .agent-organizations { background-color: var(--white-color); - height: 9.875rem; - border-radius: 4px; + height: auto; + border-radius: 0.25rem; } .agent-organizations { @@ -129,15 +36,16 @@ box-shadow: 0 4px 8px 0 var(--box-shadow-color); } -.agent-organizations__content .agent-organization img { +.agent-organization img { width: 2.5rem; height: 2.5rem; + min-width: 2.5rem; border-radius: 50%; object-fit: cover; } .agent-organization { - width: 23.625rem; + width: 100%; display: flex; align-items: center; gap: 15px; @@ -235,12 +143,6 @@ margin-bottom: 0; } -.agent-profile-actions { - display: flex; - justify-content: space-between; - margin-top: 30px; -} - .agent-profile-actions button { border: 2px solid var(--deep-teal); height: 3rem; @@ -317,4 +219,11 @@ padding-right: 0; margin-right: 0; } + + .agent-profile-actions button, + .agent-profile-actions button:first-child { + width: 100%; + min-width: 0; + } + } diff --git a/assets/styles/pages/initiatives.css b/assets/styles/pages/initiatives.css index c76199fbf..838d666b0 100644 --- a/assets/styles/pages/initiatives.css +++ b/assets/styles/pages/initiatives.css @@ -2,46 +2,19 @@ background-color: var(--card-bg-color); border: 1px solid var(--mid-gray); border-radius: 0.4375rem; - padding: 0.9375rem; - display: flex; - flex-direction: column; - justify-content: space-between; - margin-bottom: 0.625rem; box-shadow: 0 2px 10px var(--box-shadow-color, rgba(0, 0, 0, 0.1)); } -.initiative-card-header { - display: flex; - align-items: center; - justify-content: space-between; - gap: 1rem; - margin-bottom: 0.3125rem; -} - -.initiative-info { - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; -} - -.initiative-name { +.initiative-card__title { font-family: var(--font-open-sans); color: var(--btn-publish-custom-color); - margin-top: 0.825rem; - font-size: 1.25rem; + font-size: 1.125rem; font-weight: bold; } -.initiative-card-body { - padding: 10px 0; - font-size: 1rem; - line-height: 1.5; - margin-left: 81px; -} - -.initiative-info { - flex-grow: 1; +.initiative-card__type { + font-size: 0.9rem; + margin-bottom: 0.5rem; } .text-initiative { @@ -50,121 +23,28 @@ .bg-initiative { color: var(--white-color); - background-color: var(--navlink-initiative); + background-color: var(--bs-primary); font-family: var(--font-open-sans); padding: 0.25rem 0.625rem; border-radius: 0.9375rem; - font-size: 0.9rem; - font-weight: bold; - display: flex; - align-items: center; - justify-content: center; -} - -.initiative-id { - font-family: var(--font-open-sans); - font-size: 0.9rem; - margin-top: 5px; -} - -.initiative-type { - margin-left: auto; -} - -.initiative-description { - font-family: var(--font-open-sans); - color: var(--color-subtitle-gray); - margin-bottom: 10px; -} - -.initiative-seals { - display: flex; - align-items: center; - gap: 0.625rem; -} - -.initiative-date, .initiative-location { - color: var(--main-font-color); - display: flex; - align-items: center; -} - -.initiative-date i, .initiative-location i { - font-size: 1.5rem; - margin-right: 5px; -} - -.initiative-seals__entity-details { - width: 35px; - height: 35px; - border-radius: 50%; - background-color: var(--bg-color-images); -} - -.seal-initiative { + font-size: 0.85rem; font-weight: bold; - font-size: 0.8125rem; - margin: 0; - display: flex; - align-items: center; - gap: 0.4rem; -} - -.seal-initiative::before { - content: ''; - display: inline-block; - width: 0.9375rem; - height: 0.9375rem; - border-radius: 50%; - background-color: var(--bg-color-images); } .initiative-img { width: 4.125rem; height: 4.125rem; border-radius: 50%; + object-fit: cover; } @media (max-width: 768px) { - .initiative-info { - flex-direction: column-reverse; - max-width: 8rem; - height: 6rem; - justify-content: start; - gap: 0.625rem; - } - .initiative-img { width: 3.4375rem; height: 3.4375rem; - border-radius: 50%; - } - - .bg-initiative { - width: 8rem; - justify-self: start; - text-wrap: nowrap; - font-size: 0.7rem; - } - - .initiative-id { - padding-left: 0.625rem; - text-wrap: wrap; - } - - .initiative-card-body { - margin-left: 0; - } - - .initiative-seals { - gap: 0.3rem; - align-items: start; - flex-direction: column; - margin-bottom: 1rem; } - .initiative-name { + .initiative-card__title { font-size: 1rem; - margin: 0; } } diff --git a/assets/styles/pages/opportunities.css b/assets/styles/pages/opportunities.css new file mode 100644 index 000000000..ea68c970b --- /dev/null +++ b/assets/styles/pages/opportunities.css @@ -0,0 +1,52 @@ +.opportunity-card { + background-color: var(--card-bg-color); + border: 1px solid var(--mid-gray); + border-radius: 0.625rem; + padding: 1.25rem; + display: flex; + gap: 1.25rem; + margin-bottom: 0.9375rem; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + transition: transform 0.2s ease-in-out; +} + +.opportunity-card:hover { + transform: translateY(-3px); +} + +.opportunity-img { + width: 3.75rem; + height: 3.75rem; + object-fit: cover; +} + +.opportunity-card__title { + font-size: 1.125rem; + font-weight: bold; + color: var(--deep-teal); + margin-bottom: 0.125rem; +} + +.opportunity-card__type { + font-size: 0.875rem; + font-weight: 500; + color: var(--color-subtitle-gray); +} + +.opportunity-card__areas { + color: var(--dark-green); +} + +@media (max-width: 768px) { + .opportunity-img { + width: 4rem; + height: 4rem; + } + + .opportunity-card { + padding: 0.625rem; + flex-direction: column; + align-items: center; + text-align: center; + } +} diff --git a/assets/styles/pages/spaces.css b/assets/styles/pages/spaces.css index de052265f..4522d8f80 100644 --- a/assets/styles/pages/spaces.css +++ b/assets/styles/pages/spaces.css @@ -17,6 +17,7 @@ .space-img { width: 3.75rem; height: 3.75rem; + border-radius: 50%; object-fit: cover; } @@ -127,6 +128,10 @@ padding: 6px 12px; } +.responsive-icon { + font-size: 1.5rem; +} + @media (max-width: 768px) { .space-img { width: 4rem; @@ -143,6 +148,10 @@ font-size: 0.8rem; padding: 5px 10px; } + + .responsive-icon { + font-size: 1.25rem; + } } diff --git a/composer.json b/composer.json index 5a7b2366c..27a7724fc 100644 --- a/composer.json +++ b/composer.json @@ -11,34 +11,30 @@ "doctrine/dbal": "^3", "doctrine/doctrine-bundle": "^2.12", "doctrine/doctrine-migrations-bundle": "^3.3", - "doctrine/mongodb-odm-bundle": "^5.3", + "doctrine/mongodb-odm-bundle": "^5.0", "doctrine/orm": "^3.2", "league/flysystem-bundle": "^3.3", "lexik/jwt-authentication-bundle": "^3.1", - "mpdf/mpdf": "^8.2", "nelmio/cors-bundle": "^2.5", - "phpoffice/phpspreadsheet": "^5.0", - "symfony/asset": "7.2.*", - "symfony/asset-mapper": "7.2.*", - "symfony/console": "7.2.*", - "symfony/dotenv": "7.2.*", - "symfony/expression-language": "7.2.*", + "symfony/asset": "7.1.*", + "symfony/asset-mapper": "7.1.*", + "symfony/console": "7.1.*", + "symfony/dotenv": "7.1.*", "symfony/flex": "^2", - "symfony/framework-bundle": "7.2.*", - "symfony/mailer": "7.2.*", - "symfony/mime": "7.2.*", + "symfony/framework-bundle": "7.1.*", + "symfony/mime": "7.1.*", "symfony/monolog-bundle": "^3.10", - "symfony/property-access": "7.2.*", - "symfony/runtime": "7.2.*", - "symfony/security-bundle": "7.2.*", - "symfony/security-csrf": "7.2.*", - "symfony/serializer": "7.2.*", - "symfony/translation": "7.2.*", - "symfony/twig-bundle": "7.2.*", - "symfony/uid": "7.2.*", + "symfony/property-access": "7.1.*", + "symfony/runtime": "7.1.*", + "symfony/security-bundle": "7.1.*", + "symfony/security-csrf": "7.1.*", + "symfony/serializer": "7.1.*", + "symfony/translation": "7.1.*", + "symfony/twig-bundle": "7.1.*", + "symfony/uid": "7.1.*", "symfony/ux-translator": "^2.21", - "symfony/validator": "7.2.*", - "symfony/yaml": "7.2.*", + "symfony/validator": "7.1.*", + "symfony/yaml": "7.1.*", "twig/extra-bundle": "^2.12|^3.0", "twig/twig": "^2.12|^3.0" }, @@ -90,20 +86,21 @@ "extra": { "symfony": { "allow-contrib": false, - "require": "7.2.*" + "require": "7.1.*" } }, "require-dev": { - "brianium/paratest": "^7.9", + "brianium/paratest": "^7.6", "dama/doctrine-test-bundle": "^8.2", "doctrine/doctrine-fixtures-bundle": "^3.6", "friendsofphp/php-cs-fixer": "^3.62", - "phpunit/php-code-coverage": "^12.0", - "phpunit/phpunit": "^12.0", + "phpunit/php-code-coverage": "^11.0", + "phpunit/phpunit": "^11.3", "squizlabs/php_codesniffer": "*", - "symfony/browser-kit": "7.2.*", - "symfony/css-selector": "7.2.*", + "symfony/browser-kit": "7.1.*", + "symfony/css-selector": "7.1.*", "symfony/maker-bundle": "^1.60", - "symfony/phpunit-bridge": "^7.2" + "symfony/phpunit-bridge": "^7.1", + "symfony/stopwatch": "7.1.*" } } diff --git a/composer.lock b/composer.lock index f02915ab5..1beba0a82 100644 --- a/composer.lock +++ b/composer.lock @@ -4,87 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5f3e2cf89a8aadbe881604314bb9e107", + "content-hash": "f6b4a467b330c40558950aab49d17998", "packages": [ - { - "name": "composer/pcre", - "version": "3.3.2", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<1.11.10" - }, - "require-dev": { - "phpstan/phpstan": "^1.12 || ^2", - "phpstan/phpstan-strict-rules": "^1 || ^2", - "phpunit/phpunit": "^8 || ^9" - }, - "type": "library", - "extra": { - "phpstan": { - "includes": [ - "extension.neon" - ] - }, - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.2" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2024-11-12T16:29:46+00:00" - }, { "name": "composer/semver", "version": "3.4.3", @@ -261,29 +182,29 @@ }, { "name": "doctrine/collections", - "version": "2.3.0", + "version": "2.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d" + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/2eb07e5953eed811ce1b309a7478a3b236f2273d", - "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d", + "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", "shasum": "" }, "require": { "doctrine/deprecations": "^1", - "php": "^8.1", - "symfony/polyfill-php84": "^1.30" + "php": "^8.1" }, "require-dev": { "doctrine/coding-standard": "^12", "ext-json": "*", "phpstan/phpstan": "^1.8", "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^10.5" + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.11" }, "type": "library", "autoload": { @@ -327,7 +248,7 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.3.0" + "source": "https://github.com/doctrine/collections/tree/2.2.2" }, "funding": [ { @@ -343,20 +264,20 @@ "type": "tidelift" } ], - "time": "2025-03-22T10:17:19+00:00" + "time": "2024-04-18T06:56:21+00:00" }, { "name": "doctrine/dbal", - "version": "3.9.4", + "version": "3.9.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "ec16c82f20be1a7224e65ac67144a29199f87959" + "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/ec16c82f20be1a7224e65ac67144a29199f87959", - "reference": "ec16c82f20be1a7224e65ac67144a29199f87959", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/61446f07fcb522414d6cfd8b1c3e5f9e18c579ba", + "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba", "shasum": "" }, "require": { @@ -372,13 +293,15 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "2.1.1", - "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "9.6.22", + "phpstan/phpstan": "1.12.6", + "phpstan/phpstan-strict-rules": "^1.6", + "phpunit/phpunit": "9.6.20", + "psalm/plugin-phpunit": "0.18.4", "slevomat/coding-standard": "8.13.1", "squizlabs/php_codesniffer": "3.10.2", "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/console": "^4.4|^5.4|^6.0|^7.0" + "symfony/console": "^4.4|^5.4|^6.0|^7.0", + "vimeo/psalm": "4.30.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -438,7 +361,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.9.4" + "source": "https://github.com/doctrine/dbal/tree/3.9.3" }, "funding": [ { @@ -454,34 +377,33 @@ "type": "tidelift" } ], - "time": "2025-01-16T08:28:55+00:00" + "time": "2024-10-10T17:56:43+00:00" }, { "name": "doctrine/deprecations", - "version": "1.1.5", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, - "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" - }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12 || ^13", - "phpstan/phpstan": "1.4.10 || 2.1.11", - "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", - "psr/log": "^1 || ^2 || ^3" + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -489,7 +411,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\Deprecations\\": "src" + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" } }, "notification-url": "https://packagist.org/downloads/", @@ -500,70 +422,68 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" }, - "time": "2025-04-07T20:06:18+00:00" + "time": "2024-01-30T19:34:25+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "2.14.0", + "version": "2.13.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "ca6a7350b421baf7fbdefbf9f4993292ed18effb" + "reference": "2740ad8b8739b39ab37d409c972b092f632b025a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/ca6a7350b421baf7fbdefbf9f4993292ed18effb", - "reference": "ca6a7350b421baf7fbdefbf9f4993292ed18effb", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/2740ad8b8739b39ab37d409c972b092f632b025a", + "reference": "2740ad8b8739b39ab37d409c972b092f632b025a", "shasum": "" }, "require": { + "doctrine/cache": "^1.11 || ^2.0", "doctrine/dbal": "^3.7.0 || ^4.0", - "doctrine/persistence": "^3.1 || ^4", + "doctrine/persistence": "^2.2 || ^3", "doctrine/sql-formatter": "^1.0.1", - "php": "^8.1", - "symfony/cache": "^6.4 || ^7.0", - "symfony/config": "^6.4 || ^7.0", - "symfony/console": "^6.4 || ^7.0", - "symfony/dependency-injection": "^6.4 || ^7.0", + "php": "^7.4 || ^8.0", + "symfony/cache": "^5.4 || ^6.0 || ^7.0", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/doctrine-bridge": "^6.4.3 || ^7.0.3", - "symfony/framework-bundle": "^6.4 || ^7.0", - "symfony/service-contracts": "^2.5 || ^3" + "symfony/doctrine-bridge": "^5.4.46 || ^6.4.3 || ^7.0.3", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1.1 || ^2.0 || ^3" }, "conflict": { "doctrine/annotations": ">=3.0", - "doctrine/cache": "< 1.11", "doctrine/orm": "<2.17 || >=4.0", - "symfony/var-exporter": "< 6.4.1 || 7.0.0", - "twig/twig": "<2.13 || >=3.0 <3.0.4" + "twig/twig": "<1.34 || >=2.0 <2.4" }, "require-dev": { "doctrine/annotations": "^1 || ^2", - "doctrine/cache": "^1.11 || ^2.0", "doctrine/coding-standard": "^12", "doctrine/deprecations": "^1.0", "doctrine/orm": "^2.17 || ^3.0", "friendsofphp/proxy-manager-lts": "^1.0", - "phpstan/phpstan": "2.1.1", - "phpstan/phpstan-phpunit": "2.0.3", - "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "^9.6.22", + "phpunit/phpunit": "^9.5.26", + "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-symfony": "^5", "psr/log": "^1.1.4 || ^2.0 || ^3.0", - "symfony/doctrine-messenger": "^6.4 || ^7.0", - "symfony/messenger": "^6.4 || ^7.0", - "symfony/phpunit-bridge": "^7.2", - "symfony/property-info": "^6.4 || ^7.0", - "symfony/security-bundle": "^6.4 || ^7.0", - "symfony/stopwatch": "^6.4 || ^7.0", - "symfony/string": "^6.4 || ^7.0", - "symfony/twig-bridge": "^6.4 || ^7.0", - "symfony/validator": "^6.4 || ^7.0", - "symfony/var-exporter": "^6.4.1 || ^7.0.1", - "symfony/web-profiler-bundle": "^6.4 || ^7.0", - "symfony/yaml": "^6.4 || ^7.0", - "twig/twig": "^2.13 || ^3.0.4" + "symfony/phpunit-bridge": "^6.1 || ^7.0", + "symfony/property-info": "^5.4 || ^6.0 || ^7.0", + "symfony/proxy-manager-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/security-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", + "symfony/string": "^5.4 || ^6.0 || ^7.0", + "symfony/twig-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/validator": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^5.4 || ^6.2 || ^7.0", + "symfony/web-profiler-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0", + "twig/twig": "^1.34 || ^2.12 || ^3.0", + "vimeo/psalm": "^5.15" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", @@ -608,7 +528,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.14.0" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.13.1" }, "funding": [ { @@ -624,26 +544,26 @@ "type": "tidelift" } ], - "time": "2025-03-22T17:28:21+00:00" + "time": "2024-11-08T23:27:54+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "3.4.1", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "e858ce0f5c12b266dce7dce24834448355155da7" + "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/e858ce0f5c12b266dce7dce24834448355155da7", - "reference": "e858ce0f5c12b266dce7dce24834448355155da7", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", + "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", "shasum": "" }, "require": { "doctrine/doctrine-bundle": "^2.4", "doctrine/migrations": "^3.2", - "php": "^7.2 || ^8.0", + "php": "^7.2|^8.0", "symfony/deprecation-contracts": "^2.1 || ^3", "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" }, @@ -651,21 +571,27 @@ "composer/semver": "^3.0", "doctrine/coding-standard": "^12", "doctrine/orm": "^2.6 || ^3", - "doctrine/persistence": "^2.0 || ^3", - "phpstan/phpstan": "^1.4 || ^2", - "phpstan/phpstan-deprecation-rules": "^1 || ^2", - "phpstan/phpstan-phpunit": "^1 || ^2", - "phpstan/phpstan-strict-rules": "^1.1 || ^2", - "phpstan/phpstan-symfony": "^1.3 || ^2", - "phpunit/phpunit": "^8.5 || ^9.5", + "doctrine/persistence": "^2.0 || ^3 ", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^8.5|^9.5", + "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-symfony": "^3 || ^5", "symfony/phpunit-bridge": "^6.3 || ^7", - "symfony/var-exporter": "^5.4 || ^6 || ^7" + "symfony/var-exporter": "^5.4 || ^6 || ^7", + "vimeo/psalm": "^4.30 || ^5.15" }, "type": "symfony-bundle", "autoload": { "psr-4": { - "Doctrine\\Bundle\\MigrationsBundle\\": "src" - } + "Doctrine\\Bundle\\MigrationsBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -694,7 +620,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.4.1" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.3.1" }, "funding": [ { @@ -710,7 +636,7 @@ "type": "tidelift" } ], - "time": "2025-01-27T22:48:22+00:00" + "time": "2024-05-14T20:32:18+00:00" }, { "name": "doctrine/event-manager", @@ -1043,16 +969,16 @@ }, { "name": "doctrine/migrations", - "version": "3.9.0", + "version": "3.8.2", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "325b61e41d032f5f7d7e2d11cbefff656eadc9ab" + "reference": "5007eb1168691225ac305fe16856755c20860842" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/325b61e41d032f5f7d7e2d11cbefff656eadc9ab", - "reference": "325b61e41d032f5f7d7e2d11cbefff656eadc9ab", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/5007eb1168691225ac305fe16856755c20860842", + "reference": "5007eb1168691225ac305fe16856755c20860842", "shasum": "" }, "require": { @@ -1072,7 +998,7 @@ "require-dev": { "doctrine/coding-standard": "^12", "doctrine/orm": "^2.13 || ^3", - "doctrine/persistence": "^2 || ^3 || ^4", + "doctrine/persistence": "^2 || ^3", "doctrine/sql-formatter": "^1.0", "ext-pdo_sqlite": "*", "fig/log-test": "^1", @@ -1126,7 +1052,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.9.0" + "source": "https://github.com/doctrine/migrations/tree/3.8.2" }, "funding": [ { @@ -1142,20 +1068,20 @@ "type": "tidelift" } ], - "time": "2025-03-26T06:48:45+00:00" + "time": "2024-10-10T21:35:27+00:00" }, { "name": "doctrine/mongodb-odm", - "version": "2.11.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/doctrine/mongodb-odm.git", - "reference": "4cc52c287b1c3cfccdedc4e3a8d8e71223334a1b" + "reference": "3c9b1e8668343408cb70c9c9cd724b834d95438a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/mongodb-odm/zipball/4cc52c287b1c3cfccdedc4e3a8d8e71223334a1b", - "reference": "4cc52c287b1c3cfccdedc4e3a8d8e71223334a1b", + "url": "https://api.github.com/repos/doctrine/mongodb-odm/zipball/3c9b1e8668343408cb70c9c9cd724b834d95438a", + "reference": "3c9b1e8668343408cb70c9c9cd724b834d95438a", "shasum": "" }, "require": { @@ -1163,17 +1089,16 @@ "doctrine/collections": "^1.5 || ^2.0", "doctrine/event-manager": "^1.0 || ^2.0", "doctrine/instantiator": "^1.1 || ^2", - "doctrine/persistence": "^3.2 || ^4", - "ext-mongodb": "^1.21 || ^2.0", + "doctrine/persistence": "^3.2", + "ext-mongodb": "^1.17", "friendsofphp/proxy-manager-lts": "^1.0", "jean85/pretty-package-versions": "^1.3.0 || ^2.0.1", - "mongodb/mongodb": "^1.21 || ^2.0@dev", + "mongodb/mongodb": "^1.17.0", "php": "^8.1", "psr/cache": "^1.0 || ^2.0 || ^3.0", "symfony/console": "^5.4 || ^6.0 || ^7.0", "symfony/deprecation-contracts": "^2.2 || ^3.0", - "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", - "symfony/var-exporter": "^6.2 || ^7.0" + "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0" }, "conflict": { "doctrine/annotations": "<1.12 || >=3.0" @@ -1189,7 +1114,8 @@ "phpstan/phpstan-phpunit": "^1.0", "phpunit/phpunit": "^10.4", "squizlabs/php_codesniffer": "^3.5", - "symfony/cache": "^5.4 || ^6.0 || ^7.0" + "symfony/cache": "^5.4 || ^6.0 || ^7.0", + "vimeo/psalm": "~5.24.0" }, "suggest": { "doctrine/annotations": "For annotation mapping support", @@ -1240,7 +1166,7 @@ ], "support": { "issues": "https://github.com/doctrine/mongodb-odm/issues", - "source": "https://github.com/doctrine/mongodb-odm/tree/2.11.0" + "source": "https://github.com/doctrine/mongodb-odm/tree/2.9.0" }, "funding": [ { @@ -1256,27 +1182,27 @@ "type": "tidelift" } ], - "time": "2025-04-08T10:14:13+00:00" + "time": "2024-09-20T12:31:14+00:00" }, { "name": "doctrine/mongodb-odm-bundle", - "version": "5.3.0", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMongoDBBundle.git", - "reference": "e0a1b4342fb5f82abceef0098302b398ec2f67d7" + "reference": "33a9d71d8df6745120cc9b8e3bbdda0d8ff25345" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMongoDBBundle/zipball/e0a1b4342fb5f82abceef0098302b398ec2f67d7", - "reference": "e0a1b4342fb5f82abceef0098302b398ec2f67d7", + "url": "https://api.github.com/repos/doctrine/DoctrineMongoDBBundle/zipball/33a9d71d8df6745120cc9b8e3bbdda0d8ff25345", + "reference": "33a9d71d8df6745120cc9b8e3bbdda0d8ff25345", "shasum": "" }, "require": { "composer-runtime-api": "^2.0", "doctrine/mongodb-odm": "^2.6", - "doctrine/persistence": "^3.0 || ^4.0", - "ext-mongodb": "^1.16 || ^2", + "doctrine/persistence": "^3.0", + "ext-mongodb": "^1.16", "php": "^8.1", "psr/log": "^1.0 || ^2.0 || ^3.0", "symfony/config": "^6.4 || ^7.0", @@ -1288,21 +1214,21 @@ "symfony/options-resolver": "^6.4 || ^7.0" }, "conflict": { - "doctrine/data-fixtures": "<1.8 || >=3" + "doctrine/data-fixtures": "<1.3" }, "require-dev": { - "composer/semver": "^3.4", "doctrine/coding-standard": "^11.0", - "doctrine/data-fixtures": "^1.8 || ^2.0", - "phpstan/phpstan": "^2.0", + "doctrine/data-fixtures": "^1.7", "phpunit/phpunit": "^9.5.5", + "psalm/plugin-symfony": "^5.0", "symfony/browser-kit": "^6.4 || ^7.0", "symfony/form": "^6.4 || ^7.0", "symfony/phpunit-bridge": "^6.4.1 || ^7.0.1", "symfony/security-bundle": "^6.4 || ^7.0", "symfony/stopwatch": "^6.4 || ^7.0", "symfony/validator": "^6.4 || ^7.0", - "symfony/yaml": "^6.4 || ^7.0" + "symfony/yaml": "^6.4 || ^7.0", + "vimeo/psalm": "^5.25" }, "suggest": { "doctrine/data-fixtures": "Load data fixtures" @@ -1340,22 +1266,22 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMongoDBBundle/issues", - "source": "https://github.com/doctrine/DoctrineMongoDBBundle/tree/5.3.0" + "source": "https://github.com/doctrine/DoctrineMongoDBBundle/tree/5.1.0" }, - "time": "2025-04-08T16:32:24+00:00" + "time": "2024-11-04T08:53:08+00:00" }, { "name": "doctrine/orm", - "version": "3.3.2", + "version": "3.3.0", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "c9557c588b3a70ed93caff069d0aa75737f25609" + "reference": "69958152e661aa9c14e80d1ee4962863485aa60b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/c9557c588b3a70ed93caff069d0aa75737f25609", - "reference": "c9557c588b3a70ed93caff069d0aa75737f25609", + "url": "https://api.github.com/repos/doctrine/orm/zipball/69958152e661aa9c14e80d1ee4962863485aa60b", + "reference": "69958152e661aa9c14e80d1ee4962863485aa60b", "shasum": "" }, "require": { @@ -1367,7 +1293,7 @@ "doctrine/inflector": "^1.4 || ^2.0", "doctrine/instantiator": "^1.3 || ^2", "doctrine/lexer": "^3", - "doctrine/persistence": "^3.3.1 || ^4", + "doctrine/persistence": "^3.3.1", "ext-ctype": "*", "php": "^8.1", "psr/cache": "^1 || ^2 || ^3", @@ -1379,12 +1305,13 @@ "phpbench/phpbench": "^1.0", "phpdocumentor/guides-cli": "^1.4", "phpstan/extension-installer": "^1.4", - "phpstan/phpstan": "2.0.3", - "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan": "1.12.6", + "phpstan/phpstan-deprecation-rules": "^1.2", "phpunit/phpunit": "^10.4.0", "psr/log": "^1 || ^2 || ^3", "squizlabs/php_codesniffer": "3.7.2", - "symfony/cache": "^5.4 || ^6.2 || ^7.0" + "symfony/cache": "^5.4 || ^6.2 || ^7.0", + "vimeo/psalm": "5.24.0" }, "suggest": { "ext-dom": "Provides support for XSD validation for XML mapping files", @@ -1430,9 +1357,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.3.2" + "source": "https://github.com/doctrine/orm/tree/3.3.0" }, - "time": "2025-02-04T19:43:15+00:00" + "time": "2024-10-12T20:07:18+00:00" }, { "name": "doctrine/persistence", @@ -1532,16 +1459,16 @@ }, { "name": "doctrine/sql-formatter", - "version": "1.5.2", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8" + "reference": "b784cbde727cf806721451dde40eff4fec3bbe86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/d6d00aba6fd2957fe5216fe2b7673e9985db20c8", - "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/b784cbde727cf806721451dde40eff4fec3bbe86", + "reference": "b784cbde727cf806721451dde40eff4fec3bbe86", "shasum": "" }, "require": { @@ -1551,7 +1478,8 @@ "doctrine/coding-standard": "^12", "ergebnis/phpunit-slow-test-detector": "^2.14", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5" + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" }, "bin": [ "bin/sql-formatter" @@ -1581,76 +1509,9 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.5.2" - }, - "time": "2025-01-24T11:45:48+00:00" - }, - { - "name": "egulias/email-validator", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", - "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", - "shasum": "" - }, - "require": { - "doctrine/lexer": "^2.0 || ^3.0", - "php": ">=8.1", - "symfony/polyfill-intl-idn": "^1.26" - }, - "require-dev": { - "phpunit/phpunit": "^10.2", - "vimeo/psalm": "^5.12" - }, - "suggest": { - "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Egulias\\EmailValidator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eduardo Gulias Davis" - } - ], - "description": "A library for validating emails against several RFCs", - "homepage": "https://github.com/egulias/EmailValidator", - "keywords": [ - "email", - "emailvalidation", - "emailvalidator", - "validation", - "validator" - ], - "support": { - "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.1" }, - "funding": [ - { - "url": "https://github.com/egulias", - "type": "github" - } - ], - "time": "2025-03-06T22:45:56+00:00" + "time": "2024-10-21T18:21:57+00:00" }, { "name": "friendsofphp/proxy-manager-lts", @@ -1685,8 +1546,8 @@ "type": "library", "extra": { "thanks": { - "url": "https://github.com/Ocramius/ProxyManager", - "name": "ocramius/proxy-manager" + "name": "ocramius/proxy-manager", + "url": "https://github.com/Ocramius/ProxyManager" } }, "autoload": { @@ -1736,16 +1597,16 @@ }, { "name": "jean85/pretty-package-versions", - "version": "2.1.1", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a" + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a", - "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", "shasum": "" }, "require": { @@ -1755,9 +1616,8 @@ "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "jean85/composer-provided-replaced-stub-package": "^1.0", - "phpstan/phpstan": "^2.0", + "phpstan/phpstan": "^1.4", "phpunit/phpunit": "^7.5|^8.5|^9.6", - "rector/rector": "^2.0", "vimeo/psalm": "^4.3 || ^5.0" }, "type": "library", @@ -1790,9 +1650,9 @@ ], "support": { "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.1" + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.0" }, - "time": "2025-03-19T14:43:43+00:00" + "time": "2024-11-18T16:19:46+00:00" }, { "name": "laminas/laminas-code", @@ -1923,16 +1783,16 @@ }, { "name": "lcobucci/jwt", - "version": "5.5.0", + "version": "5.4.2", "source": { "type": "git", "url": "https://github.com/lcobucci/jwt.git", - "reference": "a835af59b030d3f2967725697cf88300f579088e" + "reference": "ea1ce71cbf9741e445a5914e2f67cdbb484ff712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/a835af59b030d3f2967725697cf88300f579088e", - "reference": "a835af59b030d3f2967725697cf88300f579088e", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/ea1ce71cbf9741e445a5914e2f67cdbb484ff712", + "reference": "ea1ce71cbf9741e445a5914e2f67cdbb484ff712", "shasum": "" }, "require": { @@ -1980,7 +1840,7 @@ ], "support": { "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/5.5.0" + "source": "https://github.com/lcobucci/jwt/tree/5.4.2" }, "funding": [ { @@ -1992,7 +1852,7 @@ "type": "patreon" } ], - "time": "2025-01-26T21:29:45+00:00" + "time": "2024-11-07T12:54:35+00:00" }, { "name": "league/flysystem", @@ -2079,16 +1939,16 @@ }, { "name": "league/flysystem-bundle", - "version": "3.4.0", + "version": "3.3.5", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-bundle.git", - "reference": "6493f7f2ab49bc5817e4b064b9b971d93faabc12" + "reference": "4fff744a247d360cb7b0b5f641d951f27d37013c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-bundle/zipball/6493f7f2ab49bc5817e4b064b9b971d93faabc12", - "reference": "6493f7f2ab49bc5817e4b064b9b971d93faabc12", + "url": "https://api.github.com/repos/thephpleague/flysystem-bundle/zipball/4fff744a247d360cb7b0b5f641d951f27d37013c", + "reference": "4fff744a247d360cb7b0b5f641d951f27d37013c", "shasum": "" }, "require": { @@ -2111,7 +1971,6 @@ "league/flysystem-memory": "^3.1", "league/flysystem-read-only": "^3.15", "league/flysystem-sftp-v3": "^3.1", - "league/flysystem-webdav": "^3.29", "symfony/dotenv": "^5.4 || ^6.0 || ^7.0", "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0", "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0", @@ -2134,18 +1993,12 @@ "email": "galopintitouan@gmail.com" } ], - "description": "Symfony bundle integrating Flysystem into Symfony applications", - "keywords": [ - "Flysystem", - "bundle", - "filesystem", - "symfony" - ], + "description": "Symfony bundle integrating Flysystem into Symfony 5.4+ applications", "support": { "issues": "https://github.com/thephpleague/flysystem-bundle/issues", - "source": "https://github.com/thephpleague/flysystem-bundle/tree/3.4.0" + "source": "https://github.com/thephpleague/flysystem-bundle/tree/3.3.5" }, - "time": "2025-01-23T18:07:31+00:00" + "time": "2024-05-30T20:04:21+00:00" }, { "name": "league/flysystem-local", @@ -2254,16 +2107,16 @@ }, { "name": "lexik/jwt-authentication-bundle", - "version": "v3.1.1", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/lexik/LexikJWTAuthenticationBundle.git", - "reference": "ebe0e2c6a0ae17b4702feffc89e32e3aaba6cb61" + "reference": "4f1a638289cf9282bad1b82b8df56d3bd4e0743c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lexik/LexikJWTAuthenticationBundle/zipball/ebe0e2c6a0ae17b4702feffc89e32e3aaba6cb61", - "reference": "ebe0e2c6a0ae17b4702feffc89e32e3aaba6cb61", + "url": "https://api.github.com/repos/lexik/LexikJWTAuthenticationBundle/zipball/4f1a638289cf9282bad1b82b8df56d3bd4e0743c", + "reference": "4f1a638289cf9282bad1b82b8df56d3bd4e0743c", "shasum": "" }, "require": { @@ -2282,8 +2135,7 @@ "symfony/translation-contracts": "^1.0|^2.0|^3.0" }, "require-dev": { - "api-platform/core": "^3.0|^4.0", - "rector/rector": "^1.2", + "api-platform/core": "^3.0", "symfony/browser-kit": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", "symfony/dom-crawler": "^6.4|^7.0", @@ -2354,7 +2206,7 @@ ], "support": { "issues": "https://github.com/lexik/LexikJWTAuthenticationBundle/issues", - "source": "https://github.com/lexik/LexikJWTAuthenticationBundle/tree/v3.1.1" + "source": "https://github.com/lexik/LexikJWTAuthenticationBundle/tree/v3.1.0" }, "funding": [ { @@ -2366,310 +2218,126 @@ "type": "tidelift" } ], - "time": "2025-01-06T16:34:57+00:00" + "time": "2024-07-03T20:49:59+00:00" }, { - "name": "maennchen/zipstream-php", - "version": "3.2.0", + "name": "mongodb/mongodb", + "version": "1.20.0", "source": { "type": "git", - "url": "https://github.com/maennchen/ZipStream-PHP.git", - "reference": "9712d8fa4cdf9240380b01eb4be55ad8dcf71416" + "url": "https://github.com/mongodb/mongo-php-library.git", + "reference": "75da9ea3b63d97b05e0e8648d8c09a17bc54c0b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/9712d8fa4cdf9240380b01eb4be55ad8dcf71416", - "reference": "9712d8fa4cdf9240380b01eb4be55ad8dcf71416", + "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/75da9ea3b63d97b05e0e8648d8c09a17bc54c0b6", + "reference": "75da9ea3b63d97b05e0e8648d8c09a17bc54c0b6", "shasum": "" }, "require": { - "ext-mbstring": "*", - "ext-zlib": "*", - "php-64bit": "^8.3" + "composer-runtime-api": "^2.0", + "ext-hash": "*", + "ext-json": "*", + "ext-mongodb": "^1.20.0", + "php": "^7.4 || ^8.0", + "psr/log": "^1.1.4|^2|^3", + "symfony/polyfill-php80": "^1.27", + "symfony/polyfill-php81": "^1.27" }, "require-dev": { - "brianium/paratest": "^7.7", - "ext-zip": "*", - "friendsofphp/php-cs-fixer": "^3.16", - "guzzlehttp/guzzle": "^7.5", - "mikey179/vfsstream": "^1.6", - "php-coveralls/php-coveralls": "^2.5", - "phpunit/phpunit": "^12.0", - "vimeo/psalm": "^6.0" - }, - "suggest": { - "guzzlehttp/psr7": "^2.4", - "psr/http-message": "^2.0" + "doctrine/coding-standard": "^12.0", + "rector/rector": "^1.1", + "squizlabs/php_codesniffer": "^3.7", + "symfony/phpunit-bridge": "^5.2", + "vimeo/psalm": "^5.13" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "ZipStream\\": "src/" + "MongoDB\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "Apache-2.0" ], "authors": [ { - "name": "Paul Duncan", - "email": "pabs@pablotron.org" - }, - { - "name": "Jonatan Männchen", - "email": "jonatan@maennchen.ch" + "name": "Andreas Braun", + "email": "andreas.braun@mongodb.com" }, { - "name": "Jesse Donat", - "email": "donatj@gmail.com" + "name": "Jeremy Mikola", + "email": "jmikola@gmail.com" }, { - "name": "András Kolesár", - "email": "kolesar@kolesar.hu" + "name": "Jérôme Tamarelle", + "email": "jerome.tamarelle@mongodb.com" } ], - "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "description": "MongoDB driver library", + "homepage": "https://jira.mongodb.org/browse/PHPLIB", "keywords": [ - "stream", - "zip" + "database", + "driver", + "mongodb", + "persistence" ], "support": { - "issues": "https://github.com/maennchen/ZipStream-PHP/issues", - "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.2.0" + "issues": "https://github.com/mongodb/mongo-php-library/issues", + "source": "https://github.com/mongodb/mongo-php-library/tree/1.20.0" }, - "funding": [ - { - "url": "https://github.com/maennchen", - "type": "github" - } - ], - "time": "2025-07-17T11:15:13+00:00" + "time": "2024-09-25T12:54:08+00:00" }, { - "name": "markbaker/complex", - "version": "3.0.2", + "name": "monolog/monolog", + "version": "3.8.0", "source": { "type": "git", - "url": "https://github.com/MarkBaker/PHPComplex.git", - "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9" + "url": "https://github.com/Seldaek/monolog.git", + "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9", - "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/32e515fdc02cdafbe4593e30a9350d486b125b67", + "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "dev-master", - "phpcompatibility/php-compatibility": "^9.3", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "squizlabs/php_codesniffer": "^3.7" - }, - "type": "library", - "autoload": { - "psr-4": { - "Complex\\": "classes/src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Baker", - "email": "mark@lange.demon.co.uk" - } - ], - "description": "PHP Class for working with complex numbers", - "homepage": "https://github.com/MarkBaker/PHPComplex", - "keywords": [ - "complex", - "mathematics" - ], - "support": { - "issues": "https://github.com/MarkBaker/PHPComplex/issues", - "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2" - }, - "time": "2022-12-06T16:21:08+00:00" - }, - { - "name": "markbaker/matrix", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/MarkBaker/PHPMatrix.git", - "reference": "728434227fe21be27ff6d86621a1b13107a2562c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", - "reference": "728434227fe21be27ff6d86621a1b13107a2562c", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "dev-master", - "phpcompatibility/php-compatibility": "^9.3", - "phpdocumentor/phpdocumentor": "2.*", - "phploc/phploc": "^4.0", - "phpmd/phpmd": "2.*", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "sebastian/phpcpd": "^4.0", - "squizlabs/php_codesniffer": "^3.7" - }, - "type": "library", - "autoload": { - "psr-4": { - "Matrix\\": "classes/src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Baker", - "email": "mark@demon-angel.eu" - } - ], - "description": "PHP Class for working with matrices", - "homepage": "https://github.com/MarkBaker/PHPMatrix", - "keywords": [ - "mathematics", - "matrix", - "vector" - ], - "support": { - "issues": "https://github.com/MarkBaker/PHPMatrix/issues", - "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" - }, - "time": "2022-12-02T22:17:43+00:00" - }, - { - "name": "mongodb/mongodb", - "version": "1.21.1", - "source": { - "type": "git", - "url": "https://github.com/mongodb/mongo-php-library.git", - "reference": "37bc8df3a67ddf8380704a5ba5dbd00e92ec1f6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/37bc8df3a67ddf8380704a5ba5dbd00e92ec1f6a", - "reference": "37bc8df3a67ddf8380704a5ba5dbd00e92ec1f6a", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.0", - "ext-mongodb": "^1.21.0", - "php": "^8.1", - "psr/log": "^1.1.4|^2|^3" - }, - "replace": { - "mongodb/builder": "*" - }, - "require-dev": { - "doctrine/coding-standard": "^12.0", - "phpunit/phpunit": "^10.5.35", - "rector/rector": "^1.2", - "squizlabs/php_codesniffer": "^3.7", - "vimeo/psalm": "6.5.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "MongoDB\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Andreas Braun", - "email": "andreas.braun@mongodb.com" - }, - { - "name": "Jeremy Mikola", - "email": "jmikola@gmail.com" - }, - { - "name": "Jérôme Tamarelle", - "email": "jerome.tamarelle@mongodb.com" - } - ], - "description": "MongoDB driver library", - "homepage": "https://jira.mongodb.org/browse/PHPLIB", - "keywords": [ - "database", - "driver", - "mongodb", - "persistence" - ], - "support": { - "issues": "https://github.com/mongodb/mongo-php-library/issues", - "source": "https://github.com/mongodb/mongo-php-library/tree/1.21.1" - }, - "time": "2025-02-28T17:24:20+00:00" - }, - { - "name": "monolog/monolog", - "version": "3.9.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", - "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/log": "^2.0 || ^3.0" - }, - "provide": { - "psr/log-implementation": "3.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7 || ^8", - "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2.0", - "guzzlehttp/guzzle": "^7.4.5", - "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", - "php-amqplib/php-amqplib": "~2.4 || ^3", - "php-console/php-console": "^3.1.8", - "phpstan/phpstan": "^2", - "phpstan/phpstan-deprecation-rules": "^2", - "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "^10.5.17 || ^11.0.7", - "predis/predis": "^1.1 || ^2", - "rollbar/rollbar": "^4.0", - "ruflin/elastica": "^7 || ^8", - "symfony/mailer": "^5.4 || ^6", - "symfony/mime": "^5.4 || ^6" + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" }, "suggest": { "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", @@ -2718,7 +2386,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.9.0" + "source": "https://github.com/Seldaek/monolog/tree/3.8.0" }, "funding": [ { @@ -2730,240 +2398,7 @@ "type": "tidelift" } ], - "time": "2025-03-24T10:02:05+00:00" - }, - { - "name": "mpdf/mpdf", - "version": "v8.2.5", - "source": { - "type": "git", - "url": "https://github.com/mpdf/mpdf.git", - "reference": "e175b05e3e00977b85feb96a8cccb174ac63621f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mpdf/mpdf/zipball/e175b05e3e00977b85feb96a8cccb174ac63621f", - "reference": "e175b05e3e00977b85feb96a8cccb174ac63621f", - "shasum": "" - }, - "require": { - "ext-gd": "*", - "ext-mbstring": "*", - "mpdf/psr-http-message-shim": "^1.0 || ^2.0", - "mpdf/psr-log-aware-trait": "^2.0 || ^3.0", - "myclabs/deep-copy": "^1.7", - "paragonie/random_compat": "^1.4|^2.0|^9.99.99", - "php": "^5.6 || ^7.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", - "psr/http-message": "^1.0 || ^2.0", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "setasign/fpdi": "^2.1" - }, - "require-dev": { - "mockery/mockery": "^1.3.0", - "mpdf/qrcode": "^1.1.0", - "squizlabs/php_codesniffer": "^3.5.0", - "tracy/tracy": "~2.5", - "yoast/phpunit-polyfills": "^1.0" - }, - "suggest": { - "ext-bcmath": "Needed for generation of some types of barcodes", - "ext-xml": "Needed mainly for SVG manipulation", - "ext-zlib": "Needed for compression of embedded resources, such as fonts" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Mpdf\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-only" - ], - "authors": [ - { - "name": "Matěj Humpál", - "role": "Developer, maintainer" - }, - { - "name": "Ian Back", - "role": "Developer (retired)" - } - ], - "description": "PHP library generating PDF files from UTF-8 encoded HTML", - "homepage": "https://mpdf.github.io", - "keywords": [ - "pdf", - "php", - "utf-8" - ], - "support": { - "docs": "https://mpdf.github.io", - "issues": "https://github.com/mpdf/mpdf/issues", - "source": "https://github.com/mpdf/mpdf" - }, - "funding": [ - { - "url": "https://www.paypal.me/mpdf", - "type": "custom" - } - ], - "time": "2024-11-18T15:30:42+00:00" - }, - { - "name": "mpdf/psr-http-message-shim", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/mpdf/psr-http-message-shim.git", - "reference": "f25a0153d645e234f9db42e5433b16d9b113920f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mpdf/psr-http-message-shim/zipball/f25a0153d645e234f9db42e5433b16d9b113920f", - "reference": "f25a0153d645e234f9db42e5433b16d9b113920f", - "shasum": "" - }, - "require": { - "psr/http-message": "^2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Mpdf\\PsrHttpMessageShim\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Dorison", - "email": "mark@chromatichq.com" - }, - { - "name": "Kristofer Widholm", - "email": "kristofer@chromatichq.com" - }, - { - "name": "Nigel Cunningham", - "email": "nigel.cunningham@technocrat.com.au" - } - ], - "description": "Shim to allow support of different psr/message versions.", - "support": { - "issues": "https://github.com/mpdf/psr-http-message-shim/issues", - "source": "https://github.com/mpdf/psr-http-message-shim/tree/v2.0.1" - }, - "time": "2023-10-02T14:34:03+00:00" - }, - { - "name": "mpdf/psr-log-aware-trait", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/mpdf/psr-log-aware-trait.git", - "reference": "a633da6065e946cc491e1c962850344bb0bf3e78" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mpdf/psr-log-aware-trait/zipball/a633da6065e946cc491e1c962850344bb0bf3e78", - "reference": "a633da6065e946cc491e1c962850344bb0bf3e78", - "shasum": "" - }, - "require": { - "psr/log": "^3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Mpdf\\PsrLogAwareTrait\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Dorison", - "email": "mark@chromatichq.com" - }, - { - "name": "Kristofer Widholm", - "email": "kristofer@chromatichq.com" - } - ], - "description": "Trait to allow support of different psr/log versions.", - "support": { - "issues": "https://github.com/mpdf/psr-log-aware-trait/issues", - "source": "https://github.com/mpdf/psr-log-aware-trait/tree/v3.0.0" - }, - "time": "2023-05-03T06:19:36+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.13.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2025-02-12T12:17:51+00:00" + "time": "2024-11-12T13:57:08+00:00" }, { "name": "nelmio/cors-bundle", @@ -2973,173 +2408,33 @@ "url": "https://github.com/nelmio/NelmioCorsBundle.git", "reference": "3a526fe025cd20e04a6a11370cf5ab28dbb5a544" }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/3a526fe025cd20e04a6a11370cf5ab28dbb5a544", - "reference": "3a526fe025cd20e04a6a11370cf5ab28dbb5a544", - "shasum": "" - }, - "require": { - "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" - }, - "require-dev": { - "mockery/mockery": "^1.3.6", - "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Nelmio\\CorsBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nelmio", - "homepage": "http://nelm.io" - }, - { - "name": "Symfony Community", - "homepage": "https://github.com/nelmio/NelmioCorsBundle/contributors" - } - ], - "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Symfony application", - "keywords": [ - "api", - "cors", - "crossdomain" - ], - "support": { - "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", - "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.5.0" - }, - "time": "2024-06-24T21:25:28+00:00" - }, - { - "name": "paragonie/random_compat", - "version": "v9.99.100", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", - "shasum": "" - }, - "require": { - "php": ">= 7" - }, - "require-dev": { - "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^1" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" - ], - "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/random_compat/issues", - "source": "https://github.com/paragonie/random_compat" - }, - "time": "2020-10-15T08:29:30+00:00" - }, - { - "name": "phpoffice/phpspreadsheet", - "version": "5.0.0", - "source": { - "type": "git", - "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "d88efcac2444cde18e17684178de02b25dff2050" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/d88efcac2444cde18e17684178de02b25dff2050", - "reference": "d88efcac2444cde18e17684178de02b25dff2050", - "shasum": "" - }, - "require": { - "composer/pcre": "^1||^2||^3", - "ext-ctype": "*", - "ext-dom": "*", - "ext-fileinfo": "*", - "ext-gd": "*", - "ext-iconv": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "ext-xml": "*", - "ext-xmlreader": "*", - "ext-xmlwriter": "*", - "ext-zip": "*", - "ext-zlib": "*", - "maennchen/zipstream-php": "^2.1 || ^3.0", - "markbaker/complex": "^3.0", - "markbaker/matrix": "^3.0", - "php": "^8.1", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/3a526fe025cd20e04a6a11370cf5ab28dbb5a544", + "reference": "3a526fe025cd20e04a6a11370cf5ab28dbb5a544", + "shasum": "" + }, + "require": { + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "dev-main", - "dompdf/dompdf": "^2.0 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.2", - "mitoteam/jpgraph": "^10.3", - "mpdf/mpdf": "^8.1.1", - "phpcompatibility/php-compatibility": "^9.3", - "phpstan/phpstan": "^1.1 || ^2.0", - "phpstan/phpstan-deprecation-rules": "^1.0 || ^2.0", - "phpstan/phpstan-phpunit": "^1.0 || ^2.0", - "phpunit/phpunit": "^10.5", - "squizlabs/php_codesniffer": "^3.7", - "tecnickcom/tcpdf": "^6.5" + "mockery/mockery": "^1.3.6", + "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0" }, - "suggest": { - "dompdf/dompdf": "Option for rendering PDF with PDF Writer", - "ext-intl": "PHP Internationalization Functions", - "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", - "mpdf/mpdf": "Option for rendering PDF with PDF Writer", - "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } }, - "type": "library", "autoload": { "psr-4": { - "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" - } + "Nelmio\\CorsBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3147,41 +2442,25 @@ ], "authors": [ { - "name": "Maarten Balliauw", - "homepage": "https://blog.maartenballiauw.be" - }, - { - "name": "Mark Baker", - "homepage": "https://markbakeruk.net" - }, - { - "name": "Franck Lefevre", - "homepage": "https://rootslabs.net" - }, - { - "name": "Erik Tilt" + "name": "Nelmio", + "homepage": "http://nelm.io" }, { - "name": "Adrien Crivelli" + "name": "Symfony Community", + "homepage": "https://github.com/nelmio/NelmioCorsBundle/contributors" } ], - "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", - "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Symfony application", "keywords": [ - "OpenXML", - "excel", - "gnumeric", - "ods", - "php", - "spreadsheet", - "xls", - "xlsx" + "api", + "cors", + "crossdomain" ], "support": { - "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/5.0.0" + "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", + "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.5.0" }, - "time": "2025-08-10T06:18:27+00:00" + "time": "2024-06-24T21:25:28+00:00" }, { "name": "psr/cache", @@ -3329,296 +2608,36 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" - }, - "time": "2021-11-05T16:47:00+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, - "time": "2019-01-08T18:20:26+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client" - }, - "time": "2023-09-23T14:17:50+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory" - }, - "time": "2024-04-15T12:06:14+00:00" - }, - { - "name": "psr/http-message", - "version": "2.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/2.0" - }, - "time": "2023-04-04T09:54:51+00:00" - }, - { - "name": "psr/log", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/3.0.2" + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2024-09-11T13:17:53+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { - "name": "psr/simple-cache", - "version": "3.0.0", + "name": "psr/event-dispatcher", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": ">=7.2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Psr\\SimpleCache\\": "src/" + "Psr\\EventDispatcher\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3628,57 +2647,47 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "homepage": "http://www.php-fig.org/" } ], - "description": "Common interfaces for simple caching", + "description": "Standard interfaces for event handling.", "keywords": [ - "cache", - "caching", + "events", "psr", - "psr-16", - "simple-cache" + "psr-14" ], "support": { - "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" }, - "time": "2021-10-29T13:26:27+00:00" + "time": "2019-01-08T18:20:26+00:00" }, { - "name": "setasign/fpdi", - "version": "v2.6.4", + "name": "psr/log", + "version": "3.0.2", "source": { "type": "git", - "url": "https://github.com/Setasign/FPDI.git", - "reference": "4b53852fde2734ec6a07e458a085db627c60eada" + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Setasign/FPDI/zipball/4b53852fde2734ec6a07e458a085db627c60eada", - "reference": "4b53852fde2734ec6a07e458a085db627c60eada", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { - "ext-zlib": "*", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "setasign/tfpdf": "<1.31" - }, - "require-dev": { - "phpunit/phpunit": "^7", - "setasign/fpdf": "~1.8.6", - "setasign/tfpdf": "~1.33", - "squizlabs/php_codesniffer": "^3.5", - "tecnickcom/tcpdf": "^6.8" - }, - "suggest": { - "setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured." + "php": ">=8.0.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, "autoload": { "psr-4": { - "setasign\\Fpdi\\": "src/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -3687,47 +2696,34 @@ ], "authors": [ { - "name": "Jan Slabon", - "email": "jan.slabon@setasign.com", - "homepage": "https://www.setasign.com" - }, - { - "name": "Maximilian Kresse", - "email": "maximilian.kresse@setasign.com", - "homepage": "https://www.setasign.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.", - "homepage": "https://www.setasign.com/fpdi", + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", "keywords": [ - "fpdf", - "fpdi", - "pdf" + "log", + "psr", + "psr-3" ], "support": { - "issues": "https://github.com/Setasign/FPDI/issues", - "source": "https://github.com/Setasign/FPDI/tree/v2.6.4" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/setasign/fpdi", - "type": "tidelift" - } - ], - "time": "2025-08-05T09:57:14+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "symfony/asset", - "version": "v7.2.0", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "cb926cd59fefa1f9b4900b3695f0f846797ba5c0" + "reference": "0dcd51490d7fc9fbf3c8f5aec6df182920fc0426" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/cb926cd59fefa1f9b4900b3695f0f846797ba5c0", - "reference": "cb926cd59fefa1f9b4900b3695f0f846797ba5c0", + "url": "https://api.github.com/repos/symfony/asset/zipball/0dcd51490d7fc9fbf3c8f5aec6df182920fc0426", + "reference": "0dcd51490d7fc9fbf3c8f5aec6df182920fc0426", "shasum": "" }, "require": { @@ -3767,7 +2763,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v7.2.0" + "source": "https://github.com/symfony/asset/tree/v7.1.6" }, "funding": [ { @@ -3783,20 +2779,20 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:15:23+00:00" + "time": "2024-10-25T15:11:02+00:00" }, { "name": "symfony/asset-mapper", - "version": "v7.2.5", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/asset-mapper.git", - "reference": "6428e4b6d8cff9c5fe6f40ddbee4c9f6bfdaa0b8" + "reference": "bd09ac29c8553e39832f6100a8365240c1c697a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/6428e4b6d8cff9c5fe6f40ddbee4c9f6bfdaa0b8", - "reference": "6428e4b6d8cff9c5fe6f40ddbee4c9f6bfdaa0b8", + "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/bd09ac29c8553e39832f6100a8365240c1c697a6", + "reference": "bd09ac29c8553e39832f6100a8365240c1c697a6", "shasum": "" }, "require": { @@ -3846,7 +2842,7 @@ "description": "Maps directories of assets & makes them available in a public directory with versioned filenames.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset-mapper/tree/v7.2.5" + "source": "https://github.com/symfony/asset-mapper/tree/v7.1.8" }, "funding": [ { @@ -3862,20 +2858,20 @@ "type": "tidelift" } ], - "time": "2025-03-26T11:29:07+00:00" + "time": "2024-11-09T09:16:45+00:00" }, { "name": "symfony/cache", - "version": "v7.2.5", + "version": "v7.1.7", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "9131e3018872d2ebb6fe8a9a4d6631273513d42c" + "reference": "23b61c9592ee72233c31625f0ae805dd1571e928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/9131e3018872d2ebb6fe8a9a4d6631273513d42c", - "reference": "9131e3018872d2ebb6fe8a9a4d6631273513d42c", + "url": "https://api.github.com/repos/symfony/cache/zipball/23b61c9592ee72233c31625f0ae805dd1571e928", + "reference": "23b61c9592ee72233c31625f0ae805dd1571e928", "shasum": "" }, "require": { @@ -3903,7 +2899,6 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/clock": "^6.4|^7.0", "symfony/config": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/filesystem": "^6.4|^7.0", @@ -3944,7 +2939,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.2.5" + "source": "https://github.com/symfony/cache/tree/v7.1.7" }, "funding": [ { @@ -3960,20 +2955,20 @@ "type": "tidelift" } ], - "time": "2025-03-25T15:54:33+00:00" + "time": "2024-11-05T15:34:55+00:00" }, { "name": "symfony/cache-contracts", - "version": "v3.5.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b" + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b", - "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197", "shasum": "" }, "require": { @@ -3982,12 +2977,12 @@ }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -4020,7 +3015,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.0" }, "funding": [ { @@ -4036,20 +3031,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/clock", - "version": "v7.2.0", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" + "reference": "97bebc53548684c17ed696bc8af016880f0f098d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "url": "https://api.github.com/repos/symfony/clock/zipball/97bebc53548684c17ed696bc8af016880f0f098d", + "reference": "97bebc53548684c17ed696bc8af016880f0f098d", "shasum": "" }, "require": { @@ -4094,7 +3089,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.2.0" + "source": "https://github.com/symfony/clock/tree/v7.1.6" }, "funding": [ { @@ -4110,20 +3105,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/config", - "version": "v7.2.3", + "version": "v7.1.7", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "7716594aaae91d9141be080240172a92ecca4d44" + "reference": "dc373a5cbd345354696f5dfd39c5c7a8ea23f4c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/7716594aaae91d9141be080240172a92ecca4d44", - "reference": "7716594aaae91d9141be080240172a92ecca4d44", + "url": "https://api.github.com/repos/symfony/config/zipball/dc373a5cbd345354696f5dfd39c5c7a8ea23f4c8", + "reference": "dc373a5cbd345354696f5dfd39c5c7a8ea23f4c8", "shasum": "" }, "require": { @@ -4169,7 +3164,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.2.3" + "source": "https://github.com/symfony/config/tree/v7.1.7" }, "funding": [ { @@ -4185,20 +3180,20 @@ "type": "tidelift" } ], - "time": "2025-01-22T12:07:01+00:00" + "time": "2024-11-04T11:34:07+00:00" }, { "name": "symfony/console", - "version": "v7.2.5", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "e51498ea18570c062e7df29d05a7003585b19b88" + "reference": "ff04e5b5ba043d2badfb308197b9e6b42883fcd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e51498ea18570c062e7df29d05a7003585b19b88", - "reference": "e51498ea18570c062e7df29d05a7003585b19b88", + "url": "https://api.github.com/repos/symfony/console/zipball/ff04e5b5ba043d2badfb308197b9e6b42883fcd5", + "reference": "ff04e5b5ba043d2badfb308197b9e6b42883fcd5", "shasum": "" }, "require": { @@ -4262,7 +3257,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.2.5" + "source": "https://github.com/symfony/console/tree/v7.1.8" }, "funding": [ { @@ -4278,20 +3273,20 @@ "type": "tidelift" } ], - "time": "2025-03-12T08:11:12+00:00" + "time": "2024-11-06T14:23:19+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.2.5", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "58ab71379f14a741755717cece2868bf41ed45d8" + "reference": "e4d13f0f394f4d02a041ff76acd31c5a20a5f70b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/58ab71379f14a741755717cece2868bf41ed45d8", - "reference": "58ab71379f14a741755717cece2868bf41ed45d8", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e4d13f0f394f4d02a041ff76acd31c5a20a5f70b", + "reference": "e4d13f0f394f4d02a041ff76acd31c5a20a5f70b", "shasum": "" }, "require": { @@ -4299,7 +3294,7 @@ "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^3.5", - "symfony/var-exporter": "^6.4.20|^7.2.5" + "symfony/var-exporter": "^6.4|^7.0" }, "conflict": { "ext-psr": "<1.1|>=2", @@ -4342,7 +3337,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.2.5" + "source": "https://github.com/symfony/dependency-injection/tree/v7.1.8" }, "funding": [ { @@ -4358,20 +3353,20 @@ "type": "tidelift" } ], - "time": "2025-03-13T12:21:46+00:00" + "time": "2024-11-09T09:16:45+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "shasum": "" }, "require": { @@ -4379,12 +3374,12 @@ }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -4409,7 +3404,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" }, "funding": [ { @@ -4425,25 +3420,25 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v7.2.5", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "f8a298bbb8eaca08d787bf4d4c74728f1cf98922" + "reference": "3fcfb37b738def92757b6ac5365a3147b2e2dd36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/f8a298bbb8eaca08d787bf4d4c74728f1cf98922", - "reference": "f8a298bbb8eaca08d787bf4d4c74728f1cf98922", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/3fcfb37b738def92757b6ac5365a3147b2e2dd36", + "reference": "3fcfb37b738def92757b6ac5365a3147b2e2dd36", "shasum": "" }, "require": { "doctrine/event-manager": "^2", - "doctrine/persistence": "^3.1|^4", + "doctrine/persistence": "^3.1", "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", @@ -4451,7 +3446,6 @@ "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "doctrine/collections": "<1.8", "doctrine/dbal": "<3.6", "doctrine/lexer": "<1.1", "doctrine/orm": "<2.15", @@ -4468,8 +3462,8 @@ "symfony/validator": "<6.4" }, "require-dev": { - "doctrine/collections": "^1.8|^2.0", - "doctrine/data-fixtures": "^1.1|^2", + "doctrine/collections": "^1.0|^2.0", + "doctrine/data-fixtures": "^1.1", "doctrine/dbal": "^3.6|^4", "doctrine/orm": "^2.15|^3", "psr/log": "^1|^2|^3", @@ -4518,7 +3512,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v7.2.5" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.1.6" }, "funding": [ { @@ -4534,20 +3528,20 @@ "type": "tidelift" } ], - "time": "2025-03-25T15:54:33+00:00" + "time": "2024-10-18T09:42:06+00:00" }, { "name": "symfony/dotenv", - "version": "v7.2.0", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "28347a897771d0c28e99b75166dd2689099f3045" + "reference": "56a10f3032a6c2f085b13bc429e9d78a2c895dc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/28347a897771d0c28e99b75166dd2689099f3045", - "reference": "28347a897771d0c28e99b75166dd2689099f3045", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/56a10f3032a6c2f085b13bc429e9d78a2c895dc4", + "reference": "56a10f3032a6c2f085b13bc429e9d78a2c895dc4", "shasum": "" }, "require": { @@ -4592,7 +3586,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v7.2.0" + "source": "https://github.com/symfony/dotenv/tree/v7.1.6" }, "funding": [ { @@ -4608,20 +3602,20 @@ "type": "tidelift" } ], - "time": "2024-11-27T11:18:42+00:00" + "time": "2024-09-28T11:14:12+00:00" }, { "name": "symfony/error-handler", - "version": "v7.2.5", + "version": "v7.1.7", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b" + "reference": "010e44661f4c6babaf8c4862fe68c24a53903342" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", - "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/010e44661f4c6babaf8c4862fe68c24a53903342", + "reference": "010e44661f4c6babaf8c4862fe68c24a53903342", "shasum": "" }, "require": { @@ -4667,7 +3661,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.2.5" + "source": "https://github.com/symfony/error-handler/tree/v7.1.7" }, "funding": [ { @@ -4683,20 +3677,20 @@ "type": "tidelift" } ], - "time": "2025-03-03T07:12:39+00:00" + "time": "2024-11-05T15:34:55+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.2.0", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" + "reference": "87254c78dd50721cfd015b62277a8281c5589702" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702", + "reference": "87254c78dd50721cfd015b62277a8281c5589702", "shasum": "" }, "require": { @@ -4747,7 +3741,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.6" }, "funding": [ { @@ -4763,20 +3757,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", "shasum": "" }, "require": { @@ -4785,12 +3779,12 @@ }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -4823,71 +3817,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-25T14:20:29+00:00" - }, - { - "name": "symfony/expression-language", - "version": "v7.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/expression-language.git", - "reference": "26f4884a455e755e630a5fc372df124a3578da2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/26f4884a455e755e630a5fc372df124a3578da2e", - "reference": "26f4884a455e755e630a5fc372df124a3578da2e", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/cache": "^6.4|^7.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\ExpressionLanguage\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an engine that can compile and evaluate expressions", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/expression-language/tree/v7.2.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" }, "funding": [ { @@ -4903,20 +3833,20 @@ "type": "tidelift" } ], - "time": "2024-10-15T11:52:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/filesystem", - "version": "v7.2.0", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" + "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/c835867b3c62bb05c7fe3d637c871c7ae52024d4", + "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4", "shasum": "" }, "require": { @@ -4953,7 +3883,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.2.0" + "source": "https://github.com/symfony/filesystem/tree/v7.1.6" }, "funding": [ { @@ -4969,20 +3899,20 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:15:23+00:00" + "time": "2024-10-25T15:11:02+00:00" }, { "name": "symfony/finder", - "version": "v7.2.2", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "87a71856f2f56e4100373e92529eed3171695cfb" + "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb", - "reference": "87a71856f2f56e4100373e92529eed3171695cfb", + "url": "https://api.github.com/repos/symfony/finder/zipball/2cb89664897be33f78c65d3d2845954c8d7a43b8", + "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8", "shasum": "" }, "require": { @@ -5017,7 +3947,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.2.2" + "source": "https://github.com/symfony/finder/tree/v7.1.6" }, "funding": [ { @@ -5033,20 +3963,20 @@ "type": "tidelift" } ], - "time": "2024-12-30T19:00:17+00:00" + "time": "2024-10-01T08:31:23+00:00" }, { "name": "symfony/flex", - "version": "v2.5.0", + "version": "v2.4.7", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "8ce1acd9842abe0e9b4c4a0bd3f259859516c018" + "reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/8ce1acd9842abe0e9b4c4a0bd3f259859516c018", - "reference": "8ce1acd9842abe0e9b4c4a0bd3f259859516c018", + "url": "https://api.github.com/repos/symfony/flex/zipball/92f4fba342161ff36072bd3b8e0b3c6c23160402", + "reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402", "shasum": "" }, "require": { @@ -5085,7 +4015,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.5.0" + "source": "https://github.com/symfony/flex/tree/v2.4.7" }, "funding": [ { @@ -5101,20 +4031,20 @@ "type": "tidelift" } ], - "time": "2025-03-03T07:50:46+00:00" + "time": "2024-10-07T08:51:54+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.2.5", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "c1c6ee8946491b698b067df2258e07918c25da02" + "reference": "1d616d762905091e798d64c53ffe3840ccfc3d89" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c1c6ee8946491b698b067df2258e07918c25da02", - "reference": "c1c6ee8946491b698b067df2258e07918c25da02", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/1d616d762905091e798d64c53ffe3840ccfc3d89", + "reference": "1d616d762905091e798d64c53ffe3840ccfc3d89", "shasum": "" }, "require": { @@ -5123,14 +4053,14 @@ "php": ">=8.2", "symfony/cache": "^6.4|^7.0", "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^7.2", + "symfony/dependency-injection": "^7.1.5", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", "symfony/event-dispatcher": "^6.4|^7.0", "symfony/filesystem": "^7.1", "symfony/finder": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^7.2", + "symfony/http-kernel": "^6.4|^7.0", "symfony/polyfill-mbstring": "~1.0", "symfony/routing": "^6.4|^7.0" }, @@ -5155,15 +4085,14 @@ "symfony/runtime": "<6.4.13|>=7.0,<7.1.6", "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", "symfony/security-core": "<6.4", - "symfony/security-csrf": "<7.2", - "symfony/serializer": "<7.2.5", + "symfony/security-csrf": "<6.4", + "symfony/serializer": "<6.4", "symfony/stopwatch": "<6.4", "symfony/translation": "<6.4", "symfony/twig-bridge": "<6.4", "symfony/twig-bundle": "<6.4", "symfony/validator": "<6.4", "symfony/web-profiler-bundle": "<6.4", - "symfony/webhook": "<7.2", "symfony/workflow": "<6.4" }, "require-dev": { @@ -5195,7 +4124,7 @@ "symfony/scheduler": "^6.4.4|^7.0.4", "symfony/security-bundle": "^6.4|^7.0", "symfony/semaphore": "^6.4|^7.0", - "symfony/serializer": "^7.2.5", + "symfony/serializer": "^6.4|^7.0", "symfony/stopwatch": "^6.4|^7.0", "symfony/string": "^6.4|^7.0", "symfony/translation": "^6.4|^7.0", @@ -5204,10 +4133,9 @@ "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/web-link": "^6.4|^7.0", - "symfony/webhook": "^7.2", "symfony/workflow": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", - "twig/twig": "^3.12" + "twig/twig": "^3.0.4" }, "type": "symfony-bundle", "autoload": { @@ -5235,7 +4163,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.2.5" + "source": "https://github.com/symfony/framework-bundle/tree/v7.1.6" }, "funding": [ { @@ -5251,31 +4179,30 @@ "type": "tidelift" } ], - "time": "2025-03-24T12:37:32+00:00" + "time": "2024-10-25T15:11:02+00:00" }, { "name": "symfony/http-client", - "version": "v7.2.4", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "78981a2ffef6437ed92d4d7e2a86a82f256c6dc6" + "reference": "c30d91a1deac0dc3ed5e604683cf2e1dfc635b8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/78981a2ffef6437ed92d4d7e2a86a82f256c6dc6", - "reference": "78981a2ffef6437ed92d4d7e2a86a82f256c6dc6", + "url": "https://api.github.com/repos/symfony/http-client/zipball/c30d91a1deac0dc3ed5e604683cf2e1dfc635b8a", + "reference": "c30d91a1deac0dc3ed5e604683cf2e1dfc635b8a", "shasum": "" }, "require": { "php": ">=8.2", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/http-client-contracts": "^3.4.1", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "amphp/amp": "<2.5", "php-http/discovery": "<1.15", "symfony/http-foundation": "<6.4" }, @@ -5286,14 +4213,14 @@ "symfony/http-client-implementation": "3.0" }, "require-dev": { - "amphp/http-client": "^4.2.1|^5.0", - "amphp/http-tunnel": "^1.0|^2.0", + "amphp/amp": "^2.5", + "amphp/http-client": "^4.2.1", + "amphp/http-tunnel": "^1.0", "amphp/socket": "^1.1", "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", - "symfony/amphp-http-client-meta": "^1.0|^2.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/messenger": "^6.4|^7.0", @@ -5330,7 +4257,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.2.4" + "source": "https://github.com/symfony/http-client/tree/v7.1.8" }, "funding": [ { @@ -5346,20 +4273,20 @@ "type": "tidelift" } ], - "time": "2025-02-13T10:27:23+00:00" + "time": "2024-11-13T13:40:27+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.5.2", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645" + "reference": "20414d96f391677bf80078aa55baece78b82647d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ee8d807ab20fcb51267fdace50fbe3494c31e645", - "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/20414d96f391677bf80078aa55baece78b82647d", + "reference": "20414d96f391677bf80078aa55baece78b82647d", "shasum": "" }, "require": { @@ -5367,12 +4294,12 @@ }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -5408,7 +4335,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.2" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.0" }, "funding": [ { @@ -5424,25 +4351,24 @@ "type": "tidelift" } ], - "time": "2024-12-07T08:49:48+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.2.5", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "371272aeb6286f8135e028ca535f8e4d6f114126" + "reference": "f4419ec69ccfc3f725a4de7c20e4e57626d10112" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/371272aeb6286f8135e028ca535f8e4d6f114126", - "reference": "371272aeb6286f8135e028ca535f8e4d6f114126", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f4419ec69ccfc3f725a4de7c20e4e57626d10112", + "reference": "f4419ec69ccfc3f725a4de7c20e4e57626d10112", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php83": "^1.27" }, @@ -5451,133 +4377,19 @@ "symfony/cache": "<6.4.12|>=7.0,<7.1.5" }, "require-dev": { - "doctrine/dbal": "^3.6|^4", - "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4.12|^7.1.5", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/rate-limiter": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Defines an object-oriented layer for the HTTP specification", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.2.5" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-03-25T15:54:33+00:00" - }, - { - "name": "symfony/http-kernel", - "version": "v7.2.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b1fe91bc1fa454a806d3f98db4ba826eb9941a54", - "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/browser-kit": "<6.4", - "symfony/cache": "<6.4", - "symfony/config": "<6.4", - "symfony/console": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/doctrine-bridge": "<6.4", - "symfony/form": "<6.4", - "symfony/http-client": "<6.4", - "symfony/http-client-contracts": "<2.5", - "symfony/mailer": "<6.4", - "symfony/messenger": "<6.4", - "symfony/translation": "<6.4", - "symfony/translation-contracts": "<2.5", - "symfony/twig-bridge": "<6.4", - "symfony/validator": "<6.4", - "symfony/var-dumper": "<6.4", - "twig/twig": "<3.12" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" - }, - "require-dev": { - "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^6.4|^7.0", - "symfony/clock": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/css-selector": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/dom-crawler": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/http-client-contracts": "^2.5|^3", - "symfony/process": "^6.4|^7.0", - "symfony/property-access": "^7.1", - "symfony/routing": "^6.4|^7.0", - "symfony/serializer": "^7.1", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", - "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^6.4|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0", - "symfony/var-exporter": "^6.4|^7.0", - "twig/twig": "^3.12" + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" + "Symfony\\Component\\HttpFoundation\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -5597,10 +4409,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a structured process for converting a Request into a Response", + "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.2.5" + "source": "https://github.com/symfony/http-foundation/tree/v7.1.8" }, "funding": [ { @@ -5616,48 +4428,82 @@ "type": "tidelift" } ], - "time": "2025-03-28T13:32:50+00:00" + "time": "2024-11-09T09:16:45+00:00" }, { - "name": "symfony/mailer", - "version": "v7.2.3", + "name": "symfony/http-kernel", + "version": "v7.1.8", "source": { "type": "git", - "url": "https://github.com/symfony/mailer.git", - "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3" + "url": "https://github.com/symfony/http-kernel.git", + "reference": "33fef24e3dc79d6d30bf4936531f2f4bd2ca189e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/f3871b182c44997cf039f3b462af4a48fb85f9d3", - "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/33fef24e3dc79d6d30bf4936531f2f4bd2ca189e", + "reference": "33fef24e3dc79d6d30bf4936531f2f4bd2ca189e", "shasum": "" }, "require": { - "egulias/email-validator": "^2.1.10|^3|^4", "php": ">=8.2", - "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/mime": "^7.2", - "symfony/service-contracts": "^2.5|^3" + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<6.4", + "symfony/mailer": "<6.4", "symfony/messenger": "<6.4", - "symfony/mime": "<6.4", - "symfony/twig-bridge": "<6.4" + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.0.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/twig-bridge": "^6.4|^7.0" + "symfony/css-selector": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.0.4" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Mailer\\": "" + "Symfony\\Component\\HttpKernel\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -5677,10 +4523,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Helps sending emails", + "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.2.3" + "source": "https://github.com/symfony/http-kernel/tree/v7.1.8" }, "funding": [ { @@ -5696,20 +4542,20 @@ "type": "tidelift" } ], - "time": "2025-01-27T11:08:17+00:00" + "time": "2024-11-13T14:25:32+00:00" }, { "name": "symfony/mime", - "version": "v7.2.4", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "87ca22046b78c3feaff04b337f33b38510fd686b" + "reference": "caa1e521edb2650b8470918dfe51708c237f0598" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/87ca22046b78c3feaff04b337f33b38510fd686b", - "reference": "87ca22046b78c3feaff04b337f33b38510fd686b", + "url": "https://api.github.com/repos/symfony/mime/zipball/caa1e521edb2650b8470918dfe51708c237f0598", + "reference": "caa1e521edb2650b8470918dfe51708c237f0598", "shasum": "" }, "require": { @@ -5764,7 +4610,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.2.4" + "source": "https://github.com/symfony/mime/tree/v7.1.6" }, "funding": [ { @@ -5780,20 +4626,20 @@ "type": "tidelift" } ], - "time": "2025-02-19T08:51:20+00:00" + "time": "2024-10-25T15:11:02+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v7.2.0", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "bbae784f0456c5a87c89d7c1a3fcc9cbee976c1d" + "reference": "e1da878cf5f701df5f5c1799bdbf827acee5a76e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/bbae784f0456c5a87c89d7c1a3fcc9cbee976c1d", - "reference": "bbae784f0456c5a87c89d7c1a3fcc9cbee976c1d", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/e1da878cf5f701df5f5c1799bdbf827acee5a76e", + "reference": "e1da878cf5f701df5f5c1799bdbf827acee5a76e", "shasum": "" }, "require": { @@ -5842,7 +4688,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v7.2.0" + "source": "https://github.com/symfony/monolog-bridge/tree/v7.1.6" }, "funding": [ { @@ -5858,7 +4704,7 @@ "type": "tidelift" } ], - "time": "2024-10-14T18:16:08+00:00" + "time": "2024-10-14T08:49:35+00:00" }, { "name": "symfony/monolog-bundle", @@ -5943,16 +4789,16 @@ }, { "name": "symfony/options-resolver", - "version": "v7.2.0", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50" + "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/85e95eeede2d41cd146146e98c9c81d9214cae85", + "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85", "shasum": "" }, "require": { @@ -5990,7 +4836,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.2.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.1.6" }, "funding": [ { @@ -6006,20 +4852,20 @@ "type": "tidelift" } ], - "time": "2024-11-20T11:17:29+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/password-hasher", - "version": "v7.2.0", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "d8bd3d66d074c0acba1214a0d42f5941a8e1e94d" + "reference": "2e618d1af51805e5a1fbda326d00b77c6c1037d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/d8bd3d66d074c0acba1214a0d42f5941a8e1e94d", - "reference": "d8bd3d66d074c0acba1214a0d42f5941a8e1e94d", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/2e618d1af51805e5a1fbda326d00b77c6c1037d5", + "reference": "2e618d1af51805e5a1fbda326d00b77c6c1037d5", "shasum": "" }, "require": { @@ -6062,7 +4908,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v7.2.0" + "source": "https://github.com/symfony/password-hasher/tree/v7.1.6" }, "funding": [ { @@ -6078,7 +4924,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/polyfill-intl-grapheme", @@ -6103,8 +4949,8 @@ "type": "library", "extra": { "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -6182,8 +5028,8 @@ "type": "library", "extra": { "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -6264,8 +5110,8 @@ "type": "library", "extra": { "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -6348,8 +5194,8 @@ "type": "library", "extra": { "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -6422,8 +5268,8 @@ "type": "library", "extra": { "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -6478,82 +5324,6 @@ ], "time": "2024-09-09T11:45:10+00:00" }, - { - "name": "symfony/polyfill-php84", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/e5493eb51311ab0b1cc2243416613f06ed8f18bd", - "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php84\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.31.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T12:04:04+00:00" - }, { "name": "symfony/polyfill-uuid", "version": "v1.31.0", @@ -6580,8 +5350,8 @@ "type": "library", "extra": { "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -6635,16 +5405,16 @@ }, { "name": "symfony/property-access", - "version": "v7.2.3", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "b28732e315d81fbec787f838034de7d6c9b2b902" + "reference": "975d7f7fd8fcb952364c6badc46d01a580532bf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/b28732e315d81fbec787f838034de7d6c9b2b902", - "reference": "b28732e315d81fbec787f838034de7d6c9b2b902", + "url": "https://api.github.com/repos/symfony/property-access/zipball/975d7f7fd8fcb952364c6badc46d01a580532bf9", + "reference": "975d7f7fd8fcb952364c6badc46d01a580532bf9", "shasum": "" }, "require": { @@ -6691,7 +5461,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v7.2.3" + "source": "https://github.com/symfony/property-access/tree/v7.1.6" }, "funding": [ { @@ -6707,31 +5477,30 @@ "type": "tidelift" } ], - "time": "2025-01-17T10:56:55+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/property-info", - "version": "v7.2.5", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "f00fd9685ecdbabe82ca25c7b739ce7bba99302c" + "reference": "3748f85f64351d282fd028e44309856f1d79142e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/f00fd9685ecdbabe82ca25c7b739ce7bba99302c", - "reference": "f00fd9685ecdbabe82ca25c7b739ce7bba99302c", + "url": "https://api.github.com/repos/symfony/property-info/zipball/3748f85f64351d282fd028e44309856f1d79142e", + "reference": "3748f85f64351d282fd028e44309856f1d79142e", "shasum": "" }, "require": { "php": ">=8.2", "symfony/string": "^6.4|^7.0", - "symfony/type-info": "~7.1.9|^7.2.2" + "symfony/type-info": "^7.1" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2", "phpdocumentor/type-resolver": "<1.5.1", - "symfony/cache": "<6.4", "symfony/dependency-injection": "<6.4", "symfony/serializer": "<6.4" }, @@ -6776,7 +5545,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.2.5" + "source": "https://github.com/symfony/property-info/tree/v7.1.8" }, "funding": [ { @@ -6792,20 +5561,20 @@ "type": "tidelift" } ], - "time": "2025-03-06T16:27:19+00:00" + "time": "2024-11-09T07:07:11+00:00" }, { "name": "symfony/routing", - "version": "v7.2.3", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996" + "reference": "66a2c469f6c22d08603235c46a20007c0701ea0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/ee9a67edc6baa33e5fae662f94f91fd262930996", - "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996", + "url": "https://api.github.com/repos/symfony/routing/zipball/66a2c469f6c22d08603235c46a20007c0701ea0a", + "reference": "66a2c469f6c22d08603235c46a20007c0701ea0a", "shasum": "" }, "require": { @@ -6857,7 +5626,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.2.3" + "source": "https://github.com/symfony/routing/tree/v7.1.6" }, "funding": [ { @@ -6873,20 +5642,20 @@ "type": "tidelift" } ], - "time": "2025-01-17T10:56:55+00:00" + "time": "2024-10-01T08:31:23+00:00" }, { "name": "symfony/runtime", - "version": "v7.2.3", + "version": "v7.1.7", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "8e8d09bd69b7f6c0260dd3d58f37bd4fbdeab5ad" + "reference": "9889783c17e8a68fa5e88c8e8a1a85e802558dba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/8e8d09bd69b7f6c0260dd3d58f37bd4fbdeab5ad", - "reference": "8e8d09bd69b7f6c0260dd3d58f37bd4fbdeab5ad", + "url": "https://api.github.com/repos/symfony/runtime/zipball/9889783c17e8a68fa5e88c8e8a1a85e802558dba", + "reference": "9889783c17e8a68fa5e88c8e8a1a85e802558dba", "shasum": "" }, "require": { @@ -6936,7 +5705,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v7.2.3" + "source": "https://github.com/symfony/runtime/tree/v7.1.7" }, "funding": [ { @@ -6952,20 +5721,20 @@ "type": "tidelift" } ], - "time": "2024-12-29T21:39:47+00:00" + "time": "2024-11-05T16:45:54+00:00" }, { "name": "symfony/security-bundle", - "version": "v7.2.3", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "721de227035c6e4c322fb7dd4839586d58bc0cf5" + "reference": "7df1d3d431be03fbeb1b162eebca424005b48cdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/721de227035c6e4c322fb7dd4839586d58bc0cf5", - "reference": "721de227035c6e4c322fb7dd4839586d58bc0cf5", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/7df1d3d431be03fbeb1b162eebca424005b48cdd", + "reference": "7df1d3d431be03fbeb1b162eebca424005b48cdd", "shasum": "" }, "require": { @@ -6979,9 +5748,9 @@ "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/password-hasher": "^6.4|^7.0", - "symfony/security-core": "^7.2", + "symfony/security-core": "^6.4|^7.0", "symfony/security-csrf": "^6.4|^7.0", - "symfony/security-http": "^7.2", + "symfony/security-http": "^7.1", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -7013,7 +5782,7 @@ "symfony/twig-bundle": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", - "twig/twig": "^3.12", + "twig/twig": "^3.0.4", "web-token/jwt-library": "^3.3.2|^4.0" }, "type": "symfony-bundle", @@ -7042,7 +5811,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v7.2.3" + "source": "https://github.com/symfony/security-bundle/tree/v7.1.6" }, "funding": [ { @@ -7058,25 +5827,24 @@ "type": "tidelift" } ], - "time": "2025-01-07T09:39:55+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/security-core", - "version": "v7.2.3", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "466784ffcd0b5a16e05394335897f790b17d07e4" + "reference": "6f3ffbfa1ece94f3a6d97e6e96e9994e9d1bbce2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/466784ffcd0b5a16e05394335897f790b17d07e4", - "reference": "466784ffcd0b5a16e05394335897f790b17d07e4", + "url": "https://api.github.com/repos/symfony/security-core/zipball/6f3ffbfa1ece94f3a6d97e6e96e9994e9d1bbce2", + "reference": "6f3ffbfa1ece94f3a6d97e6e96e9994e9d1bbce2", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher-contracts": "^2.5|^3", "symfony/password-hasher": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3" @@ -7129,7 +5897,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v7.2.3" + "source": "https://github.com/symfony/security-core/tree/v7.1.6" }, "funding": [ { @@ -7145,20 +5913,20 @@ "type": "tidelift" } ], - "time": "2025-01-27T11:08:17+00:00" + "time": "2024-10-25T15:11:02+00:00" }, { "name": "symfony/security-csrf", - "version": "v7.2.3", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "2b4b0c46c901729e4e90719eacd980381f53e0a3" + "reference": "23b460d3447fd61970e0ed5ec7a0301296a17f06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/2b4b0c46c901729e4e90719eacd980381f53e0a3", - "reference": "2b4b0c46c901729e4e90719eacd980381f53e0a3", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/23b460d3447fd61970e0ed5ec7a0301296a17f06", + "reference": "23b460d3447fd61970e0ed5ec7a0301296a17f06", "shasum": "" }, "require": { @@ -7169,9 +5937,7 @@ "symfony/http-foundation": "<6.4" }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0" + "symfony/http-foundation": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -7199,7 +5965,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v7.2.3" + "source": "https://github.com/symfony/security-csrf/tree/v7.1.6" }, "funding": [ { @@ -7215,20 +5981,20 @@ "type": "tidelift" } ], - "time": "2025-01-02T18:42:10+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/security-http", - "version": "v7.2.4", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "8478e95e273f8daa23bf4860dbad2a09d3fb3722" + "reference": "e11ea7f98fba4921a6c847a0c6a77d1befa9698f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/8478e95e273f8daa23bf4860dbad2a09d3fb3722", - "reference": "8478e95e273f8daa23bf4860dbad2a09d3fb3722", + "url": "https://api.github.com/repos/symfony/security-http/zipball/e11ea7f98fba4921a6c847a0c6a77d1befa9698f", + "reference": "e11ea7f98fba4921a6c847a0c6a77d1befa9698f", "shasum": "" }, "require": { @@ -7238,7 +6004,7 @@ "symfony/http-kernel": "^6.4|^7.0", "symfony/polyfill-mbstring": "~1.0", "symfony/property-access": "^6.4|^7.0", - "symfony/security-core": "^7.2", + "symfony/security-core": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -7287,7 +6053,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v7.2.4" + "source": "https://github.com/symfony/security-http/tree/v7.1.8" }, "funding": [ { @@ -7303,20 +6069,20 @@ "type": "tidelift" } ], - "time": "2025-02-11T16:46:20+00:00" + "time": "2024-11-13T13:40:27+00:00" }, { "name": "symfony/serializer", - "version": "v7.2.5", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "d8b75b2c8144c29ac43b235738411f7cca6d584d" + "reference": "6066de113408496e1e3d4bf9e21fb209d344768b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/d8b75b2c8144c29ac43b235738411f7cca6d584d", - "reference": "d8b75b2c8144c29ac43b235738411f7cca6d584d", + "url": "https://api.github.com/repos/symfony/serializer/zipball/6066de113408496e1e3d4bf9e21fb209d344768b", + "reference": "6066de113408496e1e3d4bf9e21fb209d344768b", "shasum": "" }, "require": { @@ -7330,6 +6096,7 @@ "symfony/dependency-injection": "<6.4", "symfony/property-access": "<6.4", "symfony/property-info": "<6.4", + "symfony/type-info": "<7.1.5", "symfony/uid": "<6.4", "symfony/validator": "<6.4", "symfony/yaml": "<6.4" @@ -7341,7 +6108,7 @@ "symfony/cache": "^6.4|^7.0", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^7.2", + "symfony/dependency-injection": "^6.4|^7.0", "symfony/error-handler": "^6.4|^7.0", "symfony/filesystem": "^6.4|^7.0", "symfony/form": "^6.4|^7.0", @@ -7352,7 +6119,7 @@ "symfony/property-access": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/type-info": "^7.1", + "symfony/type-info": "^7.1.5", "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0", @@ -7385,7 +6152,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.2.5" + "source": "https://github.com/symfony/serializer/tree/v7.1.8" }, "funding": [ { @@ -7401,20 +6168,20 @@ "type": "tidelift" } ], - "time": "2025-03-24T12:37:32+00:00" + "time": "2024-11-09T09:16:45+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.5.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "shasum": "" }, "require": { @@ -7427,12 +6194,12 @@ }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -7468,7 +6235,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" }, "funding": [ { @@ -7484,20 +6251,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/stopwatch", - "version": "v7.2.4", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd" + "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", - "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/8b4a434e6e7faf6adedffb48783a5c75409a1a05", + "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05", "shasum": "" }, "require": { @@ -7530,7 +6297,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.2.4" + "source": "https://github.com/symfony/stopwatch/tree/v7.1.6" }, "funding": [ { @@ -7546,20 +6313,20 @@ "type": "tidelift" } ], - "time": "2025-02-24T10:49:57+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/string", - "version": "v7.2.0", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" + "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", + "url": "https://api.github.com/repos/symfony/string/zipball/591ebd41565f356fcd8b090fe64dbb5878f50281", + "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281", "shasum": "" }, "require": { @@ -7617,7 +6384,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.2.0" + "source": "https://github.com/symfony/string/tree/v7.1.8" }, "funding": [ { @@ -7633,25 +6400,24 @@ "type": "tidelift" } ], - "time": "2024-11-13T13:31:26+00:00" + "time": "2024-11-13T13:31:21+00:00" }, { "name": "symfony/translation", - "version": "v7.2.4", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "283856e6981286cc0d800b53bd5703e8e363f05a" + "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/283856e6981286cc0d800b53bd5703e8e363f05a", - "reference": "283856e6981286cc0d800b53bd5703e8e363f05a", + "url": "https://api.github.com/repos/symfony/translation/zipball/b9f72ab14efdb6b772f85041fa12f820dee8d55f", + "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/translation-contracts": "^2.5|^3.0" }, @@ -7712,7 +6478,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.2.4" + "source": "https://github.com/symfony/translation/tree/v7.1.6" }, "funding": [ { @@ -7728,20 +6494,20 @@ "type": "tidelift" } ], - "time": "2025-02-13T10:27:23+00:00" + "time": "2024-09-28T12:35:13+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.5.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", "shasum": "" }, "require": { @@ -7749,12 +6515,12 @@ }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -7790,7 +6556,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" }, "funding": [ { @@ -7806,27 +6572,26 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/twig-bridge", - "version": "v7.2.5", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "b1942d5515b7f0a18e16fd668a04ea952db2b0f2" + "reference": "535ab0be4fc563b2bc5fc0cc9e388626d226c63f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/b1942d5515b7f0a18e16fd668a04ea952db2b0f2", - "reference": "b1942d5515b7f0a18e16fd668a04ea952db2b0f2", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/535ab0be4fc563b2bc5fc0cc9e388626d226c63f", + "reference": "535ab0be4fc563b2bc5fc0cc9e388626d226c63f", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", "symfony/translation-contracts": "^2.5|^3", - "twig/twig": "^3.12" + "twig/twig": "^3.9" }, "conflict": { "phpdocumentor/reflection-docblock": "<3.2.2", @@ -7851,7 +6616,7 @@ "symfony/emoji": "^7.1", "symfony/expression-language": "^6.4|^7.0", "symfony/finder": "^6.4|^7.0", - "symfony/form": "^6.4.20|^7.2.5", + "symfony/form": "^6.4|^7.0", "symfony/html-sanitizer": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", @@ -7900,7 +6665,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.2.5" + "source": "https://github.com/symfony/twig-bridge/tree/v7.1.8" }, "funding": [ { @@ -7916,20 +6681,20 @@ "type": "tidelift" } ], - "time": "2025-03-28T13:15:09+00:00" + "time": "2024-11-10T02:47:09+00:00" }, { "name": "symfony/twig-bundle", - "version": "v7.2.0", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "cd2be4563afaef5285bb6e0a06c5445e644a5c01" + "reference": "af902314a71fb412ae412094f7e1d7e49594507b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/cd2be4563afaef5285bb6e0a06c5445e644a5c01", - "reference": "cd2be4563afaef5285bb6e0a06c5445e644a5c01", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/af902314a71fb412ae412094f7e1d7e49594507b", + "reference": "af902314a71fb412ae412094f7e1d7e49594507b", "shasum": "" }, "require": { @@ -7940,7 +6705,7 @@ "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/twig-bridge": "^6.4|^7.0", - "twig/twig": "^3.12" + "twig/twig": "^3.0.4" }, "conflict": { "symfony/framework-bundle": "<6.4", @@ -7984,7 +6749,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v7.2.0" + "source": "https://github.com/symfony/twig-bundle/tree/v7.1.6" }, "funding": [ { @@ -8000,28 +6765,35 @@ "type": "tidelift" } ], - "time": "2024-10-23T08:11:15+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/type-info", - "version": "v7.2.5", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "c4824a6b658294c828e609d3d8dbb4e87f6a375d" + "reference": "51535dde21c7abf65c9d000a30bb15f6478195e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/c4824a6b658294c828e609d3d8dbb4e87f6a375d", - "reference": "c4824a6b658294c828e609d3d8dbb4e87f6a375d", + "url": "https://api.github.com/repos/symfony/type-info/zipball/51535dde21c7abf65c9d000a30bb15f6478195e6", + "reference": "51535dde21c7abf65c9d000a30bb15f6478195e6", "shasum": "" }, "require": { "php": ">=8.2", "psr/container": "^1.1|^2.0" }, + "conflict": { + "phpstan/phpdoc-parser": "<1.0", + "symfony/dependency-injection": "<6.4", + "symfony/property-info": "<6.4" + }, "require-dev": { - "phpstan/phpdoc-parser": "^1.0|^2.0" + "phpstan/phpdoc-parser": "^1.0|^2.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -8059,7 +6831,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.2.5" + "source": "https://github.com/symfony/type-info/tree/v7.1.8" }, "funding": [ { @@ -8075,20 +6847,20 @@ "type": "tidelift" } ], - "time": "2025-03-24T09:03:36+00:00" + "time": "2024-11-07T15:49:33+00:00" }, { "name": "symfony/uid", - "version": "v7.2.0", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "2d294d0c48df244c71c105a169d0190bfb080426" + "reference": "65befb3bb2d503bbffbd08c815aa38b472999917" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/2d294d0c48df244c71c105a169d0190bfb080426", - "reference": "2d294d0c48df244c71c105a169d0190bfb080426", + "url": "https://api.github.com/repos/symfony/uid/zipball/65befb3bb2d503bbffbd08c815aa38b472999917", + "reference": "65befb3bb2d503bbffbd08c815aa38b472999917", "shasum": "" }, "require": { @@ -8133,7 +6905,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.2.0" + "source": "https://github.com/symfony/uid/tree/v7.1.6" }, "funding": [ { @@ -8149,20 +6921,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/ux-translator", - "version": "v2.24.0", + "version": "v2.21.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-translator.git", - "reference": "a829b5c83ed676a8e848dce90dd6d42f12e90be6" + "reference": "df523d5f90256a40bc7ceaabfe6664bd9856cb74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-translator/zipball/a829b5c83ed676a8e848dce90dd6d42f12e90be6", - "reference": "a829b5c83ed676a8e848dce90dd6d42f12e90be6", + "url": "https://api.github.com/repos/symfony/ux-translator/zipball/df523d5f90256a40bc7ceaabfe6664bd9856cb74", + "reference": "df523d5f90256a40bc7ceaabfe6664bd9856cb74", "shasum": "" }, "require": { @@ -8180,8 +6952,8 @@ "type": "symfony-bundle", "extra": { "thanks": { - "url": "https://github.com/symfony/ux", - "name": "symfony/ux" + "name": "symfony/ux", + "url": "https://github.com/symfony/ux" } }, "autoload": { @@ -8209,7 +6981,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/ux-translator/tree/v2.24.0" + "source": "https://github.com/symfony/ux-translator/tree/v2.21.0" }, "funding": [ { @@ -8225,20 +6997,20 @@ "type": "tidelift" } ], - "time": "2025-03-09T21:10:04+00:00" + "time": "2024-10-12T06:22:44+00:00" }, { "name": "symfony/validator", - "version": "v7.2.5", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "d7edd7f44defbc4e0230512f929b5f4c067bb93e" + "reference": "85a90c0a4ab0d10c118d3cdf39115e00d9cca7d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/d7edd7f44defbc4e0230512f929b5f4c067bb93e", - "reference": "d7edd7f44defbc4e0230512f929b5f4c067bb93e", + "url": "https://api.github.com/repos/symfony/validator/zipball/85a90c0a4ab0d10c118d3cdf39115e00d9cca7d0", + "reference": "85a90c0a4ab0d10c118d3cdf39115e00d9cca7d0", "shasum": "" }, "require": { @@ -8306,7 +7078,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v7.2.5" + "source": "https://github.com/symfony/validator/tree/v7.1.8" }, "funding": [ { @@ -8322,20 +7094,20 @@ "type": "tidelift" } ], - "time": "2025-03-21T15:05:21+00:00" + "time": "2024-11-08T15:46:42+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.2.3", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a" + "reference": "7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/82b478c69745d8878eb60f9a049a4d584996f73a", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8", + "reference": "7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8", "shasum": "" }, "require": { @@ -8351,7 +7123,7 @@ "symfony/http-kernel": "^6.4|^7.0", "symfony/process": "^6.4|^7.0", "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.12" + "twig/twig": "^3.0.4" }, "bin": [ "Resources/bin/var-dump-server" @@ -8389,7 +7161,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.2.3" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.8" }, "funding": [ { @@ -8405,20 +7177,20 @@ "type": "tidelift" } ], - "time": "2025-01-17T11:39:41+00:00" + "time": "2024-11-08T15:46:42+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.2.5", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "c37b301818bd7288715d40de634f05781b686ace" + "reference": "90173ef89c40e7c8c616653241048705f84130ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/c37b301818bd7288715d40de634f05781b686ace", - "reference": "c37b301818bd7288715d40de634f05781b686ace", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/90173ef89c40e7c8c616653241048705f84130ef", + "reference": "90173ef89c40e7c8c616653241048705f84130ef", "shasum": "" }, "require": { @@ -8465,7 +7237,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.2.5" + "source": "https://github.com/symfony/var-exporter/tree/v7.1.6" }, "funding": [ { @@ -8481,25 +7253,24 @@ "type": "tidelift" } ], - "time": "2025-03-13T12:21:46+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/yaml", - "version": "v7.2.5", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912" + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912", - "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912", + "url": "https://api.github.com/repos/symfony/yaml/zipball/3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -8537,7 +7308,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.2.5" + "source": "https://github.com/symfony/yaml/tree/v7.1.6" }, "funding": [ { @@ -8553,24 +7324,24 @@ "type": "tidelift" } ], - "time": "2025-03-03T07:12:39+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "twig/extra-bundle", - "version": "v3.20.0", + "version": "v3.15.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "9df5e1dbb6a68c0665ae5603f6f2c20815647876" + "reference": "9746573ca4bc1cd03a767a183faadaf84e0c31fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/9df5e1dbb6a68c0665ae5603f6f2c20815647876", - "reference": "9df5e1dbb6a68c0665ae5603f6f2c20815647876", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/9746573ca4bc1cd03a767a183faadaf84e0c31fa", + "reference": "9746573ca4bc1cd03a767a183faadaf84e0c31fa", "shasum": "" }, "require": { - "php": ">=8.1.0", + "php": ">=8.0.2", "symfony/framework-bundle": "^5.4|^6.4|^7.0", "symfony/twig-bundle": "^5.4|^6.4|^7.0", "twig/twig": "^3.2|^4.0" @@ -8615,7 +7386,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.20.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.15.0" }, "funding": [ { @@ -8627,30 +7398,30 @@ "type": "tidelift" } ], - "time": "2025-02-08T09:47:15+00:00" + "time": "2024-09-26T19:22:23+00:00" }, { "name": "twig/twig", - "version": "v3.20.0", + "version": "v3.15.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "3468920399451a384bef53cf7996965f7cd40183" + "reference": "2d5b3964cc21d0188633d7ddce732dc8e874db02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/3468920399451a384bef53cf7996965f7cd40183", - "reference": "3468920399451a384bef53cf7996965f7cd40183", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/2d5b3964cc21d0188633d7ddce732dc8e874db02", + "reference": "2d5b3964cc21d0188633d7ddce732dc8e874db02", "shasum": "" }, "require": { - "php": ">=8.1.0", + "php": ">=8.0.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php81": "^1.29" }, "require-dev": { - "phpstan/phpstan": "^2.0", "psr/container": "^1.0|^2.0", "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, @@ -8694,7 +7465,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.20.0" + "source": "https://github.com/twigphp/Twig/tree/v3.15.0" }, "funding": [ { @@ -8706,22 +7477,22 @@ "type": "tidelift" } ], - "time": "2025-02-13T08:34:43+00:00" + "time": "2024-11-17T15:59:19+00:00" } ], "packages-dev": [ { "name": "brianium/paratest", - "version": "v7.9.1", + "version": "v7.6.0", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "de51af1d6410bfdb5b41d2dd2c42a0b19b3656c9" + "reference": "68ff89a8de47d086588e391a516d2a5b5fde6254" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/de51af1d6410bfdb5b41d2dd2c42a0b19b3656c9", - "reference": "de51af1d6410bfdb5b41d2dd2c42a0b19b3656c9", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/68ff89a8de47d086588e391a516d2a5b5fde6254", + "reference": "68ff89a8de47d086588e391a516d2a5b5fde6254", "shasum": "" }, "require": { @@ -8730,26 +7501,26 @@ "ext-reflection": "*", "ext-simplexml": "*", "fidry/cpu-core-counter": "^1.2.0", - "jean85/pretty-package-versions": "^2.1.1", - "php": "~8.3.0 || ~8.4.0", - "phpunit/php-code-coverage": "^12.1.2", - "phpunit/php-file-iterator": "^6", - "phpunit/php-timer": "^8", - "phpunit/phpunit": "^12.1.0", - "sebastian/environment": "^8", - "symfony/console": "^6.4.20 || ^7.2.5", - "symfony/process": "^6.4.20 || ^7.2.5" + "jean85/pretty-package-versions": "^2.0.6", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", + "phpunit/php-code-coverage": "^11.0.7", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-timer": "^7.0.1", + "phpunit/phpunit": "^11.4.1", + "sebastian/environment": "^7.2.0", + "symfony/console": "^6.4.11 || ^7.1.5", + "symfony/process": "^6.4.8 || ^7.1.5" }, "require-dev": { - "doctrine/coding-standard": "^13.0.0", + "doctrine/coding-standard": "^12.0.0", "ext-pcov": "*", "ext-posix": "*", - "phpstan/phpstan": "^2.1.11", - "phpstan/phpstan-deprecation-rules": "^2.0.1", - "phpstan/phpstan-phpunit": "^2.0.6", - "phpstan/phpstan-strict-rules": "^2.0.4", - "squizlabs/php_codesniffer": "^3.12.0", - "symfony/filesystem": "^6.4.13 || ^7.2.0" + "phpstan/phpstan": "^1.12.6", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.1", + "squizlabs/php_codesniffer": "^3.10.3", + "symfony/filesystem": "^6.4.9 || ^7.1.5" }, "bin": [ "bin/paratest", @@ -8789,7 +7560,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.9.1" + "source": "https://github.com/paratestphp/paratest/tree/v7.6.0" }, "funding": [ { @@ -8801,7 +7572,7 @@ "type": "paypal" } ], - "time": "2025-04-04T10:47:46+00:00" + "time": "2024-10-15T12:38:31+00:00" }, { "name": "clue/ndjson-react", @@ -8867,6 +7638,85 @@ ], "time": "2022-12-23T10:58:28+00:00" }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-12T16:29:46+00:00" + }, { "name": "composer/xdebug-handler", "version": "3.0.5", @@ -8935,36 +7785,34 @@ }, { "name": "dama/doctrine-test-bundle", - "version": "v8.3.0", + "version": "v8.2.0", "source": { "type": "git", "url": "https://github.com/dmaicher/doctrine-test-bundle.git", - "reference": "11846789ca2a86f6277316b42448f7fccb3965ff" + "reference": "1f81a280ea63f049d24e9c8ce00e557b18e0ff2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/11846789ca2a86f6277316b42448f7fccb3965ff", - "reference": "11846789ca2a86f6277316b42448f7fccb3965ff", + "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/1f81a280ea63f049d24e9c8ce00e557b18e0ff2f", + "reference": "1f81a280ea63f049d24e9c8ce00e557b18e0ff2f", "shasum": "" }, "require": { "doctrine/dbal": "^3.3 || ^4.0", "doctrine/doctrine-bundle": "^2.11.0", - "php": ">= 8.1", - "psr/cache": "^2.0 || ^3.0", - "symfony/cache": "^6.4 || ^7.2", - "symfony/framework-bundle": "^6.4 || ^7.2" - }, - "conflict": { - "phpunit/phpunit": "<10.0" + "php": "^7.4 || ^8.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^5.4 || ^6.3 || ^7.0", + "symfony/framework-bundle": "^5.4 || ^6.3 || ^7.0" }, "require-dev": { "behat/behat": "^3.0", "friendsofphp/php-cs-fixer": "^3.27", - "phpstan/phpstan": "^2.0", - "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", - "symfony/process": "^6.4 || ^7.2", - "symfony/yaml": "^6.4 || ^7.2" + "phpstan/phpstan": "^1.2", + "phpunit/phpunit": "^8.0 || ^9.0 || ^10.0 || ^11.0", + "symfony/phpunit-bridge": "^6.3", + "symfony/process": "^5.4 || ^6.3 || ^7.0", + "symfony/yaml": "^5.4 || ^6.3 || ^7.0" }, "type": "symfony-bundle", "extra": { @@ -8998,28 +7846,29 @@ ], "support": { "issues": "https://github.com/dmaicher/doctrine-test-bundle/issues", - "source": "https://github.com/dmaicher/doctrine-test-bundle/tree/v8.3.0" + "source": "https://github.com/dmaicher/doctrine-test-bundle/tree/v8.2.0" }, - "time": "2025-03-04T10:07:03+00:00" + "time": "2024-05-28T15:41:06+00:00" }, { "name": "doctrine/data-fixtures", - "version": "2.0.2", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "f7f1e12d6bceb58c204b3e77210a103c1c57601e" + "reference": "d2ff5046b263868baf6e9b06cf4918f60096c0d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/f7f1e12d6bceb58c204b3e77210a103c1c57601e", - "reference": "f7f1e12d6bceb58c204b3e77210a103c1c57601e", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/d2ff5046b263868baf6e9b06cf4918f60096c0d0", + "reference": "d2ff5046b263868baf6e9b06cf4918f60096c0d0", "shasum": "" }, "require": { - "doctrine/persistence": "^3.1 || ^4.0", - "php": "^8.1", - "psr/log": "^1.1 || ^2 || ^3" + "doctrine/deprecations": "^0.5.3 || ^1.0", + "doctrine/persistence": "^2.0 || ^3.0", + "php": "^7.4 || ^8.0", + "symfony/polyfill-php80": "^1" }, "conflict": { "doctrine/dbal": "<3.5 || >=5", @@ -9027,6 +7876,7 @@ "doctrine/phpcr-odm": "<1.3.0" }, "require-dev": { + "doctrine/annotations": "^1.12 || ^2", "doctrine/coding-standard": "^12", "doctrine/dbal": "^3.5 || ^4", "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", @@ -9034,9 +7884,10 @@ "ext-sqlite3": "*", "fig/log-test": "^1", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5.3", - "symfony/cache": "^6.4 || ^7", - "symfony/var-exporter": "^6.4 || ^7" + "phpunit/phpunit": "^9.6.13 || ^10.4.2", + "psr/log": "^1.1 || ^2 || ^3", + "symfony/cache": "^5.4 || ^6.3 || ^7", + "symfony/var-exporter": "^5.4 || ^6.3 || ^7" }, "suggest": { "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", @@ -9067,7 +7918,7 @@ ], "support": { "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/2.0.2" + "source": "https://github.com/doctrine/data-fixtures/tree/1.8.0" }, "funding": [ { @@ -9083,44 +7934,44 @@ "type": "tidelift" } ], - "time": "2025-01-21T13:21:31+00:00" + "time": "2024-11-04T22:36:12+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", - "version": "3.7.1", + "version": "3.6.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", - "reference": "bd59519a7532b9e1a41cef4049d5326dfac7def9" + "reference": "f44a224e27573b79140197a44e68484c45fb24da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/bd59519a7532b9e1a41cef4049d5326dfac7def9", - "reference": "bd59519a7532b9e1a41cef4049d5326dfac7def9", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/f44a224e27573b79140197a44e68484c45fb24da", + "reference": "f44a224e27573b79140197a44e68484c45fb24da", "shasum": "" }, "require": { - "doctrine/data-fixtures": "^1.5 || ^2.0", + "doctrine/data-fixtures": "^1.3", "doctrine/doctrine-bundle": "^2.2", "doctrine/orm": "^2.14.0 || ^3.0", - "doctrine/persistence": "^2.4 || ^3.0", + "doctrine/persistence": "^2.4|^3.0", "php": "^7.4 || ^8.0", - "psr/log": "^1 || ^2 || ^3", - "symfony/config": "^5.4 || ^6.0 || ^7.0", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", - "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/doctrine-bridge": "^5.4.48 || ^6.4.16 || ^7.1.9", - "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/doctrine-bridge": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0" }, "conflict": { "doctrine/dbal": "< 3" }, "require-dev": { "doctrine/coding-standard": "^12", - "phpstan/phpstan": "^2", + "phpstan/phpstan": "^1.10.39", "phpunit/phpunit": "^9.6.13", - "symfony/phpunit-bridge": "^6.3.6" + "symfony/phpunit-bridge": "^6.3.6", + "vimeo/psalm": "^5.15" }, "type": "symfony-bundle", "autoload": { @@ -9154,7 +8005,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", - "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.7.1" + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.6.2" }, "funding": [ { @@ -9170,7 +8021,7 @@ "type": "tidelift" } ], - "time": "2024-12-03T17:07:51+00:00" + "time": "2024-11-13T07:41:29+00:00" }, { "name": "evenement/evenement", @@ -9282,16 +8133,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.75.0", + "version": "v3.65.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "399a128ff2fdaf4281e4e79b755693286cdf325c" + "reference": "79d4f3e77b250a7d8043d76c6af8f0695e8a469f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/399a128ff2fdaf4281e4e79b755693286cdf325c", - "reference": "399a128ff2fdaf4281e4e79b755693286cdf325c", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/79d4f3e77b250a7d8043d76c6af8f0695e8a469f", + "reference": "79d4f3e77b250a7d8043d76c6af8f0695e8a469f", "shasum": "" }, "require": { @@ -9299,7 +8150,6 @@ "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.3", "ext-filter": "*", - "ext-hash": "*", "ext-json": "*", "ext-tokenizer": "*", "fidry/cpu-core-counter": "^1.2", @@ -9309,31 +8159,31 @@ "react/promise": "^2.0 || ^3.0", "react/socket": "^1.0", "react/stream": "^1.0", - "sebastian/diff": "^4.0 || ^5.1 || ^6.0 || ^7.0", - "symfony/console": "^5.4 || ^6.4 || ^7.0", - "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0", - "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", - "symfony/finder": "^5.4 || ^6.4 || ^7.0", - "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0", - "symfony/polyfill-mbstring": "^1.31", - "symfony/polyfill-php80": "^1.31", - "symfony/polyfill-php81": "^1.31", - "symfony/process": "^5.4 || ^6.4 || ^7.2", - "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0" + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-mbstring": "^1.28", + "symfony/polyfill-php80": "^1.28", + "symfony/polyfill-php81": "^1.28", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "facile-it/paraunit": "^1.3.1 || ^2.6", - "infection/infection": "^0.29.14", - "justinrainbow/json-schema": "^5.3 || ^6.2", + "facile-it/paraunit": "^1.3.1 || ^2.4", + "infection/infection": "^0.29.8", + "justinrainbow/json-schema": "^5.3 || ^6.0", "keradus/cli-executor": "^2.1", "mikey179/vfsstream": "^1.6.12", "php-coveralls/php-coveralls": "^2.7", "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", - "phpunit/phpunit": "^9.6.22 || ^10.5.45 || ^11.5.12", - "symfony/var-dumper": "^5.4.48 || ^6.4.18 || ^7.2.3", - "symfony/yaml": "^5.4.45 || ^6.4.18 || ^7.2.3" + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", + "phpunit/phpunit": "^9.6.21 || ^10.5.38 || ^11.4.3", + "symfony/var-dumper": "^5.4.47 || ^6.4.15 || ^7.1.8", + "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.1.6" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -9374,7 +8224,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.75.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.65.0" }, "funding": [ { @@ -9382,7 +8232,7 @@ "type": "github" } ], - "time": "2025-03-31T18:40:42+00:00" + "time": "2024-11-25T00:39:24+00:00" }, { "name": "masterminds/html5", @@ -9451,18 +8301,78 @@ }, "time": "2024-03-31T07:05:07+00:00" }, + { + "name": "myclabs/deep-copy", + "version": "1.12.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-11-08T17:47:46+00:00" + }, { "name": "nikic/php-parser", - "version": "v5.4.0", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", "shasum": "" }, "require": { @@ -9505,9 +8415,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" }, - "time": "2024-12-30T11:07:19+00:00" + "time": "2024-10-08T18:51:32+00:00" }, { "name": "phar-io/manifest", @@ -9629,34 +8539,35 @@ }, { "name": "phpunit/php-code-coverage", - "version": "12.1.2", + "version": "11.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "05c33d01a856f9f62488d144bafddc3d7b7a4ebb" + "reference": "418c59fd080954f8c4aa5631d9502ecda2387118" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/05c33d01a856f9f62488d144bafddc3d7b7a4ebb", - "reference": "05c33d01a856f9f62488d144bafddc3d7b7a4ebb", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/418c59fd080954f8c4aa5631d9502ecda2387118", + "reference": "418c59fd080954f8c4aa5631d9502ecda2387118", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^5.4.0", - "php": ">=8.3", - "phpunit/php-file-iterator": "^6.0", - "phpunit/php-text-template": "^5.0", - "sebastian/complexity": "^5.0", - "sebastian/environment": "^8.0", - "sebastian/lines-of-code": "^4.0", - "sebastian/version": "^6.0", + "nikic/php-parser": "^5.3.1", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.0", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.5.0" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -9665,7 +8576,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "12.1.x-dev" + "dev-main": "11.0.x-dev" } }, "autoload": { @@ -9694,7 +8605,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.1.2" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.8" }, "funding": [ { @@ -9702,32 +8613,32 @@ "type": "github" } ], - "time": "2025-04-03T14:34:39+00:00" + "time": "2024-12-11T12:34:27+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "6.0.0", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782" + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -9755,7 +8666,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" }, "funding": [ { @@ -9763,28 +8674,28 @@ "type": "github" } ], - "time": "2025-02-07T04:58:37+00:00" + "time": "2024-08-27T05:02:59+00:00" }, { "name": "phpunit/php-invoker", - "version": "6.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", - "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "suggest": { "ext-pcntl": "*" @@ -9792,7 +8703,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -9819,7 +8730,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" }, "funding": [ { @@ -9827,32 +8738,32 @@ "type": "github" } ], - "time": "2025-02-07T04:58:58+00:00" + "time": "2024-07-03T05:07:44+00:00" }, { "name": "phpunit/php-text-template", - "version": "5.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", - "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -9879,7 +8790,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" }, "funding": [ { @@ -9887,32 +8798,32 @@ "type": "github" } ], - "time": "2025-02-07T04:59:16+00:00" + "time": "2024-07-03T05:08:43+00:00" }, { "name": "phpunit/php-timer", - "version": "8.0.0", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", - "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -9939,7 +8850,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" }, "funding": [ { @@ -9947,20 +8858,20 @@ "type": "github" } ], - "time": "2025-02-07T04:59:38+00:00" + "time": "2024-07-03T05:09:35+00:00" }, { "name": "phpunit/phpunit", - "version": "12.1.2", + "version": "11.4.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "6f2775cc4b7b19ba5a411c188e855eb0cc78a711" + "reference": "e8e8ed1854de5d36c088ec1833beae40d2dedd76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6f2775cc4b7b19ba5a411c188e855eb0cc78a711", - "reference": "6f2775cc4b7b19ba5a411c188e855eb0cc78a711", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e8e8ed1854de5d36c088ec1833beae40d2dedd76", + "reference": "e8e8ed1854de5d36c088ec1833beae40d2dedd76", "shasum": "" }, "require": { @@ -9970,25 +8881,28 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.0", + "myclabs/deep-copy": "^1.12.0", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=8.3", - "phpunit/php-code-coverage": "^12.1.2", - "phpunit/php-file-iterator": "^6.0.0", - "phpunit/php-invoker": "^6.0.0", - "phpunit/php-text-template": "^5.0.0", - "phpunit/php-timer": "^8.0.0", - "sebastian/cli-parser": "^4.0.0", - "sebastian/comparator": "^7.0.1", - "sebastian/diff": "^7.0.0", - "sebastian/environment": "^8.0.0", - "sebastian/exporter": "^7.0.0", - "sebastian/global-state": "^8.0.0", - "sebastian/object-enumerator": "^7.0.0", - "sebastian/type": "^6.0.2", - "sebastian/version": "^6.0.0", - "staabm/side-effects-detector": "^1.0.5" + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.7", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.1", + "sebastian/comparator": "^6.1.1", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.0", + "sebastian/exporter": "^6.1.3", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.1.0", + "sebastian/version": "^5.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" }, "bin": [ "phpunit" @@ -9996,7 +8910,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "12.1-dev" + "dev-main": "11.4-dev" } }, "autoload": { @@ -10028,7 +8942,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.1.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.4.3" }, "funding": [ { @@ -10044,7 +8958,7 @@ "type": "tidelift" } ], - "time": "2025-04-08T08:05:27+00:00" + "time": "2024-10-28T13:07:50+00:00" }, { "name": "react/cache", @@ -10120,33 +9034,33 @@ }, { "name": "react/child-process", - "version": "v0.6.6", + "version": "v0.6.5", "source": { "type": "git", "url": "https://github.com/reactphp/child-process.git", - "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159" + "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159", - "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", "shasum": "" }, "require": { "evenement/evenement": "^3.0 || ^2.0 || ^1.0", "php": ">=5.3.0", "react/event-loop": "^1.2", - "react/stream": "^1.4" + "react/stream": "^1.2" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/socket": "^1.16", + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", + "react/socket": "^1.8", "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" }, "type": "library", "autoload": { "psr-4": { - "React\\ChildProcess\\": "src/" + "React\\ChildProcess\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -10183,15 +9097,19 @@ ], "support": { "issues": "https://github.com/reactphp/child-process/issues", - "source": "https://github.com/reactphp/child-process/tree/v0.6.6" + "source": "https://github.com/reactphp/child-process/tree/v0.6.5" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" } ], - "time": "2025-01-01T16:37:48+00:00" + "time": "2022-09-16T13:41:56+00:00" }, { "name": "react/dns", @@ -10574,28 +9492,28 @@ }, { "name": "sebastian/cli-parser", - "version": "4.0.0", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "6d584c727d9114bcdc14c86711cd1cad51778e7c" + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/6d584c727d9114bcdc14c86711cd1cad51778e7c", - "reference": "6d584c727d9114bcdc14c86711cd1cad51778e7c", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -10619,7 +9537,120 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.0.0" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:41:36+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "6bb7d09d6623567178cf54126afa9c2310114268" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/6bb7d09d6623567178cf54126afa9c2310114268", + "reference": "6bb7d09d6623567178cf54126afa9c2310114268", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:44:28+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" }, "funding": [ { @@ -10627,39 +9658,36 @@ "type": "github" } ], - "time": "2025-02-07T04:53:50+00:00" + "time": "2024-07-03T04:45:54+00:00" }, { "name": "sebastian/comparator", - "version": "7.0.1", + "version": "6.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "b478f34614f934e0291598d0c08cbaba9644bee5" + "reference": "43d129d6a0f81c78bee378b46688293eb7ea3739" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/b478f34614f934e0291598d0c08cbaba9644bee5", - "reference": "b478f34614f934e0291598d0c08cbaba9644bee5", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/43d129d6a0f81c78bee378b46688293eb7ea3739", + "reference": "43d129d6a0f81c78bee378b46688293eb7ea3739", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "php": ">=8.3", - "sebastian/diff": "^7.0", - "sebastian/exporter": "^7.0" + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^12.0" - }, - "suggest": { - "ext-bcmath": "For comparing BcMath\\Number objects" + "phpunit/phpunit": "^11.4" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "6.2-dev" } }, "autoload": { @@ -10699,7 +9727,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/7.0.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/6.2.1" }, "funding": [ { @@ -10707,33 +9735,33 @@ "type": "github" } ], - "time": "2025-03-07T07:00:32+00:00" + "time": "2024-10-31T05:30:08+00:00" }, { "name": "sebastian/complexity", - "version": "5.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", - "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -10757,7 +9785,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" }, "funding": [ { @@ -10765,33 +9793,33 @@ "type": "github" } ], - "time": "2025-02-07T04:55:25+00:00" + "time": "2024-07-03T04:49:50+00:00" }, { "name": "sebastian/diff", - "version": "7.0.0", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "7ab1ea946c012266ca32390913653d844ecd085f" + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", - "reference": "7ab1ea946c012266ca32390913653d844ecd085f", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0", - "symfony/process": "^7.2" + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -10824,7 +9852,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" }, "funding": [ { @@ -10832,27 +9860,27 @@ "type": "github" } ], - "time": "2025-02-07T04:55:46+00:00" + "time": "2024-07-03T04:53:05+00:00" }, { "name": "sebastian/environment", - "version": "8.0.0", + "version": "7.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8afe311eca49171bf95405cc0078be9a3821f9f2" + "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8afe311eca49171bf95405cc0078be9a3821f9f2", - "reference": "8afe311eca49171bf95405cc0078be9a3821f9f2", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "suggest": { "ext-posix": "*" @@ -10860,7 +9888,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "7.2-dev" } }, "autoload": { @@ -10888,7 +9916,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/8.0.0" + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0" }, "funding": [ { @@ -10896,34 +9924,34 @@ "type": "github" } ], - "time": "2025-02-07T04:56:08+00:00" + "time": "2024-07-03T04:54:44+00:00" }, { "name": "sebastian/exporter", - "version": "7.0.0", + "version": "6.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "76432aafc58d50691a00d86d0632f1217a47b688" + "reference": "c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/76432aafc58d50691a00d86d0632f1217a47b688", - "reference": "76432aafc58d50691a00d86d0632f1217a47b688", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e", + "reference": "c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=8.3", - "sebastian/recursion-context": "^7.0" + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "6.1-dev" } }, "autoload": { @@ -10966,7 +9994,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/exporter/tree/6.1.3" }, "funding": [ { @@ -10974,35 +10002,35 @@ "type": "github" } ], - "time": "2025-02-07T04:56:42+00:00" + "time": "2024-07-03T04:56:19+00:00" }, { "name": "sebastian/global-state", - "version": "8.0.0", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "570a2aeb26d40f057af686d63c4e99b075fb6cbc" + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/570a2aeb26d40f057af686d63c4e99b075fb6cbc", - "reference": "570a2aeb26d40f057af686d63c4e99b075fb6cbc", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", "shasum": "" }, "require": { - "php": ">=8.3", - "sebastian/object-reflector": "^5.0", - "sebastian/recursion-context": "^7.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -11028,7 +10056,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.0" + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" }, "funding": [ { @@ -11036,33 +10064,33 @@ "type": "github" } ], - "time": "2025-02-07T04:56:59+00:00" + "time": "2024-07-03T04:57:36+00:00" }, { "name": "sebastian/lines-of-code", - "version": "4.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", - "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -11086,7 +10114,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" }, "funding": [ { @@ -11094,34 +10122,34 @@ "type": "github" } ], - "time": "2025-02-07T04:57:28+00:00" + "time": "2024-07-03T04:58:38+00:00" }, { "name": "sebastian/object-enumerator", - "version": "7.0.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", - "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", "shasum": "" }, "require": { - "php": ">=8.3", - "sebastian/object-reflector": "^5.0", - "sebastian/recursion-context": "^7.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -11144,7 +10172,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" }, "funding": [ { @@ -11152,32 +10180,32 @@ "type": "github" } ], - "time": "2025-02-07T04:57:48+00:00" + "time": "2024-07-03T05:00:13+00:00" }, { "name": "sebastian/object-reflector", - "version": "5.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "4bfa827c969c98be1e527abd576533293c634f6a" + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", - "reference": "4bfa827c969c98be1e527abd576533293c634f6a", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -11200,7 +10228,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" }, "funding": [ { @@ -11208,32 +10236,32 @@ "type": "github" } ], - "time": "2025-02-07T04:58:17+00:00" + "time": "2024-07-03T05:01:32+00:00" }, { "name": "sebastian/recursion-context", - "version": "7.0.0", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "c405ae3a63e01b32eb71577f8ec1604e39858a7c" + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/c405ae3a63e01b32eb71577f8ec1604e39858a7c", - "reference": "c405ae3a63e01b32eb71577f8ec1604e39858a7c", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -11264,7 +10292,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2" }, "funding": [ { @@ -11272,32 +10300,32 @@ "type": "github" } ], - "time": "2025-02-07T05:00:01+00:00" + "time": "2024-07-03T05:10:34+00:00" }, { "name": "sebastian/type", - "version": "6.0.2", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "1d7cd6e514384c36d7a390347f57c385d4be6069" + "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/1d7cd6e514384c36d7a390347f57c385d4be6069", - "reference": "1d7cd6e514384c36d7a390347f57c385d4be6069", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/461b9c5da241511a2a0e8f240814fb23ce5c0aac", + "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -11321,7 +10349,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/type/tree/5.1.0" }, "funding": [ { @@ -11329,29 +10357,29 @@ "type": "github" } ], - "time": "2025-03-18T13:37:31+00:00" + "time": "2024-09-17T13:12:04+00:00" }, { "name": "sebastian/version", - "version": "6.0.0", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", - "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -11375,7 +10403,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/version/issues", "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" }, "funding": [ { @@ -11383,20 +10411,20 @@ "type": "github" } ], - "time": "2025-02-07T05:00:38+00:00" + "time": "2024-10-09T05:16:32+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.12.1", + "version": "3.11.2", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "ea16a1f3719783345febd3aab41beb55c8c84bfd" + "reference": "1368f4a58c3c52114b86b1abe8f4098869cb0079" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ea16a1f3719783345febd3aab41beb55c8c84bfd", - "reference": "ea16a1f3719783345febd3aab41beb55c8c84bfd", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/1368f4a58c3c52114b86b1abe8f4098869cb0079", + "reference": "1368f4a58c3c52114b86b1abe8f4098869cb0079", "shasum": "" }, "require": { @@ -11461,78 +10489,22 @@ { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcsstandards", - "type": "thanks_dev" - } - ], - "time": "2025-04-04T12:57:55+00:00" - }, - { - "name": "staabm/side-effects-detector", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/staabm/side-effects-detector.git", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^1.12.6", - "phpunit/phpunit": "^9.6.21", - "symfony/var-dumper": "^5.4.43", - "tomasvotruba/type-coverage": "1.0.0", - "tomasvotruba/unused-public": "1.0.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "lib/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A static analysis tool to detect side effects in PHP code", - "keywords": [ - "static analysis" - ], - "support": { - "issues": "https://github.com/staabm/side-effects-detector/issues", - "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" - }, - "funding": [ - { - "url": "https://github.com/staabm", - "type": "github" } ], - "time": "2024-10-20T05:08:20+00:00" + "time": "2024-12-11T16:04:26+00:00" }, { "name": "symfony/browser-kit", - "version": "v7.2.4", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "8ce0ee23857d87d5be493abba2d52d1f9e49da61" + "reference": "714becc9ba9b20115ffededc58f6b7172dc394cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/8ce0ee23857d87d5be493abba2d52d1f9e49da61", - "reference": "8ce0ee23857d87d5be493abba2d52d1f9e49da61", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/714becc9ba9b20115ffededc58f6b7172dc394cf", + "reference": "714becc9ba9b20115ffededc58f6b7172dc394cf", "shasum": "" }, "require": { @@ -11571,7 +10543,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v7.2.4" + "source": "https://github.com/symfony/browser-kit/tree/v7.1.6" }, "funding": [ { @@ -11587,20 +10559,20 @@ "type": "tidelift" } ], - "time": "2025-02-14T14:27:24+00:00" + "time": "2024-10-25T15:11:02+00:00" }, { "name": "symfony/css-selector", - "version": "v7.2.0", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" + "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", - "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", + "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", "shasum": "" }, "require": { @@ -11636,7 +10608,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.2.0" + "source": "https://github.com/symfony/css-selector/tree/v7.1.6" }, "funding": [ { @@ -11652,20 +10624,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/dom-crawler", - "version": "v7.2.4", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "19cc7b08efe9ad1ab1b56e0948e8d02e15ed3ef7" + "reference": "794ddd5481ba15d8a04132c95e211cd5656e09fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/19cc7b08efe9ad1ab1b56e0948e8d02e15ed3ef7", - "reference": "19cc7b08efe9ad1ab1b56e0948e8d02e15ed3ef7", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/794ddd5481ba15d8a04132c95e211cd5656e09fb", + "reference": "794ddd5481ba15d8a04132c95e211cd5656e09fb", "shasum": "" }, "require": { @@ -11703,7 +10675,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v7.2.4" + "source": "https://github.com/symfony/dom-crawler/tree/v7.1.6" }, "funding": [ { @@ -11719,20 +10691,20 @@ "type": "tidelift" } ], - "time": "2025-02-17T15:53:07+00:00" + "time": "2024-10-25T15:11:02+00:00" }, { "name": "symfony/maker-bundle", - "version": "v1.62.1", + "version": "v1.61.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "468ff2708200c95ebc0d85d3174b6c6711b8a590" + "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/468ff2708200c95ebc0d85d3174b6c6711b8a590", - "reference": "468ff2708200c95ebc0d85d3174b6c6711b8a590", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/a3b7f14d349f8f44ed752d4dde2263f77510cc18", + "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18", "shasum": "" }, "require": { @@ -11795,7 +10767,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.62.1" + "source": "https://github.com/symfony/maker-bundle/tree/v1.61.0" }, "funding": [ { @@ -11811,20 +10783,20 @@ "type": "tidelift" } ], - "time": "2025-01-15T00:21:40+00:00" + "time": "2024-08-29T22:50:23+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v7.2.0", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "2bbde92ab25a0e2c88160857af7be9db5da0d145" + "reference": "c6b9d8f52d3e276bedb49612aa4a2a046171287f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/2bbde92ab25a0e2c88160857af7be9db5da0d145", - "reference": "2bbde92ab25a0e2c88160857af7be9db5da0d145", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/c6b9d8f52d3e276bedb49612aa4a2a046171287f", + "reference": "c6b9d8f52d3e276bedb49612aa4a2a046171287f", "shasum": "" }, "require": { @@ -11844,8 +10816,8 @@ "type": "symfony-bridge", "extra": { "thanks": { - "url": "https://github.com/sebastianbergmann/phpunit", - "name": "phpunit/phpunit" + "name": "phpunit/phpunit", + "url": "https://github.com/sebastianbergmann/phpunit" } }, "autoload": { @@ -11877,7 +10849,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v7.2.0" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.1.6" }, "funding": [ { @@ -11893,20 +10865,20 @@ "type": "tidelift" } ], - "time": "2024-11-13T16:15:23+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/process", - "version": "v7.2.5", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "87b7c93e57df9d8e39a093d32587702380ff045d" + "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/87b7c93e57df9d8e39a093d32587702380ff045d", - "reference": "87b7c93e57df9d8e39a093d32587702380ff045d", + "url": "https://api.github.com/repos/symfony/process/zipball/42783370fda6e538771f7c7a36e9fa2ee3a84892", + "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892", "shasum": "" }, "require": { @@ -11938,7 +10910,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.2.5" + "source": "https://github.com/symfony/process/tree/v7.1.8" }, "funding": [ { @@ -11954,7 +10926,7 @@ "type": "tidelift" } ], - "time": "2025-03-13T12:21:46+00:00" + "time": "2024-11-06T14:23:19+00:00" }, { "name": "theseer/tokenizer", diff --git a/config/directories.yaml b/config/directories.yaml index a25706707..9a82596cc 100644 --- a/config/directories.yaml +++ b/config/directories.yaml @@ -1,10 +1,17 @@ parameters: app.dir.agent.profile: '/agents/images/profile' + app.dir.agent.cover: '/agents/images/cover' + app.dir.agent.portfolio: '/agents/images/portfolio' app.dir.event.profile: '/events/images/profile' - app.dir.initiative.cover_image: '/initiatives/images/cover_image' + app.dir.event.cover: '/event/images/cover' + app.dir.initiative.cover: '/initiatives/images/cover' app.dir.initiative.profile: '/initiatives/images/profile' app.dir.opportunity.cover: '/opportunities/images/cover' app.dir.opportunity.profile: '/opportunities/images/profile' app.dir.organization.profile: '/organizations/images/profile' + app.dir.organization.cover: '/organizations/images/cover' app.dir.space.profile: '/spaces/images/profile' + app.dir.space.cover: '/spaces/images/cover' + app.dir.space.portfolio: '/spaces/images/portfolio' app.dir.user.profile: '/users/images/profile' + app.dir.user.cover: '/users/images/cover' diff --git a/config/environment/aurora.yaml b/config/environment/aurora.yaml index 581a544c2..0e3b168d6 100644 --- a/config/environment/aurora.yaml +++ b/config/environment/aurora.yaml @@ -104,6 +104,9 @@ dropdown: - text: "my_initiatives" icon: article route: "admin_initiative_list" + - text: "my_organizations" + icon: build + route: "admin_organization_list" dashboard: cards: @@ -171,6 +174,7 @@ dashboard: sidebar: dashboard: + acl: [ 'ROLE_USER' ] title: menu items: admin_dashboard: @@ -180,6 +184,7 @@ sidebar: # color: text-info my_opportunities: + acl: [ 'ROLE_USER' ] title: my_opportunities items: admin_registration_list: @@ -192,6 +197,7 @@ sidebar: text: accountability my_events: + acl: [ 'ROLE_USER' ] title: my_events items: admin_my_event_list: @@ -200,6 +206,7 @@ sidebar: text: my_subscriptions notice_opportunity: + acl: [ 'ROLE_USER' ] title: footer.notices_opportunities items: admin_opportunity_list: @@ -212,6 +219,7 @@ sidebar: text: my_reviews entity: + acl: [ 'ROLE_ADMIN' ] title: management items: admin_agent_list: @@ -237,45 +245,46 @@ sidebar: admin: title: admin_options + acl: ['ROLE_ADMIN'] items: admin_seal_list: - acl: ['ROLE_USER'] + acl: ['ROLE_ADMIN'] icon: bookmark text: seals admin_subsite_list: - acl: ['ROLE_USER'] + acl: ['ROLE_ADMIN'] icon: account_tree text: subsites admin_user_list: - acl: ['ROLE_USER'] + acl: ['ROLE_ADMIN'] icon: manage_accounts text: users admin_faq_list: - acl: ['ROLE_USER'] + acl: ['ROLE_ADMIN'] icon: quiz text: faq admin_role_list: - acl: ['ROLE_USER'] + acl: ['ROLE_ADMIN'] icon: newspaper text: functions admin_activity_area_list: - acl: ['ROLE_USER'] + acl: ['ROLE_ADMIN'] icon: category text: area_of_activity admin_tag_list: - acl: ['ROLE_USER'] + acl: ['ROLE_ADMIN'] icon: label text: tags admin_space_type_list: - acl: ['ROLE_USER'] + acl: ['ROLE_ADMIN'] icon: room_preferences text: space_type admin_architectural_accessibility_list: - acl: ['ROLE_USER'] + acl: ['ROLE_ADMIN'] icon: accessibility text: architectural_accessibility admin_cultural_language_list: - acl: ['ROLE_USER'] + acl: ['ROLE_ADMIN'] icon: language text: cultural_language diff --git a/config/routes/admin/agent.yaml b/config/routes/admin/agent.yaml index bb3235f8c..c1e8a3501 100644 --- a/config/routes/admin/agent.yaml +++ b/config/routes/admin/agent.yaml @@ -22,3 +22,8 @@ edit: path: /{id}/editar controller: App\Controller\Web\Admin\AgentAdminController::edit methods: ['GET', 'POST'] + +remove_portfolio_photo: + path: /{id}/portfolio/{photoId}/remove + controller: App\Controller\Web\Admin\AgentAdminController::removePortfolioPhoto + methods: ['GET'] diff --git a/config/routes/admin/space.yaml b/config/routes/admin/space.yaml index faaaa2702..f749acd3e 100644 --- a/config/routes/admin/space.yaml +++ b/config/routes/admin/space.yaml @@ -26,4 +26,9 @@ edit: toggle_publish: path: /{id}/toggle-publish controller: App\Controller\Web\Admin\SpaceAdminController::togglePublish - methods: ['GET'] \ No newline at end of file + methods: ['GET'] + +remove_portfolio_photo: + path: /{id}/portfolio/{photoId}/remove + controller: App\Controller\Web\Admin\SpaceAdminController::removePortfolioPhoto + methods: ['GET'] diff --git a/config/routes/admin/user.yaml b/config/routes/admin/user.yaml index 7dc4171be..3f9df3664 100644 --- a/config/routes/admin/user.yaml +++ b/config/routes/admin/user.yaml @@ -18,6 +18,11 @@ edit_profile: controller: App\Controller\Web\Admin\UserAdminController::editUserProfile methods: ['GET', 'POST'] +details: + path: /{id} + controller: App\Controller\Web\Admin\UserAdminController::details + methods: ['GET'] + create: path: /adicionar controller: App\Controller\Web\Admin\UserAdminController::create diff --git a/cypress/aurora/e2e/web/event/event-list.cy.js b/cypress/aurora/e2e/web/event/event-list.cy.js index 1c12ea8a5..366452dba 100644 --- a/cypress/aurora/e2e/web/event/event-list.cy.js +++ b/cypress/aurora/e2e/web/event/event-list.cy.js @@ -58,11 +58,24 @@ describe('Pagina de listar Eventos', () => { }); it('Garante que o filtro funciona', () => { - cy.get('#open-filter').click(); - cy.get('#event-name').type('Festival da Rapadura'); + cy.get('[id=open-filter]').click(); + cy.scrollTo('top'); + cy.contains('Ver calendário').click(); + cy.get('[data-cy=dropdown-calendar]').should('be.visible'); + cy.get('[data-cy=dropdown-calendar] .air-datepicker-nav--title') + .click() + .click(); + cy.get('[data-cy=dropdown-calendar]').contains('2024').click(); + cy.get('[data-cy=dropdown-calendar]').contains('Jul').click(); + cy.get('[data-cy=dropdown-calendar]').contains('9').click(); + cy.get('[data-cy=dropdown-calendar] [data-action=next]').click(); + cy.get('[data-cy=dropdown-calendar] [data-date="2"]').click(); + cy.get('#period').should('have.value', '2024-07-09,2024-08-02'); + cy.get('#period').should('contain.text', '09/07/2024 - 02/08/2024'); + cy.get('#event-name').type('sertão'); cy.get('#apply-filters').click(); cy.get('.total-events').contains('1 Eventos Encontrados').should('be.visible'); - cy.get('.event-name').contains('Festival da Rapadura').should('be.visible'); + cy.get('.event-name').contains('Festival Sertão Criativo').should('be.visible'); }); it('Garante que o botão de limpar filtros funciona', () => { diff --git a/docker-compose.yml b/docker-compose.yml index 23921c167..cfad635a5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,6 +9,7 @@ services: volumes: - ./:/var/www - ./docker/php/local.ini:/usr/local/etc/php/conf.d/local.ini + - ./docker/php/99-xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini networks: - aurora_network diff --git a/docker/php/99-xdebug.ini b/docker/php/99-xdebug.ini new file mode 100644 index 000000000..b236d9400 --- /dev/null +++ b/docker/php/99-xdebug.ini @@ -0,0 +1,9 @@ +zend_extension=xdebug.so +xdebug.mode=coverage,develop,debug +xdebug.start_with_request=trigger +xdebug.discover_client_host=0 +xdebug.client_host=host.docker.internal +xdebug.output_dir=/var/www +xdebug.log=/var/www/xdebug.log +xdebug.log_level=10 +xdebug.show_local_vars=1 diff --git a/importmap.php b/importmap.php index 67298d3f2..81272a82c 100644 --- a/importmap.php +++ b/importmap.php @@ -45,17 +45,23 @@ '@iconify/iconify' => [ 'version' => '3.1.1', ], - 'tom-select' => [ - 'version' => '2.4.3', + 'air-datepicker' => [ + 'version' => '3.5.3', ], - '@orchidjs/sifter' => [ - 'version' => '1.1.0', + 'air-datepicker/locale/en.js' => [ + 'version' => '3.5.3', ], - '@orchidjs/unicode-variants' => [ - 'version' => '1.1.2', + 'air-datepicker/locale/es.js' => [ + 'version' => '3.5.3', ], - 'tom-select/dist/css/tom-select.default.min.css' => [ - 'version' => '2.4.3', + 'air-datepicker/locale/pt-BR.js' => [ + 'version' => '3.5.3', + ], + 'air-datepicker/locale/pt-br.js' => [ + 'path' => 'vendor/air-datepicker/locale/pt-BR.js', + ], + 'air-datepicker/air-datepicker.css' => [ + 'version' => '3.5.3', 'type' => 'css', ], ]; diff --git a/migrations/Version20260106232201.php b/migrations/Version20260106232201.php new file mode 100644 index 000000000..283e60b0c --- /dev/null +++ b/migrations/Version20260106232201.php @@ -0,0 +1,26 @@ +addSql('ALTER TABLE opportunity ADD description VARCHAR(255)'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE opportunity DROP description'); + } +} diff --git a/migrations/Version20260111085902.php b/migrations/Version20260111085902.php new file mode 100644 index 000000000..79ffe66f6 --- /dev/null +++ b/migrations/Version20260111085902.php @@ -0,0 +1,26 @@ +addSql('ALTER TABLE agent ADD fiscal_code VARCHAR(30)'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE agent DROP fiscal_code'); + } +} diff --git a/migrations/Version20260113210410.php b/migrations/Version20260113210410.php new file mode 100644 index 000000000..3d2eac36f --- /dev/null +++ b/migrations/Version20260113210410.php @@ -0,0 +1,26 @@ +addSql('ALTER TABLE app_user ADD cover_image VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE "app_user" DROP cover_image'); + } +} diff --git a/migrations/Version20260121120000.php b/migrations/Version20260121120000.php new file mode 100644 index 000000000..353ce4a9e --- /dev/null +++ b/migrations/Version20260121120000.php @@ -0,0 +1,51 @@ +addSql('CREATE TABLE photo ( + id UUID NOT NULL, + image VARCHAR(255) NOT NULL, + description TEXT DEFAULT NULL, + created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, + updated_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, + deleted_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, + PRIMARY KEY(id) + )'); + $this->addSql('COMMENT ON COLUMN photo.id IS \'(DC2Type:uuid)\''); + + $this->addSql('CREATE TABLE space_photo ( + space_id UUID NOT NULL, + photo_id UUID NOT NULL, + PRIMARY KEY(space_id, photo_id) + )'); + $this->addSql('CREATE INDEX IDX_SPACE_PHOTO_SPACE_ID ON space_photo (space_id)'); + $this->addSql('CREATE INDEX IDX_SPACE_PHOTO_PHOTO_ID ON space_photo (photo_id)'); + $this->addSql('COMMENT ON COLUMN space_photo.space_id IS \'(DC2Type:uuid)\''); + $this->addSql('COMMENT ON COLUMN space_photo.photo_id IS \'(DC2Type:uuid)\''); + + $this->addSql('ALTER TABLE space_photo ADD CONSTRAINT FK_SPACE_PHOTO_SPACE FOREIGN KEY (space_id) REFERENCES space (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE space_photo ADD CONSTRAINT FK_SPACE_PHOTO_PHOTO FOREIGN KEY (photo_id) REFERENCES photo (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE space_photo DROP CONSTRAINT FK_SPACE_PHOTO_SPACE'); + $this->addSql('ALTER TABLE space_photo DROP CONSTRAINT FK_SPACE_PHOTO_PHOTO'); + $this->addSql('DROP TABLE space_photo'); + $this->addSql('DROP TABLE photo'); + } +} diff --git a/migrations/Version20260123082601.php b/migrations/Version20260123082601.php new file mode 100644 index 000000000..a3118f611 --- /dev/null +++ b/migrations/Version20260123082601.php @@ -0,0 +1,32 @@ +addSql('CREATE TABLE activity_area_organizations (activity_area_id UUID NOT NULL, organization_id UUID NOT NULL, PRIMARY KEY(activity_area_id, organization_id))'); + + $this->addSql('CREATE INDEX IDX_F15AB7E8BD5D36AA ON activity_area_organizations (activity_area_id)'); + $this->addSql('CREATE INDEX IDX_F15AB7E8235753BB ON activity_area_organizations (organization_id)'); + + $this->addSql('ALTER TABLE activity_area_organizations ADD CONSTRAINT fk_activity_area_organizations_by_activity_area_id FOREIGN KEY (activity_area_id) REFERENCES activity_area (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE activity_area_organizations ADD CONSTRAINT fk_activity_area_organizations_by_organization_id FOREIGN KEY (organization_id) REFERENCES organization (id) ON DELETE CASCADE'); + } + + public function down(Schema $schema): void + { + $this->addSql('DROP TABLE activity_area_organizations'); + } +} diff --git a/migrations/Version20260131221551.php b/migrations/Version20260131221551.php new file mode 100644 index 000000000..3b4f3fb02 --- /dev/null +++ b/migrations/Version20260131221551.php @@ -0,0 +1,40 @@ +addSql('CREATE TABLE agent_photo ( + agent_id UUID NOT NULL, + photo_id UUID NOT NULL, + PRIMARY KEY(agent_id, photo_id) + )'); + + $this->addSql('CREATE INDEX IDX_AGENT_PHOTO_AGENT_ID ON agent_photo (agent_id)'); + $this->addSql('CREATE INDEX IDX_AGENT_PHOTO_PHOTO_ID ON agent_photo (photo_id)'); + $this->addSql("COMMENT ON COLUMN agent_photo.agent_id IS '(DC2Type:uuid)'"); + $this->addSql("COMMENT ON COLUMN agent_photo.photo_id IS '(DC2Type:uuid)'"); + + $this->addSql('ALTER TABLE agent_photo ADD CONSTRAINT FK_AGENT_PHOTO_AGENT_ID FOREIGN KEY (agent_id) REFERENCES agent (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE agent_photo ADD CONSTRAINT FK_AGENT_PHOTO_PHOTO_ID FOREIGN KEY (photo_id) REFERENCES photo (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE agent_photo DROP CONSTRAINT FK_AGENT_PHOTO_AGENT_ID'); + $this->addSql('ALTER TABLE agent_photo DROP CONSTRAINT FK_AGENT_PHOTO_PHOTO_ID'); + $this->addSql('DROP TABLE agent_photo'); + } +} diff --git a/migrations/Version20260211185521.php b/migrations/Version20260211185521.php new file mode 100644 index 000000000..c72bd5e5b --- /dev/null +++ b/migrations/Version20260211185521.php @@ -0,0 +1,28 @@ +addSql('ALTER TABLE organization ADD long_description TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE organization ADD cover_image VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE organization DROP long_description'); + $this->addSql('ALTER TABLE organization DROP cover_image'); + } +} diff --git a/migrations/Version20260220204355.php b/migrations/Version20260220204355.php new file mode 100644 index 000000000..974c906b4 --- /dev/null +++ b/migrations/Version20260220204355.php @@ -0,0 +1,26 @@ +addSql('ALTER TABLE opportunity ADD cover_image VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE opportunity DROP cover_image'); + } +} diff --git a/migrations/Version20260227003936.php b/migrations/Version20260227003936.php new file mode 100644 index 000000000..ba0f4f10c --- /dev/null +++ b/migrations/Version20260227003936.php @@ -0,0 +1,26 @@ +addSql('ALTER TABLE agent ADD cover_image VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE agent DROP cover_image'); + } +} diff --git a/package.json b/package.json index cd7e11aa0..c0b6975f6 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,13 @@ { + "scripts": { + "watch-assets": "nodemon --watch assets/ --ext js,css,scss,twig --exec \"make compile_frontend\"" + }, "devDependencies": { "cypress": "^13.13.2", "cypress-downloadfile": "^1.2.4", "cypress-file-upload": "^5.0.8", "dotenv": "^16.4.5", - "node": "^22.6.0" + "node": "^22.6.0", + "nodemon": "^3.1.9" } } diff --git a/src/Controller/Web/Admin/AgentAdminController.php b/src/Controller/Web/Admin/AgentAdminController.php index 4c665fc4c..32ddf3e7e 100644 --- a/src/Controller/Web/Admin/AgentAdminController.php +++ b/src/Controller/Web/Admin/AgentAdminController.php @@ -5,10 +5,20 @@ namespace App\Controller\Web\Admin; use App\DocumentService\AgentTimelineDocumentService; +use App\Enum\EducationEnum; use App\Enum\FlashMessageTypeEnum; +use App\Enum\GenderEnum; +use App\Enum\RaceEnum; +use App\Enum\SexualOrientationEnum; +use App\Enum\SocialNetworkEnum; use App\Enum\UserRolesEnum; use App\Exception\ValidatorException; +use App\Service\Interface\ActivityAreaServiceInterface; +use App\Service\Interface\AddressServiceInterface; use App\Service\Interface\AgentServiceInterface; +use App\Service\Interface\CulturalFunctionServiceInterface; +use App\Service\Interface\StateServiceInterface; +use App\Service\Interface\TagServiceInterface; use Exception; use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface; use Symfony\Bundle\SecurityBundle\Security; @@ -32,6 +42,11 @@ public function __construct( private readonly AgentTimelineDocumentService $documentService, private readonly JWTTokenManagerInterface $jwtManager, private readonly TranslatorInterface $translator, + private readonly StateServiceInterface $stateService, + private readonly ActivityAreaServiceInterface $activityAreaService, + private readonly TagServiceInterface $tagService, + private readonly CulturalFunctionServiceInterface $culturalFunctionService, + private readonly AddressServiceInterface $addressService, private readonly Security $security, ) { } @@ -55,6 +70,8 @@ public function create(Request $request): Response if (false === $request->isMethod(Request::METHOD_POST)) { return $this->render(self::VIEW_ADD, [ 'form_id' => self::CREATE_FORM_ID, + 'states' => $this->stateService->list(), + 'cities' => [], ]); } @@ -63,14 +80,14 @@ public function create(Request $request): Response $errors = []; try { - $this->service->create([ - 'id' => Uuid::v4(), - 'name' => $request->get('name'), - 'shortBio' => $request->get('shortBio'), - 'longBio' => $request->get('shortBio'), - 'culture' => false, - 'user' => $this->security->getUser()->getId(), - ]); + $agentData = $this->extractAgentDataFromRequest($request); + $addressData = $this->extractAddressDataFromRequest($request); + + $agent = $this->service->create($agentData); + + if (!empty($addressData)) { + $this->addressService->create($agent, $addressData); + } $this->addFlash(FlashMessageTypeEnum::SUCCESS->value, $this->translator->trans('view.agent.message.created')); } catch (ValidatorException $exception) { @@ -83,12 +100,113 @@ public function create(Request $request): Response return $this->render(self::VIEW_ADD, [ 'errors' => $errors, 'form_id' => self::CREATE_FORM_ID, + 'states' => $this->stateService->list(), + 'cities' => [], ]); } return $this->redirectToRoute('admin_agent_list'); } + private function extractAgentDataFromRequest(Request $request): array + { + return [ + 'id' => Uuid::v4(), + 'name' => $request->get('name'), + 'shortBio' => $request->get('shortBio'), + 'longBio' => $request->get('shortBio'), + 'culture' => false, + 'user' => $this->security->getUser()->getId(), + 'fiscalCode' => $request->get('cpf') ?: $request->get('mei'), + 'extraFields' => $this->extractExtraFieldsFromRequest($request), + ]; + } + + private function extractExtraFieldsFromRequest(Request $request): array + { + $extraFields = []; + + $optionalFields = ['social_name', 'full_name', 'public_email', 'private_phone1', 'private_phone2', 'site', 'link_description']; + + foreach ($optionalFields as $field) { + if ($request->get($field)) { + $extraFields[$field] = $request->get($field); + } + } + + $sensitiveFields = $this->extractSensitiveDataFromRequest($request); + + return array_merge($extraFields, $sensitiveFields); + } + + private function extractSensitiveDataFromRequest(Request $request): array + { + $sensitiveData = []; + + if ($request->get('birthday')) { + $sensitiveData['birthday'] = $request->get('birthday'); + $sensitiveData['birthday_public'] = (bool) $request->get('birthday_public'); + } + + if ($request->get('gender')) { + $sensitiveData['gender'] = $request->get('gender'); + $sensitiveData['gender_public'] = (bool) $request->get('gender_public'); + } + + if ($request->get('sexual_orientation')) { + $sensitiveData['sexual_orientation'] = $request->get('sexual_orientation'); + $sensitiveData['sexual_orientation_public'] = (bool) $request->get('sexual_orientation_public'); + } + + if ($request->get('race')) { + $sensitiveData['race'] = $request->get('race'); + $sensitiveData['race_public'] = (bool) $request->get('race_public'); + } + + if ($request->get('education')) { + $sensitiveData['education'] = $request->get('education'); + $sensitiveData['education_public'] = (bool) $request->get('education_public'); + } + + if (null !== $request->get('is_disabled') && '' !== $request->get('is_disabled')) { + $sensitiveData['is_disabled'] = (bool) (int) $request->get('is_disabled'); + $sensitiveData['disabled_public'] = (bool) $request->get('disabled_public'); + } + + if (null !== $request->get('is_indigenous') && '' !== $request->get('is_indigenous')) { + $sensitiveData['is_indigenous'] = (bool) (int) $request->get('is_indigenous'); + $sensitiveData['indigenous_public'] = (bool) $request->get('indigenous_public'); + } + + if (null !== $request->get('is_quilombola') && '' !== $request->get('is_quilombola')) { + $sensitiveData['is_quilombola'] = (bool) (int) $request->get('is_quilombola'); + $sensitiveData['quilombola_public'] = (bool) $request->get('quilombola_public'); + } + + if (null !== $request->get('is_traditional_people') && '' !== $request->get('is_traditional_people')) { + $sensitiveData['is_traditional_people'] = (bool) (int) $request->get('is_traditional_people'); + $sensitiveData['traditional_people_public'] = (bool) $request->get('traditional_people_public'); + } + + return array_filter($sensitiveData); + } + + private function extractAddressDataFromRequest(Request $request): array + { + if (!$request->get('postal_code') && !$request->get('street')) { + return []; + } + + return [ + 'zipcode' => $request->get('postal_code') ?: '', + 'street' => $request->get('street') ?: '', + 'number' => $request->get('number') ?: '', + 'neighborhood' => $request->get('neighborhood') ?: '', + 'complement' => $request->get('complement_or_reference_point') ?: '', + 'cityId' => $request->get('address_city'), + ]; + } + #[IsGranted(UserRolesEnum::ROLE_USER->value, statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] public function timeline(?Uuid $id): Response { @@ -125,20 +243,73 @@ public function edit(Uuid $id, Request $request): Response $this->denyAccessUnlessGranted('edit', $agent); if (false === $request->isMethod(Request::METHOD_POST)) { + $activityAreaItems = $this->activityAreaService->list(); + $tagItems = $this->tagService->list(); + $culturalFunctionItems = $this->culturalFunctionService->list(); + return $this->render(self::VIEW_EDIT, [ + 'activityAreaItems' => $activityAreaItems, + 'tagItems' => $tagItems, + 'culturalFunctionItems' => $culturalFunctionItems, + 'genderOptions' => GenderEnum::getValues(), + 'raceOptions' => RaceEnum::getValues(), + 'educationOptions' => EducationEnum::getValues(), + 'sexualOrientationOptions' => SexualOrientationEnum::getValues(), 'agent' => $agent, 'form_id' => self::EDIT_FORM_ID, ]); } $this->validCsrfToken(self::EDIT_FORM_ID, $request); + + $networks = []; + foreach (SocialNetworkEnum::getValues() as $network) { + if ('' !== $request->get("social_networks_{$network}")) { + $networks[$network] = $request->get("social_networks_{$network}"); + } + } + + $extraFields = array_filter([ + 'site' => $request->request->get('site'), + 'link_description' => $request->request->get('link_description'), + 'public_email' => $request->request->get('public_email'), + 'public_phone' => $request->request->get('public_phone'), + ]); + + $sensitiveFields = $this->extractSensitiveDataFromRequest($request); + $extraFields = array_merge($extraFields, $sensitiveFields); + + $rolesInCultureIds = $request->request->all('roles_in_culture') ?? []; + + $errors = []; + try { $this->service->update($id, [ - 'name' => $request->get('name'), + 'name' => $request->request->get('name'), 'shortBio' => $request->request->get('short_description'), 'longBio' => $request->request->get('long_description'), + 'culture' => $agent->isCulture(), + 'user' => $agent->getUser()->getId()->toRfc4122(), + 'socialNetworks' => $networks, + 'extraFields' => $extraFields ?: null, + 'culturalFunction' => $rolesInCultureIds, ]); + if ($uploadedImage = $request->files->get('profileImage')) { + $this->service->updateImage($id, $uploadedImage); + } + + if ($uploadedCover = $request->files->get('coverImage')) { + $this->service->updateCoverImage($id, $uploadedCover); + } + + $portfolioImages = $request->files->get('portfolioImages') ?? []; + $portfolioDescriptions = $request->request->all('portfolioDescriptions') ?? []; + foreach ($portfolioImages as $index => $portfolioImage) { + $description = $portfolioDescriptions[$index] ?? null; + $this->service->addPortfolioImage($agent, $portfolioImage, $description); + } + $this->addFlash(FlashMessageTypeEnum::SUCCESS->value, $this->translator->trans('view.agent.message.updated')); } catch (ValidatorException $exception) { $errors = $exception->getConstraintViolationList(); @@ -147,13 +318,37 @@ public function edit(Uuid $id, Request $request): Response } if (false === empty($errors)) { + $activityAreaItems = $this->activityAreaService->list(); + $tagItems = $this->tagService->list(); + $culturalFunctionItems = $this->culturalFunctionService->list(); + return $this->render(self::VIEW_EDIT, [ + 'activityAreaItems' => $activityAreaItems, + 'tagItems' => $tagItems, + 'culturalFunctionItems' => $culturalFunctionItems, + 'genderOptions' => GenderEnum::getValues(), + 'raceOptions' => RaceEnum::getValues(), + 'sexualOrientationOptions' => SexualOrientationEnum::getValues(), + 'educationOptions' => EducationEnum::getValues(), 'agent' => $agent, 'errors' => $errors, 'form_id' => self::EDIT_FORM_ID, ]); } - return $this->redirectToRoute('admin_agent_list'); + return $this->redirectToRoute('admin_agent_edit', ['id' => $id]); + } + + #[IsGranted(UserRolesEnum::ROLE_USER->value, statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] + public function removePortfolioPhoto(Uuid $id, Uuid $photoId): Response + { + try { + $this->service->removePortfolioImage($id, $photoId); + $this->addFlash(FlashMessageTypeEnum::SUCCESS->value, $this->translator->trans('photo_removed')); + } catch (Exception $exception) { + $this->addFlash(FlashMessageTypeEnum::ERROR->value, $exception->getMessage()); + } + + return $this->redirectToRoute('admin_agent_edit', ['id' => $id]); } } diff --git a/src/Controller/Web/Admin/EventAdminController.php b/src/Controller/Web/Admin/EventAdminController.php index 21a29e882..dfb96c6cb 100644 --- a/src/Controller/Web/Admin/EventAdminController.php +++ b/src/Controller/Web/Admin/EventAdminController.php @@ -6,10 +6,13 @@ use App\DocumentService\EventTimelineDocumentService; use App\Enum\EventFormatEnum; +use App\Enum\SocialNetworkEnum; use App\Enum\UserRolesEnum; +use App\Service\Interface\CityServiceInterface; use App\Service\Interface\CulturalLanguageServiceInterface; use App\Service\Interface\EventServiceInterface; use App\Service\Interface\InscriptionEventServiceInterface; +use App\Service\Interface\StateServiceInterface; use App\Service\Interface\TagServiceInterface; use Exception; use Symfony\Bundle\SecurityBundle\Security; @@ -29,6 +32,8 @@ class EventAdminController extends AbstractAdminController public function __construct( private readonly EventServiceInterface $service, private readonly InscriptionEventServiceInterface $inscriptionService, + private readonly StateServiceInterface $stateService, + private readonly CityServiceInterface $cityService, private readonly TranslatorInterface $translator, private readonly EventTimelineDocumentService $documentService, private readonly Security $security, @@ -110,19 +115,17 @@ public function create(Request $request): Response $name = $request->request->get('name'); $description = $request->request->get('description'); - $culturalLanguage = $request->get('culturalLanguage'); - $type = (int) $request->request->get('type'); + $culturalLanguages = $request->get('culturalLanguages', []); + $eventFormatType = (int) $request->request->get('eventFormatType', 1); $startDate = $request->request->get('startDate'); $event = [ 'id' => Uuid::v4(), 'name' => $name, - 'description' => $description, - 'extraFields' => [ - 'culturalLanguage' => $culturalLanguage, - ], + 'shortDescription' => $description, + 'culturalLanguages' => $culturalLanguages, 'agentGroup' => null, - 'type' => $type, + 'format' => $eventFormatType, 'startDate' => $startDate, ]; @@ -153,6 +156,16 @@ public function edit(Uuid $id, Request $request): Response } if (Request::METHOD_POST !== $request->getMethod()) { + $states = $this->stateService->list(); + + $cities = []; + if ($event->getAddress()) { + $filtersToCities = [ + 'state' => $event->getAddress()->getCity()->getState()->getId(), + ]; + $cities = $this->cityService->findBy($filtersToCities); + } + $culturalLanguageItems = $this->culturalLanguageService->list(); $tagItems = $this->tagService->list(); $type = EventFormatEnum::cases(); @@ -161,6 +174,8 @@ public function edit(Uuid $id, Request $request): Response 'event' => $event, 'form_id' => self::EDIT_FORM_ID, 'culturalLanguageItems' => $culturalLanguageItems, + 'states' => $states, + 'cities' => $cities, 'tagItems' => $tagItems, 'typeItems' => $type, ]); @@ -169,40 +184,87 @@ public function edit(Uuid $id, Request $request): Response $this->validCsrfToken(self::EDIT_FORM_ID, $request); $name = $request->request->get('name'); + $subtitle = $request->request->get('subtitle'); $description = $request->request->get('description'); + $shortDescription = $request->request->get('short_description'); + $longDescription = $request->request->get('long_description'); + $site = $request->request->get('site'); $ageRating = $request->request->get('age_rating') ?? null; - $type = (int) $request->request->get('type'); + $format = (int) $request->request->get('format'); $maxCapacity = (int) $request->request->get('max_capacity') ?? null; $culturalLanguages = $request->get('culturalLanguages') ?? []; $tags = $request->get('tags') ?? []; + $networks = []; + foreach (SocialNetworkEnum::getValues() as $network) { + if ('' !== $request->get("social_networks_{$network}")) { + $networks[$network] = $request->get("social_networks_{$network}"); + } + } + $dataToUpdate = [ 'name' => $name, + 'subtitle' => $subtitle, 'description' => $description, + 'shortDescription' => $shortDescription, + 'longDescription' => $longDescription, + 'site' => $site, 'extraFields' => [ - 'age_rating' => $ageRating, + 'ageRating' => $ageRating, ], 'agentGroup' => null, - 'type' => $type, + 'format' => $format, 'maxCapacity' => $maxCapacity, 'culturalLanguages' => $culturalLanguages, + 'socialNetworks' => $networks, 'tags' => $tags, + 'addressData' => [ + 'id' => $event->getAddress()?->getId() ?? Uuid::v4(), + 'owner' => $event->getId()->toRfc4122(), + 'zipcode' => $request->request->get('address_cep'), + 'street' => $request->request->get('address_street'), + 'number' => $request->request->get('address_number'), + 'neighborhood' => $request->request->get('address_neighborhood'), + 'complement' => $request->request->get('address_complement'), + 'state' => $request->request->get('address_state'), + 'city' => $request->request->get('address_city'), + ], 'updatedBy' => $this->security->getUser()->getAgents()->getValues()[0]->getId(), ]; try { $this->service->update($id, $dataToUpdate); + if ($uploadedImage = $request->files->get('profileImage')) { + $this->service->updateImage($id, $uploadedImage); + } + + if ($uploadedCover = $request->files->get('coverImage')) { + $this->service->updateCoverImage($id, $uploadedCover); + } + $this->addFlashSuccess($this->translator->trans('view.event.message.updated')); return $this->redirectToRoute('admin_event_list'); } catch (TypeError|Exception $exception) { $this->addFlashError($exception->getMessage()); + $states = $this->stateService->findBy(); + $cities = $this->cityService->findBy(); + + $culturalLanguageItems = $this->culturalLanguageService->list(); + $tagItems = $this->tagService->list(); + $type = EventFormatEnum::cases(); + return $this->render('event/edit.html.twig', [ 'event' => $event, 'error' => $exception->getMessage(), 'form_id' => self::EDIT_FORM_ID, + 'culturalLanguageItems' => $culturalLanguageItems, + 'states' => $states, + 'cities' => $cities, + 'tagItems' => $tagItems, + 'typeItems' => $type, ]); } } diff --git a/src/Controller/Web/Admin/MyOpportunityAdminController.php b/src/Controller/Web/Admin/MyOpportunityAdminController.php index ebbe9f6e1..3b9be5367 100644 --- a/src/Controller/Web/Admin/MyOpportunityAdminController.php +++ b/src/Controller/Web/Admin/MyOpportunityAdminController.php @@ -10,7 +10,7 @@ class MyOpportunityAdminController extends AbstractAdminController { - #[IsGranted(UserRolesEnum::ROLE_ADMIN->value, statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] + // #[IsGranted(UserRolesEnum::ROLE_ADMIN->value, statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] public function list(): Response { return $this->render('my-opportunity/list.html.twig'); diff --git a/src/Controller/Web/Admin/OpportunityAdminController.php b/src/Controller/Web/Admin/OpportunityAdminController.php index a6ab58384..b652ecf1e 100644 --- a/src/Controller/Web/Admin/OpportunityAdminController.php +++ b/src/Controller/Web/Admin/OpportunityAdminController.php @@ -65,10 +65,10 @@ private static function hidrate(array $data): array return $data; } - #[IsGranted(new Expression(' - is_granted("'.UserRolesEnum::ROLE_ADMIN->value.'") or - is_granted("'.UserRolesEnum::ROLE_MANAGER->value.'") - '), statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] + // #[IsGranted(new Expression(' + // is_granted("'.UserRolesEnum::ROLE_ADMIN->value.'") or + // is_granted("'.UserRolesEnum::ROLE_MANAGER->value.'") + // '), statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] public function create(Request $request): Response { if ('POST' !== $request->getMethod()) { @@ -92,14 +92,14 @@ public function create(Request $request): Response $this->validCsrfToken(self::CREATE_FORM_ID, $request); $data = $request->request->all(); - $files = $request->files->all(); + unset($data['coverImage']); $data = $this->hidrate($data); try { $opportunity = $this->service->create($data); - if ($files['extraFields']['coverImage'] ?? null instanceof UploadedFile) { - $this->service->updateCoverImage($opportunity->getId(), $files['extraFields']['coverImage']); + if ($uploadedImage = $request->files->get('coverImage')) { + $this->service->updateCoverImage($opportunity->getId(), $uploadedImage); } $this->addFlash('success', $this->translator->trans('view.opportunity.message.created')); @@ -116,10 +116,10 @@ public function create(Request $request): Response return $this->redirectToRoute('admin_opportunity_list'); } - #[IsGranted(new Expression(' - is_granted("'.UserRolesEnum::ROLE_ADMIN->value.'") or - is_granted("'.UserRolesEnum::ROLE_MANAGER->value.'") - '), statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] + // #[IsGranted(new Expression(' + // is_granted("'.UserRolesEnum::ROLE_ADMIN->value.'") or + // is_granted("'.UserRolesEnum::ROLE_MANAGER->value.'") + // '), statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] public function list(): Response { $opportunities = $this->service->findBy(); @@ -196,10 +196,10 @@ public function timeline(Uuid $id): Response ]); } - #[IsGranted(new Expression(' - is_granted("'.UserRolesEnum::ROLE_ADMIN->value.'") or - is_granted("'.UserRolesEnum::ROLE_MANAGER->value.'") - '), statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] + // #[IsGranted(new Expression(' + // is_granted("'.UserRolesEnum::ROLE_ADMIN->value.'") or + // is_granted("'.UserRolesEnum::ROLE_MANAGER->value.'") + // '), statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] public function get(Uuid $id): Response { $opportunity = $this->service->get($id); diff --git a/src/Controller/Web/Admin/OrganizationAdminController.php b/src/Controller/Web/Admin/OrganizationAdminController.php index b3a334b08..cdbd46d3f 100644 --- a/src/Controller/Web/Admin/OrganizationAdminController.php +++ b/src/Controller/Web/Admin/OrganizationAdminController.php @@ -5,10 +5,15 @@ namespace App\Controller\Web\Admin; use App\DocumentService\OrganizationTimelineDocumentService; +use App\Entity\Organization; +use App\Enum\OrganizationTypeEnum; use App\Enum\UserRolesEnum; use App\Exception\ValidatorException; +use App\Service\Interface\ActivityAreaServiceInterface; +use App\Service\Interface\AgentServiceInterface; use App\Service\Interface\OrganizationServiceInterface; use Exception; +use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Security\Http\Attribute\IsGranted; @@ -27,8 +32,11 @@ class OrganizationAdminController extends AbstractAdminController public function __construct( private readonly OrganizationServiceInterface $service, + private readonly AgentServiceInterface $agentService, private readonly TranslatorInterface $translator, private readonly OrganizationTimelineDocumentService $documentService, + private readonly ActivityAreaServiceInterface $activityAreaService, + private readonly Security $security, ) { } @@ -42,7 +50,9 @@ private function renderOrganizationList(array $organizations, ?array $organizati public function list(): Response { return $this->renderOrganizationList( - $this->service->list() + $this->service->findBy([ + 'createdBy' => $this->agentService->getMainAgentByUser($this->security->getUser()->getId())?->getId(), + ]) ); } @@ -74,6 +84,8 @@ public function add(Request $request, ValidatorInterface $validator): Response if ('POST' !== $request->getMethod()) { return $this->render(self::VIEW_ADD, [ 'form_id' => self::CREATE_FORM_ID, + 'activityAreas' => $this->activityAreaService->list(), + 'types' => OrganizationTypeEnum::getValues(), ]); } @@ -83,15 +95,29 @@ public function add(Request $request, ValidatorInterface $validator): Response $this->service->create([ 'id' => Uuid::v4(), 'name' => $request->get('name'), + 'long_description' => $request->get('long_description'), + 'type' => $request->get('type'), + 'activityAreas' => $request->get('activityAreas'), + 'createdBy' => $this->security->getUser()->getAgents()->getValues()[0]->getId(), + 'owner' => $this->security->getUser()->getAgents()->getValues()[0]->getId(), + 'extraFields' => [ + 'site' => $request->get('site'), + 'email' => $request->get('email'), + 'phone' => $request->get('phone'), + ], ]); } catch (ValidatorException $exception) { return $this->render(self::VIEW_ADD, [ 'errors' => $exception->getConstraintViolationList(), 'form_id' => self::CREATE_FORM_ID, + 'activityAreas' => $this->activityAreaService->list(), + 'types' => OrganizationTypeEnum::getValues(), ]); } catch (Exception $exception) { return $this->render(self::VIEW_ADD, [ 'errors' => [$exception->getMessage()], + 'activityAreas' => $this->activityAreaService->list(), + 'types' => OrganizationTypeEnum::getValues(), 'form_id' => self::CREATE_FORM_ID, ]); } @@ -132,17 +158,109 @@ public function timeline(Uuid $id): Response ]); } - public function edit(Uuid $id): Response + #[IsGranted(UserRolesEnum::ROLE_USER->value, statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] + public function edit(Uuid $id, Request $request): Response { - $organization = $this->service->get($id); - $agents = $organization->getAgents(); + try { + $organization = $this->service->get($id); + } catch (Exception $exception) { + $this->addFlashError($exception->getMessage()); + + return $this->redirectToRoute('admin_organization_list'); + } - $this->denyAccessUnlessGranted('edit', $organization); + if ($request->isMethod(Request::METHOD_POST)) { + return $this->handleUpdate($organization, $request); + } return $this->render(self::VIEW_EDIT, [ 'organization' => $organization, - 'agents' => $agents, + 'organizationAgents' => $organization->getAgents(), + 'availableAgents' => $this->agentService->findBy(), + 'activityAreaItems' => $this->activityAreaService->list(), 'form_id' => self::EDIT_FORM_ID, ]); } + + private function handleUpdate(Organization $organization, Request $request): Response + { + $this->validCsrfToken(self::EDIT_FORM_ID, $request); + + try { + $agentIds = $request->request->all('agent_ids') ?? []; + $activityAreas = $request->request->all('activityAreas') ?? []; + + $dataToUpdate = [ + 'name' => $request->request->get('name'), + 'description' => $request->request->get('short_description'), + 'longDescription' => $request->request->get('long_description'), + 'extraFields' => $this->extractExtraFields($request, $organization), + 'socialNetworks' => $this->extractSocialNetworks($request), + 'agents' => $agentIds, + 'activityAreas' => $activityAreas, + ]; + + $this->service->update($organization->getId(), $dataToUpdate); + + $this->handleUploads($organization->getId(), $request); + + $this->addFlash('success', $this->translator->trans('view.organization.message.updated')); + + return $this->redirectToRoute('admin_organization_list'); + } catch (Exception $exception) { + $this->addFlash('error', $exception->getMessage()); + + return $this->render(self::VIEW_EDIT, [ + 'organization' => $organization, + 'organizationAgents' => $organization->getAgents(), + 'availableAgents' => $this->agentService->findBy(), + 'error' => $exception->getMessage(), + 'activityAreas' => $this->activityAreaService->list(), + 'form_id' => self::EDIT_FORM_ID, + ]); + } + } + + private function extractExtraFields(Request $request, Organization $organization): array + { + $currentExtras = $organization->getExtraFields() ?? []; + + $newExtras = [ + 'site' => $request->request->get('site'), + 'link_description' => $request->request->get('link_description'), + 'email' => $request->request->get('email'), + 'phone' => $request->request->get('phone_number'), + ]; + + return array_merge($currentExtras, array_filter($newExtras)); + } + + private function extractSocialNetworks(Request $request): array + { + $socialNetworks = []; + $allowedNetworks = [ + 'instagram', 'x', 'facebook', 'vimeo', + 'youtube', 'linkedin', 'spotify', 'pinterest', 'tiktok', + ]; + + foreach ($allowedNetworks as $network) { + $value = $request->request->get($network); + if (!empty($value)) { + $socialNetworks[$network] = $value; + } + } + + return $socialNetworks; + } + + private function handleUploads(Uuid $id, Request $request): void + { + if ($uploadedImage = $request->files->get('profileImage')) { + $this->service->updateImage($id, $uploadedImage); + } + + if ($uploadedCover = $request->files->get('coverImage')) { + $this->service->updateCoverImage($id, $uploadedCover); + } + } } diff --git a/src/Controller/Web/Admin/RegistrationAdminController.php b/src/Controller/Web/Admin/RegistrationAdminController.php index cbcc3fb12..92aa789ce 100644 --- a/src/Controller/Web/Admin/RegistrationAdminController.php +++ b/src/Controller/Web/Admin/RegistrationAdminController.php @@ -16,7 +16,7 @@ public function __construct(private readonly InscriptionOpportunityServiceInterf { } - #[IsGranted(UserRolesEnum::ROLE_ADMIN->value, statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] + // #[IsGranted(UserRolesEnum::ROLE_ADMIN->value, statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] public function list(): Response { $inscriptions = $this->service->findUserInscriptionsWithDetails(); @@ -26,7 +26,7 @@ public function list(): Response ]); } - #[IsGranted(UserRolesEnum::ROLE_ADMIN->value, statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] + // #[IsGranted(UserRolesEnum::ROLE_ADMIN->value, statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] public function get(Uuid $id): Response { $inscription = $this->service->findInscriptionWithDetails($id); diff --git a/src/Controller/Web/Admin/SpaceAdminController.php b/src/Controller/Web/Admin/SpaceAdminController.php index 5117c2155..db83c5ff9 100644 --- a/src/Controller/Web/Admin/SpaceAdminController.php +++ b/src/Controller/Web/Admin/SpaceAdminController.php @@ -5,13 +5,16 @@ namespace App\Controller\Web\Admin; use App\DocumentService\SpaceTimelineDocumentService; +use App\Enum\SocialNetworkEnum; use App\Enum\UserRolesEnum; +use App\Exception\ValidatorException; use App\Service\Interface\ActivityAreaServiceInterface; use App\Service\Interface\ArchitecturalAccessibilityServiceInterface; use App\Service\Interface\CityServiceInterface; use App\Service\Interface\SpaceServiceInterface; use App\Service\Interface\StateServiceInterface; use App\Service\Interface\TagServiceInterface; +use App\Service\SpaceTypeService; use DateTime; use Exception; use Symfony\Bundle\SecurityBundle\Security; @@ -36,11 +39,12 @@ public function __construct( private readonly SpaceTimelineDocumentService $documentService, private readonly TranslatorInterface $translator, private readonly Security $security, - private ArchitecturalAccessibilityServiceInterface $architecturalAccessibilityService, + private readonly ArchitecturalAccessibilityServiceInterface $architecturalAccessibilityService, private readonly ActivityAreaServiceInterface $activityAreaService, private readonly TagServiceInterface $tagService, private readonly StateServiceInterface $stateService, private readonly CityServiceInterface $cityService, + private readonly SpaceTypeService $spaceTypeService, ) { } @@ -133,11 +137,20 @@ public function edit(Uuid $id, Request $request): Response $accessibilities = $this->architecturalAccessibilityService->list(); $activityAreaItems = $this->activityAreaService->list(); $tagItems = $this->tagService->list(); - $states = $this->stateService->findBy(); - $cities = $this->cityService->findBy(); + $states = $this->stateService->list(); + $types = $this->spaceTypeService->list(); + + $cities = []; + if ($space->getAddress()) { + $filtersToCities = [ + 'state' => $space->getAddress()->getCity()->getState()->getId(), + ]; + $cities = $this->cityService->findBy($filtersToCities); + } return $this->render(self::VIEW_EDIT, [ 'space' => $space, + 'types' => $types, 'form_id' => self::EDIT_FORM_ID, 'accessibilities' => $accessibilities, 'activityAreaItems' => $activityAreaItems, @@ -150,33 +163,103 @@ public function edit(Uuid $id, Request $request): Response $this->validCsrfToken(self::EDIT_FORM_ID, $request); $name = $request->request->get('name'); - $description = $request->request->get('extraFields')['description'] ?? null; $date = $request->request->get('date') ?? null; $tags = $request->get('tags') ?? []; $activityAreas = $request->get('activityAreas') ?? []; + $isAccessible = (bool) $request->request->get('architectural_accessibility_option'); + $accessibilities = $request->get('architectural_accessibility') ?? []; + + $networks = []; + foreach (SocialNetworkEnum::getValues() as $network) { + if ('' !== $request->get("social_networks_{$network}")) { + $networks[$network] = $request->get("social_networks_{$network}"); + } + } + + $currentExtraFields = $space->getExtraFields() ?? []; + + $extraFields = $this->mountOpeningHours($request->request->get('opening_hours'), $currentExtraFields); $dataToUpdate = [ 'name' => $name, - 'description' => $description, + 'shortDescription' => $request->request->get('short_description'), + 'longDescription' => $request->request->get('long_description'), + 'site' => $request->request->get('site'), + 'phoneNumber' => $request->request->get('phone_number'), + 'email' => $request->request->get('email'), + 'maxCapacity' => (int) $request->request->get('capacity'), + 'spaceType' => $request->request->get('type'), + 'isAccessible' => $isAccessible, 'tags' => $tags, 'activityAreas' => $activityAreas, + 'socialNetworks' => $networks, + 'accessibilities' => $isAccessible ? $accessibilities : [], 'date' => $date ? new DateTime($date) : null, + 'createdBy' => $space->getCreatedBy()->getId(), 'updatedBy' => $this->security->getUser()->getAgents()->getValues()[0]->getId(), + 'extraFields' => $extraFields, + 'addressData' => [ + 'id' => $space->getAddress()?->getId() ?? Uuid::v4(), + 'owner' => $space->getId()->toRfc4122(), + 'zipcode' => $request->request->get('address_cep'), + 'street' => $request->request->get('address_street'), + 'number' => $request->request->get('address_number'), + 'neighborhood' => $request->request->get('address_neighborhood'), + 'complement' => $request->request->get('address_complement'), + 'state' => $request->request->get('address_state'), + 'city' => $request->request->get('address_city'), + ], + 'entityAssociation' => [ + 'id' => $space->getEntityAssociation()?->getId() ?? Uuid::v4(), + 'space' => $space->getId(), + 'withAgent' => (bool) $request->request->get('association_with_agent', default: false), + 'withEvent' => (bool) $request->request->get('association_with_event', default: false), + 'withInitiative' => (bool) $request->request->get('association_with_initiative', default: false), + 'withOpportunity' => (bool) $request->request->get('association_with_opportunity', default: false), + 'withOrganization' => (bool) $request->request->get('association_with_organization', default: false), + 'withSpace' => (bool) $request->request->get('association_with_space', default: false), + ], ]; - try { $this->service->update($id, $dataToUpdate); + if ($uploadedImage = $request->files->get('profileImage')) { + $this->service->updateImage($id, $uploadedImage); + } + + if ($uploadedCover = $request->files->get('coverImage')) { + $this->service->updateCoverImage($id, $uploadedCover); + } + + $portfolioImages = $request->files->get('portfolioImages') ?? []; + $portfolioDescriptions = $request->request->all('portfolioDescriptions') ?? []; + foreach ($portfolioImages as $index => $portfolioImage) { + $description = $portfolioDescriptions[$index] ?? null; + $this->service->addPortfolioImage($space, $portfolioImage, $description); + } + $this->addFlashSuccess($this->translator->trans('view.space.message.updated')); return $this->redirectToRoute('admin_space_list'); - } catch (TypeError|Exception $exception) { - $this->addFlashError($exception->getMessage()); + } catch (TypeError|Exception|ValidatorException $exception) { + $this->addFlashErrorByException($exception); + + $accessibilities = $this->architecturalAccessibilityService->list(); + $activityAreaItems = $this->activityAreaService->list(); + $tagItems = $this->tagService->list(); + $states = $this->stateService->findBy(); + $cities = $this->cityService->findBy(); return $this->render(self::VIEW_EDIT, [ 'space' => $space, 'error' => $exception->getMessage(), 'form_id' => self::EDIT_FORM_ID, + 'accessibilities' => $accessibilities, + 'activityAreaItems' => $activityAreaItems, + 'tagItems' => $tagItems, + 'states' => $states, + 'cities' => $cities, + 'types' => $this->spaceTypeService->list(), ]); } } @@ -188,4 +271,44 @@ public function togglePublish(?Uuid $id): Response return $this->redirectToRoute('admin_space_list'); } + + #[IsGranted(UserRolesEnum::ROLE_USER->value, statusCode: self::ACCESS_DENIED_RESPONSE_CODE)] + public function removePortfolioPhoto(Uuid $id, Uuid $photoId): Response + { + try { + $this->service->removePortfolioImage($id, $photoId); + $this->addFlashSuccess($this->translator->trans('photo_removed')); + } catch (Exception $exception) { + $this->addFlashError($exception->getMessage()); + } + + return $this->redirectToRoute('admin_space_edit', ['id' => $id]); + } + + public function addFlashErrorByException(Exception $exception): void + { + if ($exception instanceof ValidatorException) { + foreach ($exception->getConstraintViolationList() as $error) { + $this->addFlashError($error->getPropertyPath().': '.$error->getMessage()); + } + + return; + } + + $this->addFlashError($exception->getMessage()); + } + + private function mountOpeningHours(?string $openingHours, array $extraFields): array + { + if (!empty($openingHours)) { + $openingHoursData = json_decode($openingHours, true); + if (JSON_ERROR_NONE === json_last_error() && !empty($openingHoursData)) { + $extraFields['openingHours'] = $openingHoursData; + } + } else { + unset($extraFields['openingHours']); + } + + return $extraFields; + } } diff --git a/src/Controller/Web/Admin/UserAdminController.php b/src/Controller/Web/Admin/UserAdminController.php index e1e8bbc29..0e0f63b4d 100644 --- a/src/Controller/Web/Admin/UserAdminController.php +++ b/src/Controller/Web/Admin/UserAdminController.php @@ -136,6 +136,23 @@ public function timeline(Uuid $id): Response ]); } + public function details(Uuid $id): Response + { + $user = $this->service->get($id); + + $this->denyAccessUnlessGranted('get', $user); + + $lastLogin = $this->documentService->getLastLoginByUserId($id); + + $agents = $this->agentService->findBy(['user' => $user]); + + return $this->render('user/details.html.twig', [ + 'user' => $user, + 'lastLogin' => $lastLogin, + 'agents' => $agents, + ]); + } + public function accountPrivacy(Uuid $id): Response { $user = $this->service->get($id); @@ -166,7 +183,7 @@ private function updateUserData($user, Request $request): void 'email' => $request->request->get('email'), ]; - if (null !== $request->request->get('password')) { + if (true !== empty($request->request->get('password'))) { $userData['password'] = PasswordHasher::hash($request->request->get('password')); } @@ -175,6 +192,10 @@ private function updateUserData($user, Request $request): void if ($uploadedImage = $request->files->get('profileImage')) { $this->service->updateImage($user->getId(), $uploadedImage); } + + if ($uploadedCover = $request->files->get('coverImage')) { + $this->service->updateCoverImage($user->getId(), $uploadedCover); + } } private function updateAgentData(Request $request): void @@ -250,6 +271,7 @@ private function renderEditProfile($user, $agents, $token, ?string $error = null 'socialName' => $user->getSocialName(), 'email' => $user->getEmail(), 'image' => $user->getImage(), + 'coverImage' => $user->getCoverImage(), ], 'form_id' => 'edit_profile', 'agents' => $agents, diff --git a/src/Controller/Web/AgentWebController.php b/src/Controller/Web/AgentWebController.php index c4953fae9..c779a4130 100644 --- a/src/Controller/Web/AgentWebController.php +++ b/src/Controller/Web/AgentWebController.php @@ -6,6 +6,7 @@ use App\Service\Interface\AgentServiceInterface; use App\Service\Interface\EventServiceInterface; +use App\Service\Interface\SpaceServiceInterface; use App\ValueObject\DashboardCardItemValueObject as CardItem; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -18,6 +19,7 @@ public function __construct( public readonly AgentServiceInterface $service, private readonly TranslatorInterface $translator, private readonly EventServiceInterface $eventService, + private readonly SpaceServiceInterface $spaceService, ) { } @@ -36,9 +38,7 @@ public function list(Request $request): Response $dashboard = [ 'color' => '#D0A020', 'items' => [ - new CardItem(icon: 'description', quantity: $totalAgents, text: 'view.agent.quantity.total'), - new CardItem(icon: 'person', quantity: 30, text: 'view.agent.quantity.culture'), - new CardItem(icon: 'block', quantity: 20, text: 'view.agent.quantity.inactive'), + new CardItem(icon: 'person', quantity: $totalAgents, text: 'view.agent.quantity.total'), new CardItem(icon: 'today', quantity: $recentAgents, text: $this->translator->trans('view.agent.quantity.last_days', ['{days}' => $days])), ], ]; @@ -54,10 +54,12 @@ public function getOne(Uuid $id): Response { $agent = $this->service->get($id); $events = $this->eventService->findByAgent($agent->getId()->toRfc4122()); + $spaces = $this->spaceService->findBy(['createdBy' => $agent]); - return $this->render('agent/one.html.twig', [ + return $this->render('agent/details.html.twig', [ 'agent' => $agent, 'events' => $events, + 'spaces' => $spaces, ]); } } diff --git a/src/Controller/Web/EventWebController.php b/src/Controller/Web/EventWebController.php index 148291b60..e12ba2f97 100644 --- a/src/Controller/Web/EventWebController.php +++ b/src/Controller/Web/EventWebController.php @@ -4,13 +4,10 @@ namespace App\Controller\Web; -use App\Enum\AgeClassificationEnum; -use App\Request\Query\Filters; -use App\Service\Interface\CulturalLanguageServiceInterface; use App\Service\Interface\EventServiceInterface; -use App\Service\Interface\StateServiceInterface; -use App\Service\Interface\TagServiceInterface; use App\ValueObject\DashboardCardItemValueObject as CardItem; +use DateInterval; +use DateTimeImmutable; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Uid\Uuid; @@ -21,29 +18,21 @@ class EventWebController extends AbstractWebController public function __construct( public readonly EventServiceInterface $service, private readonly TranslatorInterface $translator, - private readonly CulturalLanguageServiceInterface $culturalLanguageService, - private readonly TagServiceInterface $tagService, - private readonly StateServiceInterface $stateService, ) { } - public function list(Filters $filters, Request $request): Response + public function list(Request $request): Response { - $requestFilters = array_merge( - $filters->toArray(), - ['draft' => false], - $request->query->all() - ); - - $parsedFilters = $this->getOrderParam($requestFilters); - - $events = $this->service->list( - params: $parsedFilters['filters'], - order: $parsedFilters['order'] - ); + $filters = $request->query->all(); + + $filters = $this->hidratePeriodParam($filters); + $filters = $this->getOrderParam($filters); + + $events = $this->service->list(params: $filters['filters'], order: $filters['order']); + $totalEvents = count($events); - $days = $filters->toArray()['days'] ?? 7; + $days = $request->get('days', 7); $recentEvents = $this->service->countRecentRecords($days); $dashboard = [ @@ -52,23 +41,18 @@ public function list(Filters $filters, Request $request): Response new CardItem(icon: 'description', quantity: $totalEvents, text: 'view.event.quantity.total'), new CardItem(icon: 'event_note', quantity: 10, text: 'view.event.quantity.opened'), new CardItem(icon: 'event_available', quantity: 20, text: 'view.event.quantity.finished'), - new CardItem(icon: 'today', quantity: $recentEvents, text: $this->translator->trans('view.event.quantity.last_days', ['{days}' => $days])), + new CardItem( + icon: 'today', + quantity: $recentEvents, + text: $this->translator->trans('view.event.quantity.last_days', ['{days}' => $days]), + ), ], ]; - $language = $this->culturalLanguageService->list(); - $ageRating = AgeClassificationEnum::cases(); - $tag = $this->tagService->list(); - $state = $this->stateService->list(); - return $this->render('event/list.html.twig', [ 'dashboard' => $dashboard, 'events' => $events, 'totalEvents' => $totalEvents, - 'languages' => $language, - 'ageRatings' => $ageRating, - 'tags' => $tag, - 'states' => $state, ]); } @@ -78,4 +62,24 @@ public function show(Uuid $id): Response return $this->render('event/show.html.twig', ['event' => $event]); } + + private function hidratePeriodParam(array $filters): array + { + if (empty($filters['period'])) { + unset($filters['period']); + + return $filters; + } + + $dates = explode(',', (string) $filters['period']); + unset($filters['period']); + if (2 !== count($dates)) { + return $filters; + } + + [$start, $end] = array_map(fn ($date) => DateTimeImmutable::createFromFormat('Y-m-d', $date) ?: null, $dates); + $end = $end->add(new DateInterval('PT23H59M59S')); + + return ($start && $end) ? array_merge($filters, ['period' => ['start' => $start, 'end' => $end]]) : $filters; + } } diff --git a/src/Controller/Web/InitiativeWebController.php b/src/Controller/Web/InitiativeWebController.php index bee7f59ef..1def515cf 100644 --- a/src/Controller/Web/InitiativeWebController.php +++ b/src/Controller/Web/InitiativeWebController.php @@ -30,13 +30,15 @@ public function list(Request $request): Response $days = $request->get('days', 7); $recentInitiatives = $this->initiativeService->countRecentRecords($days); + $finishedInitiatives = $this->initiativeService->countByStatus('finalizados'); + $openedInitiatives = $this->initiativeService->countByStatus('em-andamento'); $dashboard = [ 'color' => 'var(--navlink-initiative)', 'items' => [ new CardItem(icon: 'description', quantity: $totalInitiatives, text: 'view.initiative.quantity.total'), - new CardItem(icon: 'event_available', quantity: 20, text: 'view.initiative.quantity.finished'), - new CardItem(icon: 'event_note', quantity: 10, text: 'view.initiative.quantity.opened'), + new CardItem(icon: 'event_available', quantity: $finishedInitiatives, text: 'view.initiative.quantity.finished'), + new CardItem(icon: 'event_note', quantity: $openedInitiatives, text: 'view.initiative.quantity.opened'), new CardItem(icon: 'today', quantity: $recentInitiatives, text: $this->translator->trans('view.initiative.quantity.last_days', ['{days}' => $days])), ], ]; @@ -52,6 +54,6 @@ public function show(Uuid $id): Response { $initiative = $this->initiativeService->get($id); - return $this->render('initiative/show.html.twig', ['initiative' => $initiative]); + return $this->render('initiative/details.html.twig', ['initiative' => $initiative]); } } diff --git a/src/Controller/Web/OpportunityWebController.php b/src/Controller/Web/OpportunityWebController.php index aa3df74cf..0e0554b96 100644 --- a/src/Controller/Web/OpportunityWebController.php +++ b/src/Controller/Web/OpportunityWebController.php @@ -29,14 +29,16 @@ public function list(Request $request): Response $totalOpportunities = count($opportunities); $days = $request->get('days', 7); - $recentOpportunities = $this->service->countRecentRecords($days); + $recentOpportunities = $this->service->countRecentOpportunities($days); + $openedOpportunities = $this->service->countOpenedOpportunities(); + $finishedOpportunities = $this->service->countFinishedOpportunities(); $dashboard = [ 'color' => '#009874', 'items' => [ new CardItem(icon: 'description', quantity: $totalOpportunities, text: 'view.opportunity.quantity.total'), - new CardItem(icon: 'event_note', quantity: 10, text: 'view.opportunity.quantity.opened'), - new CardItem(icon: 'event_available', quantity: 20, text: 'view.opportunity.quantity.finished'), + new CardItem(icon: 'event_note', quantity: $openedOpportunities, text: 'view.opportunity.quantity.opened'), + new CardItem(icon: 'event_available', quantity: $finishedOpportunities, text: 'view.opportunity.quantity.finished'), new CardItem(icon: 'today', quantity: $recentOpportunities, text: $this->translator->trans('view.opportunity.quantity.last_days', ['{days}' => $days])), ], ]; diff --git a/src/Controller/Web/OrganizationWebController.php b/src/Controller/Web/OrganizationWebController.php index ee39bcc22..8715e38ff 100644 --- a/src/Controller/Web/OrganizationWebController.php +++ b/src/Controller/Web/OrganizationWebController.php @@ -4,6 +4,7 @@ namespace App\Controller\Web; +use App\Service\Interface\AgentServiceInterface; use App\Service\Interface\OrganizationServiceInterface; use App\ValueObject\DashboardCardItemValueObject as CardItem; use Symfony\Component\HttpFoundation\Request; @@ -15,6 +16,7 @@ class OrganizationWebController extends AbstractWebController { public function __construct( public readonly OrganizationServiceInterface $service, + private readonly AgentServiceInterface $agentService, private readonly TranslatorInterface $translator, ) { } @@ -50,9 +52,11 @@ public function list(Request $request): Response public function getOne(Uuid $id): Response { $organization = $this->service->get($id); + $owner = $this->agentService->get($organization->getCreatedBy()->getId()); - return $this->render('organization/one.html.twig', [ + return $this->render('organization/details.html.twig', [ 'organization' => $organization, + 'owner' => $owner, ]); } } diff --git a/src/Controller/Web/SpaceWebController.php b/src/Controller/Web/SpaceWebController.php index ccbcf5c63..3098a8e79 100644 --- a/src/Controller/Web/SpaceWebController.php +++ b/src/Controller/Web/SpaceWebController.php @@ -4,6 +4,7 @@ namespace App\Controller\Web; +use App\Entity\Space; use App\Service\Interface\ActivityAreaServiceInterface; use App\Service\Interface\AgentServiceInterface; use App\Service\Interface\ArchitecturalAccessibilityServiceInterface; @@ -43,18 +44,20 @@ public function list(Request $request): Response $parsedFilters = $this->getOrderParam($requestFilters); + $parsedFilters['filters']['isDraft'] = 0; $spaces = $this->service->list(params: $parsedFilters['filters'], order: $parsedFilters['order']); $totalSpaces = count($spaces); $days = $request->get('days', 7); $recentSpaces = $this->service->countRecentRecords($days); + $totalSpacesAccessible = array_filter($spaces, fn (Space $item) => $item->isAccessible()); + $dashboard = [ 'color' => '#088140', 'items' => [ new CardItem(icon: 'description', quantity: $totalSpaces, text: 'view.space.quantity.total'), - new CardItem(icon: 'event_note', quantity: 10, text: 'view.space.quantity.opened'), - new CardItem(icon: 'event_available', quantity: 20, text: 'view.space.quantity.finished'), + new CardItem(icon: 'accessible', quantity: count($totalSpacesAccessible), text: 'view.space.quantity.accessible'), new CardItem(icon: 'today', quantity: $recentSpaces, text: $this->translator->trans('view.space.quantity.last_days', ['{days}' => $days])), ], ]; @@ -89,7 +92,7 @@ public function getOne(Uuid $id): Response $owner = $this->agentService->get($space->getCreatedBy()->getId()); $events = $this->eventService->findBy(['space' => $space]); - return $this->render('space/one.html.twig', [ + return $this->render('space/details.html.twig', [ 'space' => $space, 'owner' => $owner, 'events' => $events, diff --git a/src/DTO/AgentDto.php b/src/DTO/AgentDto.php index e919bff7a..cef7b4990 100644 --- a/src/DTO/AgentDto.php +++ b/src/DTO/AgentDto.php @@ -35,11 +35,18 @@ class AgentDto ])] public mixed $name; + #[Sequentially([ + new Length(min: 11, max: 30, groups: [self::CREATE, self::UPDATE]), + ])] + public mixed $fiscalCode; + #[Image(maxSize: (2000000), mimeTypes: ['image/png', 'image/jpg', 'image/jpeg'], groups: [self::CREATE, self::UPDATE])] public ?File $image = null; + #[Image(maxSize: (2000000), mimeTypes: ['image/png', 'image/jpg', 'image/jpeg'], groups: [self::UPDATE])] + public ?File $coverImage = null; + #[Sequentially([ - new NotBlank(groups: [self::CREATE]), new NotNull(groups: [self::UPDATE]), new Type('string', groups: [self::CREATE, self::UPDATE]), new Length(max: 100, groups: [self::CREATE, self::UPDATE]), diff --git a/src/DTO/EventDto.php b/src/DTO/EventDto.php index 4a0c1c21a..97b6ae38b 100644 --- a/src/DTO/EventDto.php +++ b/src/DTO/EventDto.php @@ -81,10 +81,11 @@ class EventDto ])] public mixed $createdBy; - #[Sequentially([ - new Type('string', groups: [self::CREATE, self::UPDATE]), - new Length(min: 2, max: 255, groups: [self::CREATE, self::UPDATE]), - ])] + #[Image( + maxSize: (2000000), + mimeTypes: ['image/png', 'image/jpg', 'image/jpeg'], + groups: [self::CREATE, self::UPDATE] + )] public mixed $coverImage; #[Sequentially([ @@ -110,7 +111,7 @@ class EventDto new Type('integer', groups: [self::CREATE, self::UPDATE]), new Choice(callback: [EventFormatEnum::class, 'getValues'], groups: [self::CREATE, self::UPDATE]), ])] - public mixed $type; + public mixed $format; #[Sequentially([ new NotBlank(groups: [self::CREATE]), @@ -144,6 +145,9 @@ class EventDto ])] public mixed $site; + #[Sequentially([new Json(groups: [self::CREATE, self::UPDATE])])] + public mixed $socialNetworks; + #[Sequentially([ new Type('string', groups: [self::CREATE, self::UPDATE]), new Length(min: 2, max: 20, groups: [self::CREATE, self::UPDATE]), diff --git a/src/DTO/OpportunityDto.php b/src/DTO/OpportunityDto.php index 4d7933cef..1b0747356 100644 --- a/src/DTO/OpportunityDto.php +++ b/src/DTO/OpportunityDto.php @@ -12,6 +12,7 @@ use App\Validator\Constraints\Exists; use App\Validator\Constraints\Json; use App\Validator\Constraints\NotNull; +use Symfony\Component\HttpFoundation\File\File; use Symfony\Component\Validator\Constraints\Image; use Symfony\Component\Validator\Constraints\Length; use Symfony\Component\Validator\Constraints\NotBlank; @@ -36,9 +37,6 @@ class OpportunityDto ])] public mixed $name; - #[Sequentially([new Image(maxSize: 2000000, mimeTypes: ['image/png', 'image/jpg', 'image/jpeg'], groups: [self::CREATE, self::UPDATE])])] - public mixed $image = null; - #[Sequentially([ new Uuid(groups: [self::CREATE, self::UPDATE]), new Exists(Opportunity::class, groups: [self::CREATE, self::UPDATE]), @@ -73,4 +71,10 @@ class OpportunityDto #[Sequentially([new Json(groups: [self::CREATE, self::UPDATE])])] public mixed $extraFields; + + #[Image(maxSize: (2000000), mimeTypes: ['image/png', 'image/jpg', 'image/jpeg'], groups: [self::CREATE, self::UPDATE])] + public ?File $profileImage = null; + + #[Image(maxSize: (2000000), mimeTypes: ['image/png', 'image/jpg', 'image/jpeg'], groups: [self::UPDATE])] + public ?File $coverImage = null; } diff --git a/src/DTO/OrganizationDto.php b/src/DTO/OrganizationDto.php index 07da9a095..e20e2371c 100644 --- a/src/DTO/OrganizationDto.php +++ b/src/DTO/OrganizationDto.php @@ -8,6 +8,7 @@ use App\Validator\Constraints\Exists; use App\Validator\Constraints\Json; use App\Validator\Constraints\NotNull; +use Symfony\Component\HttpFoundation\File\File; use Symfony\Component\Validator\Constraints\All; use Symfony\Component\Validator\Constraints\Image; use Symfony\Component\Validator\Constraints\Length; @@ -33,9 +34,6 @@ class OrganizationDto ])] public mixed $name; - #[Sequentially([new Image(maxSize: 2000000, mimeTypes: ['image/png', 'image/jpg', 'image/jpeg'], groups: [self::CREATE, self::UPDATE])])] - public mixed $image = null; - #[Sequentially([new Type('string'), new Length(max: 255)], groups: [self::CREATE, self::UPDATE])] public mixed $description; @@ -46,6 +44,12 @@ class OrganizationDto ])] public mixed $createdBy; + #[Sequentially([ + new NotNull(), + new Uuid(), + ])] + public mixed $activityAreas; + #[Sequentially([ new NotNull(groups: [self::UPDATE]), new Uuid(groups: [self::CREATE, self::UPDATE]), @@ -61,4 +65,10 @@ class OrganizationDto #[Sequentially([new Json(groups: [self::CREATE, self::UPDATE])])] public mixed $extraFields; + + #[Image(maxSize: (2000000), mimeTypes: ['image/png', 'image/jpg', 'image/jpeg'], groups: [self::CREATE, self::UPDATE])] + public ?File $image = null; + + #[Image(maxSize: (2000000), mimeTypes: ['image/png', 'image/jpg', 'image/jpeg'], groups: [self::UPDATE])] + public ?File $coverImage = null; } diff --git a/src/DTO/PhotoDto.php b/src/DTO/PhotoDto.php new file mode 100644 index 000000000..633cd122e --- /dev/null +++ b/src/DTO/PhotoDto.php @@ -0,0 +1,31 @@ +fileService->uploadImage($this->parameterBag->get('app.dir.event.cover'), ImageFixtures::getCoverImage()); + $eventData['coverImage'] = $file; + } + $event = $this->mountEvent($eventData); $this->setReference(sprintf('%s-%s', self::EVENT_ID_PREFIX, $eventData['id']), $event); diff --git a/src/DataFixtures/Entity/ImageFixtures.php b/src/DataFixtures/Entity/ImageFixtures.php index 329466fa5..4d00a4b50 100644 --- a/src/DataFixtures/Entity/ImageFixtures.php +++ b/src/DataFixtures/Entity/ImageFixtures.php @@ -39,11 +39,21 @@ public static function getSpaceImage(): UploadedFile return self::getUploadedFile('space.png'); } + public static function getSpacePortfolioImage(): UploadedFile + { + return self::getUploadedFile('space.png'); + } + public static function getUserImage(): UploadedFile { return self::getUploadedFile('user.png'); } + public static function getCoverImage(): UploadedFile + { + return self::getUploadedFile('entity-cover-image.png'); + } + private static function getUploadedFile(string $image): UploadedFile { $path = realpath(sprintf('%s/images/%s', __DIR__, $image)); diff --git a/src/DataFixtures/Entity/OrganizationFixtures.php b/src/DataFixtures/Entity/OrganizationFixtures.php index eb9533d25..ced297f93 100644 --- a/src/DataFixtures/Entity/OrganizationFixtures.php +++ b/src/DataFixtures/Entity/OrganizationFixtures.php @@ -51,6 +51,9 @@ final class OrganizationFixtures extends AbstractFixture implements DependentFix 'phone' => '(85) 99999-0001', 'site' => 'https://www.phpcomrapadura.com.br', ], + 'activityAreas' => [ + ActivityAreaFixtures::ACTIVITY_AREA_ID_8, + ], 'socialNetworks' => [ SocialNetworkEnum::INSTAGRAM->value => 'phpcomrapadura', ], @@ -78,6 +81,12 @@ final class OrganizationFixtures extends AbstractFixture implements DependentFix 'phone' => '(85) 99999-0002', 'site' => 'https://www.secult.ce.gov.br/', ], + 'activityAreas' => [ + ActivityAreaFixtures::ACTIVITY_AREA_ID_2, + ActivityAreaFixtures::ACTIVITY_AREA_ID_3, + ActivityAreaFixtures::ACTIVITY_AREA_ID_4, + ActivityAreaFixtures::ACTIVITY_AREA_ID_5, + ], 'socialNetworks' => [ SocialNetworkEnum::INSTAGRAM->value => 'secultceara', ], @@ -104,6 +113,10 @@ final class OrganizationFixtures extends AbstractFixture implements DependentFix 'phone' => '(85) 99999-0003', 'site' => 'https://www.igrejaderussas.org.br', ], + 'activityAreas' => [ + ActivityAreaFixtures::ACTIVITY_AREA_ID_1, + ActivityAreaFixtures::ACTIVITY_AREA_ID_2, + ], 'socialNetworks' => [ SocialNetworkEnum::INSTAGRAM->value => 'igrejaderussas', ], @@ -130,6 +143,10 @@ final class OrganizationFixtures extends AbstractFixture implements DependentFix 'phone' => '(85) 99999-0004', 'site' => 'https://www.axezumbi.com.br', ], + 'activityAreas' => [ + ActivityAreaFixtures::ACTIVITY_AREA_ID_4, + ActivityAreaFixtures::ACTIVITY_AREA_ID_2, + ], 'socialNetworks' => [ SocialNetworkEnum::INSTAGRAM->value => 'capoeiraaxezumbi', ], @@ -156,6 +173,9 @@ final class OrganizationFixtures extends AbstractFixture implements DependentFix 'phone' => '(85) 99999-0005', 'site' => 'https://www.phpeste.com.br', ], + 'activityAreas' => [ + ActivityAreaFixtures::ACTIVITY_AREA_ID_8, + ], 'socialNetworks' => [ SocialNetworkEnum::INSTAGRAM->value => 'grupoderapente', ], @@ -182,6 +202,10 @@ final class OrganizationFixtures extends AbstractFixture implements DependentFix 'phone' => '(85) 99999-0006', 'site' => 'https://www.ongambientalce.org.br', ], + 'activityAreas' => [ + ActivityAreaFixtures::ACTIVITY_AREA_ID_10, + ActivityAreaFixtures::ACTIVITY_AREA_ID_6, + ], 'socialNetworks' => [ SocialNetworkEnum::INSTAGRAM->value => 'ongambientalce', ], @@ -208,6 +232,11 @@ final class OrganizationFixtures extends AbstractFixture implements DependentFix 'phone' => '(85) 99999-0007', 'site' => 'https://www.foliacearense.com.br', ], + 'activityAreas' => [ + ActivityAreaFixtures::ACTIVITY_AREA_ID_2, + ActivityAreaFixtures::ACTIVITY_AREA_ID_4, + ActivityAreaFixtures::ACTIVITY_AREA_ID_9, + ], 'socialNetworks' => [ SocialNetworkEnum::INSTAGRAM->value => 'foliacearense', ], @@ -234,6 +263,9 @@ final class OrganizationFixtures extends AbstractFixture implements DependentFix 'phone' => '(85) 99999-0008', 'site' => 'https://filiados.cbsk.com.br/site/login', ], + 'activityAreas' => [ + ActivityAreaFixtures::ACTIVITY_AREA_ID_4, + ], 'socialNetworks' => [ SocialNetworkEnum::INSTAGRAM->value => 'fesk_skateboard', ], @@ -260,6 +292,9 @@ final class OrganizationFixtures extends AbstractFixture implements DependentFix 'phone' => '(85) 99999-0009', 'site' => 'https://30praum.com.br/', ], + 'activityAreas' => [ + ActivityAreaFixtures::ACTIVITY_AREA_ID_2, + ], 'socialNetworks' => [ SocialNetworkEnum::INSTAGRAM->value => '30praum', ], @@ -286,6 +321,10 @@ final class OrganizationFixtures extends AbstractFixture implements DependentFix 'phone' => '(85) 99999-0010', 'site' => 'https://www.acr.com.br', ], + 'activityAreas' => [ + ActivityAreaFixtures::ACTIVITY_AREA_ID_2, + ActivityAreaFixtures::ACTIVITY_AREA_ID_3, + ], 'socialNetworks' => [ SocialNetworkEnum::INSTAGRAM->value => 'acr_ce', ], @@ -356,6 +395,7 @@ public function getDependencies(): array { return [ AgentFixtures::class, + ActivityAreaFixtures::class, ]; } diff --git a/src/DataFixtures/Entity/PhotoFixtures.php b/src/DataFixtures/Entity/PhotoFixtures.php new file mode 100644 index 000000000..8a12cfe71 --- /dev/null +++ b/src/DataFixtures/Entity/PhotoFixtures.php @@ -0,0 +1,124 @@ + self::PHOTO_ID_1, + 'description' => 'Fachada principal do espaço cultural', + 'createdAt' => '2024-07-10T11:30:00+00:00', + ], + [ + 'id' => self::PHOTO_ID_2, + 'description' => 'Auditório com capacidade para 200 pessoas', + 'createdAt' => '2024-07-10T11:35:00+00:00', + ], + [ + 'id' => self::PHOTO_ID_3, + 'description' => 'Galeria de arte contemporânea', + 'createdAt' => '2024-07-11T10:00:00+00:00', + ], + [ + 'id' => self::PHOTO_ID_4, + 'description' => 'Espaço para oficinas e workshops', + 'createdAt' => '2024-07-11T10:05:00+00:00', + ], + [ + 'id' => self::PHOTO_ID_5, + 'description' => 'Área de convivência', + 'createdAt' => '2024-07-12T09:00:00+00:00', + ], + [ + 'id' => self::PHOTO_ID_6, + 'description' => 'Biblioteca com acervo local', + 'createdAt' => '2024-07-12T09:30:00+00:00', + ], + [ + 'id' => self::PHOTO_ID_7, + 'description' => 'Palco para apresentações musicais', + 'createdAt' => '2024-07-13T14:00:00+00:00', + ], + [ + 'id' => self::PHOTO_ID_8, + 'description' => 'Área externa para eventos ao ar livre', + 'createdAt' => '2024-07-13T14:30:00+00:00', + ], + ]; + + public function __construct( + protected EntityManagerInterface $entityManager, + protected TokenStorageInterface $tokenStorage, + private readonly SerializerInterface $serializer, + private readonly FileServiceInterface $fileService, + private readonly ParameterBagInterface $parameterBag, + ) { + parent::__construct($entityManager, $tokenStorage); + } + + public function getDependencies(): array + { + return [ + AgentFixtures::class, + ]; + } + + public function load(ObjectManager $manager): void + { + $this->createPhotos($manager); + $this->manualLogout(); + } + + private function createPhotos(ObjectManager $manager): void + { + $this->manualLoginByAgent(AgentFixtures::AGENT_ID_1); + + foreach (self::PHOTOS as $photoData) { + $file = $this->fileService->uploadImage( + $this->parameterBag->get('app.dir.space.portfolio'), + ImageFixtures::getSpacePortfolioImage() + ); + + $relativePath = '/uploads'.$this->parameterBag->get('app.dir.space.portfolio').'/'.$file->getFilename(); + + $photo = $this->mountPhoto($photoData, $relativePath); + + $this->setReference(sprintf('%s-%s', self::PHOTO_ID_PREFIX, $photoData['id']), $photo); + + $manager->persist($photo); + } + + $manager->flush(); + } + + private function mountPhoto(array $photoData, string $imagePath): Photo + { + /** @var Photo $photo */ + $photo = $this->serializer->denormalize($photoData, Photo::class); + $photo->setImage($imagePath); + + return $photo; + } +} diff --git a/src/DataFixtures/Entity/SpaceFixtures.php b/src/DataFixtures/Entity/SpaceFixtures.php index 829b2ce01..c49903940 100644 --- a/src/DataFixtures/Entity/SpaceFixtures.php +++ b/src/DataFixtures/Entity/SpaceFixtures.php @@ -71,6 +71,11 @@ final class SpaceFixtures extends AbstractFixture implements DependentFixtureInt 'updatedAt' => null, 'deletedAt' => null, 'spaceType' => SpaceTypeFixtures::SPACE_TYPE_ID_1, + 'portfolio' => [ + PhotoFixtures::PHOTO_ID_1, + PhotoFixtures::PHOTO_ID_2, + PhotoFixtures::PHOTO_ID_3, + ], ], [ 'id' => self::SPACE_ID_2, @@ -112,6 +117,10 @@ final class SpaceFixtures extends AbstractFixture implements DependentFixtureInt 'updatedAt' => null, 'deletedAt' => null, 'spaceType' => SpaceTypeFixtures::SPACE_TYPE_ID_1, + 'portfolio' => [ + PhotoFixtures::PHOTO_ID_4, + PhotoFixtures::PHOTO_ID_5, + ], ], [ 'id' => self::SPACE_ID_3, @@ -154,6 +163,9 @@ final class SpaceFixtures extends AbstractFixture implements DependentFixtureInt 'updatedAt' => null, 'deletedAt' => null, 'spaceType' => SpaceTypeFixtures::SPACE_TYPE_ID_1, + 'portfolio' => [ + PhotoFixtures::PHOTO_ID_6, + ], ], [ 'id' => self::SPACE_ID_4, @@ -497,6 +509,7 @@ public function getDependencies(): array ArchitecturalAccessibilityFixtures::class, TagFixtures::class, SpaceTypeFixtures::class, + PhotoFixtures::class, ]; } diff --git a/src/DataFixtures/Entity/images/entity-cover-image.png b/src/DataFixtures/Entity/images/entity-cover-image.png new file mode 100644 index 000000000..4e53b769c Binary files /dev/null and b/src/DataFixtures/Entity/images/entity-cover-image.png differ diff --git a/src/Document/AgentTimeline.php b/src/Document/AgentTimeline.php index f803201bb..23667e4e6 100644 --- a/src/Document/AgentTimeline.php +++ b/src/Document/AgentTimeline.php @@ -15,7 +15,7 @@ class AgentTimeline extends AbstractDocument private ?string $id = null; #[ODM\Field] - private string $userId; + private ?string $userId = null; #[ODM\Field] private string $resourceId; @@ -51,7 +51,7 @@ public function setId(string $id): void $this->id = $id; } - public function getUserId(): string + public function getUserId(): ?string { return $this->userId; } diff --git a/src/Document/AuthTimeline.php b/src/Document/AuthTimeline.php index 333fc1663..fb450106f 100644 --- a/src/Document/AuthTimeline.php +++ b/src/Document/AuthTimeline.php @@ -14,7 +14,7 @@ class AuthTimeline extends AbstractDocument private ?string $id = null; #[ODM\Field] - private string $userId; + private ?string $userId = null; #[ODM\Field] private int $priority; @@ -41,7 +41,7 @@ public function setId(string $id): void $this->id = $id; } - public function getUserId(): string + public function getUserId(): ?string { return $this->userId; } diff --git a/src/Document/EventTimeline.php b/src/Document/EventTimeline.php index bc78d2903..9ebd0b43f 100644 --- a/src/Document/EventTimeline.php +++ b/src/Document/EventTimeline.php @@ -15,7 +15,7 @@ class EventTimeline extends AbstractDocument private ?string $id = null; #[ODM\Field] - private string $userId; + private ?string $userId = null; #[ODM\Field] private string $resourceId; @@ -51,7 +51,7 @@ public function setId(string $id): void $this->id = $id; } - public function getUserId(): string + public function getUserId(): ?string { return $this->userId; } diff --git a/src/Document/InitiativeTimeline.php b/src/Document/InitiativeTimeline.php index 8f5a8c663..d149cabff 100644 --- a/src/Document/InitiativeTimeline.php +++ b/src/Document/InitiativeTimeline.php @@ -15,7 +15,7 @@ class InitiativeTimeline extends AbstractDocument private ?string $id = null; #[ODM\Field] - private string $userId; + private ?string $userId = null; #[ODM\Field] private string $resourceId; @@ -51,7 +51,7 @@ public function setId(string $id): void $this->id = $id; } - public function getUserId(): string + public function getUserId(): ?string { return $this->userId; } diff --git a/src/Document/InscriptionEventTimeline.php b/src/Document/InscriptionEventTimeline.php index f80defbff..d505c4fdd 100644 --- a/src/Document/InscriptionEventTimeline.php +++ b/src/Document/InscriptionEventTimeline.php @@ -15,7 +15,7 @@ class InscriptionEventTimeline extends AbstractDocument private ?string $id = null; #[ODM\Field] - private string $userId; + private ?string $userId = null; #[ODM\Field] private string $resourceId; @@ -51,7 +51,7 @@ public function setId(string $id): void $this->id = $id; } - public function getUserId(): string + public function getUserId(): ?string { return $this->userId; } diff --git a/src/Document/InscriptionOpportunityTimeline.php b/src/Document/InscriptionOpportunityTimeline.php index 9f55e9cf9..2921dce2b 100644 --- a/src/Document/InscriptionOpportunityTimeline.php +++ b/src/Document/InscriptionOpportunityTimeline.php @@ -15,7 +15,7 @@ class InscriptionOpportunityTimeline extends AbstractDocument private ?string $id = null; #[ODM\Field] - private string $userId; + private ?string $userId = null; #[ODM\Field] private string $resourceId; @@ -51,7 +51,7 @@ public function setId(string $id): void $this->id = $id; } - public function getUserId(): string + public function getUserId(): ?string { return $this->userId; } diff --git a/src/Document/InscriptionPhaseReviewTimeline.php b/src/Document/InscriptionPhaseReviewTimeline.php index 61e3bab0c..cbdc2ee8f 100644 --- a/src/Document/InscriptionPhaseReviewTimeline.php +++ b/src/Document/InscriptionPhaseReviewTimeline.php @@ -15,7 +15,7 @@ class InscriptionPhaseReviewTimeline private ?string $id = null; #[ODM\Field] - private string $userId; + private ?string $userId = null; #[ODM\Field] private string $resourceId; @@ -51,7 +51,7 @@ public function setId(string $id): void $this->id = $id; } - public function getUserId(): string + public function getUserId(): ?string { return $this->userId; } diff --git a/src/Document/InscriptionPhaseTimeline.php b/src/Document/InscriptionPhaseTimeline.php index 56ccf59ec..f8fd9ad80 100644 --- a/src/Document/InscriptionPhaseTimeline.php +++ b/src/Document/InscriptionPhaseTimeline.php @@ -15,7 +15,7 @@ class InscriptionPhaseTimeline private ?string $id = null; #[ODM\Field] - private string $userId; + private ?string $userId = null; #[ODM\Field] private string $resourceId; @@ -51,7 +51,7 @@ public function setId(string $id): void $this->id = $id; } - public function getUserId(): string + public function getUserId(): ?string { return $this->userId; } diff --git a/src/Document/OpportunityTimeline.php b/src/Document/OpportunityTimeline.php index ddfca1a96..f9add5c5a 100644 --- a/src/Document/OpportunityTimeline.php +++ b/src/Document/OpportunityTimeline.php @@ -15,7 +15,7 @@ class OpportunityTimeline extends AbstractDocument private ?string $id = null; #[ODM\Field] - private string $userId; + private ?string $userId = null; #[ODM\Field] private string $resourceId; @@ -51,7 +51,7 @@ public function setId(string $id): void $this->id = $id; } - public function getUserId(): string + public function getUserId(): ?string { return $this->userId; } diff --git a/src/Document/OrganizationTimeline.php b/src/Document/OrganizationTimeline.php index 90fad06d5..813281b7b 100644 --- a/src/Document/OrganizationTimeline.php +++ b/src/Document/OrganizationTimeline.php @@ -15,7 +15,7 @@ class OrganizationTimeline extends AbstractDocument private ?string $id = null; #[ODM\Field] - private string $userId; + private ?string $userId = null; #[ODM\Field] private string $resourceId; @@ -51,7 +51,7 @@ public function setId(string $id): void $this->id = $id; } - public function getUserId(): string + public function getUserId(): ?string { return $this->userId; } diff --git a/src/Document/PhaseTimeline.php b/src/Document/PhaseTimeline.php index a83751ee0..f3f59159f 100644 --- a/src/Document/PhaseTimeline.php +++ b/src/Document/PhaseTimeline.php @@ -15,7 +15,7 @@ class PhaseTimeline extends AbstractDocument private ?string $id = null; #[ODM\Field] - private string $userId; + private ?string $userId = null; #[ODM\Field] private string $resourceId; @@ -51,7 +51,7 @@ public function setId(string $id): void $this->id = $id; } - public function getUserId(): string + public function getUserId(): ?string { return $this->userId; } diff --git a/src/Document/SealEntityTimeline.php b/src/Document/SealEntityTimeline.php index 109b48742..cc9b62ab7 100644 --- a/src/Document/SealEntityTimeline.php +++ b/src/Document/SealEntityTimeline.php @@ -15,7 +15,7 @@ class SealEntityTimeline private ?string $id = null; #[ODM\Field] - private string $userId; + private ?string $userId = null; #[ODM\Field] private string $resourceId; @@ -51,7 +51,7 @@ public function setId(string $id): void $this->id = $id; } - public function getUserId(): string + public function getUserId(): ?string { return $this->userId; } diff --git a/src/Document/SealTimeline.php b/src/Document/SealTimeline.php index 5410e3301..19617c97e 100644 --- a/src/Document/SealTimeline.php +++ b/src/Document/SealTimeline.php @@ -15,7 +15,7 @@ class SealTimeline private ?string $id = null; #[ODM\Field] - private string $userId; + private ?string $userId = null; #[ODM\Field] private string $resourceId; @@ -51,7 +51,7 @@ public function setId(string $id): void $this->id = $id; } - public function getUserId(): string + public function getUserId(): ?string { return $this->userId; } diff --git a/src/Document/SpaceTimeline.php b/src/Document/SpaceTimeline.php index 5cac3242a..102b0a362 100644 --- a/src/Document/SpaceTimeline.php +++ b/src/Document/SpaceTimeline.php @@ -15,7 +15,7 @@ class SpaceTimeline extends AbstractDocument private ?string $id = null; #[ODM\Field] - private string $userId; + private ?string $userId = null; #[ODM\Field] private string $resourceId; @@ -51,7 +51,7 @@ public function setId(string $id): void $this->id = $id; } - public function getUserId(): string + public function getUserId(): ?string { return $this->userId; } diff --git a/src/Entity/ActivityArea.php b/src/Entity/ActivityArea.php index be8a386e2..fc453251f 100644 --- a/src/Entity/ActivityArea.php +++ b/src/Entity/ActivityArea.php @@ -15,11 +15,21 @@ class ActivityArea { #[ORM\Id] #[ORM\Column(type: UuidType::NAME)] - #[Groups(['space.get', 'space.get.item', 'activity-area.get', 'activity-area.get.item', 'event.get', 'event.get.item'])] + #[Groups([ + 'space.get', 'space.get.item', + 'activity-area.get', 'activity-area.get.item', + 'event.get', 'event.get.item', + 'organization.get', 'organization.get.item', + ])] private ?Uuid $id = null; #[ORM\Column(length: 20)] - #[Groups(['space.get', 'space.get.item', 'activity-area.get', 'activity-area.get.item', 'event.get', 'event.get.item'])] + #[Groups([ + 'space.get', 'space.get.item', + 'activity-area.get', 'activity-area.get.item', + 'event.get', 'event.get.item', + 'organization.get', 'organization.get.item', + ])] private ?string $name = null; public function getId(): ?Uuid diff --git a/src/Entity/Address.php b/src/Entity/Address.php index befcbba1f..de00e8837 100644 --- a/src/Entity/Address.php +++ b/src/Entity/Address.php @@ -15,7 +15,7 @@ #[ORM\Table(name: 'address')] #[ORM\InheritanceType('SINGLE_TABLE')] #[ORM\DiscriminatorColumn(name: 'owner_type', type: 'string')] -#[ORM\DiscriminatorMap(['agent' => AgentAddress::class, 'space' => SpaceAddress::class])] +#[ORM\DiscriminatorMap(['agent' => AgentAddress::class, 'space' => SpaceAddress::class, 'event' => EventAddress::class])] abstract class Address extends AbstractEntity { #[ORM\Id] diff --git a/src/Entity/Agent.php b/src/Entity/Agent.php index 2419a659e..020e57b34 100644 --- a/src/Entity/Agent.php +++ b/src/Entity/Agent.php @@ -30,10 +30,18 @@ class Agent extends AbstractEntity #[Groups(['agent.get'])] private ?string $name = null; + #[ORM\Column(length: 30)] + #[Groups(['agent.get', 'agent.get.item'])] + private ?string $fiscalCode = ''; + #[ORM\Column(nullable: true)] #[Groups(['agent.get'])] private ?string $image = null; + #[ORM\Column(length: 255, nullable: true)] + #[Groups(['agent.get'])] + private ?string $coverImage = null; + #[ORM\Column(length: 100)] #[Groups(['agent.get'])] private string $shortBio; @@ -79,6 +87,11 @@ class Agent extends AbstractEntity #[Groups(['agent.get.item'])] private ?Collection $addresses = null; + #[ORM\ManyToMany(targetEntity: Photo::class)] + #[ORM\JoinTable(name: 'agent_photo')] + #[Groups('agent.get.item')] + private Collection $portfolio; + /** * @var array */ @@ -105,6 +118,7 @@ public function __construct() $this->seals = new ArrayCollection(); $this->createdAt = new DateTimeImmutable(); $this->culturalFunction = new ArrayCollection(); + $this->portfolio = new ArrayCollection(); } public function getId(): ?Uuid @@ -127,6 +141,16 @@ public function setName(string $name): void $this->name = $name; } + public function getFiscalCode(): ?string + { + return $this->fiscalCode; + } + + public function setFiscalCode(?string $fiscalCode): void + { + $this->fiscalCode = $fiscalCode; + } + public function getImage(): ?string { return $this->image; @@ -137,6 +161,16 @@ public function setImage(?string $image): void $this->image = $image; } + public function getCoverImage(): ?string + { + return $this->coverImage; + } + + public function setCoverImage(?string $coverImage): void + { + $this->coverImage = $coverImage; + } + public function getShortBio(): string { return $this->shortBio; @@ -262,6 +296,28 @@ public function removeAddress(AgentAddress $address): void $this->addresses->removeElement($address); } + public function getPortfolio(): Collection + { + return $this->portfolio; + } + + public function setPortfolio(Collection $portfolio): void + { + $this->portfolio = $portfolio; + } + + public function addPortfolio(Photo $photo): void + { + if (!$this->portfolio->contains($photo)) { + $this->portfolio->add($photo); + } + } + + public function removePortfolio(Photo $photo): void + { + $this->portfolio->removeElement($photo); + } + public function getSocialNetworks(): array { return $this->socialNetworks; @@ -334,13 +390,16 @@ public function toArray(): array return [ 'id' => $this->id?->toRfc4122(), 'name' => $this->name, + 'fiscalCode' => $this->fiscalCode, 'image' => $this->image, + 'coverImage' => $this->coverImage, 'shortBio' => $this->shortBio, 'longBio' => $this->longBio, 'culture' => $this->culture, 'extraFields' => $this->extraFields, 'organizations' => $this->organizations->map(fn ($organization) => $organization->getId()->toRfc4122())->toArray(), 'culturalFunction' => $this->culturalFunction->map(fn ($culturalFunction) => $culturalFunction->getId()->toRfc4122())->toArray(), + 'portfolio' => $this->portfolio->map(fn (Photo $photo) => $photo->toArray())->toArray(), 'socialNetworks' => $this->socialNetworks, 'createdAt' => $this->createdAt->format(DateFormatHelper::DEFAULT_FORMAT), 'updatedAt' => $this->updatedAt?->format(DateFormatHelper::DEFAULT_FORMAT), diff --git a/src/Entity/City.php b/src/Entity/City.php index 7f5f54a99..7b51eadad 100644 --- a/src/Entity/City.php +++ b/src/Entity/City.php @@ -16,7 +16,7 @@ class City extends AbstractEntity { #[ORM\Id] #[ORM\Column(type: UuidType::NAME)] - #[Groups(['city.get', 'state.get', 'address.get.item'])] + #[Groups(['city.get', 'state.get', 'address.get.item', 'space.get'])] private Uuid $id; #[ORM\Column(length: 100)] diff --git a/src/Entity/Event.php b/src/Entity/Event.php index 7499cf07e..581d966cf 100644 --- a/src/Entity/Event.php +++ b/src/Entity/Event.php @@ -139,6 +139,10 @@ class Event extends AbstractEntity implements ExportableSourceInterface #[Groups(['event.get', 'event.get.item'])] private bool $draft = true; + #[ORM\OneToOne(targetEntity: EventAddress::class, mappedBy: 'owner', cascade: ['persist', 'remove'])] + #[Groups(['event.get', 'event.get.item'])] + private ?EventAddress $address = null; + #[ORM\ManyToMany(targetEntity: CulturalLanguage::class)] #[ORM\JoinTable(name: 'event_cultural_languages')] #[Groups(['event.get', 'event.get.item'])] @@ -466,6 +470,16 @@ public function setDraft(bool $draft): void $this->draft = $draft; } + public function getAddress(): ?EventAddress + { + return $this->address; + } + + public function setAddress(EventAddress $address): void + { + $this->address = $address; + } + public function getSocialNetworks(): array { return $this->socialNetworks; diff --git a/src/Entity/EventAddress.php b/src/Entity/EventAddress.php new file mode 100644 index 000000000..6d2c37ac7 --- /dev/null +++ b/src/Entity/EventAddress.php @@ -0,0 +1,41 @@ +setId(Uuid::v4()); + parent::__construct(); + } + + public function getOwner(): Event + { + return $this->owner; + } + + public function setOwner(Event $owner): void + { + $this->owner = $owner; + } + + public function toArray(): array + { + $data = parent::toArray(); + $data['owner'] = $this->owner->getId()?->toRfc4122(); + + return $data; + } +} diff --git a/src/Entity/Opportunity.php b/src/Entity/Opportunity.php index 3bbc55cce..3d5dfb5fb 100644 --- a/src/Entity/Opportunity.php +++ b/src/Entity/Opportunity.php @@ -29,10 +29,17 @@ class Opportunity extends AbstractEntity #[Groups('opportunity.get')] private ?string $name = null; + #[ORM\Column(length: 255, nullable: true)] + #[Groups('opportunity.get')] + private ?string $description = null; + #[ORM\Column(nullable: true)] #[Groups('opportunity.get')] private ?string $image = null; + #[ORM\Column(length: 255, nullable: true)] + private ?string $coverImage = null; + #[ORM\ManyToOne(targetEntity: self::class)] #[ORM\JoinColumn(name: 'parent_id', referencedColumnName: 'id', nullable: true, onDelete: 'SET NULL')] #[Groups('opportunity.get')] @@ -121,6 +128,16 @@ public function setImage(?string $image): void $this->image = $image; } + public function getCoverImage(): ?string + { + return $this->coverImage; + } + + public function setCoverImage(?string $coverImage): void + { + $this->coverImage = $coverImage; + } + public function getParent(): ?Opportunity { return $this->parent; @@ -254,11 +271,22 @@ public function setDeletedAt(?DateTime $deletedAt): void $this->deletedAt = $deletedAt; } + public function getDescription(): ?string + { + return $this->description; + } + + public function setDescription(?string $description): void + { + $this->description = $description; + } + public function toArray(): array { return [ 'id' => $this->id?->toRfc4122(), 'name' => $this->name, + 'description' => $this->description, 'parent' => $this->parent?->toArray(), 'space' => $this->space?->toArray(), 'initiative' => $this->initiative?->toArray(), diff --git a/src/Entity/Organization.php b/src/Entity/Organization.php index 2ab3e2dae..af4ee9a07 100644 --- a/src/Entity/Organization.php +++ b/src/Entity/Organization.php @@ -34,6 +34,10 @@ class Organization extends AbstractEntity #[Groups('organization.get')] private ?string $description = null; + #[ORM\Column(type: Types::TEXT, nullable: true)] + #[Groups('organization.get')] + private ?string $longDescription = null; + #[ORM\Column(type: 'string', nullable: false)] #[Groups('organization.get')] private string $type = OrganizationTypeEnum::UNDEFINED->value; @@ -42,6 +46,10 @@ class Organization extends AbstractEntity #[Groups('organization.get')] private ?string $image = null; + #[ORM\Column(length: 255, nullable: true)] + #[Groups('organization.get')] + private ?string $coverImage = null; + #[ORM\JoinTable(name: 'organizations_agents')] #[ORM\JoinColumn(name: 'organization_id', referencedColumnName: 'id')] #[ORM\InverseJoinColumn(name: 'agent_id', referencedColumnName: 'id')] @@ -69,6 +77,11 @@ class Organization extends AbstractEntity #[ORM\Column(type: Types::JSON, nullable: true)] private array $socialNetworks = []; + #[ORM\ManyToMany(targetEntity: ActivityArea::class, inversedBy: 'organizations', cascade: ['persist'])] + #[ORM\JoinTable(name: 'activity_area_organizations')] + #[Groups(['organization.get', 'organization.get.item'])] + private Collection $activityAreas; + #[ORM\Column] #[Groups('organization.get')] private DateTimeImmutable $createdAt; @@ -85,6 +98,7 @@ public function __construct() { $this->createdAt = new DateTimeImmutable(); $this->agents = new ArrayCollection(); + $this->activityAreas = new ArrayCollection(); } public function getId(): ?Uuid @@ -117,6 +131,16 @@ public function setDescription(?string $description): void $this->description = $description; } + public function getLongDescription(): ?string + { + return $this->longDescription; + } + + public function setLongDescription(?string $longDescription): void + { + $this->longDescription = $longDescription; + } + public function getType(): string { return $this->type; @@ -137,6 +161,16 @@ public function setImage(?string $image): void $this->image = $image; } + public function getCoverImage(): ?string + { + return $this->coverImage; + } + + public function setCoverImage(?string $coverImage): void + { + $this->coverImage = $coverImage; + } + public function getAgents(): Collection { return $this->agents; @@ -192,6 +226,28 @@ public function addExtraField(string $name, mixed $value): void $this->extraFields[$name] = $value; } + public function getActivityAreas(): Collection + { + return $this->activityAreas; + } + + public function setActivityAreas(Collection $activityAreas): void + { + $this->activityAreas = $activityAreas; + } + + public function addActivityArea(ActivityArea $activityArea): void + { + if (!$this->activityAreas->contains($activityArea)) { + $this->activityAreas->add($activityArea); + } + } + + public function removeActivityArea(ActivityArea $activityArea): void + { + $this->activityAreas->removeElement($activityArea); + } + public function getSocialNetworks(): array { return $this->socialNetworks; diff --git a/src/Entity/Photo.php b/src/Entity/Photo.php new file mode 100644 index 000000000..4ec70b203 --- /dev/null +++ b/src/Entity/Photo.php @@ -0,0 +1,121 @@ +createdAt = new DateTimeImmutable(); + } + + public function getId(): ?Uuid + { + return $this->id; + } + + public function setId(Uuid $id): void + { + $this->id = $id; + } + + public function getImage(): ?string + { + return $this->image; + } + + public function setImage(string $image): void + { + $this->image = $image; + } + + public function getDescription(): ?string + { + return $this->description; + } + + public function setDescription(?string $description): void + { + $this->description = $description; + } + + public function getCreatedAt(): ?DateTimeImmutable + { + return $this->createdAt; + } + + public function setCreatedAt(DateTimeImmutable $createdAt): void + { + $this->createdAt = $createdAt; + } + + public function getUpdatedAt(): ?DateTime + { + return $this->updatedAt; + } + + public function setUpdatedAt(?DateTime $updatedAt): void + { + $this->updatedAt = $updatedAt; + } + + public function getDeletedAt(): ?DateTime + { + return $this->deletedAt; + } + + public function setDeletedAt(?DateTime $deletedAt): void + { + $this->deletedAt = $deletedAt; + } + + public function toArray(): array + { + return [ + 'id' => $this->id?->toRfc4122(), + 'image' => $this->image, + 'description' => $this->description, + 'createdAt' => $this->createdAt->format(DateFormatHelper::DEFAULT_FORMAT), + 'updatedAt' => $this->updatedAt?->format(DateFormatHelper::DEFAULT_FORMAT), + 'deletedAt' => $this->deletedAt?->format(DateFormatHelper::DEFAULT_FORMAT), + ]; + } +} diff --git a/src/Entity/Space.php b/src/Entity/Space.php index 0c3734f88..059e762ef 100644 --- a/src/Entity/Space.php +++ b/src/Entity/Space.php @@ -107,6 +107,11 @@ class Space extends AbstractEntity #[Groups(['space.get', 'space.get.item'])] private Collection $accessibilities; + #[ORM\ManyToMany(targetEntity: Photo::class)] + #[ORM\JoinTable(name: 'space_photo')] + #[Groups('space.get.item')] + private Collection $portfolio; + /** * @var array */ @@ -136,6 +141,7 @@ public function __construct() $this->createdAt = new DateTimeImmutable(); $this->activityAreas = new ArrayCollection(); $this->accessibilities = new ArrayCollection(); + $this->portfolio = new ArrayCollection(); } public function getId(): ?Uuid @@ -364,6 +370,28 @@ public function removeAccessibility(ArchitecturalAccessibility $accessibility): $this->accessibilities->removeElement($accessibility); } + public function getPortfolio(): Collection + { + return $this->portfolio; + } + + public function setPortfolio(Collection $portfolio): void + { + $this->portfolio = $portfolio; + } + + public function addPortfolio(Photo $photo): void + { + if (!$this->portfolio->contains($photo)) { + $this->portfolio->add($photo); + } + } + + public function removePortfolio(Photo $photo): void + { + $this->portfolio->removeElement($photo); + } + public function getEntityAssociation(): ?EntityAssociation { return $this->entityAssociation; @@ -460,6 +488,7 @@ public function toArray(): array 'entityAssociation' => $this->entityAssociation?->toArray(), 'tags' => $this->tags->map(fn (Tag $tag) => $tag->toArray())->toArray(), 'accessibilities' => $this->accessibilities->map(fn (ArchitecturalAccessibility $accessibility) => $accessibility->toArray())->toArray(), + 'portfolio' => $this->portfolio->map(fn (Photo $photo) => $photo->toArray())->toArray(), 'spaceType' => $this->spaceType?->toArray(), 'socialNetworks' => $this->socialNetworks, 'createdAt' => $this->createdAt->format(DateFormatHelper::DEFAULT_FORMAT), diff --git a/src/Entity/SpaceAddress.php b/src/Entity/SpaceAddress.php index 93b314263..c5f6b5ffa 100644 --- a/src/Entity/SpaceAddress.php +++ b/src/Entity/SpaceAddress.php @@ -5,13 +5,20 @@ namespace App\Entity; use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Uid\Uuid; #[ORM\Entity] class SpaceAddress extends Address { #[ORM\OneToOne(targetEntity: Space::class, inversedBy: 'address')] #[ORM\JoinColumn(name: 'owner_id', referencedColumnName: 'id', nullable: false)] - public Space $owner; + public ?Space $owner = null; + + public function __construct() + { + $this->setId(Uuid::v4()); + parent::__construct(); + } public function getOwner(): Space { diff --git a/src/Entity/User.php b/src/Entity/User.php index caa9f7c08..b42bdf053 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -50,6 +50,9 @@ class User extends AbstractEntity implements UserInterface, PasswordAuthenticate #[Groups(['user.get'])] private ?string $image = null; + #[ORM\Column(length: 255, nullable: true)] + private ?string $coverImage = null; + #[ORM\OneToMany(targetEntity: Agent::class, mappedBy: 'user')] #[Groups(['user.get'])] private Collection $agents; @@ -59,7 +62,7 @@ class User extends AbstractEntity implements UserInterface, PasswordAuthenticate private string $status = UserStatusEnum::AWAITING_CONFIRMATION->value; #[ORM\Column(type: 'json')] - private array $roles = []; + private array $roles = ['ROLE_USER']; #[ORM\Column] #[Groups(['user.get'])] @@ -154,6 +157,16 @@ public function setImage(?string $image): void $this->image = $image; } + public function getCoverImage(): ?string + { + return $this->coverImage; + } + + public function setCoverImage(?string $coverImage): void + { + $this->coverImage = $coverImage; + } + public function getAgents(): Collection { return $this->agents; diff --git a/src/Enum/EducationEnum.php b/src/Enum/EducationEnum.php index 97d8ea64d..3d077172f 100644 --- a/src/Enum/EducationEnum.php +++ b/src/Enum/EducationEnum.php @@ -10,17 +10,17 @@ enum EducationEnum: string { use EnumTrait; - case NOT_LITERATE = 'Not literate'; - case ELEMENTARY_INCOMPLETE = 'Incomplete Elementary School'; - case ELEMENTARY_COMPLETE = 'Complete Elementary School'; - case HIGH_SCHOOL_INCOMPLETE = 'Incomplete High School'; - case HIGH_SCHOOL_COMPLETE = 'Complete High School'; - case COLLEGE_INCOMPLETE = 'Incomplete College'; - case COLLEGE_COMPLETE = 'Complete College'; - case POSTGRADUATE = 'Postgraduate (lato sensu)'; - case MASTER = 'Master (stricto sensu)'; - case DOCTORATE = 'Doctorate (stricto sensu)'; - case POST_DOCTORATE = 'Post-doctorate'; - case OTHER = 'Other'; - case PREFER_NOT_TO_DISCLOSE = 'Prefer not to disclose'; + case NOT_LITERATE = 'Não alfabetizado'; + case ELEMENTARY_INCOMPLETE = 'Fundamental incompleto'; + case ELEMENTARY_COMPLETE = 'Fundamental completo'; + case HIGH_SCHOOL_INCOMPLETE = 'Médio incompleto'; + case HIGH_SCHOOL_COMPLETE = 'Médio completo'; + case COLLEGE_INCOMPLETE = 'Superior incompleto'; + case COLLEGE_COMPLETE = 'Superior completo'; + case POSTGRADUATE = 'Pós-graduação (lato sensu)'; + case MASTER = 'Mestrado (stricto sensu)'; + case DOCTORATE = 'Doutorado (stricto sensu)'; + case POST_DOCTORATE = 'Pós-doutorado'; + case OTHER = 'Outro'; + case PREFER_NOT_TO_DISCLOSE = 'Prefere não informar'; } diff --git a/src/Enum/OrganizationTypeEnum.php b/src/Enum/OrganizationTypeEnum.php index 01f079fe0..c8d088bc3 100644 --- a/src/Enum/OrganizationTypeEnum.php +++ b/src/Enum/OrganizationTypeEnum.php @@ -10,10 +10,10 @@ enum OrganizationTypeEnum: string { use EnumTrait; - case UNDEFINED = 'Undefined'; case MUNICIPIO = 'Municipio'; case COMUNIDADE = 'Comunidade'; case EMPRESA = 'Empresa'; case ENTIDADE = 'Entidade'; case OSC = 'OSC'; + case UNDEFINED = 'Outro'; } diff --git a/src/Exception/CulturalFunction/CulturalFunctionResourceNotFoundException.php b/src/Exception/CulturalFunction/CulturalFunctionResourceNotFoundException.php new file mode 100644 index 000000000..109d9b344 --- /dev/null +++ b/src/Exception/CulturalFunction/CulturalFunctionResourceNotFoundException.php @@ -0,0 +1,12 @@ +getQuery() ->getOneOrNullResult(); } + + public function getMainAgentByUser(string $userId): ?Agent + { + $qb = $this->getEntityManager()->createQueryBuilder(); + + return $qb->select('a') + ->from(Agent::class, 'a') + ->where('a.user = :userId') + ->andWhere('a.main = true') + ->andWhere('a.deletedAt IS NULL') + ->setParameter('userId', $userId) + ->setMaxResults(1) + ->getQuery() + ->getOneOrNullResult(); + } } diff --git a/src/Repository/EventRepository.php b/src/Repository/EventRepository.php index 7eeb8660d..b500cd7de 100644 --- a/src/Repository/EventRepository.php +++ b/src/Repository/EventRepository.php @@ -5,11 +5,8 @@ namespace App\Repository; use App\Entity\Event; -use App\Entity\InscriptionEvent; use App\Repository\Interface\EventRepositoryInterface; -use DateTime; -use Doctrine\DBAL\ParameterType; -use Doctrine\ORM\QueryBuilder; +use Doctrine\DBAL\Types\Types; use Doctrine\Persistence\ManagerRegistry; class EventRepository extends AbstractRepository implements EventRepositoryInterface @@ -19,112 +16,54 @@ public function __construct(ManagerRegistry $registry) parent::__construct($registry, Event::class); } - public function save(Event $event): Event - { - $this->getEntityManager()->persist($event); - $this->getEntityManager()->flush(); - - return $event; - } - - public function findByAgent(string $agentId): array - { - return $this->getEntityManager()->createQueryBuilder() - ->select('e') - ->from(Event::class, 'e') - ->join(InscriptionEvent::class, 'ie', 'WITH', 'ie.event = e.id') - ->where('ie.agent = :agentId') - ->setParameter('agentId', $agentId) - ->orderBy('e.createdAt', 'DESC') - ->getQuery() - ->getResult(); - } - - public function findByFilters(array $filters, array $orderBy, int $limit): array + public function findByFilters(array $filters, array $order = [], int $limit = 50): array { - $qb = $this->createQueryBuilder('e') - ->orderBy('e.'.key($orderBy), current($orderBy)) - ->setMaxResults($limit); - - $this->applyFilters($qb, $filters); - - return $qb->getQuery()->getResult(); - } + $qb = $this->createQueryBuilder('e'); + if (!empty($filters['name'])) { + $qb->andWhere('lower(e.name) LIKE lower(:name)') + ->setParameter('name', "%{$filters['name']}%"); + unset($filters['name']); + } - private function applyFilters(QueryBuilder $qb, array $filters): void - { - $filterMappings = $this->getFilterMappings(); + if (!empty($filters['period']['start']) && !empty($filters['period']['end'])) { + $qb->leftJoin('e.eventSchedules', 'es') + ->andWhere('es.startHour BETWEEN :startPeriod AND :endPeriod') + ->setParameter('startPeriod', $filters['period']['start'], Types::DATETIME_IMMUTABLE) + ->setParameter('endPeriod', $filters['period']['end'], Types::DATETIME_IMMUTABLE); + unset($filters['period']); + } foreach ($filters as $key => $value) { - if (!isset($filterMappings[$key])) { - continue; - } - - $map = $filterMappings[$key]; - - if (isset($map['join'])) { - $joins = is_array($map['join'][0]) ? $map['join'] : [$map['join']]; - - foreach ($joins as $join) { - if (!in_array($join[1], $qb->getAllAliases())) { - $qb->join($join[0], $join[1]); - } - } + $paramName = $key; + $expr = match (true) { + is_array($value) => "e.$key IN (:$paramName)", + is_null($value) => "e.$key IS NULL", + is_bool($value) => "e.$key is :$paramName", + default => "e.$key = :$paramName", + }; + + $qb->andWhere($expr); + + if (null !== $value) { + $qb->setParameter($paramName, $value, type: is_bool($value) ? Types::BOOLEAN : null); } + } - $map['condition']($qb, $value); + foreach ($order as $key => $value) { + $qb->addOrderBy("e.$key", $value); } - } - private function getFilterMappings(): array - { - return [ - 'name' => [ - 'condition' => fn (QueryBuilder $qb, $value) => $qb->andWhere('e.name LIKE :name')->setParameter('name', "%{$value}%"), - ], - 'draft' => [ - 'condition' => fn (QueryBuilder $qb, $value) => $qb->andWhere('e.draft = :draft')->setParameter('draft', $value, ParameterType::BOOLEAN), - ], - 'culturalLanguages' => [ - 'join' => ['e.culturalLanguages', 'cl'], - 'condition' => fn (QueryBuilder $qb, $value) => $qb->andWhere('cl.id = :languageId')->setParameter('languageId', $value), - ], - 'tags' => [ - 'join' => ['e.tags', 't'], - 'condition' => fn (QueryBuilder $qb, $value) => $qb->andWhere('t.id = :tagId')->setParameter('tagId', $value), - ], - 'state' => [ - 'join' => [['e.space', 'sp'], ['sp.address', 'a'], ['a.city', 'c'], ['c.state', 'st']], - 'condition' => fn (QueryBuilder $qb, $value) => $qb->andWhere('st.id = :stateId')->setParameter('stateId', $value), - ], - 'city' => [ - 'join' => [['e.space', 'sp'], ['sp.address', 'a'], ['a.city', 'c']], - 'condition' => fn (QueryBuilder $qb, $value) => $qb->andWhere('c.id = :cityId')->setParameter('cityId', $value), - ], - 'ageRating' => [ - 'condition' => fn (QueryBuilder $qb, $value) => $qb->andWhere("JSON_GET_TEXT(e.extraFields, 'ageRating') = :ageRating") - ->setParameter('ageRating', (string) $value), - ], - 'period' => [ - 'condition' => fn (QueryBuilder $qb, $value) => $this->applyPeriodFilter($qb, $value), - ], - ]; + return $qb + ->setMaxResults($limit) + ->getQuery() + ->getResult(); } - private function applyPeriodFilter(QueryBuilder $qb, mixed $period): void + public function save(Event $event): Event { - if (!is_array($period)) { - return; - } - - if (!empty($period['start']) && !empty($period['end'])) { - $start = new DateTime($period['start']); - $end = new DateTime($period['end']); + $this->getEntityManager()->persist($event); + $this->getEntityManager()->flush(); - $qb->andWhere('COALESCE(e.endDate, e.startDate) >= :periodStart') - ->andWhere('e.startDate <= :periodEnd') - ->setParameter('periodStart', $start) - ->setParameter('periodEnd', $end); - } + return $event; } } diff --git a/src/Repository/InitiativeRepository.php b/src/Repository/InitiativeRepository.php index d5b66621d..4c7e7534f 100644 --- a/src/Repository/InitiativeRepository.php +++ b/src/Repository/InitiativeRepository.php @@ -23,6 +23,21 @@ public function save(Initiative $initiative): Initiative return $initiative; } + public function countByStatus(string $status): int + { + $connection = $this->getEntityManager()->getConnection(); + $result = $connection->createQueryBuilder() + ->select('COUNT(*)') + ->from('initiative', 'i') + ->where("i.extra_fields->>'status' = :status") + ->andWhere('i.deleted_at IS NULL') + ->setParameter('status', $status) + ->executeQuery() + ->fetchOne(); + + return (int) $result; + } + public function findByFilters(?string $region, ?string $state, ?string $cityName, ?string $status): array { $connection = $this->getEntityManager()->getConnection(); diff --git a/src/Repository/InscriptionEventRepository.php b/src/Repository/InscriptionEventRepository.php index 9b864fdc2..db3b6d9b7 100644 --- a/src/Repository/InscriptionEventRepository.php +++ b/src/Repository/InscriptionEventRepository.php @@ -58,6 +58,21 @@ public function findOneInscriptionEvent(string $inscriptionId, string $eventId): ->getOneOrNullResult(); } + public function findInscriptionByAgentAndEvent(string $agentId, string $eventId): ?InscriptionEvent + { + $qb = $this->getEntityManager()->createQueryBuilder(); + + return $qb->select('ie') + ->from(InscriptionEvent::class, 'ie') + ->where('ie.agent = :agentId') + ->andWhere('ie.event = :eventId') + ->setParameter('agentId', $agentId) + ->setParameter('eventId', $eventId) + ->setMaxResults(1) + ->getQuery() + ->getOneOrNullResult(); + } + public function save(InscriptionEvent $inscriptionEvent): InscriptionEvent { $this->getEntityManager()->persist($inscriptionEvent); diff --git a/src/Repository/Interface/AgentRepositoryInterface.php b/src/Repository/Interface/AgentRepositoryInterface.php index 1ea9309b6..da21d9b05 100644 --- a/src/Repository/Interface/AgentRepositoryInterface.php +++ b/src/Repository/Interface/AgentRepositoryInterface.php @@ -11,4 +11,6 @@ interface AgentRepositoryInterface public function save(Agent $agent): Agent; public function getMainAgentByEmail(string $email): ?Agent; + + public function getMainAgentByUser(string $userId): ?Agent; } diff --git a/src/Repository/Interface/EventRepositoryInterface.php b/src/Repository/Interface/EventRepositoryInterface.php index f1fd215f3..49033e016 100644 --- a/src/Repository/Interface/EventRepositoryInterface.php +++ b/src/Repository/Interface/EventRepositoryInterface.php @@ -8,9 +8,15 @@ interface EventRepositoryInterface { + public function findByFilters(array $filters, array $order = [], int $limit = 50): array; + public function save(Event $event): Event; public function findByAgent(string $agentId): array; public function findByFilters(array $filters, array $orderBy, int $limit): array; + + public function countOpenedEvents(): int; + + public function countFinishedEvents(): int; } diff --git a/src/Repository/Interface/InitiativeRepositoryInterface.php b/src/Repository/Interface/InitiativeRepositoryInterface.php index fed41dbb7..42dad84ec 100644 --- a/src/Repository/Interface/InitiativeRepositoryInterface.php +++ b/src/Repository/Interface/InitiativeRepositoryInterface.php @@ -9,4 +9,6 @@ interface InitiativeRepositoryInterface { public function save(Initiative $initiative): Initiative; + + public function countByStatus(string $status): int; } diff --git a/src/Repository/Interface/InscriptionEventRepositoryInterface.php b/src/Repository/Interface/InscriptionEventRepositoryInterface.php index aa49d7468..a4fd6e29b 100644 --- a/src/Repository/Interface/InscriptionEventRepositoryInterface.php +++ b/src/Repository/Interface/InscriptionEventRepositoryInterface.php @@ -14,5 +14,7 @@ public function findInscriptionsByEvent(string $eventId, int $limit): array; public function findOneInscriptionEvent(string $inscriptionId, string $eventId): ?InscriptionEvent; + public function findInscriptionByAgentAndEvent(string $agentId, string $eventId): ?InscriptionEvent; + public function save(InscriptionEvent $inscriptionEvent): InscriptionEvent; } diff --git a/src/Repository/Interface/OpportunityRepositoryInterface.php b/src/Repository/Interface/OpportunityRepositoryInterface.php index 21967a0ac..97d4b1ebc 100644 --- a/src/Repository/Interface/OpportunityRepositoryInterface.php +++ b/src/Repository/Interface/OpportunityRepositoryInterface.php @@ -5,8 +5,15 @@ namespace App\Repository\Interface; use App\Entity\Opportunity; +use DateTime; interface OpportunityRepositoryInterface { public function save(Opportunity $opportunity): Opportunity; + + public function countRecentOpportunities(DateTime $startDate): int; + + public function countOpenedOpportunities(): int; + + public function countFinishedOpportunities(): int; } diff --git a/src/Repository/Interface/PhotoRepositoryInterface.php b/src/Repository/Interface/PhotoRepositoryInterface.php new file mode 100644 index 000000000..2071d4197 --- /dev/null +++ b/src/Repository/Interface/PhotoRepositoryInterface.php @@ -0,0 +1,12 @@ +createQueryBuilder('o') + ->select('COUNT(o.id)') + ->where('o.createdAt >= :startDate') + ->andWhere('o.deletedAt IS NULL') + ->setParameter('startDate', $startDate) + ->getQuery() + ->getSingleScalarResult(); + } + + public function countOpenedOpportunities(): int + { + $now = new DateTime(); + + return $this->createQueryBuilder('o') + ->select('COUNT(DISTINCT o.id)') + ->leftJoin('o.phases', 'p') + ->where('o.deletedAt IS NULL') + ->andWhere( + 'p.id IS NULL OR (p.startDate <= :now AND p.endDate >= :now AND p.status = true)' + ) + ->setParameter('now', $now) + ->getQuery() + ->getSingleScalarResult(); + } + + public function countFinishedOpportunities(): int + { + $now = new DateTime(); + + return (int) $this->createQueryBuilder('o') + ->select('COUNT(DISTINCT o.id)') + ->innerJoin('o.phases', 'p') + ->where('o.deletedAt IS NULL') + ->andWhere('p.endDate < :now') + ->setParameter('now', $now) + ->getQuery() + ->getSingleScalarResult(); + } } diff --git a/src/Repository/PhotoRepository.php b/src/Repository/PhotoRepository.php new file mode 100644 index 000000000..965c8e21d --- /dev/null +++ b/src/Repository/PhotoRepository.php @@ -0,0 +1,25 @@ +getEntityManager()->persist($photo); + $this->getEntityManager()->flush(); + + return $photo; + } +} diff --git a/src/Repository/SpaceRepository.php b/src/Repository/SpaceRepository.php index 4f2d177f6..9aa02a944 100644 --- a/src/Repository/SpaceRepository.php +++ b/src/Repository/SpaceRepository.php @@ -107,8 +107,8 @@ private function getFilterMappings(): array ], 'state' => [ 'join' => [ - ['s.address', 'a'], - ['a.city', 'c'], + ['s.address', 'address'], + ['address.city', 'c'], ['c.state', 'ast'], ], 'condition' => fn ($qb, $value) => $qb->andWhere('ast.id = :stateId')->setParameter('stateId', $value), diff --git a/src/Serializer/Denormalizer/AgentDenormalizer.php b/src/Serializer/Denormalizer/AgentDenormalizer.php index 3886005bc..71034363d 100644 --- a/src/Serializer/Denormalizer/AgentDenormalizer.php +++ b/src/Serializer/Denormalizer/AgentDenormalizer.php @@ -5,7 +5,9 @@ namespace App\Serializer\Denormalizer; use App\Entity\Agent; +use App\Entity\CulturalFunction; use App\Entity\Organization; +use App\Entity\Photo; use App\Entity\User; use App\Service\Interface\FileServiceInterface; use Doctrine\Common\Collections\ArrayCollection; @@ -55,6 +57,25 @@ public function denormalize(mixed $data, string $type, ?string $format = null, a $agent->setOrganizations(new ArrayCollection($organizations)); } + $culturalFunctions = array_map( + fn (string $id) => $this->entityManager->getRepository(CulturalFunction::class)->findOneBy(['id' => $id]), + $data['culturalFunction'] ?? [] + ); + + if (true === array_key_exists('culturalFunction', $data)) { + $culturalFunctions = array_filter($culturalFunctions); + $agent->setCulturalFunction(new ArrayCollection($culturalFunctions)); + } + + $portfolio = array_map( + fn (string $id) => $this->entityManager->find(Photo::class, $id), + $data['portfolio'] ?? [] + ); + + if (true === array_key_exists('portfolio', $data)) { + $agent->setPortfolio(new ArrayCollection($portfolio)); + } + return $agent; } @@ -71,7 +92,7 @@ private function uploadImage(array &$data, ?Agent $agentFromDb = null): void private function filterData(array $data): array { - unset($data['organizations']); + unset($data['organizations'], $data['culturalFunction'], $data['portfolio']); return $data; } diff --git a/src/Serializer/Denormalizer/EntityAssociationDenormalizer.php b/src/Serializer/Denormalizer/EntityAssociationDenormalizer.php new file mode 100644 index 000000000..8ed1e9c88 --- /dev/null +++ b/src/Serializer/Denormalizer/EntityAssociationDenormalizer.php @@ -0,0 +1,92 @@ +denormalizer->denormalize(['id' => $data], $type, $format, $context); + } + + if (EntityAssociation::class !== $type) { + return $data; + } + + $objectToPopulate = $context['object_to_populate'] ?? null; + + if (null === $objectToPopulate && isset($data['id'])) { + $id = is_string($data['id']) ? Uuid::fromString($data['id']) : $data['id']; + $objectToPopulate = $this->entityManager->getRepository(EntityAssociation::class)->find($id); + } + + if ($objectToPopulate) { + $context['object_to_populate'] = $objectToPopulate; + } + + $entityAssociation = $this->denormalizer->denormalize($data, $type, $format, $context); + + if (isset($data['agent'])) { + $agent = $this->entityManager->getRepository(Agent::class)->find($data['agent']); + $entityAssociation->setAgent($agent); + } + if (isset($data['event'])) { + $event = $this->entityManager->getRepository(Event::class)->find($data['event']); + $entityAssociation->setEvent($event); + } + if (isset($data['initiative'])) { + $initiative = $this->entityManager->getRepository(Initiative::class)->find($data['initiative']); + $entityAssociation->setInitiative($initiative); + } + if (isset($data['opportunity'])) { + $opportunity = $this->entityManager->getRepository(Opportunity::class)->find($data['opportunity']); + $entityAssociation->setOpportunity($opportunity); + } + if (isset($data['organization'])) { + $organization = $this->entityManager->getRepository(Organization::class)->find($data['organization']); + $entityAssociation->setOrganization($organization); + } + if (isset($data['space'])) { + $space = $this->entityManager->getRepository(Space::class)->find($data['space']); + $entityAssociation->setSpace($space); + } + + return $entityAssociation; + } + + public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []): bool + { + return EntityAssociation::class === $type; + } + + public function getSupportedTypes(?string $format): array + { + return [ + 'object' => null, + '*' => false, + EntityAssociation::class => true, + ]; + } +} diff --git a/src/Serializer/Denormalizer/EventDenormalizer.php b/src/Serializer/Denormalizer/EventDenormalizer.php index 1f60d8399..8cf2d4108 100644 --- a/src/Serializer/Denormalizer/EventDenormalizer.php +++ b/src/Serializer/Denormalizer/EventDenormalizer.php @@ -45,8 +45,12 @@ public function denormalize(mixed $data, string $type, ?string $format = null, a $this->uploadImage($data, $context['object_to_populate'] ?? null); } - if (true === array_key_exists('type', $data)) { - $data['type'] = $this->denormalizeEventType($data['type']); + if (true === array_key_exists('coverImage', $data)) { + $this->uploadCoverImage($data, $context['object_to_populate'] ?? null); + } + + if (true === array_key_exists('format', $data)) { + $data['format'] = $this->denormalizeEventType($data['format']); } if (true === array_key_exists('accessibleAudio', $data)) { @@ -131,6 +135,17 @@ private function uploadImage(array &$data, ?Event $eventFromDb = null): void } } + private function uploadCoverImage(array &$data, ?Event $eventFromDb = null): void + { + if (false === is_null($eventFromDb) && true === is_string($eventFromDb->getCoverImage())) { + $this->fileService->deleteFileByUrl($eventFromDb->getCoverImage()); + } + + if ($data['coverImage'] instanceof File) { + $data['coverImage'] = $this->fileService->getFileUrl($data['coverImage']->getPathname()); + } + } + public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []): bool { return Event::class === $type; diff --git a/src/Serializer/Denormalizer/OrganizationDenormalizer.php b/src/Serializer/Denormalizer/OrganizationDenormalizer.php index 5f4fb1731..3d10c3f88 100644 --- a/src/Serializer/Denormalizer/OrganizationDenormalizer.php +++ b/src/Serializer/Denormalizer/OrganizationDenormalizer.php @@ -4,6 +4,7 @@ namespace App\Serializer\Denormalizer; +use App\Entity\ActivityArea; use App\Entity\Agent; use App\Entity\Organization; use App\Service\Interface\FileServiceInterface; @@ -49,6 +50,15 @@ public function denormalize(mixed $data, string $type, ?string $format = null, a $organization->setAgents(new ArrayCollection($agents)); } + $activityAreas = array_map( + fn (string $id) => $this->entityManager->getRepository(ActivityArea::class)->findOneBy(['id' => $id]), + $data['activityAreas'] ?? [] + ); + + if (true === array_key_exists('activityAreas', $data)) { + $organization->setActivityAreas(new ArrayCollection($activityAreas)); + } + if (true === array_key_exists('createdBy', $data)) { $createdBy = $this->entityManager->getRepository(Agent::class)->find($data['createdBy']); $organization->setCreatedBy($createdBy); diff --git a/src/Serializer/Denormalizer/SpaceDenormalizer.php b/src/Serializer/Denormalizer/SpaceDenormalizer.php index c9bbe7108..e39b96b5d 100644 --- a/src/Serializer/Denormalizer/SpaceDenormalizer.php +++ b/src/Serializer/Denormalizer/SpaceDenormalizer.php @@ -7,6 +7,7 @@ use App\Entity\ActivityArea; use App\Entity\Agent; use App\Entity\ArchitecturalAccessibility; +use App\Entity\Photo; use App\Entity\Space; use App\Entity\SpaceType; use App\Entity\Tag; @@ -86,6 +87,15 @@ public function denormalize(mixed $data, string $type, ?string $format = null, a $space->setSpaceType($spaceType); } + $portfolio = array_map( + fn (string $id) => $this->entityManager->find(Photo::class, $id), + $data['portfolio'] ?? [] + ); + + if (true === array_key_exists('portfolio', $data)) { + $space->setPortfolio(new ArrayCollection($portfolio)); + } + return $space; } diff --git a/src/Service/AbstractEntityService.php b/src/Service/AbstractEntityService.php index 1564a2a2e..15fca311a 100644 --- a/src/Service/AbstractEntityService.php +++ b/src/Service/AbstractEntityService.php @@ -7,14 +7,18 @@ use App\Enum\UserRolesEnum; use App\Exception\EntityManagerAndEntityClassNotSetException; use App\Exception\NoEntitiesProvidedForExportException; +use App\Exception\ResourceNotFoundException; use App\Exception\ValidatorException; use App\Service\Interface\FileServiceInterface; +use DateTime; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; +use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\HttpFoundation\StreamedResponse; use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; use Symfony\Component\Serializer\SerializerInterface; +use Symfony\Component\Uid\Uuid; use Symfony\Component\Validator\Validator\ValidatorInterface; abstract readonly class AbstractEntityService @@ -108,6 +112,7 @@ public function validateInput(array $data, string $dtoClass, string $group = 'De { $dto = $this->denormalizeDto($data, $dtoClass); $violations = $this->validator->validate($dto, groups: $group); + if ($violations->count() > 0) { throw new ValidatorException(violations: $violations); } @@ -138,4 +143,57 @@ public function generateCsv(array $entities, string $filename, ?string $type): S return $response; } + + protected function processFileUpload( + Uuid $id, + UploadedFile $uploadedFile, + string $dtoClass, + string $dtoProperty, + string $directoryParam, + string $getterMethod, + string $setterMethod, + array $validationGroups = ['UPDATE'] + ): object { + if (null === $this->entityClass) { + throw new EntityManagerAndEntityClassNotSetException(); + } + + $entity = $this->entityManager->getRepository($this->entityClass)->find($id); + + if (!$entity) { + throw new ResourceNotFoundException(); + } + + $dto = new $dtoClass(); + if (property_exists($dto, $dtoProperty)) { + $dto->$dtoProperty = $uploadedFile; + } + + $violations = $this->validator->validateProperty($dto, $dtoProperty, $validationGroups); + + if ($violations->count() > 0) { + throw new ValidatorException(violations: $violations); + } + + $oldFile = $entity->$getterMethod(); + if ($oldFile) { + $this->fileService->deleteFileByUrl($oldFile); + } + + $uploadedImage = $this->fileService->uploadImage( + $this->parameterBag->get($directoryParam), + $uploadedFile + ); + + $relativePath = '/uploads'.$this->parameterBag->get($directoryParam).'/'.$uploadedImage->getFilename(); + $entity->$setterMethod($relativePath); + + if (method_exists($entity, 'setUpdatedAt')) { + $entity->setUpdatedAt(new DateTime()); + } + + $this->entityManager->flush(); + + return $entity; + } } diff --git a/src/Service/AddressService.php b/src/Service/AddressService.php new file mode 100644 index 000000000..119e9b61d --- /dev/null +++ b/src/Service/AddressService.php @@ -0,0 +1,46 @@ +setId(Uuid::v4()); + $agentAddress->setZipcode($addressData['zipcode']); + $agentAddress->setStreet($addressData['street']); + $agentAddress->setNumber($addressData['number']); + $agentAddress->setNeighborhood($addressData['neighborhood']); + + if ($addressData['complement']) { + $agentAddress->setComplement($addressData['complement']); + } + + if ($addressData['cityId']) { + $city = $this->cityService->get($addressData['cityId']); + if ($city) { + $agentAddress->setCity($city); + } + } + + $agentAddress->setOwner($agent); + + $this->addressRepository->save($agentAddress); + } +} diff --git a/src/Service/AgentService.php b/src/Service/AgentService.php index 9aaa88ee2..6aeeda6b4 100644 --- a/src/Service/AgentService.php +++ b/src/Service/AgentService.php @@ -7,6 +7,7 @@ use App\DTO\AgentDto; use App\Entity\Agent; use App\Entity\User; +use App\Enum\UserRolesEnum; use App\Exception\Agent\AgentResourceNotFoundException; use App\Exception\Agent\CantRemoveUniqueAgentFromUserException; use App\Exception\ValidatorException; @@ -14,6 +15,7 @@ use App\Repository\Interface\OpportunityRepositoryInterface; use App\Service\Interface\AgentServiceInterface; use App\Service\Interface\FileServiceInterface; +use App\Service\Interface\PhotoServiceInterface; use DateTime; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\SecurityBundle\Security; @@ -26,6 +28,8 @@ readonly class AgentService extends AbstractEntityService implements AgentServiceInterface { private const string DIR_AGENT_PROFILE = 'app.dir.agent.profile'; + private const string DIR_AGENT_COVER = 'app.dir.agent.cover'; + private const string DIR_AGENT_PORTFOLIO = 'app.dir.agent.portfolio'; public function __construct( private AgentRepositoryInterface $repository, @@ -36,6 +40,7 @@ public function __construct( private SerializerInterface $serializer, private ValidatorInterface $validator, private EntityManagerInterface $entityManager, + private PhotoServiceInterface $photoService, ) { parent::__construct( $this->security, @@ -72,8 +77,14 @@ public function create(array $agent): Agent public function createFromUser(array $user, ?array $extraFields = null): Agent { $agent = $this->organizeDefaultAgentData($user); - $agent['extraFields'] = $extraFields; + $agent['extraFields'] = [...$extraFields ?? [], ...[ + 'phone' => $user['phone'] ?? '', + ]]; $agent['main'] = true; + + if (true === isset($user['cpf'])) { + $agent['fiscalCode'] = $user['cpf']; + } $agent = $this->validateInput($agent, AgentDto::class, AgentDto::CREATE); $agentObj = $this->serializer->denormalize($agent, Agent::class); @@ -85,7 +96,10 @@ public function findBy(array $params = [], int $limit = 50): array { $userParams = $this->getDefaultParams(); - if (null !== $this->security->getUser()) { + if ( + null !== $this->security->getUser() + && false === $this->security->getUser()->isRole(UserRolesEnum::ROLE_ADMIN) + ) { $user = $this->security->getUser(); $userParams['user'] = $user; } @@ -137,8 +151,8 @@ private function organizeDefaultAgentData(array $user): array return [ 'id' => Uuid::v4()->toRfc4122(), 'name' => "{$user['firstname']} {$user['lastname']}", - 'shortBio' => 'Agente criado automaticamente', - 'longBio' => 'Este agente foi criado automaticamente pelo sistema', + 'shortBio' => '', + 'longBio' => '', 'culture' => false, 'user' => $user['id'], ]; @@ -221,4 +235,52 @@ public function updateImage(Uuid $id, UploadedFile $uploadedFile): Agent return $agent; } + + public function updateCoverImage(Uuid $id, UploadedFile $uploadedFile): Agent + { + return $this->processFileUpload( + id: $id, + uploadedFile: $uploadedFile, + dtoClass: AgentDto::class, + dtoProperty: 'coverImage', + directoryParam: self::DIR_AGENT_COVER, + getterMethod: 'getCoverImage', + setterMethod: 'setCoverImage', + validationGroups: [AgentDto::UPDATE] + ); + } + + public function addPortfolioImage(Agent $agent, UploadedFile $uploadedFile, ?string $description = null): Agent + { + $photo = $this->photoService->create($uploadedFile, self::DIR_AGENT_PORTFOLIO, $description); + + $agent->addPortfolio($photo); + $agent->setUpdatedAt(new DateTime()); + + $this->entityManager->flush(); + + return $agent; + } + + public function removePortfolioImage(Uuid $agentId, Uuid $photoId): Agent + { + $agent = $this->get($agentId); + + $photo = $this->photoService->get($photoId); + + if (null !== $photo) { + $agent->removePortfolio($photo); + $this->photoService->delete($photo); + $agent->setUpdatedAt(new DateTime()); + + $this->entityManager->flush(); + } + + return $agent; + } + + public function getMainAgentByUser(Uuid $userId): ?Agent + { + return $this->repository->getMainAgentByUser($userId->toString()); + } } diff --git a/src/Service/CulturalFunctionService.php b/src/Service/CulturalFunctionService.php new file mode 100644 index 000000000..83e51eaf3 --- /dev/null +++ b/src/Service/CulturalFunctionService.php @@ -0,0 +1,39 @@ +repository->findOneBy(['id' => $id]); + + if (null === $culturalFunction) { + throw new CulturalFunctionResourceNotFoundException(); + } + + return $culturalFunction; + } + + public function list(int $limit = 50): array + { + return $this->repository->findBy( + [], + ['name' => 'ASC'], + $limit + ); + } +} diff --git a/src/Service/EventService.php b/src/Service/EventService.php index 382ce7c4b..431d8481f 100644 --- a/src/Service/EventService.php +++ b/src/Service/EventService.php @@ -5,7 +5,6 @@ namespace App\Service; use App\DTO\EventDto; -use App\DTO\EventFilterDto; use App\Entity\Agent; use App\Entity\Event; use App\Exception\Event\EventResourceNotFoundException; @@ -103,12 +102,10 @@ public function get(Uuid $id): Event public function list(int $limit = 50, array $params = [], string $order = 'DESC'): array { - $filters = $this->validateInput($params, EventFilterDto::class); - return $this->repository->findByFilters( - filters: $filters, - orderBy: ['createdAt' => $order], - limit: $limit + [...$params, ...$this->getDefaultParams()], + ['createdAt' => $order], + $limit ); } @@ -176,17 +173,4 @@ public function updateImage(Uuid $id, UploadedFile $uploadedFile): Event return $event; } - - public function findByAgent(string $agentId): array - { - return $this->repository->findByAgent($agentId); - } - - public function togglePublish(Uuid $id): void - { - $event = $this->get($id); - $event->setDraft(!$event->isDraft()); - - $this->repository->save($event); - } } diff --git a/src/Service/InitiativeService.php b/src/Service/InitiativeService.php index 781eaddc9..316f5270e 100644 --- a/src/Service/InitiativeService.php +++ b/src/Service/InitiativeService.php @@ -167,6 +167,11 @@ public function updateImage(Uuid $id, UploadedFile $uploadedFile): Initiative return $initiative; } + public function countByStatus(string $status): int + { + return $this->repository->countByStatus($status); + } + public function listFiltered(?string $region, ?string $state, ?string $cityId, ?string $status): array { $cityName = null; diff --git a/src/Service/InscriptionEventService.php b/src/Service/InscriptionEventService.php index ecfa60b5a..8ceb2729e 100644 --- a/src/Service/InscriptionEventService.php +++ b/src/Service/InscriptionEventService.php @@ -143,4 +143,26 @@ public function listMyInscriptions(): array return $this->repository->findMyInscriptions($firstAgent->getId()->toRfc4122(), 50); } + + public function getUserInscription(Uuid $eventId): ?InscriptionEvent + { + /** @var User $user */ + $user = $this->security->getUser(); + + if (null === $user) { + return null; + } + + /** @var Agent $firstAgent */ + $firstAgent = $user->getAgents()->first(); + + if (!$firstAgent) { + return null; + } + + return $this->repository->findInscriptionByAgentAndEvent( + $firstAgent->getId()->toRfc4122(), + $eventId->toRfc4122() + ); + } } diff --git a/src/Service/Interface/AddressServiceInterface.php b/src/Service/Interface/AddressServiceInterface.php new file mode 100644 index 000000000..9a31c2fc1 --- /dev/null +++ b/src/Service/Interface/AddressServiceInterface.php @@ -0,0 +1,12 @@ +repository->count($criteria); } + public function countRecentOpportunities(int $days = 7): int + { + $startDate = new DateTime("-{$days} days"); + + return $this->repository->countRecentOpportunities($startDate); + } + + public function countOpenedOpportunities(): int + { + return $this->repository->countOpenedOpportunities(); + } + + public function countFinishedOpportunities(): int + { + return $this->repository->countFinishedOpportunities(); + } + public function create(array $opportunity): Opportunity { $opportunity = $this->validateInput($opportunity, OpportunityDto::class, OpportunityDto::CREATE); @@ -141,61 +158,29 @@ public function update(Uuid $id, array $opportunity): Opportunity public function updateImage(Uuid $id, UploadedFile $uploadedFile): Opportunity { - $opportunity = $this->get($id); - - $opportunityDto = new OpportunityDto(); - $opportunityDto->image = $uploadedFile; - - $violations = $this->validator->validate($opportunityDto, groups: [OpportunityDto::UPDATE]); - - if ($violations->count() > 0) { - throw new ValidatorException(violations: $violations); - } - - if ($opportunity->getImage()) { - $this->fileService->deleteFileByUrl($opportunity->getImage()); - } - - $uploadedImage = $this->fileService->uploadImage( - $this->parameterBag->get(self::DIR_OPPORTUNITY_PROFILE), - $uploadedFile + return $this->processFileUpload( + id: $id, + uploadedFile: $uploadedFile, + dtoClass: OpportunityDto::class, + dtoProperty: 'profileImage', + directoryParam: self::DIR_OPPORTUNITY_PROFILE, + getterMethod: 'getImage', + setterMethod: 'setImage', + validationGroups: [OpportunityDto::UPDATE] ); - - $relativePath = '/uploads'.$this->parameterBag->get(self::DIR_OPPORTUNITY_PROFILE).'/'.$uploadedImage->getFilename(); - $opportunity->setImage($relativePath); - - $opportunity->setUpdatedAt(new DateTime()); - - $this->repository->save($opportunity); - - return $opportunity; } - public function updateCoverImage(Uuid $id, UploadedFile $coverImage): Opportunity + public function updateCoverImage(Uuid $id, UploadedFile $uploadedFile): Opportunity { - $opportunity = $this->get($id); - - $opportunityDto = new OpportunityDto(); - $opportunityDto->image = $coverImage; - - $violations = $this->validator->validate($opportunityDto, groups: [OpportunityDto::UPDATE]); - - if ($violations->count() > 0) { - throw new ValidatorException(violations: $violations); - } - - $uploadedImage = $this->fileService->uploadImage( - $this->parameterBag->get('app.dir.opportunity.cover'), - $coverImage, + return $this->processFileUpload( + id: $id, + uploadedFile: $uploadedFile, + dtoClass: OpportunityDto::class, + dtoProperty: 'coverImage', + directoryParam: self::DIR_OPPORTUNITY_COVER, + getterMethod: 'getCoverImage', + setterMethod: 'setCoverImage', + validationGroups: [OpportunityDto::UPDATE] ); - - $extraFields = $opportunity->getExtraFields(); - $extraFields['coverImage'] = $this->fileService->getFileUrl($uploadedImage->getPathname()); - $opportunity->setUpdatedAt(new DateTime()); - $opportunity->setExtraFields($extraFields); - - $this->repository->save($opportunity); - - return $opportunity; } } diff --git a/src/Service/OrganizationService.php b/src/Service/OrganizationService.php index 9e32bbe7f..6778b00f9 100644 --- a/src/Service/OrganizationService.php +++ b/src/Service/OrganizationService.php @@ -9,7 +9,6 @@ use App\Entity\Organization; use App\Enum\OrganizationTypeEnum; use App\Exception\Organization\OrganizationResourceNotFoundException; -use App\Exception\ValidatorException; use App\Repository\Interface\OrganizationRepositoryInterface; use App\Service\Interface\AgentServiceInterface; use App\Service\Interface\FileServiceInterface; @@ -29,6 +28,7 @@ readonly class OrganizationService extends AbstractEntityService implements OrganizationServiceInterface { private const string DIR_ORGANIZATION_PROFILE = 'app.dir.organization.profile'; + private const string DIR_ORGANIZATION_COVER = 'app.dir.organization.cover'; public function __construct( private FileServiceInterface $fileService, @@ -149,34 +149,30 @@ public function update(Uuid $identifier, array $organization): Organization public function updateImage(Uuid $id, UploadedFile $uploadedFile): Organization { - $organization = $this->get($id); - - $organizationDto = new OrganizationDto(); - $organizationDto->image = $uploadedFile; - - $violations = $this->validator->validate($organizationDto, groups: [OrganizationDto::UPDATE]); - - if ($violations->count() > 0) { - throw new ValidatorException(violations: $violations); - } - - if ($organization->getImage()) { - $this->fileService->deleteFileByUrl($organization->getImage()); - } - - $uploadedImage = $this->fileService->uploadImage( - $this->parameterBag->get(self::DIR_ORGANIZATION_PROFILE), - $uploadedFile + return $this->processFileUpload( + id: $id, + uploadedFile: $uploadedFile, + dtoClass: OrganizationDto::class, + dtoProperty: 'image', + directoryParam: self::DIR_ORGANIZATION_PROFILE, + getterMethod: 'getImage', + setterMethod: 'setImage', + validationGroups: [OrganizationDto::UPDATE] ); + } - $relativePath = '/uploads'.$this->parameterBag->get(self::DIR_ORGANIZATION_PROFILE).'/'.$uploadedImage->getFilename(); - $organization->setImage($relativePath); - - $organization->setUpdatedAt(new DateTime()); - - $this->repository->save($organization); - - return $organization; + public function updateCoverImage(Uuid $id, UploadedFile $uploadedFile): Organization + { + return $this->processFileUpload( + id: $id, + uploadedFile: $uploadedFile, + dtoClass: OrganizationDto::class, + dtoProperty: 'coverImage', + directoryParam: self::DIR_ORGANIZATION_COVER, + getterMethod: 'getCoverImage', + setterMethod: 'setCoverImage', + validationGroups: [OrganizationDto::UPDATE] + ); } public function removeAgent(Uuid $agentId, Uuid $organizationId): void diff --git a/src/Service/PhotoService.php b/src/Service/PhotoService.php new file mode 100644 index 000000000..64d0db573 --- /dev/null +++ b/src/Service/PhotoService.php @@ -0,0 +1,72 @@ +id = Uuid::v4(); + $dto->image = $uploadedFile; + $dto->description = $description; + + $violations = $this->validator->validate($dto, groups: [PhotoDto::CREATE]); + + if ($violations->count() > 0) { + throw new ValidatorException(violations: $violations); + } + + $uploadedImage = $this->fileService->uploadImage( + $this->parameterBag->get($directoryParam), + $uploadedFile + ); + + $relativePath = '/uploads'.$this->parameterBag->get($directoryParam).'/'.$uploadedImage->getFilename(); + + $photo = new Photo(); + $photo->setId($dto->id); + $photo->setImage($relativePath); + $photo->setDescription($description); + + $this->entityManager->persist($photo); + + return $photo; + } + + public function get(Uuid $id): ?Photo + { + return $this->entityManager->find(Photo::class, $id); + } + + public function delete(Photo $photo): void + { + if ($photo->getImage()) { + $this->fileService->deleteFileByUrl($photo->getImage()); + } + + $photo->setDeletedAt(new DateTime()); + } +} diff --git a/src/Service/SpaceService.php b/src/Service/SpaceService.php index a9b019e7d..ff6483c29 100644 --- a/src/Service/SpaceService.php +++ b/src/Service/SpaceService.php @@ -8,11 +8,13 @@ use App\DTO\SpaceFilterDto; use App\Entity\Agent; use App\Entity\Space; +use App\Entity\SpaceAddress; use App\Enum\EntityEnum; use App\Exception\Space\SpaceResourceNotFoundException; -use App\Exception\ValidatorException; use App\Repository\Interface\SpaceRepositoryInterface; +use App\Service\Interface\CityServiceInterface; use App\Service\Interface\FileServiceInterface; +use App\Service\Interface\PhotoServiceInterface; use App\Service\Interface\SpaceServiceInterface; use DateTime; use Doctrine\ORM\EntityManagerInterface; @@ -26,15 +28,19 @@ readonly class SpaceService extends AbstractEntityService implements SpaceServiceInterface { private const string DIR_SPACE_PROFILE = 'app.dir.space.profile'; + private const string DIR_SPACE_COVER = 'app.dir.space.cover'; + private const string DIR_SPACE_PORTFOLIO = 'app.dir.space.portfolio'; public function __construct( private FileServiceInterface $fileService, private ParameterBagInterface $parameterBag, private SpaceRepositoryInterface $repository, + private CityServiceInterface $cityService, private Security $security, private SerializerInterface $serializer, private ValidatorInterface $validator, private EntityManagerInterface $entityManager, + private PhotoServiceInterface $photoService, ) { parent::__construct( $this->security, @@ -100,6 +106,8 @@ public function get(Uuid $id): Space public function list(int $limit = 50, array $params = [], string $order = 'DESC'): array { + $params['isDraft'] = false; + $filters = $this->validateInput($params, SpaceFilterDto::class); if (true === array_key_exists('associationWith', $params)) { @@ -146,6 +154,23 @@ public function update(Uuid $identifier, array $space): Space 'object_to_populate' => $spaceFromDB, ]); + $addressData = $space['addressData'] ?? null; + + if (null !== $addressData) { + $address = $spaceFromDB->getAddress() ?? new SpaceAddress(); + $city = $this->cityService->get($space['addressData']['city']); + + $address->setZipcode($space['addressData']['zipcode']); + $address->setStreet($space['addressData']['street']); + $address->setNumber($space['addressData']['number'] ?? ''); + $address->setNeighborhood($space['addressData']['neighborhood']); + $address->setComplement($space['addressData']['complement']); + $address->setCity($city); + + $address->setOwner($spaceFromDB); + $spaceObj->setAddress($address); + } + $spaceObj->setUpdatedAt(new DateTime()); return $this->repository->save($spaceObj); @@ -153,40 +178,66 @@ public function update(Uuid $identifier, array $space): Space public function updateImage(Uuid $id, UploadedFile $uploadedFile): Space { - $space = $this->get($id); - - $spaceDto = new SpaceDto(); - $spaceDto->image = $uploadedFile; - - $violations = $this->validator->validate($spaceDto, groups: [SpaceDto::UPDATE]); + return $this->processFileUpload( + id: $id, + uploadedFile: $uploadedFile, + dtoClass: SpaceDto::class, + dtoProperty: 'profileImage', + directoryParam: self::DIR_SPACE_PROFILE, + getterMethod: 'getImage', + setterMethod: 'setImage', + validationGroups: [SpaceDto::UPDATE] + ); + } - if ($violations->count() > 0) { - throw new ValidatorException(violations: $violations); - } + public function updateCoverImage(Uuid $id, UploadedFile $uploadedFile): Space + { + return $this->processFileUpload( + id: $id, + uploadedFile: $uploadedFile, + dtoClass: SpaceDto::class, + dtoProperty: 'coverImage', + directoryParam: self::DIR_SPACE_COVER, + getterMethod: 'getCoverImage', + setterMethod: 'setCoverImage', + validationGroups: [SpaceDto::UPDATE] + ); + } - if ($space->getImage()) { - $this->fileService->deleteFileByUrl($space->getImage()); - } + public function togglePublish(Uuid $id): void + { + $space = $this->get($id); + $space->setIsDraft(!$space->isDraft()); - $uploadedImage = $this->fileService->uploadImage( - $this->parameterBag->get(self::DIR_SPACE_PROFILE), - $uploadedFile - ); + $this->repository->save($space); + } - $space->setImage($this->fileService->urlOfImage($uploadedImage->getFilename())); + public function addPortfolioImage(Space $space, UploadedFile $uploadedFile, ?string $description = null): Space + { + $photo = $this->photoService->create($uploadedFile, self::DIR_SPACE_PORTFOLIO, $description); + $space->addPortfolio($photo); $space->setUpdatedAt(new DateTime()); - $this->repository->save($space); + $this->entityManager->flush(); return $space; } - public function togglePublish(Uuid $id): void + public function removePortfolioImage(Uuid $spaceId, Uuid $photoId): Space { - $space = $this->get($id); - $space->setIsDraft(!$space->isDraft()); + $space = $this->get($spaceId); - $this->repository->save($space); + $photo = $this->photoService->get($photoId); + + if (null !== $photo) { + $space->removePortfolio($photo); + $this->photoService->delete($photo); + $space->setUpdatedAt(new DateTime()); + + $this->entityManager->flush(); + } + + return $space; } } diff --git a/src/Service/UserService.php b/src/Service/UserService.php index 9718374d6..30b2968d9 100644 --- a/src/Service/UserService.php +++ b/src/Service/UserService.php @@ -23,12 +23,12 @@ use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; use Symfony\Component\Serializer\SerializerInterface; use Symfony\Component\Uid\Uuid; -use Symfony\Component\Validator\Exception\ValidatorException; use Symfony\Component\Validator\Validator\ValidatorInterface; readonly class UserService extends AbstractEntityService implements UserServiceInterface { private const string DIR_USER_PROFILE = 'app.dir.user.profile'; + public const string DIR_USER_COVER = 'app.dir.user.cover'; public function __construct( private AgentServiceInterface $agentService, @@ -74,6 +74,7 @@ public function create(array $user): User $userObj->addAgent($agent); } catch (Exception $exception) { + dd($exception->getMessage()); $this->repository->rollback(); throw $exception; } @@ -128,34 +129,28 @@ public function update(Uuid $id, array $user, ?string $browserUserAgent = null): public function updateImage(Uuid $id, UploadedFile $uploadedFile): User { - $user = $this->get($id); - - $userDto = new UserDto(); - $userDto->image = $uploadedFile; - - $violations = $this->validator->validate($userDto, groups: [UserDto::UPDATE]); - - if ($violations->count() > 0) { - throw new ValidatorException(violations: $violations); - } - - if ($user->getImage()) { - $this->fileService->deleteFileByUrl($user->getImage()); - } - - $uploadedImage = $this->fileService->uploadImage( - $this->parameterBag->get(self::DIR_USER_PROFILE), - $uploadedFile + return $this->processFileUpload( + id: $id, + uploadedFile: $uploadedFile, + dtoClass: UserDto::class, + dtoProperty: 'profileImage', + directoryParam: self::DIR_USER_PROFILE, + getterMethod: 'getImage', + setterMethod: 'setImage' ); + } - $relativePath = '/uploads'.$this->parameterBag->get(self::DIR_USER_PROFILE).'/'.$uploadedImage->getFilename(); - $user->setImage($relativePath); - - $user->setUpdatedAt(new DateTime()); - - $this->repository->save($user); - - return $user; + public function updateCoverImage(Uuid $id, UploadedFile $uploadedFile): User + { + return $this->processFileUpload( + id: $id, + uploadedFile: $uploadedFile, + dtoClass: UserDto::class, + dtoProperty: 'coverImage', + directoryParam: self::DIR_USER_COVER, + getterMethod: 'getCoverImage', + setterMethod: 'setCoverImage' + ); } public function authenticate(User $user, $password): bool diff --git a/templates/_admin/agent/_partials/create-form.html.twig b/templates/_admin/agent/_partials/create-form.html.twig index 419f6dfbd..d4e6e6522 100644 --- a/templates/_admin/agent/_partials/create-form.html.twig +++ b/templates/_admin/agent/_partials/create-form.html.twig @@ -149,39 +149,93 @@

{{ "address" | trans}}

-
-
- - + +
+
+
+ + + +
- -
- - +
+
+ + +
-
-
- - +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+
+ + +
+ +
-
- - +
+
+
+ + +
+
+
+
+ + +
-
- - +
+
+ +
+ +
+
-
+
- - + +

{{ "view.agent_create.public_location_info" | trans}}

diff --git a/templates/_admin/agent/_partials/forms/entity-edit-form.html.twig b/templates/_admin/agent/_partials/forms/entity-edit-form.html.twig index cfdfec179..5b80eb415 100644 --- a/templates/_admin/agent/_partials/forms/entity-edit-form.html.twig +++ b/templates/_admin/agent/_partials/forms/entity-edit-form.html.twig @@ -1,4 +1,4 @@ -
+
@@ -80,5 +80,23 @@
+ +
+

+ +

+ +
+
+ {% include "_admin/agent/_partials/forms/portfolio.html.twig" %} +
+
+
diff --git a/templates/_admin/agent/_partials/forms/introduction.html.twig b/templates/_admin/agent/_partials/forms/introduction.html.twig index dcc032880..d886baf1e 100644 --- a/templates/_admin/agent/_partials/forms/introduction.html.twig +++ b/templates/_admin/agent/_partials/forms/introduction.html.twig @@ -1,16 +1,21 @@
- @@ -28,7 +33,7 @@ {% include '_components/tags-selector.html.twig' with { inputName: 'areas_of_expertise', inputLabel: 'areas_of_expertise'|trans, - items: [], + items: activityAreaItems|map(function => { 'label': function.name, 'value': function.id }), tags: [], required: false, questionFill: true, @@ -39,8 +44,8 @@ {% include '_components/tags-selector.html.twig' with { inputName: 'roles_in_culture', inputLabel: 'roles_in_culture'|trans, - items: [], - tags: [], + items: culturalFunctionItems|map(function => { 'label': function.name, 'value': function.id }), + tags: agent.culturalFunction ? agent.culturalFunction|map(function => { 'label': function.name, 'value': function.id }) : [], required: false, questionFill: true, } %} @@ -50,7 +55,7 @@ {% include '_components/tags-selector.html.twig' with { inputName: 'tags', inputLabel: 'tags'|trans, - items: [], + items: tagItems|map(tag => { 'label': tag.name, 'value': tag.id }), tags: [], required: false, questionFill: true, @@ -73,13 +78,13 @@

- +
- +
@@ -88,16 +93,20 @@ - +
- +
+ +{% include '_components/banner-cropper.html.twig' with {'modalId': 'modalBannerCrop'} %} + {% block extra_javascripts %} + {% endblock %} diff --git a/templates/_admin/agent/_partials/forms/portfolio.html.twig b/templates/_admin/agent/_partials/forms/portfolio.html.twig new file mode 100644 index 000000000..592c0718e --- /dev/null +++ b/templates/_admin/agent/_partials/forms/portfolio.html.twig @@ -0,0 +1,101 @@ +
+ {% if agent.portfolio is defined and agent.portfolio|length > 0 %} +
+
{{ 'existing_photos'|trans }}
+
+ {% for photo in agent.portfolio %} +
+
+ {{ photo.description }} +
+
+ {% if photo.description %} +
+ {{ photo.description }} +
+ {% endif %} +
+ +
+
+
+
+
+ {% endfor %} +
+
+
+ {% endif %} + +
+
{{ 'add_new_photos'|trans }}
+

{{ 'portfolio_upload_hint'|trans }}

+ +
+
+
+
+ + +
+
+ + +
+
+ +
+
+
+
+ + +
+
+ + diff --git a/templates/_admin/agent/_partials/forms/sensitive-data.html.twig b/templates/_admin/agent/_partials/forms/sensitive-data.html.twig index 21f06458b..831ceef4d 100644 --- a/templates/_admin/agent/_partials/forms/sensitive-data.html.twig +++ b/templates/_admin/agent/_partials/forms/sensitive-data.html.twig @@ -8,29 +8,43 @@
- +
- + {% for genderOption in genderOptions %} + + {% endfor %}
- +
- + {% for sexualOrientationOption in sexualOrientationOptions %} + + {% endfor %}
- +
@@ -39,21 +53,33 @@
- + {% for raceOption in raceOptions %} + + {% endfor %}
- +
- + {% for educationOption in educationOptions %} + + {% endfor %}
- +
@@ -62,15 +88,18 @@

{{ 'view.agent_edit.is_disabled' | trans }}

- +
- +
- +
@@ -78,15 +107,18 @@

{{ 'view.agent_edit.is_indigenous' | trans }}

- +
- +
- +
@@ -94,15 +126,18 @@

{{ 'view.agent_edit.is_quilombola' | trans }}

- +
- +
- +
@@ -110,15 +145,18 @@

{{ 'view.agent_edit.is_traditional_people' | trans }}

- +
- +
- +
diff --git a/templates/_admin/agent/_partials/forms/social-media.html.twig b/templates/_admin/agent/_partials/forms/social-media.html.twig index 509839651..aada928f0 100644 --- a/templates/_admin/agent/_partials/forms/social-media.html.twig +++ b/templates/_admin/agent/_partials/forms/social-media.html.twig @@ -9,6 +9,8 @@
+ + {% endblock %} diff --git a/templates/_admin/agent/edit.html.twig b/templates/_admin/agent/edit.html.twig index 0f912bc06..e45b2953d 100644 --- a/templates/_admin/agent/edit.html.twig +++ b/templates/_admin/agent/edit.html.twig @@ -13,6 +13,7 @@ {% include "_components/side-bar.html.twig" %}
{% include "_admin/agent/_partials/agent-edit-header.html.twig" %} + {% include '_components/modal-confirm-remove.html.twig' %}
{% set asterisk = '*' %} @@ -46,3 +47,9 @@
{% endblock %} + +{% block javascripts %} + {{ parent() }} + + +{% endblock %} diff --git a/templates/_admin/event/_partials/forms/address-data.html.twig b/templates/_admin/event/_partials/forms/address-data.html.twig new file mode 100644 index 000000000..60531d2b4 --- /dev/null +++ b/templates/_admin/event/_partials/forms/address-data.html.twig @@ -0,0 +1,81 @@ +
+
+
+ + * + +
+
+ + * + +
+
+ +
+
+ + * + +
+
+ + +
+
+ + * + +
+
+ + +
+ +
+ +
+
+ + +
+
+ + +
+
+ +
+
+ +
+ +
+
+
+
diff --git a/templates/_admin/event/_partials/forms/entity-edit-form.html.twig b/templates/_admin/event/_partials/forms/entity-edit-form.html.twig index 39e93d619..80e45a8cf 100644 --- a/templates/_admin/event/_partials/forms/entity-edit-form.html.twig +++ b/templates/_admin/event/_partials/forms/entity-edit-form.html.twig @@ -1,4 +1,4 @@ -
+
@@ -20,6 +20,27 @@
+
+

+ +

+
+
+ {{ 'public_data_notice' | trans }} +
+ {% include "_admin/event/_partials/forms/address-data.html.twig" %} +
+
+
+

+ + + diff --git a/templates/_admin/event/_partials/forms/introduction.html.twig b/templates/_admin/event/_partials/forms/introduction.html.twig index 9ea0b5b6d..f40e94a0b 100644 --- a/templates/_admin/event/_partials/forms/introduction.html.twig +++ b/templates/_admin/event/_partials/forms/introduction.html.twig @@ -1,16 +1,21 @@
- @@ -32,6 +37,7 @@
@@ -59,12 +65,12 @@
- + * - + {% for type in typeItems %} - + {% endfor %}
@@ -74,19 +80,19 @@ id="short-description" name="short_description" placeholder="{{ 'short_description' | trans }}" maxlength="400" - > + >{{ event.shortDescription }} + >{{ event.longDescription }}
- +
diff --git a/templates/_admin/event/_partials/forms/social-media.html.twig b/templates/_admin/event/_partials/forms/social-media.html.twig index 509839651..fcf304ef2 100644 --- a/templates/_admin/event/_partials/forms/social-media.html.twig +++ b/templates/_admin/event/_partials/forms/social-media.html.twig @@ -9,6 +9,8 @@

{{ 'view.event.create_event.create'|trans }}

{{ 'view.event.create_event.description'|trans }}

+
@@ -30,8 +31,8 @@
{% include '_components/tags-selector.html.twig' with { - inputName: 'culturalLanguage', - inputLabel: 'cultural_language'|trans, + inputName: 'culturalLanguages', + inputLabel: 'cultural_languages'|trans, items: culturalLanguageItems|map(culturalLanguage => { 'label': culturalLanguage.name, 'value': culturalLanguage.id }), tags: [], required: false, @@ -43,17 +44,17 @@ - -

0/400

+ +

0/255

- + * - {% for type in typeItems %} - + {% endfor %}
@@ -74,7 +75,18 @@ {% block extra_javascripts %} - + + {% endblock %} diff --git a/templates/_admin/event/edit.html.twig b/templates/_admin/event/edit.html.twig index f06adfc1e..c329dee68 100644 --- a/templates/_admin/event/edit.html.twig +++ b/templates/_admin/event/edit.html.twig @@ -40,3 +40,11 @@
{% endblock %} + +{% block javascripts %} + {{ parent() }} + + + + +{% endblock %} diff --git a/templates/_admin/opportunity/create.html.twig b/templates/_admin/opportunity/create.html.twig index 916473275..b80603af0 100644 --- a/templates/_admin/opportunity/create.html.twig +++ b/templates/_admin/opportunity/create.html.twig @@ -41,7 +41,7 @@

{{ 'view.entities.message.required_fields'|trans }} (*)

-
+
@@ -83,10 +83,17 @@ questionFill: false, } %}
-
- - - +
@@ -118,11 +125,15 @@
+ + {% include '_components/banner-cropper.html.twig' with {'modalId': 'modalBannerCrop'} %} + {% endblock %} {% block footer %}{% endblock %} {% block extra_javascripts %} {{ parent() }} + {% endblock %} diff --git a/templates/_admin/organization/_partials/forms/entity-edit-form.html.twig b/templates/_admin/organization/_partials/forms/entity-edit-form.html.twig index 0e811d8ec..4f5f6ffcb 100644 --- a/templates/_admin/organization/_partials/forms/entity-edit-form.html.twig +++ b/templates/_admin/organization/_partials/forms/entity-edit-form.html.twig @@ -1,4 +1,25 @@ - + +
+ Pessoas ({{ organizationAgents|length }}) + +
+ {% for agent in availableAgents %} + + {% set isChecked = organizationAgents.contains(agent) ? 'checked' : '' %} + +
+ + +
+ {% endfor %} +
+
+ + {% set asterisk = '*' %} + {{ 'mandatory_fields'|trans({'asterisco': asterisk})|raw }} +
diff --git a/templates/_admin/organization/_partials/forms/introduction.html.twig b/templates/_admin/organization/_partials/forms/introduction.html.twig index c56cbe5ad..8118cbd59 100644 --- a/templates/_admin/organization/_partials/forms/introduction.html.twig +++ b/templates/_admin/organization/_partials/forms/introduction.html.twig @@ -1,16 +1,21 @@
- @@ -28,15 +33,15 @@ required > -
- - - {{ 'add_new' | trans|lower }} - - +
+ {% include '_components/tags-selector.html.twig' with { + inputName: 'activityAreas', + inputLabel: 'areas_of_expertise'|trans, + items: activityAreaItems|map(area => { 'label': area.name, 'value': area.id }), + tags: organization.activityAreas ? organization.activityAreas|map(area => { 'label': area.name, 'value': area.id }) : [], + required: false, + questionFill: true, + } %}
@@ -68,7 +73,7 @@ placeholder="{{ 'long_description' | trans }}" required > - {{- organization.description | default('') -}} + {{- organization.longDescription | default('') -}} @@ -85,7 +90,14 @@
- +
@@ -111,3 +123,10 @@
+ +{% include '_components/banner-cropper.html.twig' with {'modalId': 'modalBannerCrop'} %} + +{% block extra_javascripts %} + + +{% endblock %} diff --git a/templates/_admin/organization/_partials/forms/social-media.html.twig b/templates/_admin/organization/_partials/forms/social-media.html.twig index 147c785db..4d4544e10 100644 --- a/templates/_admin/organization/_partials/forms/social-media.html.twig +++ b/templates/_admin/organization/_partials/forms/social-media.html.twig @@ -13,6 +13,8 @@ class="form-control" id="instagram" placeholder="@{{ 'user_name' | trans }}" + name="instagram" + value="{{ organization.socialNetworks.instagram | default('') }}" >
@@ -26,6 +28,8 @@ class="form-control" id="x" placeholder="@{{ 'user_name' | trans }}" + name="x" + value="{{ organization.socialNetworks.x | default('') }}" >
@@ -39,6 +43,8 @@ class="form-control" id="facebook" placeholder="@{{ 'user_name' | trans }}" + name="facebook" + value="{{ organization.socialNetworks.facebook | default('') }}" >
@@ -54,6 +60,8 @@ class="form-control" id="vimeo" placeholder="@{{ 'user_name' | trans }}" + name="vimeo" + value="{{ organization.socialNetworks.vimeo | default('') }}" >
@@ -67,6 +75,8 @@ class="form-control" id="youtube" placeholder="@{{ 'user_name' | trans }}" + name="youtube" + value="{{ organization.socialNetworks.youtube | default('') }}" >
@@ -80,6 +90,8 @@ class="form-control" id="linkedin" placeholder="@{{ 'user_name' | trans }}" + name="linkedin" + value="{{ organization.socialNetworks.linkedin | default('') }}" > @@ -95,6 +107,8 @@ class="form-control" id="spotify" placeholder="@{{ 'user_name' | trans }}" + name="spotify" + value="{{ organization.socialNetworks.spotify | default('') }}" > @@ -108,6 +122,8 @@ class="form-control" id="pinterest" placeholder="@{{ 'user_name' | trans }}" + name="pinterest" + value="{{ organization.socialNetworks.pinterest | default('') }}" > @@ -121,6 +137,8 @@ class="form-control" id="tiktok" placeholder="@{{ 'user_name' | trans }}" + name="tiktok" + value="{{ organization.socialNetworks.tiktok | default('') }}" > diff --git a/templates/_admin/organization/_partials/organization-card.html.twig b/templates/_admin/organization/_partials/organization-card.html.twig index ec96b9c4c..308c2deef 100644 --- a/templates/_admin/organization/_partials/organization-card.html.twig +++ b/templates/_admin/organization/_partials/organization-card.html.twig @@ -9,15 +9,25 @@
- - + + {% for type in types %} + + {% endfor %}
-
- - +
+ {% include '_components/tags-selector.html.twig' with { + inputName: 'activityAreas', + inputLabel: 'areas_of_expertise'|trans, + items: activityAreas|map(area => { 'label': area.name, 'value': area.id }), + tags: [], + required: false, + questionFill: true, + } %}
@@ -27,17 +37,17 @@
- +
- +
- +
@@ -46,4 +56,8 @@
-
\ No newline at end of file +
+ +{% block extra_javascripts %} + +{% endblock %} diff --git a/templates/_admin/organization/edit.html.twig b/templates/_admin/organization/edit.html.twig index 3959861f1..48230430c 100644 --- a/templates/_admin/organization/edit.html.twig +++ b/templates/_admin/organization/edit.html.twig @@ -14,20 +14,6 @@ {% include "_admin/organization/_partials/organization-edit-header.html.twig" %}
-
- Pessoas ({{ agents|length }}) - {% for agent in agents %} -
- - {{ agent.name }} -
- {% endfor %} - -
- - {% set asterisk = '*' %} - {{ 'mandatory_fields'|trans({'asterisco': asterisk})|raw }} - {% include "_admin/organization/_partials/forms/entity-edit-form.html.twig" %}
@@ -39,10 +25,13 @@
- + {{ 'logout' | trans }}
{% endblock %} +{% block extra_javascripts %} + +{% endblock %} \ No newline at end of file diff --git a/templates/_admin/space/_partials/forms/address-data.html.twig b/templates/_admin/space/_partials/forms/address-data.html.twig index 81a05d192..a46b2514e 100644 --- a/templates/_admin/space/_partials/forms/address-data.html.twig +++ b/templates/_admin/space/_partials/forms/address-data.html.twig @@ -3,12 +3,12 @@
* - +
* - +
@@ -16,10 +16,10 @@
* - +
- + @@ -27,11 +27,11 @@
* - +
- +
@@ -39,8 +39,12 @@
- + {% if space.address and space.address.city %} + + {% else %} + + {% endif %} {% for state in states %} {% endfor %} @@ -48,8 +52,16 @@
- + {% if space.address and space.address.city %} + + {% else %} + + {% endif %} + + {% for city in cities %} + + {% endfor %}
diff --git a/templates/_admin/space/_partials/forms/capacity-accessibility.html.twig b/templates/_admin/space/_partials/forms/capacity-accessibility.html.twig index 51554a602..6b785cf0d 100644 --- a/templates/_admin/space/_partials/forms/capacity-accessibility.html.twig +++ b/templates/_admin/space/_partials/forms/capacity-accessibility.html.twig @@ -4,7 +4,12 @@ @@ -26,6 +31,7 @@ class="form-check-input" type="radio" name="architectural_accessibility_option" + value="1" id="yes" >