edit.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. <template>
  2. <ContainerComponent>
  3. <template>
  4. <v-card class="margin-bottom-20">
  5. <v-toolbar flat class="ot_light_grey" dark>
  6. <v-toolbar-title class="ot_dark_grey--text">
  7. Description de l'organisation
  8. <v-btn @click="edit" class="ot_green editBtn">
  9. <v-icon class="ot_white--text" small>fa-pencil-alt</v-icon>
  10. </v-btn>
  11. </v-toolbar-title>
  12. </v-toolbar>
  13. <FormComponent :repository="repositories.organizationRepository" :id="id" :query="repositories.organizationRepository.query()">
  14. <template v-slot:form.input="{entry}">
  15. <v-tabs vertical>
  16. <v-tab><v-icon left>fa-info</v-icon>{{$t('description')}}</v-tab>
  17. <v-tab><v-icon left>fa-gavel</v-icon>{{$t('legalInformation')}}</v-tab>
  18. <v-tab><v-icon left>fa-certificate</v-icon>{{$t('agrements')}}</v-tab>
  19. <v-tab><v-icon left>fa-users</v-icon>{{$t('salary')}}</v-tab>
  20. <v-tab v-if="organizationProfile.isInsideNetwork()"><v-icon left>fa-share-alt</v-icon>{{$t('network')}}</v-tab>
  21. <v-tab><v-icon left>fa-rss</v-icon>{{$t('communication')}}</v-tab>
  22. <v-tab-item>
  23. <v-container fluid class="container">
  24. <v-row>
  25. <v-col cols="12" sm="6">
  26. <InputComponent field="name" :repository="repositories.organizationRepository" :entry="entry" :rules="rules.nameRules" />
  27. </v-col>
  28. <v-col cols="12" sm="6">
  29. <InputComponent field="acronym" :repository="repositories.organizationRepository" :entry="entry" />
  30. </v-col>
  31. <v-col cols="12" sm="6">
  32. <InputComponent
  33. field="siretNumber"
  34. :repository="repositories.organizationRepository"
  35. :entry="entry"
  36. v-on:update="checkSiret"
  37. :error="siretError"
  38. :errorMessage="siretErrorMessage"
  39. :rules="rules.siretRule"
  40. />
  41. </v-col>
  42. <v-col cols="12" sm="6">
  43. <InputComponent field="apeNumber" :repository="repositories.organizationRepository" :entry="entry" />
  44. </v-col>
  45. <v-col cols="12" sm="6" v-if="entry['legalStatus'] === 'ASSOCIATION_LAW_1901'" >
  46. <InputComponent field="waldecNumber" :repository="repositories.organizationRepository" :entry="entry" />
  47. </v-col>
  48. <v-col cols="12" sm="6" v-if="organizationProfile.isInsideNetwork()" >
  49. <InputComponent field="identifier" :repository="repositories.organizationRepository" :entry="entry"
  50. :label="organizationProfile.isCmf() ? 'identifierCmf' : 'identifierFfec'" />
  51. </v-col>
  52. <v-col cols="12" sm="6" v-if="organizationProfile.isFfec()" >
  53. <InputComponent field="ffecApproval" :repository="repositories.organizationRepository" :entry="entry" />
  54. </v-col>
  55. <v-col cols="12" sm="6">
  56. <InputComponent field="description" :repository="repositories.organizationRepository" :entry="entry" />
  57. </v-col>
  58. <v-col cols="12" sm="6">
  59. <InputComponent field="logo" :repository="repositories.organizationRepository" :entry="entry" />
  60. </v-col>
  61. <!-- @todo: ajouter les if et transformer en select-->
  62. <v-col cols="12" sm="6">
  63. <InputComponent field="typeOfPractices" :repository="repositories.organizationRepository" :entry="entry" />
  64. </v-col>
  65. <v-col cols="12" sm="6">
  66. <InputComponent field="otherPractice" :repository="repositories.organizationRepository" :entry="entry" />
  67. </v-col>
  68. </v-row>
  69. </v-container>
  70. </v-tab-item>
  71. <v-tab-item>
  72. <v-container fluid class="container">
  73. <v-row>
  74. <v-col cols="12" sm="6">
  75. <DatePickerComponent field="creationDate" :repository="repositories.organizationRepository" :entry="entry" />
  76. </v-col>
  77. <v-col cols="12" sm="6">
  78. <InputComponent field="prefectureName" :repository="repositories.organizationRepository" :entry="entry" />
  79. </v-col>
  80. <v-col cols="12" sm="6">
  81. <InputComponent field="prefectureNumber" :repository="repositories.organizationRepository" :entry="entry" />
  82. </v-col>
  83. <v-col cols="12" sm="6">
  84. <InputComponent field="tvaNumber" :repository="repositories.organizationRepository" :entry="entry" />
  85. </v-col>
  86. <v-col cols="12" sm="6">
  87. <SelectComponent field="legalStatus" :repository="repositories.organizationRepository" :entry="entry" enumType="organization_legal" />
  88. </v-col>
  89. <v-col cols="12" sm="6" v-if="!organizationProfile.isManagerProduct()" >
  90. <SelectComponent field="principalType" :repository="repositories.organizationRepository"
  91. :entry="entry" enumType="organization_principal_type"
  92. />
  93. </v-col>
  94. <v-col cols="12" sm="6" v-if="!organizationProfile.isFfec() && !organizationProfile.isManagerProduct() && !organizationProfile.isArtist()">
  95. <SelectComponent field="schoolCategory" :repository="repositories.organizationRepository" :entry="entry" enumType="organization_school_cat" />
  96. </v-col>
  97. <v-col cols="12" sm="6" v-if="organizationProfile.isFfec()" >
  98. <SelectComponent field="typeEstablishment" :repository="repositories.organizationRepository" :entry="entry" enumType="organization_type_establishment"/>
  99. </v-col>
  100. <v-col cols="12" sm="6" v-if="entry.typeEstablishment === 'MULTIPLE'" >
  101. <SelectComponent field="typeEstablishmentDetail" :repository="repositories.organizationRepository" :entry="entry" enumType="organization_type_establishment_detail"/>
  102. </v-col>
  103. </v-row>
  104. </v-container>
  105. </v-tab-item>
  106. <v-tab-item>
  107. <v-container fluid class="container">
  108. <v-row>
  109. <v-col cols="12" sm="6">
  110. <InputComponent field="youngApproval" :repository="repositories.organizationRepository" :entry="entry" />
  111. </v-col>
  112. <v-col cols="12" sm="6">
  113. <InputComponent field="trainingApproval" :repository="repositories.organizationRepository" :entry="entry" />
  114. </v-col>
  115. <v-col cols="12" sm="6">
  116. <InputComponent field="otherApproval" :repository="repositories.organizationRepository" :entry="entry" />
  117. </v-col>
  118. </v-row>
  119. </v-container>
  120. </v-tab-item>
  121. <v-tab-item>
  122. <v-container fluid class="container">
  123. <v-row>
  124. <v-col cols="12" sm="6">
  125. <InputComponent field="collectiveAgreement" :repository="repositories.organizationRepository" :entry="entry" />
  126. </v-col>
  127. <v-col cols="12" sm="6">
  128. <SelectComponent field="opca" :repository="repositories.organizationRepository" :entry="entry" enumType="organization_opca" />
  129. </v-col>
  130. <v-col cols="12" sm="6">
  131. <InputComponent field="icomNumber" :repository="repositories.organizationRepository" :entry="entry" />
  132. </v-col>
  133. <v-col cols="12" sm="6">
  134. <InputComponent field="urssafNumber" :repository="repositories.organizationRepository" :entry="entry" />
  135. </v-col>
  136. </v-row>
  137. </v-container>
  138. </v-tab-item>
  139. <v-tab-item v-if="organizationProfile.isInsideNetwork()">
  140. <v-container fluid class="container">
  141. <v-row>
  142. <v-col cols="12" sm="6" v-if="organizationProfile.isFfec()" >
  143. <InputComponent field="budget" :repository="repositories.organizationRepository" :entry="entry" type="number" />
  144. </v-col>
  145. <v-col cols="12" sm="6" v-if="organizationProfile.isFfec()" >
  146. <CheckboxComponent field="isPedagogicIsPrincipalActivity" :repository="repositories.organizationRepository" :entry="entry" />
  147. </v-col>
  148. <v-col cols="12" sm="6" v-if="organizationProfile.isFfec()" >
  149. <InputComponent field="pedagogicBudget" :repository="repositories.organizationRepository" :entry="entry" type="number"/>
  150. </v-col>
  151. </v-row>
  152. </v-container>
  153. </v-tab-item>
  154. <v-tab-item>
  155. <v-container fluid class="container">
  156. <v-row>
  157. <v-col cols="12" sm="6">
  158. <InputComponent field="twitter" :repository="repositories.organizationRepository" :entry="entry" />
  159. </v-col>
  160. <v-col cols="12" sm="6">
  161. <InputComponent field="facebook" :repository="repositories.organizationRepository" :entry="entry" />
  162. </v-col>
  163. <v-col cols="12" sm="6">
  164. <InputComponent field="instagram" :repository="repositories.organizationRepository" :entry="entry" />
  165. </v-col>
  166. <v-col cols="12" sm="6">
  167. <CheckboxComponent field="portailVisibility" :repository="repositories.organizationRepository" :entry="entry" />
  168. </v-col>
  169. <v-col cols="12" sm="6">
  170. <InputComponent field="image" :repository="repositories.organizationRepository" :entry="entry" />
  171. </v-col>
  172. </v-row>
  173. </v-container>
  174. </v-tab-item>
  175. </v-tabs>
  176. </template>
  177. </FormComponent>
  178. </v-card>
  179. </template>
  180. <v-expansion-panels v-model="panel" focusable>
  181. <!-- Adresses -->
  182. <ExpansionPanelComponent :title="$t('address_postal')" icon="fa-globe-europe">
  183. <v-container fluid class="container">
  184. <v-row>
  185. <v-col cols="12" sm="12">
  186. <DataTableComponent
  187. :query="repositories.addressRepository.with('addressPostal')"
  188. :rootModel="models.Organization"
  189. :rootId="id"
  190. :model="models.OrganizationAddressPostal"
  191. :headers="datatableHeaders.headersAddressPostal"
  192. >
  193. <template v-slot:item.type="{item}">
  194. {{$t(item.type)}}
  195. </template>
  196. <template v-slot:item.address="{item}">
  197. {{item['addressPostal.streetAddress']}}
  198. {{item['addressPostal.postalCode']}}
  199. {{item['addressPostal.addressCity']}}
  200. </template>
  201. <template v-slot:sheet.content="{itemId}">
  202. <v-container fluid class="container">
  203. <FormComponent :repository="repositories.addressRepository" :id="itemId" :query="queries.addressQuery()">
  204. <template v-slot:form.input="{entry: addressEntry }">
  205. <v-row>
  206. <v-col cols="12" sm="6">
  207. <SelectComponent field="type" label="address_postal_type" :repository="repositories.addressRepository" :entry="addressEntry" enumType="address_postal_organization" />
  208. </v-col>
  209. <v-col cols="12" sm="6">
  210. <InputComponent field="addressPostal.addressOwner" label="addressOwner" :repository="repositories.addressRepository" :entry="addressEntry" />
  211. </v-col>
  212. <v-col cols="12" sm="6">
  213. <InputComponent field="addressPostal.streetAddress" label="streetAddress" :repository="repositories.addressRepository" :entry="addressEntry" />
  214. </v-col>
  215. <v-col cols="12" sm="6">
  216. <InputComponent field="addressPostal.streetAddressSecond" label="streetAddressSecond" :repository="repositories.addressRepository" :entry="addressEntry" />
  217. </v-col>
  218. <v-col cols="12" sm="6">
  219. <InputComponent field="addressPostal.streetAddressThird" label="streetAddressThird" :repository="repositories.addressRepository" :entry="addressEntry" />
  220. </v-col>
  221. <v-col cols="12" sm="6">
  222. <InputComponent field="addressPostal.postalCode" label="postalCode" :repository="repositories.addressRepository" :entry="addressEntry" />
  223. </v-col>
  224. <v-col cols="12" sm="6">
  225. <InputComponent field="addressPostal.addressCity" label="addressCity" :repository="repositories.addressRepository" :entry="addressEntry" />
  226. </v-col>
  227. <v-col cols="12" sm="6">
  228. <InputComponent field="addressPostal.country" label="country" :repository="repositories.addressRepository" :entry="addressEntry" />
  229. </v-col>
  230. </v-row>
  231. </template>
  232. </FormComponent>
  233. </v-container>
  234. </template>
  235. </DataTableComponent>
  236. </v-col>
  237. </v-row>
  238. </v-container>
  239. </ExpansionPanelComponent>
  240. <!-- Point de Contact-->
  241. <ExpansionPanelComponent :title="$t('contact_point')" icon="fa-phone">
  242. <v-container fluid class="container">
  243. <v-row>
  244. <v-col cols="12" sm="12">
  245. <DataTableComponent
  246. :query="repositories.contactPointRepository.query()"
  247. :rootModel="models.Organization"
  248. :rootId="id"
  249. :model="models.ContactPoint"
  250. :headers="datatableHeaders.headersContactPoint"
  251. >
  252. <template v-slot:sheet.content="{itemId }">
  253. <v-container fluid class="container">
  254. <FormComponent :repository="repositories.contactPointRepository" :query="queries.contactPointQuery()" :id="itemId">
  255. <template v-slot:form.input="{entry: contactPointEntry }">
  256. <v-row>
  257. <v-col cols="12" sm="6">
  258. <InputComponent field="email" :repository="repositories.contactPointRepository" :entry="contactPointEntry" />
  259. </v-col>
  260. <v-col cols="12" sm="6">
  261. <InputComponent field="telphone" :repository="repositories.contactPointRepository" :entry="contactPointEntry" />
  262. </v-col>
  263. <v-col cols="12" sm="6">
  264. <InputComponent field="mobilPhone" :repository="repositories.contactPointRepository" :entry="contactPointEntry" />
  265. </v-col>
  266. <v-col cols="12" sm="6">
  267. <InputComponent field="faxNumber" :repository="repositories.contactPointRepository" :entry="contactPointEntry" />
  268. </v-col>
  269. </v-row>
  270. </template>
  271. </FormComponent>
  272. </v-container>
  273. </template>
  274. </DataTableComponent>
  275. </v-col>
  276. </v-row>
  277. </v-container>
  278. </ExpansionPanelComponent>
  279. <!-- IBAN -->
  280. <ExpansionPanelComponent :title="$t('bank_account')" icon="fa-euro-sign">
  281. <v-container fluid class="container">
  282. <v-row>
  283. <v-col cols="12" sm="12">
  284. <DataTableComponent
  285. :query="repositories.bankAccountRepository.query()"
  286. :rootModel="models.Organization"
  287. :rootId="id"
  288. :model="models.BankAccount"
  289. :headers="datatableHeaders.headersBankAccount"
  290. >
  291. <template v-slot:sheet.content="{itemId}">
  292. <v-container fluid class="container">
  293. <FormComponent :repository="repositories.bankAccountRepository" :id="itemId" :query="queries.bankAccountQuery()">
  294. <template v-slot:form.input="{entry: bankAccountEntry }">
  295. <v-row>
  296. <v-col cols="12" sm="6">
  297. <InputComponent field="bankName" :repository="repositories.bankAccountRepository" :entry="bankAccountEntry" />
  298. </v-col>
  299. <v-col cols="12" sm="6">
  300. <InputComponent field="bic" :repository="repositories.bankAccountRepository" :entry="bankAccountEntry" />
  301. </v-col>
  302. <v-col cols="12" sm="6">
  303. <InputComponent field="iban" :repository="repositories.bankAccountRepository" :entry="bankAccountEntry" />
  304. </v-col>
  305. <v-col cols="12" sm="6">
  306. <InputComponent field="debitAddress" :repository="repositories.bankAccountRepository" :entry="bankAccountEntry" />
  307. </v-col>
  308. <v-col cols="12" sm="6">
  309. <InputComponent field="holder" :repository="repositories.bankAccountRepository" :entry="bankAccountEntry" />
  310. </v-col>
  311. <v-col cols="12" sm="6">
  312. <CheckboxComponent field="principal" :repository="repositories.bankAccountRepository" :entry="bankAccountEntry" />
  313. </v-col>
  314. </v-row>
  315. </template>
  316. </FormComponent>
  317. </v-container>
  318. </template>
  319. </DataTableComponent>
  320. </v-col>
  321. </v-row>
  322. </v-container>
  323. </ExpansionPanelComponent>
  324. </v-expansion-panels>
  325. </ContainerComponent>
  326. </template>
  327. <script lang="ts">
  328. import {defineComponent, useContext, onUnmounted, computed} from '@nuxtjs/composition-api'
  329. import {$dataProvider} from "~/services/dataProvider/dataProvider";
  330. import {$organizationProfile} from "~/services/profile/organizationProfile";
  331. import {Organization} from '@/models/Organization/Organization'
  332. import {OrganizationAddressPostal} from "~/models/Organization/OrganizationAddressPostal";
  333. import {ContactPoint} from "~/models/Core/ContactPoint";
  334. import {BankAccount} from "~/models/Core/BankAccount";
  335. import {useRepositoryHelper} from "~/use/store/useRepository";
  336. import {Utils} from "~/use/form/utils";
  337. export default defineComponent({
  338. name: 'organization_edit',
  339. setup() {
  340. const {store, app:{i18n}} = useContext()
  341. const organizationProfile = $organizationProfile(store)
  342. const id = store.state.profile.organization.id;
  343. const repositories = getRepositories()
  344. const {siretError, siretErrorMessage, checkSiret} = Utils.useHandleSiret()
  345. //onUnmounted( useRepositoryHelper.cleanRepository(repository) )
  346. return {
  347. repositories,
  348. queries: getQueries(),
  349. id,
  350. organizationProfile,
  351. models: {Organization, ContactPoint, BankAccount, OrganizationAddressPostal},
  352. edit: useRepositoryHelper.editRepository(repositories.organizationRepository),
  353. datatableHeaders: getDataTablesHeaders(i18n),
  354. rules: getRules(i18n),
  355. siretError,
  356. siretErrorMessage,
  357. checkSiret,
  358. panel:null,
  359. }
  360. },
  361. async asyncData({store, $rest}){
  362. await $dataProvider(store, $rest).getItem(Organization, store.state.profile.organization.id)
  363. }
  364. })
  365. function getRules(i18n: any){
  366. return {
  367. nameRules : [
  368. (nameValue:string) => !!nameValue || i18n.t('required'),
  369. (nameValue:string) => (nameValue || '').length <= 128 || i18n.t('name_length_rule')
  370. ],
  371. siretRule : [
  372. (siretValue:string) => /^([0-9]{9}|[0-9]{14})$/.test(siretValue) || i18n.t('siret_error')
  373. ]
  374. }
  375. }
  376. function getDataTablesHeaders(i18n: any) {
  377. return {
  378. headersContactPoint: [
  379. {text: i18n.t('email'), value: 'email'},
  380. {text: i18n.t('telphone'), value: 'telphone'},
  381. {text: i18n.t('mobilPhone'), value: 'mobilPhone'},
  382. {text: i18n.t('actions'), value: 'actions', sortable: false},
  383. ],
  384. headersBankAccount: [
  385. {text: i18n.t('bankName'), value: 'bankName'},
  386. {text: i18n.t('iban'), value: 'iban'},
  387. {text: i18n.t('bic'), value: 'bic'},
  388. {text: i18n.t('actions'), value: 'actions', sortable: false},
  389. ],
  390. headersAddressPostal: [
  391. {text: i18n.t('address_postal_type'), value: 'type'},
  392. {text: i18n.t('address'), value: 'address'},
  393. {text: i18n.t('actions'), value: 'actions', sortable: false},
  394. ]
  395. }
  396. }
  397. function getRepositories() {
  398. return {
  399. organizationRepository: useRepositoryHelper.initRepository(Organization),
  400. contactPointRepository: useRepositoryHelper.initRepository(ContactPoint, false),
  401. bankAccountRepository: useRepositoryHelper.initRepository(BankAccount, false),
  402. addressRepository: useRepositoryHelper.initRepository(OrganizationAddressPostal, false)
  403. }
  404. }
  405. function getQueries() {
  406. return {
  407. organizationQuery: () => getRepositories().organizationRepository.query(),
  408. contactPointQuery: () => getRepositories().contactPointRepository.query(),
  409. bankAccountQuery: () => getRepositories().bankAccountRepository.query(),
  410. addressQuery: () => getRepositories().addressRepository.with('addressPostal')
  411. }
  412. }
  413. </script>
  414. <style scoped>
  415. .v-tab{
  416. justify-content: left;
  417. font-size: 12px;
  418. }
  419. .v-icon.v-icon{
  420. font-size: 14px;
  421. }
  422. </style>