From 7ae2e691f81977a35b1c61a9ebad5e7273be843f Mon Sep 17 00:00:00 2001 From: Yassine R Date: Tue, 9 Jan 2024 17:29:46 +0100 Subject: [PATCH] fix(stats): close stats periods --- .talismanrc | 4 +- .../db/dumps/domifa_test.postgres.custom.gz | Bin 91833 -> 91818 bytes ...domifa_test.postgres.restore-data-only.sql | 26 +++--- ...st.postgres.truncate-restore-data-only.sql | 26 +++--- .../1704813167013-manual-migration.ts | 12 +++ ...1704813169210-update-end-date-migration.ts | 79 ++++++++++++++++++ .../data-anonymizer/dataUsagerAnonymizer.ts | 13 ++- .../usagers/controllers/usagers.controller.ts | 1 - .../usagerHistoryStateManager.service.ts | 36 +++----- 9 files changed, 142 insertions(+), 55 deletions(-) create mode 100644 packages/backend/src/_migrations/1704813167013-manual-migration.ts create mode 100644 packages/backend/src/_migrations/1704813169210-update-end-date-migration.ts diff --git a/.talismanrc b/.talismanrc index 07f93a9c90..c6469022c4 100644 --- a/.talismanrc +++ b/.talismanrc @@ -1,8 +1,8 @@ fileignoreconfig: - filename: _scripts/db/dumps/domifa_test.postgres.restore-data-only.sql - checksum: efba4cbbb8096c89a0c7dc6bc3923186d659b235b19d71ff2a97bb92fd799e41 + checksum: 5a6dd4fe960a2aaaf31ac459b0e88e54b9b972e2cc2ba0d625e5c0de52155b1a - filename: _scripts/db/dumps/domifa_test.postgres.truncate-restore-data-only.sql - checksum: d0dac15ae96ec0a7e3045051f1640293934148cadb08aaaa5121b0e1070cc8fa + checksum: 0241639f53b87b4d8ab0e8ab8a733f7460fac1dac4dc2b05f0c9f7ac3bd169f0 - filename: packages/backend/src/_common/decorators/IsValidPasswordDecorator.ts checksum: f0d4b3cd2e6e2d9b1e0271c34d64adacf87a5f1e7a505402a20869962543608d - filename: packages/backend/src/_migrations/1699910877010-auto-migration.ts diff --git a/_scripts/db/dumps/domifa_test.postgres.custom.gz b/_scripts/db/dumps/domifa_test.postgres.custom.gz index f5eec94ba3e3e5749363b2013bf94f9331da5bb4..cb858a421dce0eaaaa0d05fb4768ce3477d05516 100644 GIT binary patch delta 4189 zcmXY#XE+-Q6o$oKwMuj#g4(0htW7Cmiydl3i^dk!B5howMyS1NRqauU+G@4-Z0%K} z2r6n*!R@_I&yVjp&-;DPIe*Tt(>O#?Hben7e)zz^7{EY6P7NTTA^B5e|H-xgg!wB4cxSkJb;!` z=Pz^kpGo;KlF};a{$-B;Gv@$W0N@Pgi8Ke$uG{>zT>iJ#0_^~_bGCmO{D0;Wqz3@F z;Hsa?0%(;S|5{J}x2S@{0RU}WT*#k+Y`FALP5^B={BI)YO#)le&JAGF7Rm%5i&J{Z zSo^0TA$c~7_@->sb(e{9N#RTqKm0g%gqKC@E>!=iXi<$ZpHBHW=hBp)ryJ*%Fr?rl z=puz&(S=)G6Yy58KErHq6TE)Pb>gNRIw%=Gw+Y%BLrQwyMdGx_UO)hA9_H6DfOC|clN1>}HdVL&|o(W=q&9N)~fGME zf9pkMEL+B#V?#<1l+^11<@-wV>Jp7ZewXVtg8qtp)ap0XE*N~GLIr=eGvCU;;wcF! zQ}YH~G3+q8m8_xK^TzR4Jl+optd8cUPa0m*=jj_TMPnTh36fx^)XbRWVO31vTP`B{k3FA(km z^X5C%UkC0as*PMD`8pt5rSd2l!qu@*hy-n`==%p9xz5LIxBC0-*)F4Hf?LFif+6Db z8jH4ba;QLJT*&MF^iLtR;gHZ~|NC6*hUjl9hQ`9nKPxxtqF zXyK1&oTOiPW?3Ffc9bo)_oj&lZ<(L24|}g@f3zA^zFE~*MWJ*}5vv~={$C2o6;eKn z^3Y&dlNQ5;rIPd@-y^j$ojwe+3%(I3!J4(}OEEch@L=^Pn~Fu7Q1JMlXF^2WorcQcW{Peevyj2*uieZyWtR_?^bhIS=xxyB5-s zV=tU?NM5J8ZjY1DI0C+)DeD||6Xj;6Z7VEwU1@~JkHxU>z}h}c;BbfFl{Q6KNawO|#1fsUj3MBFyO z+pd6Q26Qyd^xAWHg&E~QHlvb?f(j_!P&M{gfOt^7`|#nr=9AOUoCHn|@%00zKx~F0 z?5Am4bC<*}1AEJBp?oRfRFg#wFjiEU^ISMW@QIrHMl*JN#A#!)ww89g0}$f}%nX-{(D*JjpERHoaFrq8;~oDozyGKg{HbD-^Q^ zfHZDe6!mUX#Y_x(%Dx!#oOE%xjCQvh8!icI;^4|P?0$TH&sw1xyo-=lKXc%11iPiy z?=!;`dc!A;SFYD@ZMi!}`_6AJd`H%mICv_r0SdeHN?A-r3q?h;9kfb9(z zALAHj2ZG8!jB08r>1IcU>nE~>PjD|l(Nxzu=&nUa`w7-At?hkh2b!T`W-QSZt&UcO zH^{MVuQH=LmdyVVER5`Be18o~U0~p_mp8Ep!eB;Dj4+sC%)_@xQJ_&(ZoRd@Sm)7^ zIhC<>-K^SKXx{S*qMo6S7kx5+f|WNFHlH;0^K6$3CY7z{xJ0zCJ*D(>g!nEm@+dZUDohEfn1GrOGUK%@492)?i3f;fs!Hasgq9B{$hI!}s)dJb! z%4DjwdQ(sE20-04O7@xeqEEY!9$OzF&x*n@KgqZP%k3C5lOn`~o-pUiwqFas^2jNeO(tN@1I#uiO#zn6Gy3rC(K?%u=xE99gy>XDg>Szx_93 z5xSxW!279TdJ-sWBO&`Cr=gUo5%wjhCY&pCskj5=4=e+~0rf`3SAsunAo3Ltn`nvSAM=BAgTOYXXuM+jx3bJ$HdJz;gwJd07 zNU45>dMg8evd)U965L9gco_@o2{YRahj#`J z*4yZ49aKdnD>jUo=3{kV@BVzqCV07BaJj;6_tPLIR$Y#n+>jcm{W>H*#{AxmU^U^d zS^b0GfdzYQj%8X&RYTV_AsA5d7v2wAS}@|%wr?H>>0H4 zo;Jl1%#jewSMU4C4^aWwaGv2>%HGCbRiB$`qD;wHM;6kcJV44c;S%{nnT)Y&3g{!O z@vKw-vRK%5%Bv3Goc2^O8NowRG_hL7!b0Y29bY~V`CUEgDAVYlGZonBkr1&yaqgzv zL!_-;4E-3z9TqD4OiU>`Wb4yq>SR{fYv+^o5YeR;76h4c-Gi*pHq+L+uhLlAU+g3k zP;YYyHJu8xiYhk(6b9`tx7w(KStX<z1clC~e9 zP{;@!Q)QL04G%iti@@#gQVpL}(E8>2J9fc)*IvrK1iea`1<p9Oi)ah{_-Bl$!F zj)%vc4g-l5J@L2X$3?z2A+P)nSDz54nCT)`za6xO?copo%NV&>T9FU0lyB{V2spbQ zfyksy$?e?CBN01ix23;Z(vDAIj z30L!Z8pHesBmAv3+cHV1&P^yowqdf|2GwseszJI7yA9vOO#276T6d4wZ;J#tmTQVN z65i2E0XZ&5X&UI?)CFrUwrm9Wh$&DtvRFEe^mY50orHFwt%6T-doS& zt~DeHJ>Gp>peY6ZEb5F>beY`gG^R}Zhe|9vimP%d#VH36W9VrA!*lttDHg=SkOE35 zSd?CpooD*eJ_~Q8g!FqxpKWl4^aR)cI1d-}^yIhEVC{HW)mMLy-@YT9n%>$?Q{Q}& zwa))u&Xo5tr4oAOPM`_f=TV-2@*Xr7t=O$;TX0FTx!e+>8@_jlGGF@6V?I-rgYRt! z7|VP-${CL_8V==ZMYVWi6Re-u^|FXXrOyo1)zTeffx<>0kz2ebhmCQQ;(lM7=0xba zPxmir5rJ=$CKn%B`+^W|Q=Eb)+pO(p?2x7S zlTfamTvcpw*w1EE?tb?T3-+mkT$aRjeMK9K<(Uc+nRK=&$Vzl7wMoo<- zY_S{d@YH7p)64`>wCNnqWi(ohw;%O`lOv7Z94-3hl&Z#IFxnfD#R9GP`&nL=p9}}8 z`F}>X?mcP5eW~2M-xepW=hBKOLguh~@MdNPN+cp?qB7U#i_E73~)_>n!u zDdoP1$4eCIgZGeBSel7?m32^LH{DUJ-T;wnaRikWR`o@8vy*2(aISHoP8v9MVOUVD zR)DE(fNTX=P)wGJ7p^BHlI`|s8p^mE{oKQU2{4i2b1z=fYZRZ-;=LoK_e434-MKind6j%p$bXQ#oXQ*V7X$Dfw;nQC;ms zN)$m$JmL-|B)x@%lT0y!i6fHKUbCRRNpRXlhuGX{%E(M*UzseoiepT|`HWCs+Oo=c zVfe-?~nJ#^W1aqIrp6VeCk%`)GaPkU9G#O07^VU5&#}4-k;+C8ytUw;ct+%a6x zLzjQb>wiUjKM?@1!lp<48OVbzie>|lb-DlRKxJnEb8(EI+VCCA0{(w(zcUWF|)mEB{#{$wp4>H#2T&-P2RW3a}tm$ znp5BpMU+{Lo77chhK|+mg_KRS72j0QsMy{mK$3mrN!U8JMUeL-QEcCmYKAjfdqZk) zBB~ExJM0=^=Dv-D`*w_pTcN?Ut2(LNLu=uW`fAF4D;D;ce6?2qPo~?iF1IRjQJW70 z)Pk5O88CqST~UbcgNp>9x+`GvA~#^M<+@;h$#_af0i~Yxh#(9ZB~pf|Jg6*r<;k--EN|)N1lE; z(VKd9PmAizTei4RFi>tLWc9P;E^5^;;69ph^qAqOVDzY?Tn6CGfTpMXdo>)?*91CF zbESMK4DRDodA{EmJtYV7pyMW3630AU*LqgQ!oy-s#M)qeaadPMEG{nf1`1-~FOb+& zy23;nFV}tZiL8yI%1e;Ty5(J;z;CDhgAYd6LfutLn2evMc108v6OGq?$iqB~#$Sb4 z;a6v!-5!iNP_san4aEMUb2d36vo%Q2iLp`7s?$%ob64MG0;JH%FtY@+C^wI=tQ6V3XQ z0BL1q#*7D^m!l7HmC&~rix<1vzQ5WXZgD**Qhzxp#g|!tZg8$T8n1XmB=C7w2>r4L z($p|G{_SUIn-WAG;*;6bICMG{771a#hDS*5@j(kYrtgU<`2ndnkxOnduXgIG@KjY~ zOaol{hrPRLXF~}5-jDi2qm{)Nl;ifQ5a0GUj6=gtJ>Gw>Uk{DCu7kf~-f#j&=RrUL zT!)ZVx$xiU7HG%~T}TZ)Wbtw5OVmxN>TkyBCcdkg8wW^!YH|G~RpWF>r{4L#bUbT8 z>d|Dc=V9kn=*8C1)JX5ci<2RgA{q@TJ3k20gPtrOO=@2ZxD~4eVk!C)Q@_?8t3{m}cY!ccN>>J2uB;Kk)F-j_EG8v}!w#HSfn0jU7~@W%LwfOtOU+|adnx+* zJC?NAq|1<;qVJ-XV@5&^_ZdLmOz~lTNwlcAJT_8~92zbVILoSaY29<~Ab-8(^XPg9 z@#PR&_lGx8;29DWRfIOcLsZY4>{ERSxjOb>inK;towj~H*T?!t4^?s?GGB+(vmKW= z4Tc&ied&F|$;4jlUrEFh10*qIMiNEZ^o+mWa8=>W&o4J!>ln+>kxU^-ppQFFzCpN( z89Z(&JFBa-}VTOE{eN?w6XwVTrjHPC+5HWtX4iz_gF+ly9L z$?_;~o?+M9lS#;t(%364cqSao&=pamnWO$vAXS{Yyr#-Gxa;#0O$y%6dirdr1o*n> z6!MwdPxhJNw4nBSqUnQt!INLFTxGDuQ;yhT89Q-wg}qIiRGVI5d}Z$Om(V~_VFsC< zH#%;X9kS;4ay-IVGMQSR9(YjLtE)WZbJ&P1_beidW{i>y(uB>2`_@3sc86!Z;&qyoxa-vDbQ<<1$Mx*HU z%?KCgpOAe|yzNiRvXD8)Y2U;|_N*QKkKABObBq86G;x;)Im?Zlje`YIs-p?SGH?2u zi)`QYQG<7cA84llvaZsf=}R&yYtyKsXf7&R)qz>TEVl1`UUU!-RbqR$hlb`Ww{(<1 zll;q5Ys$QHgNuv1MCGl1FCZ5IZ`g zxzJ-$9<7RUQl6~a#k7ni9%xz%Fi?-Es#u5B%LkBVruKOFXG(V#J>g24*PT`7sF|j8 zd2_fd(;a9v2+KpgvBU|}sBX0=2O{h+v`k{jGB*Ct(`^HTz*ThNZWc)uaByY2J%&$~ z`OcJI!gL_jD$pN1@~O3z#VtfzR}7rR?iQk$!Miey$<0|L)gA_*xtxIq#hB*mFL{{s zw3LS{uo{Jo2i5I9w`F^=7Jfvg^y!`gT;lj~6Ws4M6SrwI$}RQUA2w4yDW{{Z2WK~r z9KcdY>W$LAICLRnd`!h(-Y1VHlbeI zr0|V=9Nu(dh9ebPp03IJ**KX6H#ys+dbJIvHpvES8?t-)okreUt!8G0aL*=w-u`h+ zZp2$!{o?rMovQMjN;szS-6zv$zmqJNRG{7S_KX|vnpuS_@Zw2wk8CkV0B+mL=NSvP zo>*6Zfi7^HVeU$UXcTg&TZ8pPq*%DZ929DGG$JVF8Qvk$_)o&!m106FDrZ>jPXwwy zXn;i%PZV2_W$`<|HadwV5;B-lx5p|BmMDk6Vl#V;DlloHwfUt1E4|k6UUBgiSI4Mp z#*e8(8YjOB1*~Wmcfb}BU>-wZybKZGBU`r>B2ah}DqNYJJ-u@Qez*xcYgB5Ye)q%f zt{+hXYSkF6_Hud75JSCScJGmM<=w&7B_RFkZ3W#iN+Mbxr(Cn$ip#eI$x)h{7zbS6 z6Z3#BiRZ4fcL_;}2L=UN4ue{Jh~lXPQcr4HFLS=WFC;JBzICLG4?DM#PYaUO%I=kx zu&sC74}I?l4H}mRS+D}g%?-$xrzPr;JV$9}S!_1wqPpw_?E7U67L%Cojef*%(a<0L zU;Df`>oSjKqXgq@8KIV0@;_uA%{8f8I!R`=7X>4y{=QiANNJ^SAO86ZR?zq|vv57L z`@I}f0CgIz<0qIwwhGH+$ib&RYZ!x`Lh+C9?Og>-u5@_<2a)cwM!dFW=er$kj%-G( z-E!zdH=1d>w%b2eX#Ht@T|DzCda7Qoc-MxWAHWKM(_7!>uHm^u2a8SD*nx-0?3TuD zZmFix29@QNxk9a9yjZq&?D5TltenkddA;T3A3Y(PEEtUiM<1xo;rV}H_Vr4a zJmIOG7=tw#JU8aSp^~=}wG$Fpcj0R8&pXhvYN`9D%q~?=mr}MPIQ%9xL!qnK!^fqq z!_<}q4)<*`L_1xjOwyNCg0+)3MMwy7P(H#RYpfsM7)k3qDfYU28STzuSl-!l@L(3Y zI_C-0nKvs+FKoYfCg=Drpw^qn;C6G^k+XOGhz=7LXbtk&L#b=k*9(Zyyz2Uxo8E+G zf;zFQ*H{(c9PXdpj83eWeB8w_S*9 z#oy8Lzb3P84b6?Oe!KQU220KncO*M14fRv$MiNK*EzcdlLI%J2_0S_qguSZIS!gAV zBK!f;i1bA%?Jq-f?iL6prA?qnVbc;FTewj0=)iQGf{TgegoDNM*+tcEynY}qV(R5? z5u}=oAy%wY73&>+lG617egjTaLZc?>8w(+qq*~l$AM-5}3cxdxg-XCb8GsD|BS^%wc3mQgqp%zOr z8jZ9OckI5;x*3x0sw?ng1E+t}S$&w!R`WbdRi}`Br?zw5Z(Q6d0dEq2$@9&>Yc!J*8{p`RLZh zDqEy%Rupzsh3D`fi1^z#HjXRYPiNl9hI`SEa3~wkos{CLltt_OIufAI8j%c!ia=MK zrbjwK(Q;j%CpfIm^SmWh#LCrBETGV;+9*y?Gp?1A*QQKkOa+ZS+oy=E&3jHGq4NP@ zuF#mXLH_6w%1py-0&$$u=-y7~fsw(e3EGv0dx6H5w6z8q_Yqyq7sC>*q~#ZkEAO}( z1Kjk*+yDGuH?^>m{i|sXs*Dem9CIQ5gtC=m^Bck0b*dCpR1ZCg`A18>D3%@8+%L&< zGFb`luH5qROhwPseEkS{J&Y25kK}N>=9Z%?(rytx6-v$_7}XZ4Ai*6x9;bLA;O&po zsPO0Z4-xEe%CV!U+e>N@7nTQg(`((MbdY}`m?`~ zXL)Jb8|6lnR1YXFCN8j=2MX&cMn>}1bE4gqZt(}#%jt}5A9Q);=|6t@ zg2e0vju=#L77MHaN#j0R9kqBaUno;9CGFV}+QD&4_;iawQWd)az>&87g8AaghDB|` zG(k+Yze{K1Skhp2IX@ez!yYos*XIuDOs8nq>}xu?ux}HHmvz|Lxm { + await queryRunner.query(`update usager_history set migrated = false`); + } + + public async down(_queryRunner: QueryRunner): Promise { + // + } +} diff --git a/packages/backend/src/_migrations/1704813169210-update-end-date-migration.ts b/packages/backend/src/_migrations/1704813169210-update-end-date-migration.ts new file mode 100644 index 0000000000..9e529a41ae --- /dev/null +++ b/packages/backend/src/_migrations/1704813169210-update-end-date-migration.ts @@ -0,0 +1,79 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { In, MigrationInterface, QueryRunner } from "typeorm"; +import { UsagerHistory, UsagerHistoryState } from "../_common/model"; +import { usagerHistoryRepository } from "../database"; +import { getHistoryEndDateFromNextBeginDate } from "../usagers/services"; + +export class UpdateEndDateHistoryMigration1704813169210 + implements MigrationInterface +{ + public async up(queryRunner: QueryRunner): Promise { + const total = await this.countHistoriesToMigrate(); + + console.log(total); + + for (let cpt = 0; cpt <= total; cpt = cpt + 2000) { + console.log(`${cpt}/${total} migrated`); + const usagerHistories: UsagerHistory[] = + await usagerHistoryRepository.find({ + where: { migrated: false }, + order: { + structureId: "DESC", + usagerRef: "DESC", + }, + take: 2000, + }); + + await queryRunner.startTransaction(); + const uuidsToUpdate = []; + for (const history of usagerHistories) { + let needUdpate = false; + + const states: UsagerHistoryState[] = history.states; + + for (let i = 0; i < states.length - 1; i++) { + const state = states[i]; + + const nextState = states[i + 1]; + if (typeof nextState !== "undefined" && !state?.historyEndDate) { + needUdpate = true; + states[i].historyEndDate = getHistoryEndDateFromNextBeginDate( + nextState.historyBeginDate + ); + console.log({ + structureId: history.structureId, + usagerRef: history.usagerRef, + historyBeginDate: state.historyBeginDate, + historyEndDate: state.historyEndDate, + NewHistoryEndDate: states[i].historyEndDate, + }); + console.log(); + } + } + + if (needUdpate) { + await usagerHistoryRepository.update( + { uuid: history.uuid }, + { states: history.states } + ); + } + + uuidsToUpdate.push(history.uuid); + } + + await usagerHistoryRepository.update( + { uuid: In(uuidsToUpdate) }, + { migrated: true } + ); + await queryRunner.commitTransaction(); + } + } + + public async down(_queryRunner: QueryRunner): Promise { + // + } + + private countHistoriesToMigrate(): Promise { + return usagerHistoryRepository.countBy({ migrated: false }); + } +} diff --git a/packages/backend/src/database/services/_scripts/data-anonymizer/dataUsagerAnonymizer.ts b/packages/backend/src/database/services/_scripts/data-anonymizer/dataUsagerAnonymizer.ts index 935c49dc5b..bb6c8ee005 100644 --- a/packages/backend/src/database/services/_scripts/data-anonymizer/dataUsagerAnonymizer.ts +++ b/packages/backend/src/database/services/_scripts/data-anonymizer/dataUsagerAnonymizer.ts @@ -12,6 +12,7 @@ import { usagerRepository } from "../../usager/usagerRepository.service"; import { dataGenerator } from "./dataGenerator.service"; import { dataStructureAnonymizer } from "./dataStructureAnonymizer"; import { UsagerAyantDroit, UsagerDecision } from "@domifa/common"; +import { myDataSource } from "../../_postgres"; export const dataUsagerAnonymizer = { anonymizeUsagers, @@ -45,16 +46,23 @@ async function anonymizeUsagers() { }); const usagersToAnonymize = usagers.filter((x) => isUsagerToAnonymize(x)); - + const queryRunner = myDataSource.createQueryRunner(); appLogger.warn( `[dataUsagerAnonymizer] ${usagersToAnonymize.length}/${usagers.length} usagers to anonymize` ); for (let i = 0; i < usagersToAnonymize.length; i++) { const usager = usagersToAnonymize[i]; + + if (i === 0) { + await queryRunner.startTransaction(); + } if (i !== 0 && i % 5000 === 0) { + await queryRunner.commitTransaction(); + appLogger.warn( `[dataUsagerAnonymizer] ${i}/${usagersToAnonymize.length} usagers anonymized` ); + await queryRunner.startTransaction(); } try { @@ -63,6 +71,7 @@ async function anonymizeUsagers() { console.log(e); } } + await queryRunner.commitTransaction(); } function isUsagerToAnonymize(x: Usager): unknown { @@ -113,7 +122,7 @@ async function _anonymizeUsager(usager: Usager) { return usager; } - return usagerRepository.updateOneAndReturn(usager.uuid, attributesToUpdate); + return usagerRepository.update({ uuid: usager.uuid }, attributesToUpdate); } function anonymizeAyantDroits( diff --git a/packages/backend/src/usagers/controllers/usagers.controller.ts b/packages/backend/src/usagers/controllers/usagers.controller.ts index 8ee5fdff3f..44d49d3f31 100644 --- a/packages/backend/src/usagers/controllers/usagers.controller.ts +++ b/packages/backend/src/usagers/controllers/usagers.controller.ts @@ -189,7 +189,6 @@ export class UsagersController { await usagerHistoryStateManager.updateHistoryStateWithoutDecision({ usager: currentUsager, - createdEvent: "update-usager", }); diff --git a/packages/backend/src/usagers/services/usagerHistoryStateManager.service.ts b/packages/backend/src/usagers/services/usagerHistoryStateManager.service.ts index 7bfec93efe..eb57090d3c 100644 --- a/packages/backend/src/usagers/services/usagerHistoryStateManager.service.ts +++ b/packages/backend/src/usagers/services/usagerHistoryStateManager.service.ts @@ -25,7 +25,7 @@ function getHistoryBeginDate(date: Date) { return startOfDay(new Date(date)); } -function getHistoryEndDateFromNextBeginDate(date: Date) { +export function getHistoryEndDateFromNextBeginDate(date: Date) { return endOfDay(subDays(new Date(date), 1)); } @@ -141,42 +141,30 @@ function addNewStateToHistory({ usagerHistory: UsagerHistory; newHistoryState: UsagerHistoryState; }) { - const states: UsagerHistoryState[] = [ - ...usagerHistory.states.map((state, i) => { - // TODO: s'il s'agit d'une décision, rechercher la précédente décision pour indiquer qu'elle n'est plus valable - if (i === usagerHistory.states.length - 1) { - // finish previous history state - state.historyEndDate = getHistoryEndDateFromNextBeginDate( - newHistoryState.historyBeginDate - ); - } - return state; - }), - newHistoryState, - ]; - - return { - ...usagerHistory, - states, - }; + if ( + typeof usagerHistory.states[usagerHistory.states.length - 1] !== "undefined" + ) { + usagerHistory.states[usagerHistory.states.length - 1].historyEndDate = + getHistoryEndDateFromNextBeginDate(newHistoryState.historyBeginDate); + } + usagerHistory.states.push(newHistoryState); + return usagerHistory; } async function updateHistoryStateWithoutDecision({ usager, - createdAt = new Date(), createdEvent, - historyBeginDate = createdAt, }: { usager: Usager; - - createdAt?: Date; createdEvent: UsagerHistoryStateCreationEvent; - historyBeginDate?: Date; }): Promise { const usagerHistory: UsagerHistory = await usagerHistoryRepository.findOneBy({ usagerUUID: usager.uuid, }); + const createdAt = new Date(); + const historyBeginDate = createdAt; + const newHistoryState: UsagerHistoryState = buildHistoryState({ usager, usagerHistory,