import { Action as CreationChecklistAction } from 'Actions/companyCreationChecklistActions' import { Action as HiringChecklist } from 'Actions/hiringChecklistAction' import { omit } from 'ramda' import { combineReducers } from 'redux' import { LegalStatus } from 'Selectors/companyStatusSelectors' import { Action as CompanyStatusAction, LegalStatusRequirements } from 'Types/companyTypes' type Action = CompanyStatusAction | CreationChecklistAction | HiringChecklist function companyLegalStatus( state: LegalStatusRequirements = {}, action: Action ): LegalStatusRequirements { switch (action.type) { case 'COMPANY_IS_SOLE_PROPRIETORSHIP': return { ...state, soleProprietorship: action.isSoleProprietorship } case 'DEFINE_DIRECTOR_STATUS': return { ...state, directorStatus: action.status } case 'COMPANY_HAS_MULTIPLE_ASSOCIATES': return { ...state, multipleAssociates: action.multipleAssociates } case 'COMPANY_IS_MICROENTERPRISE': return { ...state, autoEntrepreneur: action.autoEntrepreneur } case 'SPECIFY_DIRECTORS_SHARE': return { ...state, minorityDirector: action.minorityDirector } case 'RESET_COMPANY_STATUS_CHOICE': return action.answersToReset ? omit(action.answersToReset, state) : {} } return state } function hiringChecklist( state: { [key: string]: boolean } = {}, action: Action ) { switch (action.type) { case 'CHECK_HIRING_ITEM': return { ...state, [action.name]: action.checked } case 'INITIALIZE_HIRING_CHECKLIST': return Object.keys(state).length ? state : action.checklistItems.reduce( (checklist, item) => ({ ...checklist, [item]: false }), {} ) default: return state } } function companyCreationChecklist( state: { [key: string]: boolean } = {}, action: Action ) { switch (action.type) { case 'CHECK_COMPANY_CREATION_ITEM': return { ...state, [action.name]: action.checked } case 'INITIALIZE_COMPANY_CREATION_CHECKLIST': return Object.keys(state).length ? state : action.checklistItems.reduce( (checklist, item) => ({ ...checklist, [item]: false }), {} ) case 'RESET_COMPANY_STATUS_CHOICE': return {} default: return state } } function companyStatusChoice( state: LegalStatus = null, action: Action ): LegalStatus { if (action.type === 'RESET_COMPANY_STATUS_CHOICE') { return null } if (action.type !== 'INITIALIZE_COMPANY_CREATION_CHECKLIST') { return state } return action.statusName } const infereLegalStatusFromCategorieJuridique = ( catégorieJuridique: string ) => { /* Nous utilisons le code entreprise pour connaitre le statut juridique (voir https://www.insee.fr/fr/information/2028129) En revanche, impossible de différencier EI et auto-entreprise https://www.sirene.fr/sirene/public/question.action?idQuestion=2933 */ if (catégorieJuridique === '1000') { return 'EI' } if (catégorieJuridique === '5498') { return 'EURL' } if (catégorieJuridique.match(/^54..$/)) { return 'SARL' } if (catégorieJuridique.match(/^55..$/)) { return 'SA' } if (catégorieJuridique === '5720') { return 'SASU' } if (catégorieJuridique.match(/^57..$/)) { return 'SAS' } return 'NON_IMPLÉMENTÉ' } export type Company = { siren: string catégorieJuridique?: string statutJuridique?: string isAutoEntrepreneur?: boolean isDirigeantMajoritaire?: boolean } function existingCompany(state: Company = null, action): Company { if (!action.type.startsWith('EXISTING_COMPANY::')) { return state } if (action.type.endsWith('RESET')) { return null } if (action.type.endsWith('SET_SIREN')) { return { siren: action.siren } } if (state && action.type.endsWith('SET_CATEGORIE_JURIDIQUE')) { const statutJuridique = infereLegalStatusFromCategorieJuridique( action.catégorieJuridique ) return { siren: state.siren, statutJuridique } } if (state && action.type.endsWith('SPECIFY_AUTO_ENTREPRENEUR')) { return { ...state, isAutoEntrepreneur: action.isAutoEntrepreneur } } if (state && action.type.endsWith('SPECIFY_DIRIGEANT_MAJORITAIRE')) { return { ...state, isDirigeantMajoritaire: action.isDirigeantMajoritaire } } return state } export default combineReducers({ companyLegalStatus, companyStatusChoice, companyCreationChecklist, existingCompany, hiringChecklist })