diff --git a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php index 830a9e48e..1c375d051 100644 --- a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php +++ b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php @@ -499,6 +499,17 @@ class AccompanyingPeriod implements TrackCreationInterface, TrackUpdateInterface return $collection->count() > 0 ? $collection->first() : NULL; } + public function getOPenParticipations(): Collection + { + return $this + ->getParticipations() + ->filter( + static function(AccompanyingPeriodParticipation $participation): bool { + return null === $participation->getEndDate(); + } + ); + } + /** * Return true if the accompanying period contains a person. * @@ -974,6 +985,22 @@ class AccompanyingPeriod implements TrackCreationInterface, TrackUpdateInterface return $this->personLocation; } + /** + * Get a list of person which have an adresse available for a valid location + * + * @return Collection|Person[] + */ + public function getAvailablePersonLocation(): Collection + { + return $this->getOPenParticipations() + ->filter(function(AccompanyingPeriodParticipation $p) { + return $p->getPerson()->hasCurrentHouseholdAddress(); + }) + ->map(function(AccompanyingPeriodParticipation $p) { + return $p->getPerson(); + }); + } + /** * @Groups({"write"}) */ diff --git a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodWork.php b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodWork.php index f97f8a243..b0c60de82 100644 --- a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodWork.php +++ b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodWork.php @@ -169,7 +169,7 @@ use Symfony\Component\Validator\Constraints as Assert; * orphanRemoval=true * ) * @Serializer\Groups({"read"}) - * @internal /!\ the serialization for read / write evaluations is handled in `AccompanyingPeriodWorkDenormalizer` + * @internal /!\ the serialization for write evaluations is handled in `AccompanyingPeriodWorkDenormalizer` */ private Collection $accompanyingPeriodWorkEvaluations; diff --git a/src/Bundle/ChillPersonBundle/Entity/Person.php b/src/Bundle/ChillPersonBundle/Entity/Person.php index cf00eb9f1..084a24ca3 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person.php @@ -103,7 +103,7 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI * * @ORM\Column(type="date", nullable=true) */ - private $birthdate; + private $birthdate; /** * The person's deathdate @@ -736,8 +736,8 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI { return $this->birthdate; } - - public function getAge(): ?int + + public function getAge(): ?int { if ($this->birthdate instanceof \DateTimeInterface) { return date_diff($this->birthdate, date_create('now'))->format("%y"); @@ -1439,6 +1439,11 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI } } + public function hasCurrentHouseholdAddress(?\DateTimeImmutable $at = null): bool + { + return null !== $this->getCurrentHouseholdAddress($at); + } + public function getGenderComment(): CommentEmbeddable { return $this->genderComment; diff --git a/src/Bundle/ChillPersonBundle/Resources/public/page/accompanying_course_index/person_locate.js b/src/Bundle/ChillPersonBundle/Resources/public/page/accompanying_course_index/person_locate.js new file mode 100644 index 000000000..b634bf146 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/public/page/accompanying_course_index/person_locate.js @@ -0,0 +1,49 @@ +const onSubmit = function(e) { + e.preventDefault(); + let + form = e.target, + formData = new FormData(form), + url = form.action, + payload = { + type: 'accompanying_period', + id: Number.parseInt(formData.get('periodId'), 10), + personLocation: { + type: 'person', + id: Number.parseInt(formData.get('personLocation'), 10) + } + } + ; + + console.log('event', e); + console.log('form', form); + console.log('formData', formData); + console.log('url', url); + console.log('payload', payload); + + window.fetch(url, { + method: 'PATCH', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(payload), + }) + .then(r => { + if (r.ok) { + console.log('response ok'); + window.location.reload(); + } else { + console.err("could not patch accompanying course"); + } + }); +} + +window.addEventListener('DOMContentLoaded', function(e) { + let forms = document.querySelectorAll('.quickLocationForm'); + + console.log(forms); + + forms.forEach(function(form){ + console.log('form quickLocation found', form); + form.addEventListener('submit', onSubmit); + }) +}); diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/< b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/< deleted file mode 100644 index f2917b463..000000000 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/< +++ /dev/null @@ -1,374 +0,0 @@ -import { createStore } from 'vuex'; -import { householdMove, fetchHouseholdSuggestionByAccompanyingPeriod, fetchAddressSuggestionByPerson} from './../api.js'; -import { datetimeToISO } from 'ChillMainAssets/chill/js/date.js'; - -const debug = process.env.NODE_ENV !== 'production'; - -const concerned = window.household_members_editor_data.persons.map(p => { - return { - person: p, - position: null, - allowRemove: false, - holder: false, - comment: "", - }; -}); - -console.log('expand suggestions', window.household_members_editor_expand_suggestions === 1); - -const store = createStore({ - strict: debug, - state: { - concerned, - household: window.household_members_editor_data.household, - positions: window.household_members_editor_data.positions.sort((a, b) => { - if (a.ordering < b.ordering) { - return -1; - } - if (a.ordering > b.ordering) { - return 1; - } - return 0; - }), - startDate: new Date(), - allowHouseholdCreate: window.household_members_editor_data.allowHouseholdCreate, - allowHouseholdSearch: window.household_members_editor_data.allowHouseholdSearch, - allowLeaveWithoutHousehold: window.household_members_editor_data.allowLeaveWithoutHousehold, - forceLeaveWithoutHousehold: false, - householdSuggestionByAccompanyingPeriod: [], - showHouseholdSuggestion: window.household_members_editor_expand_suggestions === 1, - addressesSuggestion: [], - warnings: [], - errors: [] - }, - getters: { - isHouseholdNew(state) { - if (state.household === null) { - return false; - } - return !Number.isInteger(state.household.id); - }, - hasHousehold(state) { - return state.household !== null; - }, - hasHouseholdOrLeave(state) { - return state.household !== null || state.forceLeaveWithoutHousehold; - }, - hasHouseholdSuggestion(state, getters) { - return getters.filterHouseholdSuggestionByAccompanyingPeriod.length > 0; - }, - countHouseholdSuggestion(state, getters) { - return getters.filterHouseholdSuggestionByAccompanyingPeriod.length; - }, - filterHouseholdSuggestionByAccompanyingPeriod(state) { - if (state.household === null) { - return state.householdSuggestionByAccompanyingPeriod; - } - - return state.householdSuggestionByAccompanyingPeriod - .filter(h => h.id !== state.household.id) - ; - }, - hasPersonsWellPositionnated(state, getters) { - return getters.needsPositionning === false - || (getters.persons.length > 0 && getters.concUnpositionned.length === 0); - }, - persons(state) { - return state.concerned.map(conc => conc.person); - }, - concUnpositionned(state) { - return state.concerned - .filter(conc => conc.position === null) - ; - }, - positions(state) { - return state.positions; - }, - personByPosition: (state) => (position_id) => { - return state.concerned - .filter(conc => - conc.position !== null ? conc.position.id === position_id : false - ) - .map(conc => conc.person) - ; - }, - concByPosition: (state) => (position_id) => { - return state.concerned - .filter(conc => - conc.position !== null ? conc.position.id === position_id : false - ) - ; - }, - concByPersonId: (state) => (person_id) => { - return state.concerned - .find(conc => conc.person.id === person_id) - ; - }, - needsPositionning(state) { - return state.forceLeaveWithoutHousehold === false; - }, - buildPayload: (state) => { - let - conc, - payload_conc, - payload = { - concerned: [], - destination: null - } - ; - - if (state.forceLeaveWithoutHousehold === false) { - payload.destination = { - id: state.household.id, - type: state.household.type - }; - } - - for (let i in state.concerned) { - conc = state.concerned[i]; - payload_conc = { - person: { - id: conc.person.id, - type: conc.person.type - }, - start_date: { - datetime: datetimeToISO(state.startDate) - } - }; - - if (state.forceLeaveWithoutHousehold === false) { - payload_conc.position = { - id: conc.position.id, - type: conc.position.type - }; - payload_conc.holder = conc.holder; - payload_conc.comment = conc.comment; - } - - payload.concerned.push(payload_conc); - } - - return payload; - }, - }, - mutations: { - addConcerned(state, person) { - let persons = state.concerned.map(conc => conc.person.id); - if (!persons.includes(person.id)) { - state.concerned.push({ - person, - position: null, - allowRemove: true, - holder: false, - comment: "", - }); - } else { - console.err("person already included"); - } - }, - markPosition(state, { person_id, position_id}) { - let - position = state.positions.find(pos => pos.id === position_id), - conc = state.concerned.find(c => c.person.id === person_id); - conc.position = position; - }, - setComment(state, {conc, comment}) { - conc.comment = comment; - }, - toggleHolder(state, conc) { - conc.holder = !conc.holder; - }, - removePosition(state, conc) { - conc.holder = false; - conc.position = null; - }, - removeConcerned(state, conc) { - state.concerned = state.concerned.filter(c => - c.person.id !== conc.person.id - ) - }, - createHousehold(state) { - state.household = { type: 'household', members: [], current_address: null, - current_members_id: [] }; - state.forceLeaveWithoutHousehold = false; - }, - removeHousehold(state) { - state.household = null; - state.forceLeaveWithoutHousehold = false; - }, - setHouseholdAddress(state, address) { - if (null === state.household) { - console.error("no household"); - throw new Error("No household"); - } - - state.household.current_address = address; - state.household.force_new_address = address; - }, - forceLeaveWithoutHousehold(state) { - state.household = null; - state.forceLeaveWithoutHousehold = true; - }, - selectHousehold(state, household) { - state.household = household; - state.forceLeaveWithoutHousehold = false; - }, - setHouseholdSuggestionByAccompanyingPeriod(state, households) { - let existingIds = state.householdSuggestionByAccompanyingPeriod - .map(h => h.id); - for (let i in households) { - if (!existingIds.includes(households[i].id)) { - state.householdSuggestionByAccompanyingPeriod.push(households[i]); - } - } - }, - setStartDate(state, dateI) { - state.startDate = dateI; - }, - toggleHouseholdSuggestion(state) { - state.showHouseholdSuggestion = !state.showHouseholdSuggestion; - }, - setWarnings(state, warnings) { - state.warnings = warnings; - // reset errors, which should come from servers - state.errors.splice(0, state.errors.length); - }, - setErrors(state, errors) { - state.errors = errors; - }, - addAddressesSuggestion(state, addresses) { - let existingIds = state.addressesSuggestion - .map(a => a.id); - - for (let i in addresses) { - if (!existingIds.includes(addresses[i].id)) { - state.addressesSuggestion.push(addresses[i]); - } - } - } - }, - actions: { - addConcerned({ commit, dispatch }, person) { - commit('addConcerned', person); - dispatch('computeWarnings'); - dispatch('fetchAddressSuggestions'); - }, - markPosition({ commit, state, dispatch }, { person_id, position_id }) { - commit('markPosition', { person_id, position_id }); - dispatch('computeWarnings'); - }, - toggleHolder({ commit, dispatch }, conc) { - commit('toggleHolder', conc); - dispatch('computeWarnings'); - }, - removePosition({ commit, dispatch }, conc) { - commit('removePosition', conc); - dispatch('computeWarnings'); - }, - removeConcerned({ commit, dispatch }, conc) { - commit('removeConcerned', conc); - dispatch('computeWarnings'); - dispatch('fetchAddressSuggestions'); - }, - removeHousehold({ commit, dispatch }) { - commit('removeHousehold'); - dispatch('computeWarnings'); - }, - createHousehold({ commit, dispatch }) { - commit('createHousehold'); - dispatch('computeWarnings'); - }, - forceLeaveWithoutHousehold({ commit, dispatch }) { - commit('forceLeaveWithoutHousehold'); - dispatch('computeWarnings'); - }, - selectHousehold({ commit }, h) { - commit('selectHousehold', h); - dispatch('computeWarnings'); - }, - setStartDate({ commit, dispatch }, date) { - commit('setStartDate', date); - dispatch('computeWarnings'); - }, - setComment({ commit }, payload) { - commit('setComment', payload); - }, - fetchHouseholdSuggestionForConcerned({ commit, state }, person) { - fetchHouseholdSuggestionByAccompanyingPeriod(person.id) - .then(households => { - commit('setHouseholdSuggestionByAccompanyingPeriod', households); - }); - }, - fetchAddressSuggestions({ commit, state }) { - for (let i in state.concerned) { - fetchAddressSuggestionByPerson(state.concerned[i].person.id) - .then(addresses => { - commit('addAddressesSuggestion', addresses); - }) - .catch(e => { - console.log(e); - }); - } - }, - computeWarnings({ commit, state, getters }) { - let warnings = [], - payload; - - if (!getters.hasHousehold && !state.forceLeaveWithoutHousehold) { - warnings.push({ m: 'household_members_editor.add_destination', a: {} }); - } - - if (state.concerned.length === 0) { - warnings.push({ m: 'household_members_editor.add_at_least_onePerson', a: {} }); - } - - if (getters.concUnpositionned.length > 0 - && !state.forceLeaveWithoutHousehold) { - warnings.push({ m: 'household_members_editor.give_a_position_to_every_person', a: {} }) - } - - commit('setWarnings', warnings); - }, - confirm({ getters, state, commit }) { - let payload = getters.buildPayload, - errors = [], - person_id, - household_id, - error - ; - - householdMove(payload).then(household => { - if (household === null) { - person_id = getters.persons[0].id; - window.location.replace(`/fr/person/${person_id}/general`); - } else { - if (household.type === 'household') { - household_id = household.id; - // nothing to do anymore here, bye-bye ! - window.location.replace(`/fr/person/household/${household_id}/summary`); - } else { - // we assume the answer was 422... - error = household; - for (let i in error.violations) { - let e = error.violations[i]; - errors.push(e.title); - } - - commit('setErrors', errors); - } - } - }); - }, - } -}); - -store.dispatch('computeWarnings'); -store.dispatch('fetchAddressSuggestions'); - -if (concerned.length > 0) { - concerned.forEach(c => { - store.dispatch('fetchHouseholdSuggestionForConcerned', c.person); - }); -} - -export { store }; diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Household.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Household.vue index fa3dd64b6..05746429c 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Household.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Household.vue @@ -7,35 +7,43 @@
-

À quelle adresse habite ce ménage ?

+

À quelle adresse habite ce ménage ?

- +
+ +
+ Aucune adresse à suggérer +
- +
- +
@@ -51,7 +59,7 @@ class="btn btn-misc" @click="toggleHouseholdSuggestion" > - {{ $tc('household_members_editor.show_household_suggestion', + {{ $tc('household_members_editor.show_household_suggestion', countHouseholdSuggestion) }} @@ -106,11 +114,24 @@
- +