Compare commits

..

103 commits
v4 ... master

Author SHA1 Message Date
Noah Lancien
99d6865665 Merge branch 'develop' 2026-04-23 09:35:11 +02:00
Noix
e718a3eca9 Merge branch 'issue-crm-52' into 'develop'
Issue crm 52

See merge request ldc-web/projets/crm-client!19
2026-04-23 07:34:26 +00:00
Alexis Gousseau
59c94e16e5
chore: 🔖 release v4.1.8 2026-04-15 12:21:07 +02:00
Alexis Gousseau
91d341b2e9
fix: 🐛 remove sending brand id in claim call crm#52 2026-04-15 12:21:00 +02:00
Noah Lancien
654be241e4 Merge branch 'develop' 2026-04-09 11:36:13 +02:00
Noix
d6399f77e9 Merge branch 'add-germany' into 'develop'
fix: 🏷️ add Germany to the valid countries

See merge request ldc-web/projets/crm-client!18
2026-04-09 09:35:23 +00:00
Corentin Huet
439e042a0d chore: 🔖 release v4.1.6 2026-04-09 11:34:22 +02:00
Corentin Huet
30830596b1 fix: 🏷️ add Germany to the valid countries 2026-04-09 11:17:23 +02:00
Noah Lancien
841cfc800d Merge branch 'develop' 2026-04-09 11:13:48 +02:00
Noix
99fcd5b4ce Merge branch 'issue-53' into 'develop'
Issue 53 - Association customer à faire côté Serveur et non client

See merge request ldc-web/projets/crm-client!17
2026-04-09 09:12:25 +00:00
Alexis Gousseau
f09825531b
chore: 🔖 release v4.1.6 2026-03-31 14:08:19 +02:00
Alexis Gousseau
72440ce83d
fix: 🔥 move claim customer association into server side 2026-03-31 14:06:33 +02:00
Vincent BRIDIER
53172d00de Merge branch 'develop' into 'master'
Develop

See merge request ldc-web/projets/crm-client!16
2025-10-07 10:47:34 +00:00
Vincent BRIDIER
47c041155f Merge branch 'claim_customer' into 'develop'
chore: 🔖 release v4.1.5

See merge request ldc-web/projets/crm-client!15
2025-10-07 10:47:12 +00:00
Alexis Gousseau
6e160ab567
chore: 🔖 release v4.1.5 2025-10-07 10:35:47 +02:00
Alexis Gousseau
a7be8bbc46
fix: 🐛 update claim customer relation with hashcode 2025-10-07 09:20:31 +02:00
noah.lancien
9aa66a8b3f Merge branch 'develop' into 'master'
Develop

See merge request ldc-web/projets/crm-client!14
2025-09-16 11:07:23 +00:00
noah.lancien
3d25f43f8d Merge branch 'claim_file' into 'develop'
v4.1.4

See merge request ldc-web/projets/crm-client!13
2025-09-16 11:06:04 +00:00
Alexis Gousseau
9e968e71e1
chore: 🔖 release v4.1.4 2025-08-28 16:41:55 +02:00
Alexis Gousseau
a7d7436b10
fix: 🚨 resolve phpcs errors 2025-08-28 16:41:48 +02:00
Alexis Gousseau
664dd850a2
fix: 🐛 update claim file validation 2025-08-28 16:41:39 +02:00
Vincent BRIDIER
cbf6f8c9be
Merge branch 'develop' 2025-08-26 16:41:06 +02:00
Vincent BRIDIER
04f3bc8698 Merge branch 'claim' into 'develop'
fix: ✅ add missing client tests for registering a claim

See merge request ldc-web/projets/crm-client!12
2025-08-26 14:40:46 +00:00
Alexis Gousseau
dd8ff9af78
chore: 🔖 release v4.1.3 2025-08-26 09:43:57 +02:00
Alexis Gousseau
d6d9b9d54c
fix: ✅ add missing client tests for registering a claim 2025-08-26 09:43:27 +02:00
Vincent BRIDIER
3cd9a83dd2
Merge branch 'develop' 2025-08-07 10:41:03 +02:00
Vincent BRIDIER
1f39c519a7 Merge branch 'cast_ctype_digit' into 'develop'
fix: 🐛 force string cast in ctype_digit method

See merge request ldc-web/projets/crm-client!11
2025-08-07 08:40:35 +00:00
Alexis Gousseau
1c24ce9ea5
chore: 🔖 release v4.1.2 2025-08-07 10:39:30 +02:00
Alexis Gousseau
0ce322ad94
fix: 🐛 force string cast in ctype_digit method 2025-08-07 10:32:58 +02:00
Vincent BRIDIER
de66204060
Merge branch 'develop' 2025-08-06 17:16:10 +02:00
Vincent BRIDIER
28596bc9e8 Merge branch 'single-optin-answer' into 'develop'
fix: 🐛 update optionnal answer id parameter when set new single optin for laravel and wordpress

See merge request ldc-web/projets/crm-client!10
2025-08-06 15:15:32 +00:00
Alexis Gousseau
ee2b26e67e
chore: 🔖 release v4.1.1 2025-08-06 17:14:57 +02:00
Alexis Gousseau
8b37bc50dd
fix: 🐛 update optionnal answer id parameter when set new single optin for laravel and wordpress 2025-08-06 17:06:00 +02:00
Vincent BRIDIER
b0f5b6d47a
Merge branch 'develop' 2025-07-25 14:44:58 +02:00
Vincent BRIDIER
2746ed89dc Merge branch 'add-api-route' into 'develop'
feat: ✨ add new api route for sending new claim

See merge request ldc-web/projets/crm-client!9
2025-07-25 12:44:10 +00:00
Vincent BRIDIER
073725a56f Merge branch 'segmentation_optins' into 'develop'
chore: 🔖 release v4.1.0

See merge request ldc-web/projets/crm-client!8
2025-07-25 12:43:50 +00:00
Alexis Gousseau
03b18a083f
chore: 🔖 release v4.1.0 2025-07-25 10:16:49 +02:00
Alexis Gousseau
833d024d99
feat: ✨ add optionnal answer id parameter when set new single optin 2025-07-25 10:16:40 +02:00
Alexis Gousseau
b6af059d72
feat: ✨ add new api route for sending new claim 2025-07-24 17:22:51 +02:00
Noah Lancien
c531b093c8 Merge branch 'develop' 2025-02-27 10:21:29 +01:00
noah.lancien
1cb88fce19 Merge branch 'fix-customer-activation' into 'develop'
fix: remove toggle optin in customer activation

See merge request ldc-web/projets/crm-client!7
2025-02-27 09:20:31 +00:00
Noah Lancien
392c3d77f2 fix: remove toggle optin in customer activation 2025-02-26 17:02:25 +01:00
Noah Lancien
588e74e951 Merge branch 'develop' 2024-10-22 11:11:29 +02:00
Noah Lancien
b02282e8a0 fix: save customer optin after it changes in WPCrm 2024-10-22 11:10:07 +02:00
Vincent BRIDIER
7837f78bf8
Merge branch 'develop' 2024-10-18 14:52:35 +02:00
Vincent BRIDIER
d43da6d6a9
fix: LogLevel Enum type 2024-10-18 14:52:25 +02:00
Vincent BRIDIER
846f1b459c
Merge branch 'develop' 2024-10-15 14:22:52 +02:00
Vincent BRIDIER
29a93b1f92
feat: Clean bump to 4.0.6 2024-10-15 14:22:42 +02:00
Vincent BRIDIER
f9dc59ff15
Merge branch 'develop' 2024-10-15 14:17:17 +02:00
Vincent BRIDIER
f7e9ab78a2
fix: Remvove Laravel deps call + add PHP>8.1 compliance 2024-10-15 14:16:43 +02:00
Vincent BRIDIER
ad5009402d
Merge branch 'develop' 2024-10-14 16:22:13 +02:00
Vincent BRIDIER
d7c4018d01 Merge branch 'v4.0.4' into 'develop'
chore: ⬆️ bump to v4.0.4

See merge request ldc-web/projets/crm-client!6
2024-10-14 14:21:55 +00:00
Alexis Gousseau
99212285a4 chore: ⬆️ bump to v4.0.4 2024-10-14 16:20:32 +02:00
Vincent BRIDIER
77dd3707eb
Merge branch 'develop' 2024-10-14 14:42:11 +02:00
Vincent BRIDIER
10bd5ebb85 Merge branch 'v4.0.3' into 'develop'
chore: ⬆️ bump to v4.0.3

See merge request ldc-web/projets/crm-client!5
2024-10-14 12:41:33 +00:00
Alexis Gousseau
b0eb36daed chore: ⬆️ bump to v4.0.3 2024-10-10 14:49:13 +02:00
Vincent BRIDIER
01c616ef33
Merge branch 'develop' 2024-09-11 17:06:51 +02:00
Vincent BRIDIER
a4f962c9a7 Merge branch 'v4.0.2' into 'develop'
chore: ⬆️ bump to v4.0.2

See merge request ldc-web/projets/crm-client!4
2024-09-11 15:06:26 +00:00
Alexis Gousseau
f11701ad4e chore: ⬆️ bump to v4.0.2 2024-09-11 16:37:41 +02:00
Vincent BRIDIER
6d5e433f9c
Merge branch 'develop' 2024-09-09 15:27:15 +02:00
Vincent BRIDIER
8cb649bb5e Merge branch 'v4.0.1' into 'develop'
fix: 🏷️ add Netherlands to the valid countries

See merge request ldc-web/projets/crm-client!3
2024-09-09 13:25:14 +00:00
Alexis Gousseau
72c1c4283f chore: ⬆️ bump to v4.0.1 2024-09-09 15:23:00 +02:00
Alexis Gousseau
23d86024ef fix: 🏷️ add Netherlands to the valid countries 2024-09-09 15:21:41 +02:00
Jérémy Munsch
150aaeeb78
Merge branch 'develop' 2023-10-06 16:16:33 +02:00
Jérémy Munsch
0f95357f46
Merge branch 'v4' into develop 2023-10-06 16:16:16 +02:00
Vincent BRIDIER
d0287ff9c3
Merge branch 'develop' 2023-07-05 17:12:24 +02:00
Jérémy Munsch
41e2fff7f7
Merge branch 'develop' 2022-08-24 12:06:04 +02:00
Vincent BRIDIER
181b320e09
Merge branch 'develop' - Add CI 2022-08-24 10:01:40 +02:00
Jérémy Munsch
70043b227c 3.0.3
-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEENM6P8RR0Fd/BNUDJGDYa87/sD+wFAmKhvFAACgkQGDYa87/s
 D+w6XBAAo0HaUUi2ArCO6VnQQfMmSIFhF2cr1ZT5CcG8quK19AdWrjwwanyx9ood
 r55GOjKHF2g/Hs5bg63xiKsDsMs93ZZks8RmpktMb50YSCnRQraOZ9dWQG/dIn2V
 VvUISrcqFFMiAObcKyzfzTWhQaFpPz3oBf9tf52zf7ZM61DrwfA4xCItGA/3hQmx
 aQleMOkRX3vSphYraSqLwpENWXQYEJKmgGCTr0Pq8KMfsOYRO6+JXwGjQVQuFXtL
 uHvCTsUVxw9UYpzA/PqoUu++nhDbKCWjDiUaOLeNmXdMTN9n4TK+7fstDWpLZ83q
 GgxTcQt4ES7S/cqZ5WFW9whDQUqoywjNokPKjJfZ0BF6hpPvMMI0EBkdZiI5X7uP
 E1d2mhbzmJXu0LOnMEyqeU6bbeVSdm3F1CNjoN68wLgGHhZ2zt2zoEMbkJZUya7i
 jjl0dRj7wXRE8VRcheixQ/AWCAyORs0c+nigQsk/dWpxHT0dyBlmn0fvt9SleWB9
 hYVy/DDTxNstV0OHNiLNnU6SfSEPKCxt7B5tBw/cCJHo5go0kFYRpC7ka8G67+M1
 /WV+1u2ZdoyQQCxD+fjuWXAGZVSC+SAa6JjdyItDhZzLzZp5IjU+rCDPjYetf0sZ
 cU33khcpfdLtYYlfBYhBOVm2/zz1S4MtGYUV/jmpPJuRQA0r4yQ=
 =fTMB
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEENM6P8RR0Fd/BNUDJGDYa87/sD+wFAmKsj9wACgkQGDYa87/s
 D+y2IQ//TmkewKBjKXh3GVIwCN8yghM2ARLgYSvJAIqE4akBDyd8dAT0akY691JN
 3OfEBKJBQD+Ml1+gZq1vRVTxyYvfiJPl/LcuUzv2RL0MwdQ53wDH7VKXauOtr3yY
 r57RAYEHuYKRXPVHIoyg2vvy+snLZtiV8mhLY1zYav1AC4hYVlyuQ07AcCIipsT8
 K0ZRhjk2Z/2rLWa3uZoEaQN4AsD9w5Fqum+TctMKvhHhZ+Wp0x9gUa2SRgFbXvHo
 tSHblRU1svCAEK3bE43McPvYq2rndKwGJDFeWI7EfaKjZOWzaMRfISz0KeFgZ26E
 08d3rQA9TbV4YckUPOKF5Lj21UYY3MHIUuTC/MBSofcgMhYSHgNPwLjxBCOhlzv/
 ycZUFlVUIrc1H4Fw9JgHLTdqmu8BnDc5gJpuEK4bycsxKDKmGtMRnY/fVd2w3GxZ
 /UlS2WSbYBtjl7EFTIWHTG95Ns2+5qs86w40kwVCJDDspwoEM9U6nJhULAwbmCgj
 Nw32s/+D/eojBlS6LOLPWBS5LUGUagFzBMoaanHCqtow3ivJ4fwA6pdCF3Ks9thg
 QzboJNOQ7osBU4Fw1WXqf9KCyu/o95q43iEz1eoicIonucfdHdWTZHuNUfAjdCGk
 Jd4kXkd75toobxaFM5yf0UXI2VltMpG5KwBhRXmrw7EOMSJHoGk=
 =jR9h
 -----END PGP SIGNATURE-----

Merge tag '3.0.3'

3.0.3
2022-06-17 16:29:47 +02:00
Jérémy Munsch
df163e7fcf 3.0.2
-----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmIWDX8ACgkQVRlr7kRf
 YEnVRwwArH1fWtysIH8nyYzAFRGZVD/aUzcdZEDPcNrcwGAy5PMVsSm2LP6SCzk8
 f/DzD0am18HYLFAkY0lL0HqFXaIYwZRFQToREJb5YEsBSDBkBeJaabpWLx7yDluW
 AprNTccOtZZzCed5mQXRLSuIVEBrSGSR8Wuksa+I7+6mJACwCSAbMbVFthLiHktq
 LWSUA/mEAGTHg84qmSNKGCDaU9rK+Hwvwi7hn0althRWqod4tp8nVVsGeBhrLO7O
 SLGkxF4sEY3aU1/nz3KAxs+GtwDtjXnSoPKAPlzk+/yWHpe5JAqLygsL+rGvO3Y8
 6BOe2OPgo+Q+qwatZJ1az2nRY7PhBfWB9NvNBJmoGyZg8TVlljBwdYYClrgtmWtH
 wdH/jDVATybXjCOQt/lLPa1sJXndUWM6tPHqANSpP/ZyKe0iBpYdy0gHBVKhwjT5
 EXxLw+uC9zQFvQw9rPWyUFZwtqIssRrOGD62VQCsp3ddMY/lBEB58bPFvNx20NXc
 tNskET1t
 =24Fk
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmIWDY4ACgkQVRlr7kRf
 YEkAPgwAmt64CbKYfsW6fjhKsRdW9Ml7zlMyz+9icxF/vAZjl8B9D25Xclxz9u+P
 hduR3Cqj+dqraJSzqZkyAthAdD5IdyPEAObGgNdXUlEutz71RZHJH6zmYRoraD9c
 cnRLKlbF81wl+aOOz9nj9J8yeNCSXkjT3NHBHyiEhPcuKj6/GxdWwGdgmphEi+8Q
 ValWDUqYqWDTMJuXHGW0+J9Ocz625DKvPljT1A2Qih9dqqim6e31mlLPgMnrfG2R
 OjGtCRZTjnewINFzGUcffEdjHC2sdAKoUoLV3UWQM5SpIrfF3CK3pbEc+5rtRmz4
 IQRDuBPgQnJC4dDcpOYSLiwLHpig8NJI5cIs4/e93L1AJ+VKA9iA22jz+DVlleze
 CnwyCox18HYC3u0SVXja/psVNGCYH1OrM0rkxCrBZ62ecx3yN7feN9MvDp4vA/5G
 DKlwuUU58HtdiVL73hgPZHqvxCC4wnQXYq2lzpTal532Wt1B5n0v5HA5Jd3Gk9Kk
 QosO+iCg
 =h2Sf
 -----END PGP SIGNATURE-----

Merge tag '3.0.2'

3.0.2
2022-02-23 11:33:49 +01:00
Jérémy Munsch
b669e2010a 3.0.1
-----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmIGcDQACgkQVRlr7kRf
 YEmtNgwAqaz7/NUJ74cYx9VzrhP95aVn77Z8nRHoZUf0LNpXIaDkFchsuhTHQvRV
 72Yx51sfhvGpILLqIhMvRGoMP6qIry+86M6g1t6nMS38IhSi6tUsbXa3HBIsQfwk
 OH+GmhrhzNtCpk8mzKnHOEx4Ie/yGpl6LFbfb+X8qZgatjqEcg/zFBwlfW7JziiQ
 X9fV8X+utif3b9or7g5PWTvoJCd1+Vlh0cfOUuNa2mohC0R587lSm6cGK62sXbOp
 EQ9NBKumxC6c1CDQADaaY0uuLXTp5UApRmCr2wuKhhanM3XSI8MqJy8x8yo/jKcB
 zFAf2oFm/q36aOcFBgfDpIxM0i5BMkOJI6z9EXF7erw+SnBVJNhz4LUi5WtSaPip
 UUetmfywnnHtuRE1zTfOxyruF2WvpjlVgySRrgwn43+r9REJCMUuiZ5l4Dy6/BFl
 JOwWO/Q3SYae6v54NTxET6GQiwEUuCxpPvhdoPv9OtyDcU730748wza5CPs/nv3H
 kj8+R4Pc
 =7/kD
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmIGcDoACgkQVRlr7kRf
 YElmUAv+NmXTamlvT23WQM2xabHC0JvYzqnEdlU3zhe/rW98YfyHiBBozmJCKCry
 /QDmYK14htnBT8gROVb+8R5Ma/zfv0YGmt23+8CmU51kAYWS4WRSrXG1gMsGQfjP
 f2Ya0R7S3gxg7KHBTzO/IgumMmlS428YCQ3cGIbKvgSDkj1cwu3Mciw/Fe10J1HQ
 3+X7HbpUUvRWI38Requbx/Y5KDP7V7m8mUf4cUw9FkmggM8nqYbBZWxslPI6xiGc
 C+mIyKFvFI6UFr63WyMHWpBBxaDDadxhtzlpeMcp/3y9kz7br/Y6uRwxBEGNaA3N
 +wS/HRTwPKK6VeYIjV2pWLQV1XBpQenme6E1qh154RjEEd76Lqfb1Uy3/B7Ja5v3
 44W+zNwMbo4EJqf2472EBXfSxIoAodFobFerppmN2HuTip8Md9g7U0GTepTW0wSC
 NfqIAuMxiV6g1WBzQe2H+iWG4qTyA8PFmVw/egxXTGLvwFvX0zuZAz1k3wDRjNDG
 brMVTamC
 =zZ8B
 -----END PGP SIGNATURE-----

Merge tag '3.0.1'

3.0.1
2022-02-11 15:18:34 +01:00
Jérémy Munsch
32781fe540 3.0.0
-----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmHWpWsACgkQVRlr7kRf
 YEkj5wv/YBCZnm5rD7lJ2uK8HznreftwN1AcKB0sNWfOvYguL/vw3bG1ycdeypnL
 Den/e4PG8pcR0wpPjURdPv2V5HMco6ZBNPmrjaPkBJtedODD8fw8OMReRczdosmv
 xesS2TEjZoQDcqmEPZgVFv4TAPrtKtnRtKw9g/6bmc1ACUcci16Qvdt1BMdLs+XB
 aUx1tcJ0NLXSAzSyU7vGsh852vyYrFjCTmm69RpiFoy3KN/++GxaBsfCnq6fpocR
 SGO39ENroZRvSdbKcWCAV82cwRguFfEeZ9+qHm/BulbcvaCYgN78zFgFAPoZ395q
 NuRhxQdRBiIU3lCWQQKr3JGrQ11TZ1cRfa3AFTeGO3XvQBYcaqgosKbccMe9UAmL
 s4kX7TGxkWQZYx1AudTbub7NRx7BsjdsZSSnQ6CNRsLuAxTD3Es89IgLNXb+MksL
 HXItP5r2/YN2L+EUQidvqt9Qg+cHWjsHFC10omhV0sjnbkq6DnoQ0D9kWNsfUbNQ
 fxYZq2NO
 =/D48
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmHWpXcACgkQVRlr7kRf
 YEnKKgwAjMS06QtaBkrTZnOOf835QOjhhq2uj1cQbPY4/7FHw0liSl4j8hHcdZRU
 U8yCm5kpxYOArf4PTdMBX/pO3J8lpr46WlvAHfFGS2mRlcMUUJl+p7JA9pNq30lC
 qkBY8nll4qf9gPMznlfnRjhlVz/+UifwgBnoaQWL/+bOzckd/2SRjoXcrEwCuMIh
 pchDM79r11wcy0tR1fss0loZq70ftN0Nz2VKQvVPdN7L1s9DULzVHU4FXiLiRis7
 RXe9hmiWMgLN70oCpDAacpoHzq29TAm0crAJiqQ6JUqCIMzyvQorX6OtMZjtFlg9
 qnJs6KsQhp0/twYHGu6VMqMmSf6SDOSuYEniS/y9AH5y+Med5nWNdY/eMBcfLKH/
 h3iFCQotOR5xcER3I5unrN53//RD7j5sIKWmtK9gZFqy/ozWxXeoeG2nDxYZ+tJg
 5hOlRw05CiB5coBxrD2NRJmcOBbqbSyHdlr8FhM/UAynHchfXobZ8FPFEWpBynv6
 7xdiSe9Y
 =onve
 -----END PGP SIGNATURE-----

Merge tag '3.0.0'

3.0.0
2022-01-06 09:16:54 +01:00
Jérémy Munsch
f1398e1e14 2.3.2
-----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmGmPuwACgkQVRlr7kRf
 YEm93Av/bod/RPGO7bQ0VlaAEQSYa1/Bx8Z13xp1ejRlnWBHL63kNH8y28sLm4Wi
 nfMUOOC/p6YMW6wfMfLLkyo9mZR74Xrynx3GBeAGNP1OOEqBzJPQzQSyr9YgZO+e
 UkqOqEPX2UtNBudOXzFzz5rFk/e15ubIPpzQr8V83ksX2xoZXzyymPOqfFVGhkZl
 dKY7Nye+ETxbTFsdjI3jbLZODKqD8zxiTuaYZVDypAJ8Vcim+FFmWOEH52pSIoF7
 H9+jvyKnhfA2R63Fb0WP+QyJ+7fuYSsXgsh//YpWX+O7dWaGMminZq2mA9rzVlOW
 9dJkZ9urPhoAsPWL3tbB5szaEuU/pWocgcgEhm2puBmt7/JK5+IiKN2ztrcaXhyQ
 Aqi1YFI4v5AStjiNBTf5U0jX5qB3ox6e9TTPPKWxKnx9DW4tJIhc9UclJM6SoFhQ
 n0WWAoGwBCxW6yB3C2QNGh/4RKzo0h5M1lRkXBHILO4uCt6sr7xOStjabnkAFXxq
 2NW6+n3l
 =IswG
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmGmPvcACgkQVRlr7kRf
 YEm6Pwv9FeJxap0XSWrbszZizBYx0iUzBMBsUgo8d4+znSt6GB10T93UrbCKG6nx
 f4bxj/M/6U49Fq4+opfbM1oWDFWm3uapfaHpw/7i5Q+DSQsdzFmAZb+G5jjmxtSZ
 PDWxpdlIxdYWBm9huSR9R522KLQOdniJPJcRJxdM1skms/DWdPaskKMrb/rwDDj9
 Dmc9+WSW8Xk2ApeBDxSFPZJ2e734HXl3P0C32J6/sDiYRzPjGZIBayorapiqkeQk
 VxM0opdMgbU/EqAdbx9CZ4R39dnulXddAOXmy6aRUKvAJepUu8DZq3caultwnWjA
 vXRRyRp0lGTuRzVeqckrh9P3cItlaekUZoAHyKfFZYNXmuahdQE0ruWYRdzOOa6J
 2nBIxxZCPx10Eh/P+S8q0tMilujNf/4QEeTy231jo3sJG3PK8MbBzPBID3M2PdJn
 Jcj96xIHa++xqcQLoxCAdYeUD2jyNV5uMl5W6NkryJ12zyNgMyIXuk67TvUd0pCG
 SZMp7ytU
 =Gg/L
 -----END PGP SIGNATURE-----

Merge tag '2.3.2'

2.3.2
2021-11-30 16:10:46 +01:00
Jérémy Munsch
4a9a2ce451 2.3.1
-----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmGmM5gACgkQVRlr7kRf
 YEnx/Av/fs/K81mahvrqfWuC7YISkzZj1KWfuyjPZGewgMtlVZaHZv++YOPwEcfl
 6pYJ7Hj8Lu+F2sJxJDLc8iEZQwXwu7bLI5Oe8ijrj7Mg+hVr6TCeFahjFUjz35cg
 Enn8yAeDsaq7wTFIw9+b4vnc/TalPDD71WHKm4emobY8e1V10iJ3bmUk5J9pjZWL
 9TaqE4b+Hv4qgRj1BUpeaCpWV2piSHqhZNMnvcKhbJR9/uwIgboJhrCbQXt2wXSI
 zmm/TSGVaEI0hWYKUKYV0f8tszbQLzcvJWY/lWdGMDrtaNFIepLtHbjCSNs7D25l
 vqon3yszHyPkRdDGJWGc6HvW0tWuAI72XOaHoxTnWMEl2KGmO8rgLiEgQB+acBhI
 izcdyUx6RtpwfowlXUyMyIoFzvXa6g8fyJ18LkmpzAqLT6Y87tVVFM03KU3ot6N+
 GlfpgQVb8ZkhKKBtrgcvg3Db7a5cNnYotcVzgk7R/n4AGb8f+EOkUhvfqCvR2Wr/
 u3IwDSHX
 =GLXy
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmGmM6gACgkQVRlr7kRf
 YEld9Av/ZWvWs4gaKW7Y/lcUc3+tipMKRbD3d1DwDAC4NvzneqHiWY3GlRLWxYeV
 fvsQHY1oHNXhofk2Bw128zYsoQ9CHg+x9JEN5linVI6xMNibheFSkrlBMCANiRmm
 EpzNrAeG6OkfQLHHqljXLqdii9sR18B099dyBpeDgk+i9jenyb8JdCFGIm2uduPW
 LQusv2YUW3ITJoZzBNj2CH5UPg9R1fr0rc6p/8xdSlav9DeB0nwUOhwA4y2bN1OU
 eOMd0YeeSNZ51iZS7OTS/097N8VYxvtyO1k3Co0nxiOwsRJZPkMKpPkxskBPpJje
 4e8G4gBKcdiUwlbmH1zG4NzD4MmkPcW64OsvMUEHNqmIU7mNSdpkjTbjvt0ICwDr
 yNKlvLKhyq0ZmxHg+ZGCsxL5D7v+pBXBjzgTFyy9XefEc3XtYBjtWWpJipAyBs4R
 L9IB4ZmB+/b0SXXxz6Z27IfsgnWdvdb6umrQolq2KzSc9JqICiaLPn7ve+jMITH+
 QlQOgmlD
 =f14e
 -----END PGP SIGNATURE-----

Merge tag '2.3.1'

2.3.1
2021-11-30 15:22:32 +01:00
Jérémy Munsch
311a6c6c63 2.3.0
-----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmGFO1YACgkQVRlr7kRf
 YEkQMwwAi/faUHLiBXq5vIX7XrUdYZ7Ns6A7PRzJzLlHiI3NCGgs9iLEBXP/IpzR
 voXYzGYsQIfkV4ybHRbwfuv3X878GFy2SgdRBMUPWIMuUW+ObLzXOMbHNCABDAK0
 LG3QHpONXLQECiDssq2ncQi613OBzV2TAt4vCtvsYLYF5NdFsgYswE4vuc0BqhYV
 yf5cRbR9ldC0Q0tXg4aJo27mSu5GkLsvrygiwph5HogH1HdLepLsJj15rcjMmbSu
 bk9FGhj7SZvfrIdvfRyJFhTJ5tuSNOVRCv1GtPRn6DNMMNjUF92MpeIfJ2AZi/wQ
 Ag8cwnd/1dftqEe+W7SuDqLLTjacgOqa1Y4aAIAFScamDtTXDpnkPcOinX/B/Vcp
 B/Kg4vctsHbd33ZZfgHEGxn9CNwoLehMLXwKcWpYvKhQa7jfleWIJGQmSdsGeJg5
 T75Wm2mD1sfbndNDs/wan8Zs0NXkjEeoQ6oalHcawaMIO5s+LMmKE5rk4y9p4P76
 WvTKpi2s
 =mbpv
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmGFO3QACgkQVRlr7kRf
 YEnHjwv+P8dQ2RHcQV1PmLEZWcks3IzU1p6bR/cnq0eZurMsaHk54ahbTmoB4e+C
 vcJD22nVeoUBXE7fszVio6rzMl1s627wAqXXbxHIQAs7ICG9GoFtwY48XvcHCALH
 BfCY3VMPlP1/MCEsbjIqz2xNv3Mx5FLXmF03S6aueGxNSmKOd3S/fMlw0mzjeTBY
 aBgLIOuMJ3Regb9IJTZ6tK565mNN38QjX8Bj0lDGPWG3FiBsrst5vC2SWlxnhO8V
 B+AwYTMoLDEOSZqPY4fXqxlVri4tdIOqBffRFK+BAi9x5PGQoxBqmf3lugfrl2IV
 dWHCEbW+V+MehuhsRGqXMYIy3/7l8QjPMwL38ERfvKPW4S9+n6ZaHOxZgnE2W8oD
 FY9kDjluHZ5keDTaDtfX2uxElYx/6J+XgoaAgxSVcZsuzSsyJZdBjknK1F33PbLr
 iGCCNAW+JBk5vLmq46yCSMvo6yceX3Nw2P30PEEY9NiUObL69BasDEXtsYSlZVhg
 RgXeMGUD
 =7KEk
 -----END PGP SIGNATURE-----

Merge tag '2.3.0'

2.3.0
2021-11-05 15:10:59 +01:00
Jérémy Munsch
2917520aa9 2.2.3
-----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmF33WwACgkQVRlr7kRf
 YEn1OAv/bzR5BEOsvqMwKlUZ6WcjGBXQhzP9G13KaP/0UOnSbEOxCGX5Tmuyo0Hc
 mHXdTa40FG1KohcLrhHEhdhiGJ5fA/Tuy9L3q4SeAboBuDqk273oUlL1NIgHe02+
 j449cvMDwic5WzRhYAYwANEhryWRpaGjwC5KVxX8Q83SiBBcF262QAN7Qt/DULIr
 8oth2/jn2V+/33+IvK4FMtlwABZ1/h1LN2Ja+WX7Hx6FeT7xdLyJGjD/uYitM4aX
 44yi2qMeEcbuFTpkcQUuYBf5ggcATDiKl79QZJiqexNEY1RTIsNQ/PUfIw45YImE
 dObmmLiXPctO7oNbtaHOEgCskNHJtj6KXNLTuTMyT3xWmB1MvRdZzyS6RjWq6wP9
 om5Mggf+kq0VkGGgIex0l5LhLLjGOVquICfT+KIqwaTHCYca3EO6iawAQyOsyo/x
 RfOcIraN0IuPjvmDvJt097qm/VDh/b/YNuDfTf9YfU7JzaUNi+F2n2jNc/Ixmczi
 mwG53qj6
 =7/o8
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmF33YIACgkQVRlr7kRf
 YEmWQwwApuBhzmZ5ngOuOHllf1ek/HY9vT6KskBj7x4AmELuYffZX7CVxhA4S+mR
 PPmwIWE4xOWR/1ebkhZpw9J5KuNv7XAsnz/uxMUqlxIszhWCwMHny/jdsRrmDxXc
 +Q3cVhOrU2byPCfW9kmi2qV6fvVHNmqF62sh1fzBkhXh8vsdMhsUSh3qg/fDDr1j
 3Z4v2fotXDqbDaZtLdEPXOkvWkTrOACFtjJ1oc9BVUYFKMDFzmBSp5Rt9u+Ms1cM
 avVLcD0nM6tFcmD8xI8ZFvnGWipIpZndAzhHR/37IgzL7HKSM99OcGhd7E/o7AVT
 5y8Od7GPKHkYy/dkh0w+MfWzPWRrS88+ViTh8Qt9rodYQxr9TpRif4E03qQ1geCx
 H9CeqFw80xv4QXkEF2/wJ6LEcDJHE6cVQK9BPWFFCe/aZz33NSBp35rv6oihYdZo
 ZfUDXBR1oN8TKqYDQlDrIKlTbKsXy36SfwCJq+mJMIym7R7SIustt81wZyIwL8Yt
 3quXBTUQ
 =2IRg
 -----END PGP SIGNATURE-----

Merge tag '2.2.3'

2.2.3
2021-10-26 12:50:42 +02:00
Jérémy Munsch
df2fe5ae41 2.2.2
-----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmFxhiUACgkQVRlr7kRf
 YEmwYgwAm0N0HUMK/y7xUY/waCVgz73nu2fCl1ei2/psa82AMvi/B/W6a1fQRw0z
 +sAft9AqVRc/dnlOOKIrz2fAPWsVdbaQhSioHzsGnT1fVCidSEpzJHroiJpA1GQ1
 zF4MvmG9pRWf8ltedpKSmneobZMc2Qxj6WrXTOTRKe1RuhPlAfVqJEUK/kkLin7B
 OD2AnbT4sxGRSYB6WLAJ2q5QfsxOrSIzKIxbe9NJcSpbjutBKiPxmKACZPRPQYdK
 y7Cou9IYPLsKGnsa7JrAHayCjPbY/g8pwnqMOdlJrEdobwi9C0WJQ8O1QWG2rT1V
 9xx3nnNMMXIq3nIl7FiNVRgNwCVKV2rOFczuwSnIT2P6LB0p4eGh2jyjNuXQziQC
 G9eQyFw3fg2UPsXJc2qQx6Tg3x3U43woJmQjNFFF2EcbPaF4bXT466BoMWrYdY9l
 xw+tQwHtx9XWD/gBWF/Jg8ZyCvzrs037nwIvautfXRgHETR1r5JPcKVUaNRcZfAu
 Y0j2Q1lO
 =mk9b
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmFxhiwACgkQVRlr7kRf
 YEmFbAwAqPUvuPTLrNoTwkjYj26eDBLBet8EZS9kYTkWAaKKwMmbMqskgaH3xO07
 vStEg0rltc8PLYyYm5s1AINLx1mUQZmJhsRiRPtC9HsmfxJxB56Zwm71mfIQEXfy
 jEsYHqoHEpfGXCvnWw89vonSTnr8XUKNTa/AryEl/7Ql6XPb17tpzkNCJ7UoZExk
 WuEVs9SZGI1donja8c1f98ha+Rom3haCtfCWVh3IBXfYdW1YApY3JvNunQx9xCxE
 OcboavdFPVXBzDNAQJyx2MswQTHzoepi3oDMr9fdN1o1s2/ysVaMyqdRWi5DwenI
 HxDCYpAhClA19H+DTvSOUWYYXP8vTook4EOXuc56VfJwhbzPpMjAd7iN8hB5REz0
 7a6lapyiIyjO6R2H2CHQyZAlL/1VOVQb3F+uxyj9yjn78YpYcv565/RCShm0OzKy
 DX1czRfJqufz9fnEdIRi7+wYTiOa2OH8w8ClX2InXJY60eBsC8ArTb2AxxIDhJim
 MfvYlkeC
 =Mcp+
 -----END PGP SIGNATURE-----

Merge tag '2.2.2'

2.2.2
2021-10-21 17:24:27 +02:00
Jérémy Munsch
6c39a2ac3c 2.2.1
-----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmFwMUcACgkQVRlr7kRf
 YEmQCgwAnNULBKtkQFnnNqTJ1Jaq9gXfmkUhmvu7M9PdZ/qmWLRz196xn3WCc2YM
 7gYYXcllyomw8Q9hewcwFjluM/G1p5YcHLkJsejWaSo7Ppzt2c38/qSfeNoYcW8N
 /0FmIIdAVvvehhh0qydnmravjdOFh4JMkQKQseVLe3lz4VE04bmT2PVM+9CwHBOx
 Q0NTm3fjSDmatBkD2v7BrGJwLNXh1Uv+/X1aWOqOlbp2xLnEKS1Ccv5hjMT4LS63
 3W9zqtBylrQNGpt2GXFNPhBDq066PhBi99B+Gu/eUmaNCZ1D4gU2xCCxnodBp8C8
 U6uyePxHkCs5HH5yBWRzdfPVWJmPuUtqphOFJtnZFWR9iz6wmya2iAFGRHN6vKXR
 QuHQLcaBYvLnsZrn2XWHs8EB2fiXdgiGDv2VMlEgRPKKIgcoK2tcpVLmoHux3dax
 tbMboRcPIHLTmONdPJ6ML7EuPw5klNeiAelBT+kRzQ6F+xFjSlxL+kAgELGdOaNn
 FNBFtG8a
 =YQX5
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmFwMVEACgkQVRlr7kRf
 YEmMCAwAroMx9XBcZXyffvGTEZAQ51jnNM7EVZdw1BCwjrI7KHO3Yd5UcGvHuZLt
 f1OTg/kRPoyl4Uxwss8fIEjiFoyn7pGDXeUkrui8U6q/jCIFRIZPT4f8k3S/vi+o
 7kMCVEz8HZEQXYp8JwzVP0MhwVi1KOCtmJS7DuSZW4TiKNrtbibTudKKH5e4qPu2
 MiepW9LtnzaNhLuYxL7/8qDJhUPRdb5Gbb0AAYlw5zEgRLWNrmeuQ4DOyv25zUSf
 JU9ZZHZVuST9Al3ufamKKtle+eg/p2EiKxyEVVnjs+Oe4dhkwqL94iYlOxOoIm1O
 BM/wlfqgDADkXg/EyEI1yzaLv/YirCOcGLvhwqJ4mh+flqXUMZErNcQGeOD5tUVP
 wCOG/PZb8Op+XhVc/Zr77eS1dPwXyQIPgwrkp10aXd4JEvk4sSJ/A3/C1FgKl0Ej
 Ij4LY73zJswDOl30jLeAaf+51vBjPF5Dr0JXQHNDlP0w5ZbsCibs/b37xFGKe4He
 XEzAS1rt
 =6n42
 -----END PGP SIGNATURE-----

Merge tag '2.2.1'

2.2.1
2021-10-20 17:10:07 +02:00
Jérémy Munsch
c27c7dd1e7 2.2.1
-----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmFwGZIACgkQVRlr7kRf
 YEk3Wgv+PE7pPt3iW7NagmOJr+7amapJkbDixyOolHTHD+0KoR0RFki7mGGzSEe8
 f3dE/tD6QN57hKj6rEvjK4BgA9r/PE7C/ioMYnNL447x2WN8gwgH1AI/yN6n7txv
 FRVAnO8xzh77RlWKxJHK4h8R/yeRcJiBiafhVKlBhe0GP9IMJN4hxdlTk67V/I42
 evt/5Gss4EcXo5mBzAJvBuRtwRc66MhxBA8Airb4Wx/D2C5Wbph8MDKHpclaP4Zn
 yooYMwJwvvq3yH59CCaI5JKzK90ESa0q4uRSd1Pk8f332wrUVLf4ApGwdqldt3Q1
 F8ZttmzLqSabbqBVv0EEv/eoiUmzBP2XY8K+lROn3/K7sQg1UFJbc6n9y4GUFl3r
 wo45UTVUGqQaE8Oioz2OrXA6IJca8QwBBa9hNnO3iRmTrQOmneOrImqZVht8NoYc
 cOyUAHB73y91pagAMF95y1JxVSTvFhMV8sT2FruDIwx/mJgTZAVVonb/zh7N5/dR
 DezjSUtw
 =ZKP8
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmFwGZ4ACgkQVRlr7kRf
 YEmUTQv9Ehg/qVGd5u+u+z0eDF5kUvme/Ks5XoKX1BznpbP+PdlV/pyF2PW8Uzwd
 dV+notGbNco9m0+SArDOpPblXfQOo3d+Jf2vzXgQfW6gp757mOGTygdYi0aDfF0q
 8jQBV4nQ+/yhOIGWvJI2zWF9jbPJPjq5XV+UPm6dJOm9L55eXvHX/GeIv+bJxkaX
 QFFBOaI766ysL+HnV+0E3FvRRXCDnqyzteZKIK0kJVrT0tqhDNGnyzh7Vqk6cCsL
 5yV9zhvyw8aYrfDB5T16yyqWXrz4hnkOvBGfecLz/SiexzPzyIj8l6U0+Sz7bpOy
 Xs5155WAq9qxVWLoU8r6ArMlEHOyz/cFxGaj8wqRcH5487lpnweOYFUZXlJz2sVQ
 t+AAMLHPOTmcPft/rBDwd8CIYKRYgEwd5VvTOgMTCGUz6i+gCP23WXLyCkvZ8DbL
 O3JChfV0F7aq70XQvuz79ntCL3IAw7SKyVzNr6w+1SkYcUNBAaSOLTANXYFG4OqO
 rI6ROOk+
 =YT3I
 -----END PGP SIGNATURE-----

Merge tag '2.2.1'

2.2.1
2021-10-20 15:29:02 +02:00
Jérémy Munsch
36709d3668 2.2.0
-----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmFtHD4ACgkQVRlr7kRf
 YEmEpwv9F+RKD+BSfQrxBswQG2Y1TTfbH7GF6bkGroHwuLl3CUdsxqgRC54zOqr0
 v4iFifdrJPaVzMUU5jlA5ADgFHJjdg7Ye0FCXKRzRIcL67TpLy7JARc9W3MSkF8j
 KYK5+pzru5qfKPTAJASHdvEJHyM7t4K5/Lkp6lBuF3NdvivUtM6g1Px9rYgxaWkh
 p+ImqMvYFr+Exies/pnd0MAjnDU52WpjEVe3vKRxAGgHzHFfWdC2gV1HHus+i2mv
 ZAJPRB21TRs0ZPOWkwEetdNxBji3294x84+sT6Z/TE772WA1tJ1YQnsHjSoc0M1E
 H4H2uyM496NiwBOWgCP5dys8WQKQUgPXDirYAzsvXQ/oIbSGMxPvMXuwnedOQLZj
 K5fo/pZ2ZQesU5qc0MztipiadXE3cugNEGVyyNmW3lomJicz8UrwAQSXkvyW4dCF
 GTzt5P/zKnE+ehKc76csnE+sDIe9dNP/0+/MdB2rDllvBXkpJo2GTiCNwMbGFgHS
 42WVAeGi
 =zOCj
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmFtHFoACgkQVRlr7kRf
 YEnLsAv9HmttsW+3U9j2MMxSsMh0/SqO6nzyyceGlc2oCKUUqvdt5DvtuhmKHbTr
 m2PuWJhYLur7Hi7JITGPPtaVQPZyQUjGmsrNBrPuS4EfgQJN6rrBSilljiPBwyB1
 FqUAX2i4UyM+ntQj2gzZGw2hdgAxNhHG2LPbsV61NWRfiM0/S22AtUWpi+ZitWQz
 JYPT0r/QWHaIAmjg7vnu83+DwzHYxFiI0l2ufo+0YYLRldQrkeEUTZ30qNUq/wJS
 khGo1MaEYq95kU5TJ+2ZlBP1Z/Dz7ShRbIiXCwHZesI1p//6ReurQCfLDjLQ4IFS
 I41/I1gAm8HXVcJLxj8m2vbFFXdhptikKDmGD01NbAAHePjPjim9D2Z7r4BeSRgB
 oXVVi923OglJfVBMUSq0b3nD8GjGNNgnMucm5M3ObZrLE/zDATnXsa1JF0FtL3pb
 YlWSK3+zV+6A/2qO7O9Am46ZOMODP4QG+XkP65Y9vHDpW3FwjVJ/ELHzu3rGEfAJ
 RlABduAK
 =ainv
 -----END PGP SIGNATURE-----

Merge tag '2.2.0'

2.2.0
2021-10-18 09:03:53 +02:00
Jérémy Munsch
b58a3a0817
Merge branch 'develop' 2021-10-14 11:50:47 +02:00
Jérémy Munsch
59bee34d45 2.1.8
-----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmFJsQYACgkQVRlr7kRf
 YElccgv/aGO9NlhExmL3VfWCYcWZWrHxUEJQoQSLgtAodhDGT56reqV2X0/W8Cjx
 YVLtWOPLtNFyUDOqrg+19u+2F1AjvO0KiGKO5SngV8dEiFj3JfLfD8/DsKtPgi7b
 k3u3r8MBw9d4+cHEiQSH9+Zizsh/T1nJYQaBpNxIv6IW9vtUiIAm+6Y4xH323v/g
 DBHF1hWe5a0Xf1AX05Oqmdmkk6IGacAZtzEbs/lHXPRz0gZRd2QTs5ZlaUAPZoCV
 El/wtpiRqbeH1bg2juN+mvq/+MZzGVduWlWWzPOjcn/ZJsKhRowTF3x5D/fFEbmI
 EqkZ7ymeMWDR87vnUUwx6Zl3lKtsFdlmI7vR+nCbqysiaivYQx1NIebpezG+lps0
 WJhg4bMFr1y3Dp7blkPotNfvQqX5oxBH5YJJeAf7AGKUEzdIrmAY1meRGfv9q3Wv
 /IXNvk8m2Su92L1iYm3IBfsuDqUqOF7mzpNd52t2yZJOeWwIZ+Y6wxrLzfuifxSO
 QSxi5aAi
 =woLk
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEbXCAeh4tnJbE5ao1VRlr7kRfYEkFAmFJsTAACgkQVRlr7kRf
 YEkkKgv+N3YuZul1ut7VhODc1MPCfBIiZEU8Z59vFBqKyyEDZID80By1WTmLIvfu
 WCW2lJWjWbgoT3iuvm9rh5a7+iDKyISdl0JBuCgyUFTRYnOjrACUA8+pQ2t2Uobn
 lH4O3NwMJyVpbg28SXyeIn0oVPNLZb2qEBbMZs7loZuRomd1eVSzJweZDlpNMyIf
 lgekUO1M1FoaAeobRyYewB9UqlxNcjTeIcrKbUHW+RUBdrIXScLk1KVymSq47Sfh
 a8jivB7tClG26/46pobNPIHXthF/oLLf2DFIVXnTx8itGp0OPaWHtFgmSWHu1Lj7
 8DafPAuWsVzrRfNbP/NCIzy9k04MvU0JN2zyqLmOXzld3cOXCLzGSD/uzsG/dskY
 Af8RnB6cdCZB7mjZLeDIyS9IAOQj0cWHh5u+OEQDEJxG4kgHrLJ5qgh96rDAdioT
 5bduORjj9Xsf6Ima8NXvwnT46IqxKmJjGpCLkBNd5DuTJTLBtrZM8II3gRo804os
 YeqbbI+P
 =v04M
 -----END PGP SIGNATURE-----

Merge tag '2.1.8'

2.1.8
2021-09-21 12:17:19 +02:00
Jérémy Munsch
b29fb6a5bc Merge tag '2.1.7' 2021-09-14 11:19:19 +02:00
Jérémy Munsch
14d966a62b Merge tag '2.1.6' 2021-09-07 15:35:21 +02:00
Jérémy Munsch
9d17992545 Merge tag '2.1.5' 2021-08-26 14:59:09 +02:00
Jérémy Munsch
1e4f7a6943 Merge tag '2.1.4' 2021-08-25 17:30:45 +02:00
Jérémy Munsch
5c91b1d0f7 Merge tag '2.1.3' 2021-08-25 14:54:35 +02:00
Jérémy Munsch
9ad2f564d5 Merge tag '2.1.2' 2021-08-24 12:45:41 +02:00
Jérémy Munsch
0b2c4b4ec3 Merge tag '2.1.1' 2021-08-24 08:32:32 +02:00
Jérémy Munsch
14735c4195 Merge tag '2.1.0' 2021-08-20 17:53:06 +02:00
Jérémy Munsch
0c9a7e2106 Merge tag '2.0.14' 2021-08-18 08:49:33 +02:00
Jérémy Munsch
c8c0808078 Merge tag '2.0.12' 2021-08-17 11:14:45 +02:00
Jérémy Munsch
078201fe04 Merge tag '2.0.11'
tag 2.0.11
2021-08-17 11:14:43 +02:00
Jérémy Munsch
2b0be3493b Merge tag '2.0.10'
tag 2.0.10
2021-08-17 11:14:41 +02:00
Jérémy Munsch
407c753bc1 Merge tag '2.0.9'
tag 2.0.9
2021-08-17 11:14:38 +02:00
Jérémy Munsch
afa6d110b6 Merge tag '2.0.8' 2021-08-17 11:14:36 +02:00
Jérémy Munsch
ff4212db93 Merge tag '2.0.7' 2021-08-17 11:14:33 +02:00
Jérémy Munsch
cdf406d0a4 Merge tag '2.0.6' 2021-08-17 11:14:30 +02:00
Jérémy Munsch
c9af0afe07 Merge tag '2.0.5' 2021-08-17 11:14:27 +02:00
Jérémy Munsch
85680ad828 Merge tag '2.0.4'
2.0.4 release
2021-08-17 11:14:25 +02:00
Jérémy Munsch
1523ca6ebf Merge tag '2.0.3'
2.0.3 release
2021-08-17 11:14:21 +02:00
Jérémy Munsch
0085fb6ebb Merge tag '2.0.2'
2.0.2 release
2021-08-17 11:14:18 +02:00
Jérémy Munsch
dfae053db6 Merge tag '2.0.1'
2.0.1 release
2021-08-17 11:14:08 +02:00
23 changed files with 574 additions and 302 deletions

View file

@ -2,34 +2,96 @@
### All notable changes to `CRM CLient V4` will be documented in this file.
# version 4.1.8
- fix: 🐛 remove sending brand id in claim call #52
# version 4.1.7
- fix: 🏷️ add Germany to the valid countries
# version 4.1.6
- Changed: move claim customer association into server side
# version 4.1.4
- Changed: update claim customer relation with hashcode
# version 4.1.4
- Changed: update claim file validation
- Changed: resolve phpcs errors
# version 4.1.3
- Added: client tests for registering a claim
# version 4.1.2
- Changed: force string cast in ctype_digit method
# version 4.1.1
- Changed: update optionnal answer id parameter when set new single optin for laravel and wordpress
# version 4.1.0
- Added: new api route for sending new claim
- Added: optionnal answer id parameter when set new single optin
# version 4.0.4
- chore: :arrow_up: bump to v4.0.4
# version 4.0.3
- chore: :arrow_up: bump to v4.0.3
# version 4.0.2
- chore: :arrow_up: bump to v4.0.2
# version 4.0.1
- chore: :arrow_up: bump to v4.0.1
- fix: 🏷️ add Netherlands to the valid countries
# version 4.0.0
- Changed: CRM is now php 8.2 only
- Changed: CRM is now php 8.2 only
# version 3.0.6
- Added: SingleOptin::unsetStatusWithHashcode to allow customers to unsubscribe using a hashcode, now single optins do have hashcodes
- Added: SingleOptin::unsetStatusWithHashcode to allow customers to unsubscribe using a hashcode, now single optins do have hashcodes
# version 3.0.5
- Bumped to follow CRM updates
- Bumped to follow CRM updates
# version 3.0.4
- Added CI configuration
- Added CI configuration
# version 3.0.3
- Update Country enum
- Fixed : request merge method of data to query (Request.php)
- Fixed : validate json check should check if really false (Response.php)
- Bumped composer deps
- Update Country enum
- Fixed : request merge method of data to query (Request.php)
- Fixed : validate json check should check if really false (Response.php)
- Bumped composer deps
# version 3.0.2
- Regen documentation with php documentor
- Regen documentation with php documentor
# version 3.0.1
- Fixed : Customer do not call update if there are no updated fields
- Fixed : WPCrm bootSessionIfNeeded trying to access $_SESSION['wpcrm'] before session was started
- Fixed : WPCrm now only returns a boolean
- Fixed : get crm info when client used in laravel
- Changed : WpCrm::makeApiV4Call Change LogLevel on error from Emerge to Critical
- Changed : WPCrm readd forceLogin()
- Fixed : Customer do not call update if there are no updated fields
- Fixed : WPCrm bootSessionIfNeeded trying to access $\_SESSION['wpcrm'] before session was started
- Fixed : WPCrm now only returns a boolean
- Fixed : get crm info when client used in laravel
- Changed : WpCrm::makeApiV4Call Change LogLevel on error from Emerge to Critical
- Changed : WPCrm readd forceLogin()
# version 3.0.0
@ -37,60 +99,68 @@ This removes api authentication with token in favor of signature method.
Refactored code and clean up. It add more unit test plus code coverage
in test/coverage.
- Added : mardown documentation.
- Changed : WPCrm::login now only returns a boolean
- Changed : model Stats::getQuestionStats to pass question as route parameter
- Changed : now requests need to have a signature generated with a private key (crm password) using hmac sha256 wrapping url, method and parameters
- Changed : now timestamp will timeout if request is slower than "timestampTimeout", this means crm will reject the request
- Changed : throw ValidationException s instead of TypeErrors
- Changed : timestamp has to be send in request with a DateTime format, it also has to a UTC value
- Fixed : Change WPCRM dynamic session key, this could prevent spoofing session in some cases.
- Fixed : closure validation
- Fixed : model mutator not catching reflectionException
- Fixed : really send json request using Guzzle internal lib methods.
- Removed : Api AUTH system with api token
- Removed : ApiError::needAuth
- Removed : composer vlucas/dotenv, .env file is not handled any more.
- Removed : LoginException
- Removed : memcached dependency
- Removed : need of memcached
- Removed : unused service provider
- Removed : WpCrm::forceLogin
- Removed : WpCrm::sendArcadiaMailDefault
- Removed : WpCrm::sendArcadiaMailGame
- Updated : PHPCS rules, phpcs fixes and refactored code
- Added : mardown documentation.
- Changed : WPCrm::login now only returns a boolean
- Changed : model Stats::getQuestionStats to pass question as route parameter
- Changed : now requests need to have a signature generated with a private key (crm password) using hmac sha256 wrapping url, method and parameters
- Changed : now timestamp will timeout if request is slower than "timestampTimeout", this means crm will reject the request
- Changed : throw ValidationException s instead of TypeErrors
- Changed : timestamp has to be send in request with a DateTime format, it also has to a UTC value
- Fixed : Change WPCRM dynamic session key, this could prevent spoofing session in some cases.
- Fixed : closure validation
- Fixed : model mutator not catching reflectionException
- Fixed : really send json request using Guzzle internal lib methods.
- Removed : Api AUTH system with api token
- Removed : ApiError::needAuth
- Removed : composer vlucas/dotenv, .env file is not handled any more.
- Removed : LoginException
- Removed : memcached dependency
- Removed : need of memcached
- Removed : unused service provider
- Removed : WpCrm::forceLogin
- Removed : WpCrm::sendArcadiaMailDefault
- Removed : WpCrm::sendArcadiaMailGame
- Updated : PHPCS rules, phpcs fixes and refactored code
# version 2.3.2
- Hotfixed arcadia order
- Hotfixed arcadia order
# version 2.3.1
- Fixed Consider fill attributes as can be nullable
- Fixed Respect sometimes validation
- Fixed Consider fill attributes as can be nullable
- Fixed Respect sometimes validation
# version 2.3.0
- Added Stats call by brand and by question
- Added min rule valdation for integers as well as for strings in Utils
- Added Stats call by brand and by question
- Added min rule valdation for integers as well as for strings in Utils
# version 2.2.3
- Changed for bool casting for response parse field 'status' when is int 1 or 0
- Changed, properties are filled from CRM after a save or update action, this will allow for props to be set on model as it is on the crm, after all checks and casts (firstname capitalized, ... etc)
- Changed for bool casting for response parse field 'status' when is int 1 or 0
- Changed, properties are filled from CRM after a save or update action, this will allow for props to be set on model as it is on the crm, after all checks and casts (firstname capitalized, ... etc)
# version 2.2.2
- Fixed Arcadia mail where sending parameters as query instead of Data
- Fixed Arcadia mail where sending parameters as query instead of Data
# version 2.2.1
- Fixed fill methods on models to handle all enums + arrays
- Changed validation on customer, city minimum is now 2 chars,
firstname and lastname min are now 1 char, phone min 10 has been removed,
other validations are made on backend side such as limit countries,
right now limit is FR, BE, NL.
Anyway dont forget to handle ValidationException which returns crm message.
- Include Drom Com to allowed countries
- Update Country enum to remove '-' chars
- Fixed fill methods on models to handle all enums + arrays
- Changed validation on customer, city minimum is now 2 chars,
firstname and lastname min are now 1 char, phone min 10 has been removed,
other validations are made on backend side such as limit countries,
right now limit is FR, BE, NL.
Anyway dont forget to handle ValidationException which returns crm message.
- Include Drom Com to allowed countries
- Update Country enum to remove '-' chars
# version 2.2.0
- Fixed Utils.php getResquest method
- Changed Arcadia mails, add customer parameters for these calls
- Fixed Utils.php getResquest method
- Changed Arcadia mails, add customer parameters for these calls
# version 2.1.9
- Fixed method CrmClientModel::fill now validates data and put value to updatedValues array
- Fixed method CrmClientModel::fill now validates data and put value to updatedValues array

View file

@ -1,5 +1,5 @@
{
"version": "4.0.0",
"version": "4.1.8",
"timestampTimeout": 30,
"apiRequestRatePerMinute": 256,
"servicesDBCache": 10

View file

@ -1,17 +1,12 @@
{
"name": "ldc/ldccrmv4client",
"version": "4.1.8",
"type": "library",
"description": "LDC CRM Client V4",
"license": "MIT",
"version": "4.0.0",
"authors": [
{
"name": "Jérémy Munsch",
"email": "jeremy.munsch@ldc.fr",
"homepage": "https://jeremydev.ovh"
}
],
"homepage": "https://github.com/kwaadpepper",
"support": {
"email": "digital@ldc.fr"
},
"keywords": [
"Laravel",
"CRM",
@ -20,6 +15,7 @@
],
"require": {
"php": "^8.2",
"doctrine/inflector": "^2.0",
"ext-curl": "*",
"guzzlehttp/guzzle": "^7.4",
"respect/validation": "^2.2"

186
composer.lock generated
View file

@ -4,8 +4,99 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "46d0f076c74afaa5b636e0b6283ad48e",
"content-hash": "eb380867bcf551762b352ecb8f201c22",
"packages": [
{
"name": "doctrine/inflector",
"version": "2.0.10",
"source": {
"type": "git",
"url": "https://github.com/doctrine/inflector.git",
"reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc",
"reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^11.0",
"phpstan/phpstan": "^1.8",
"phpstan/phpstan-phpunit": "^1.1",
"phpstan/phpstan-strict-rules": "^1.3",
"phpunit/phpunit": "^8.5 || ^9.5",
"vimeo/psalm": "^4.25 || ^5.4"
},
"type": "library",
"autoload": {
"psr-4": {
"Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Guilherme Blanco",
"email": "guilhermeblanco@gmail.com"
},
{
"name": "Roman Borschel",
"email": "roman@code-factory.org"
},
{
"name": "Benjamin Eberlei",
"email": "kontakt@beberlei.de"
},
{
"name": "Jonathan Wage",
"email": "jonwage@gmail.com"
},
{
"name": "Johannes Schmitt",
"email": "schmittjoh@gmail.com"
}
],
"description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
"homepage": "https://www.doctrine-project.org/projects/inflector.html",
"keywords": [
"inflection",
"inflector",
"lowercase",
"manipulation",
"php",
"plural",
"singular",
"strings",
"uppercase",
"words"
],
"support": {
"issues": "https://github.com/doctrine/inflector/issues",
"source": "https://github.com/doctrine/inflector/tree/2.0.10"
},
"funding": [
{
"url": "https://www.doctrine-project.org/sponsorship.html",
"type": "custom"
},
{
"url": "https://www.patreon.com/phpdoctrine",
"type": "patreon"
},
{
"url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
"type": "tidelift"
}
],
"time": "2024-02-18T20:23:39+00:00"
},
{
"name": "guzzlehttp/guzzle",
"version": "7.8.0",
@ -1097,97 +1188,6 @@
},
"time": "2022-10-27T11:44:00+00:00"
},
{
"name": "doctrine/inflector",
"version": "2.0.8",
"source": {
"type": "git",
"url": "https://github.com/doctrine/inflector.git",
"reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff",
"reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^11.0",
"phpstan/phpstan": "^1.8",
"phpstan/phpstan-phpunit": "^1.1",
"phpstan/phpstan-strict-rules": "^1.3",
"phpunit/phpunit": "^8.5 || ^9.5",
"vimeo/psalm": "^4.25 || ^5.4"
},
"type": "library",
"autoload": {
"psr-4": {
"Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Guilherme Blanco",
"email": "guilhermeblanco@gmail.com"
},
{
"name": "Roman Borschel",
"email": "roman@code-factory.org"
},
{
"name": "Benjamin Eberlei",
"email": "kontakt@beberlei.de"
},
{
"name": "Jonathan Wage",
"email": "jonwage@gmail.com"
},
{
"name": "Johannes Schmitt",
"email": "schmittjoh@gmail.com"
}
],
"description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
"homepage": "https://www.doctrine-project.org/projects/inflector.html",
"keywords": [
"inflection",
"inflector",
"lowercase",
"manipulation",
"php",
"plural",
"singular",
"strings",
"uppercase",
"words"
],
"support": {
"issues": "https://github.com/doctrine/inflector/issues",
"source": "https://github.com/doctrine/inflector/tree/2.0.8"
},
"funding": [
{
"url": "https://www.doctrine-project.org/sponsorship.html",
"type": "custom"
},
{
"url": "https://www.patreon.com/phpdoctrine",
"type": "patreon"
},
{
"url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
"type": "tidelift"
}
],
"time": "2023-06-16T13:40:37+00:00"
},
{
"name": "doctrine/instantiator",
"version": "2.0.0",
@ -8972,7 +8972,7 @@
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"php": "^8.1",
"php": "^8.2",
"ext-curl": "*"
},
"platform-dev": [],

View file

@ -27,8 +27,7 @@
<rule ref="Generic.Files.LineLength"/>
<rule ref="Generic.Formatting.DisallowMultipleStatements"/>
<rule ref="Generic.Formatting.MultipleStatementAlignment"/>
<rule ref="Generic.Formatting.NoSpaceAfterCast"/>
<rule ref="Generic.Functions.CallTimePassByReference"/>
<rule ref="Generic.Formatting.SpaceAfterCast"/>
<rule ref="Generic.Functions.FunctionCallArgumentSpacing"/>
<rule ref="Generic.Metrics.CyclomaticComplexity"/>
<rule ref="Generic.Metrics.NestingLevel"/>
@ -42,9 +41,7 @@
<rule ref="Generic.Strings.UnnecessaryStringConcat"/>
<rule ref="Generic.WhiteSpace.DisallowTabIndent"/>
<rule ref="Generic.WhiteSpace.ScopeIndent"/>
<rule ref="MySource.PHP.EvalObjectFactory"/>
<rule ref="MySource.PHP.GetRequestData"/>
<rule ref="MySource.PHP.AjaxNullComparison"/>
<rule ref="Generic.WhiteSpace.LanguageConstructSpacing"/>
<rule ref="PEAR.Classes.ClassDeclaration"/>
<rule ref="PEAR.Commenting.InlineComment"/>
<rule ref="PSR1.Classes.ClassDeclaration"/>
@ -77,7 +74,6 @@
<rule ref="Squiz.Scope.MemberVarScope"/>
<rule ref="Squiz.Scope.MethodScope"/>
<rule ref="Squiz.Scope.StaticThisUsage"/>
<rule ref="Squiz.WhiteSpace.LanguageConstructSpacing"/>
<rule ref="Squiz.WhiteSpace.LogicalOperatorSpacing"/>
<rule ref="Squiz.WhiteSpace.MemberVarSpacing">
<properties>

View file

@ -3,26 +3,27 @@
namespace LDC\LDCCRM;
use LDC\LDCCRM\Enums\ApiStatus;
use LDC\LDCCRM\Models\Claim;
use LDC\LDCCRM\Models\Customer;
use LDC\LDCCRM\Models\SingleOptin;
use LDC\LDCCRM\Transport\ApiInterface;
/**
* This is the main class to interact with the CRM
* This is the main class to interact with the CRM.
*
* @package LDCCrmClient
*/
class CrmApiV4
{
/**
* The Api object that will handle requests and responses
* The Api object that will handle requests and responses.
*
* @var \LDC\LDCCRM\Transport\ApiInterface
*/
private static $apiInterface;
/**
* CrmApiV4
* CrmApiV4.
*
* @param string|null $endpoint
* @param string|null $bearerToken
@ -42,7 +43,7 @@ class CrmApiV4
}
/**
* Use this the ping the crm and know its current status
* Use this the ping the crm and know its current status.
*
* @return boolean
* @throws \LDC\LDCCRM\Exceptions\CrmException If an error occurs
@ -57,7 +58,7 @@ class CrmApiV4
/**
*
* Get a customer from its hashcode or email
* Get a customer from its hashcode or email.
* If it does not exists a new instance
* will be returned. You would have
* to call its save method later on.
@ -75,7 +76,7 @@ class CrmApiV4
}
/**
* Get a customer from its hashcode or email
* Get a customer from its hashcode or email.
* If it does not exists a new instance
* will be returned. You would have
* to call its save method later on.
@ -93,10 +94,11 @@ class CrmApiV4
}
/**
* Set the single optin status for an email
* Set the single optin status for an email.
*
* @param string $email
* @param boolean $opt_in
* @param string $email
* @param boolean $opt_in
* @param array|null $answerId
* @return boolean true if succeeded
* @throws \LDC\LDCCRM\Exceptions\ValidationException If a field email could not be validated.
* @throws \LDC\LDCCRM\Exceptions\CrmException If an error occurs on server side or on getting response.
@ -104,13 +106,13 @@ class CrmApiV4
* Possibles are : - singleOptinCustomerExists, If a customer exists with this email.
* @phpcs:ignore Squiz.Commenting.FunctionCommentThrowTag.WrongNumber
*/
public static function setStatus(#[\SensitiveParameter] string $email, bool $opt_in): bool
public static function setStatus(#[\SensitiveParameter] string $email, bool $opt_in, ?array $answerId = null): bool
{
return SingleOptin::setStatus($email, $opt_in);
return SingleOptin::setStatus($email, $opt_in, $answerId);
}
/**
* Set the single optin status for an email
* Unset the single optin status for an email.
*
* @param string $hashcode
* @return boolean true if succeeded
@ -126,7 +128,50 @@ class CrmApiV4
}
/**
* Test a customer credentials to see if it can login
* Set new claim.
*
* @param string $last_name
* @param string $first_name
* @param string $email
* @param string $message
* @param integer $subject_id
* @param string|null $address
* @param string|null $city
* @param string|null $postcode
* @param string|null $file
* @return boolean true if succeeded
* @throws \LDC\LDCCRM\Exceptions\ValidationException If a field email could not be validated.
* @throws \LDC\LDCCRM\Exceptions\CrmException If an error occurs on server side or on getting response.
* @throws \LDC\LDCCRM\Exceptions\ApiErrorException If any error or \LDC\LDCCRM\Enums\ApiError occurs.
* Possibles are : - singleOptinCustomerExists, If a customer exists with this email.
* @phpcs:ignore Squiz.Commenting.FunctionCommentThrowTag.WrongNumber
*/
public static function setClaim(
#[\SensitiveParameter] string $last_name,
#[\SensitiveParameter] string $first_name,
#[\SensitiveParameter] string $email,
#[\SensitiveParameter] string $message,
#[\SensitiveParameter] int $subject_id,
#[\SensitiveParameter] ?string $address = null,
#[\SensitiveParameter] ?string $city = null,
#[\SensitiveParameter] ?string $postcode = null,
#[\SensitiveParameter] ?string $file = null,
): bool {
return Claim::setClaim(
$last_name,
$first_name,
$email,
$message,
$subject_id,
$address,
$city,
$postcode,
$file,
);
}
/**
* Test a customer credentials to see if it can login.
*
* @param string $email
* @param string $password

View file

@ -517,33 +517,30 @@ enum Country: int
* Get valid countries label.
*
* @return array<string>
* @codeCoverageIgnore
*/
public static function getValidCountriesLabel(): array
{
return collect(self::getValidCountries())->map(function (self $country) {
return \array_map(function (self $country) {
return $country->label();
})->all();
}, self::getValidCountries());
}
/**
* Get valid countries value.
*
* @return array<string|integer>
* @codeCoverageIgnore
*/
public static function getValidCountriesValues(): array
{
return collect(self::getValidCountries())->map(function (self $country) {
return \array_map(function (self $country) {
return $country->value();
})->all();
}, self::getValidCountries());
}
/**
* Get Alpha 2 ISO code of valid countries
*
* @return array
* @codeCoverageIgnore
*/
public static function getValidIsoAplha2Codes(): array
{
@ -554,7 +551,6 @@ enum Country: int
* Get valid countries
*
* @return array
* @codeCoverageIgnore
*/
public static function getValidCountries(): array
{
@ -572,7 +568,9 @@ enum Country: int
Country::saintMartinFrenchPart,
Country::wallisAndFutuna,
Country::frenchPolynesia,
Country::newCaledonia
Country::newCaledonia,
Country::netherlands,
Country::germany,
];
}
@ -580,32 +578,32 @@ enum Country: int
* Enum classes
*
* @return array
* @codeCoverageIgnore
*/
protected static function isoCodes(): array
{
return [
'france' => 'FR',
'belgium' => 'BE',
'luxembourg' => 'LU',
'guadeloupe' => 'GP',
'martinique' => 'MQ',
'frenchGuiana' => 'GF',
'reunion' => 'RE',
'france' => 'FR',
'belgium' => 'BE',
'luxembourg' => 'LU',
'guadeloupe' => 'GP',
'martinique' => 'MQ',
'frenchGuiana' => 'GF',
'reunion' => 'RE',
'saintPierreAndMiquelon' => 'PM',
'mayotte' => 'YT',
'saintBarthelemy' => 'BL',
'saintMartinFrenchPart' => 'MF',
'wallisAndFutuna' => 'WF',
'frenchPolynesia' => 'PF',
'newCaledonia' => 'NC',
'mayotte' => 'YT',
'saintBarthelemy' => 'BL',
'saintMartinFrenchPart' => 'MF',
'wallisAndFutuna' => 'WF',
'frenchPolynesia' => 'PF',
'newCaledonia' => 'NC',
'netherlands' => 'NL',
'germany' => 'DE',
];
}
/**
* @param string $attribute
* @return integer|string|null
* @codeCoverageIgnore
*/
public function get(string $attribute): int|string|null
{

View file

@ -4,7 +4,7 @@ namespace LDC\LDCCRM\Enums;
use LDC\LDCCRM\Traits\BaseEnum;
enum LogLevel: int
enum LogLevel: string
{
use BaseEnum;

View file

@ -11,6 +11,7 @@ use Illuminate\Support\Facades\Log;
*
* @package LDCCrmClient
* @subpackage exceptions
*
*/
class CrmException extends \RuntimeException
{

View file

@ -125,6 +125,7 @@ class Answer extends ClientModel
*
* @return array
*/
#[\ReturnTypeWillChange]
public function jsonSerialize()
{
return [

View file

@ -327,11 +327,11 @@ class ArcadiaMailDefault extends ClientModel
try {
$properties['state_order'] = (\is_object($properties['state_order']) and
get_class($properties['state_order']) === ArcadiaOrderType::class) ?
$properties['state_order']->value() : (ctype_digit($properties['state_order']) ?
(int)$properties['state_order'] : $properties['state_order']);
$properties['state_order']->value() : (ctype_digit((string) $properties['state_order']) ?
(int) $properties['state_order'] : $properties['state_order']);
} catch (\TypeError | \BadMethodCallException) {
// * Cast anyway
$properties['state_order'] = (int)$properties['state_order'];
$properties['state_order'] = (int) $properties['state_order'];
}
}
parent::fill($properties);
@ -391,6 +391,7 @@ class ArcadiaMailDefault extends ClientModel
*
* @return array
*/
#[\ReturnTypeWillChange]
public function jsonSerialize()
{
return [

View file

@ -296,11 +296,11 @@ class ArcadiaMailGame extends ClientModel
try {
$properties['state_order'] = (\is_object($properties['state_order']) and
get_class($properties['state_order']) === ArcadiaOrderType::class) ?
$properties['state_order']->value : (ctype_digit($properties['state_order']) ?
(int)$properties['state_order'] : $properties['state_order']);
$properties['state_order']->value : (ctype_digit((string) $properties['state_order']) ?
(int) $properties['state_order'] : $properties['state_order']);
} catch (\TypeError | \BadMethodCallException) {
// * Cast anyway
$properties['state_order'] = (int)$properties['state_order'];
$properties['state_order'] = (int) $properties['state_order'];
}
}
parent::fill($properties);
@ -334,6 +334,7 @@ class ArcadiaMailGame extends ClientModel
*
* @return array
*/
#[\ReturnTypeWillChange]
public function jsonSerialize()
{
return [

88
src/Models/Claim.php Normal file
View file

@ -0,0 +1,88 @@
<?php
namespace LDC\LDCCRM\Models;
use LDC\LDCCRM\Enums\ApiStatus;
use LDC\LDCCRM\Utils;
/**
* This class allows to handle claim.
*
* @category Api Models
* @package LDCCrmClient
* @subpackage models
*/
abstract class Claim extends ClientModel
{
/**
* Validation rules.
*
* @var array
*/
protected static array $validation = [
'first_name' => 'required|string|min:3|max:255',
'last_name' => 'required|string|min:3|max:255',
'email' => 'required|email:rfc,dns,spoof,filter|max:255',
'address' => 'sometimes|nullable|string|max:255',
'city' => 'sometimes|nullable|string|min:2|max:255',
'postcode' => 'sometimes|nullable|string',
'file' => 'sometimes|nullable|string',
'message' => 'required|string|min:3',
'subject_id' => 'required|int|min:1',
];
/**
* Set new claim.
*
* @param string $last_name
* @param string $first_name
* @param string $email
* @param string $message
* @param integer $subject_id
* @param string|null $address
* @param string|null $city
* @param string|null $postcode
* @param string|null $file
* @return boolean True if succeeded.
* @throws \LDC\LDCCRM\Exceptions\ValidationException If a field could not be validated.
* @throws \LDC\LDCCRM\Exceptions\CrmException If an error occurs on server side or on getting response.
* @throws \LDC\LDCCRM\Exceptions\ApiErrorException If any error or \LDC\LDCCRM\Enums\ApiError occurs.
* @phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassAfterLastUsed,Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
*/
public static function setClaim(
#[\SensitiveParameter] string $last_name,
#[\SensitiveParameter] string $first_name,
#[\SensitiveParameter] string $email,
#[\SensitiveParameter] string $message,
#[\SensitiveParameter] int $subject_id,
#[\SensitiveParameter] ?string $address = null,
#[\SensitiveParameter] ?string $city = null,
#[\SensitiveParameter] ?string $postcode = null,
#[\SensitiveParameter] string|null $file = null,
): bool {
// @phpcs:enable
$params = compact(
'last_name',
'first_name',
'email',
'message',
'subject_id',
'address',
'city',
'postcode',
'file',
);
// Validate all data.
foreach ($params as $key => $value) {
self::validateValue($key, $value);
}
static::setUpApiInterface();
$response = static::$apiInterface->call(
Utils::getResquest('apiV4.claim.store', [], $params)
);
return $response->status->equals(ApiStatus::OK);
}
}

View file

@ -146,7 +146,7 @@ abstract class ClientModel implements \JsonSerializable
$type = $this->getPropType($field);
// * Force boolean
if ($type === 'bool') {
$value = (\is_int($value) and ($value === 1 or $value === 0)) ? (bool)$value : $value;
$value = (\is_int($value) and ($value === 1 or $value === 0)) ? (bool) $value : $value;
}
if (!is_null($value) and !$this->checkFieldType($type, $value)) {
throw new ValidationException("Wrong type for $field");
@ -270,7 +270,7 @@ abstract class ClientModel implements \JsonSerializable
case '\\' . ArcadiaOrderType::class:
return $checkValueIsEnum(\ltrim($type, '\\'), $value);
case 'boolean':
return \is_bool(\is_int($value) ? (bool)$value : $value);
return \is_bool(\is_int($value) ? (bool) $value : $value);
case 'array':
return \is_array($value);
case 'string':

View file

@ -355,11 +355,11 @@ class Customer extends ClientModel
try {
$properties['country'] = (\is_object($properties['country']) and
get_class($properties['country']) === Country::class) ?
$properties['country']->value : (ctype_digit($properties['country']) ?
(int)$properties['country'] : $properties['country']);
$properties['country']->value : (is_numeric(trim($properties['country'])) ?
(int) $properties['country'] : $properties['country']);
} catch (TypeError | \BadMethodCallException $e) {
// * Cast anyway
$properties['country'] = (int)$properties['country'];
$properties['country'] = (int) $properties['country'];
}
}
parent::fill($properties);
@ -614,6 +614,7 @@ class Customer extends ClientModel
*
* @return array
*/
#[\ReturnTypeWillChange]
public function jsonSerialize()
{
return [

View file

@ -154,11 +154,11 @@ class Question extends ClientModel
try {
$properties['type'] = (\is_object($properties['type']) and
get_class($properties['type']) === QuestionType::class) ?
$properties['type']->value : (ctype_digit($properties['type']) ?
(int)$properties['type'] : $properties['type']);
$properties['type']->value : (ctype_digit((string) $properties['type']) ?
(int) $properties['type'] : $properties['type']);
} catch (\TypeError | \BadMethodCallException) {
// * Cast anyway
$properties['type'] = (int)$properties['type'];
$properties['type'] = (int) $properties['type'];
}
}
parent::fill($properties);
@ -298,6 +298,7 @@ class Question extends ClientModel
*
* @return array
*/
#[\ReturnTypeWillChange]
public function jsonSerialize()
{
return [

View file

@ -27,26 +27,32 @@ abstract class SingleOptin extends ClientModel
];
/**
* Set the single opt in status for an email
* Set the single opt in status for an email,
* with an optionnal answer associated.
*
* @param string $email
* @param boolean $opt_in
* @param string $email
* @param boolean $opt_in
* @param array<int,int>|null $answerId
* @return boolean true if succeeded
* @throws \LDC\LDCCRM\Exceptions\ValidationException If a field email could not be validated.
* @throws \LDC\LDCCRM\Exceptions\CrmException If an error occurs on server side or on getting response.
* @throws \LDC\LDCCRM\Exceptions\ApiErrorException If any error or \LDC\LDCCRM\Enums\ApiError occurs.
* Possibles are : - singleOptinCustomerExists, If a customer exists with this email.
*/
public static function setStatus(#[\SensitiveParameter] string $email, bool $opt_in): bool
public static function setStatus(#[\SensitiveParameter] string $email, bool $opt_in, ?array $answerId = null): bool
{
self::validateValue('email', $email);
static::setUpApiInterface();
$request = Utils::getResquest('apiV4.optin', [], [
'email' => $email,
'opt_in' => $opt_in
]);
$response = static::$apiInterface->call($request);
$payload = [
'email' => $email,
'opt_in' => $opt_in,
'answer_id' => (!empty($answerId)) ? $answerId : null,
];
$response = static::$apiInterface->call(
Utils::getResquest('apiV4.optin', [], array_filter($payload, fn($v) => !is_null($v)))
);
return $response->status->equals(ApiStatus::OK);
}

View file

@ -2,7 +2,7 @@
namespace LDC\LDCCRM\Traits;
use Illuminate\Support\Str;
use Doctrine\Inflector\InflectorFactory;
trait BaseEnum
{
@ -48,15 +48,16 @@ trait BaseEnum
{
if (empty(self::getCache('labels'))) {
$labels = self::getLabelsConstant();
self::setCache('labels', \collect(self::cases())
->mapWithKeys(function ($enum) use ($labels) {
if (!\is_null($labels) and !isset($labels[$enum->name])) {
throw new \Error('Missing definition label ' . self::class . " for {$enum->name}");
}
return [$enum->name => \trans(
!\is_null($labels) ? $labels[$enum->name] : Str::ucfirst($enum->name)
)];
})->all());
$array = [];
\array_map(function ($enum) use (&$array, $labels) {
if (!\is_null($labels) and !isset($labels[$enum->name])) {
throw new \Error('Missing definition label ' . self::class . " for {$enum->name}");
}
$array = array_merge($array, [$enum->name => __(
!\is_null($labels) ? $labels[$enum->name] : ucfirst($enum->name)
)]);
}, self::cases());
self::setCache('labels', $array);
}
return self::getCache('labels');
}
@ -69,8 +70,11 @@ trait BaseEnum
public static function toValues(): array
{
if (empty(self::getCache('values'))) {
self::setCache('values', \collect(self::cases())
->mapWithKeys(fn ($enum) => [$enum->name => $enum->value])->all());
$array = [];
\array_map(function ($enum) use (&$array) {
$array = array_merge($array, [$enum->name => $enum->value]);
}, self::cases());
self::setCache('values', $array);
}
return self::getCache('values');
}
@ -94,23 +98,25 @@ trait BaseEnum
{
if (empty(self::getCache('enums'))) {
$definitions = self::getCustomDefinitions();
self::setCache('enums', \collect(self::cases())
->mapWithKeys(function ($enum) use ($definitions) {
$baseArray = [
'name' => $enum->name,
'label' => $enum->label(),
'value' => $enum->value,
];
foreach ($definitions as $index => $elements) {
$index = Str::lower(Str::singular($index));
if (!isset($elements[$enum->name])) {
throw new \Error("Missing definition {$index} " . self::class . " for {$enum->name}");
}
$baseArray[$index] = $elements[$enum->name];
$array = [];
$inflector = InflectorFactory::create()->build();
\array_map(function ($enum) use (&$array, $definitions, $inflector) {
$baseArray = [
'name' => $enum->name,
'label' => $enum->label(),
'value' => $enum->value,
];
foreach ($definitions as $index => $elements) {
$index = $inflector->singularize(strtolower($index));
if (!isset($elements[$enum->name])) {
throw new \Error("Missing definition {$index} " . self::class . " for {$enum->name}");
}
return [$enum->name => (object)$baseArray];
})->all());
}
$baseArray[$index] = $elements[$enum->name];
}
$array = array_merge($array, [$enum->name => (object) $baseArray]);
}, self::cases());
self::setCache('enums', $array);
} //end if
return self::getCache('enums');
}
@ -123,8 +129,7 @@ trait BaseEnum
*/
public static function make(self|int|string $value, string $field = 'value'): self|null
{
return !\is_object($value) ?
\collect(self::cases())->keyBy($field)->get($value) : $value;
return !\is_object($value) ? self::cases()[array_search($value, array_column(self::cases(), $field))] : $value;
}
/**
@ -137,7 +142,7 @@ trait BaseEnum
public function equals(object ...$others): bool
{
foreach ($others as $other) {
if (!\in_array(BaseEnum::class, \class_uses_recursive($other))) {
if (!\in_array(BaseEnum::class, $this->classUsesRecursive($other))) {
throw new \Error(__METHOD__ .
' requires $enum to use ' . BaseEnum::class);
}
@ -204,8 +209,8 @@ trait BaseEnum
{
if (!isset($GLOBALS[self::class])) {
$GLOBALS[self::class] = [
'props' => [
'enums' => [],
'props' => [
'enums' => [],
'values' => [],
'labels' => []
],
@ -241,17 +246,65 @@ trait BaseEnum
{
// ? Has custom props in cache ?
if (!isset($GLOBALS[self::class]) or \is_null($GLOBALS[self::class]['customProps'])) {
$names = \collect(self::cases())->keyBy('name');
$names = [];
\array_map(function (self $enum) use (&$names) {
$names = array_merge($names, [$enum->name => $enum]);
}, self::cases());
$GLOBALS[self::class]['customProps'] = \collect((new \ReflectionClass(self::class))->getConstants())
->filter(function (mixed $constant, string $key) use ($names) {
$GLOBALS[self::class]['customProps'] = \array_filter(
(new \ReflectionClass(self::class))->getConstants(),
function (mixed $constant, string $key) use ($names) {
if ($key === 'LABELS' or !\is_array($constant)) {
return false;
}
return \collect($constant)->keys()
->filter(fn (string $name) => $names->has($name))->count();
})->all();
}
return count(\array_filter(
array_flip($constant),
function (string $name) use ($names) {
return array_key_exists($name, $names);
}
));
},
ARRAY_FILTER_USE_BOTH
);
} //end if
return $GLOBALS[self::class]['customProps'];
}
/**
* Returns all traits used by a class, its parent classes and trait of their traits.
*
* @param object|string $class
* @return array
*/
private function classUsesRecursive($class)
{
if (is_object($class)) {
$class = get_class($class);
}
$results = [];
foreach (array_reverse(class_parents($class) ?: []) + [$class => $class] as $class) {
$results += $this->traitUsesRecursive($class);
}
return array_unique($results);
}
/**
* Returns all traits used by a trait and its traits.
*
* @param object|string $trait
* @return array
*/
private function traitUsesRecursive($trait)
{
$traits = class_uses($trait) ?: [];
foreach ($traits as $trait) {
$traits += $this->traitUsesRecursive($trait);
}
return $traits;
}
}

View file

@ -101,11 +101,10 @@ class Response
$this->message = $response->getReasonPhrase();
}
// * Body should be json data.
if (($decodedJson = $this->tryDecodeJson($this->body->getContents())) === false) {
if (Utils::getConfig('app.env') === 'testing') {
dump((string)$this->body);
dump((string) $this->body);
}
throw new CrmException('The Api should have returned JSON data');
}

View file

@ -9,7 +9,6 @@ use LDC\LDCCRM\Exceptions\SkipValidationException;
use LDC\LDCCRM\Exceptions\ValidationException;
use LDC\LDCCRM\Transport\Request;
use Respect\Validation\Validator;
use Illuminate\Support\Str;
/**
* This is the LDCCRM utility class
@ -281,7 +280,7 @@ class Utils
),
'validate' => function () use ($value, $params) {
if (\is_string($value)) {
return \strlen($value) === (int)$params[0];
return \strlen($value) === (int) $params[0];
}
return false;
}
@ -308,10 +307,10 @@ class Utils
),
'validate' => function () use ($value, $params) {
if (\is_string($value)) {
return \strlen($value) >= (int)$params[0];
return \strlen($value) >= (int) $params[0];
}
if (\is_int($value)) {
return $value >= (int)$params[0];
return $value >= (int) $params[0];
}
return false;
}
@ -338,10 +337,10 @@ class Utils
),
'validate' => function () use ($value, $params) {
if (\is_string($value)) {
return \strlen($value) <= (int)$params[0];
return \strlen($value) <= (int) $params[0];
}
if (\is_int($value)) {
return $value <= (int)$params[0];
return $value <= (int) $params[0];
}
return false;
}
@ -570,10 +569,10 @@ class Utils
): Request {
// Convert bool to integer.
$query = \array_map(function ($v) {
return is_bool($v) ? (int)$v : $v;
return is_bool($v) ? (int) $v : $v;
}, $query);
$data = \array_map(function ($v) {
return is_bool($v) ? (int)$v : $v;
return is_bool($v) ? (int) $v : $v;
}, $data);
$routes = \json_decode(\file_get_contents(__DIR__ . '/routes.json'), true);
@ -600,7 +599,7 @@ class Utils
$route['uri'] = sprintf('%s?%s', $route['uri'], \http_build_query($query));
}
return new Request(
HttpMethods::make(Str::lower($route['methods'][0]), 'name'),
HttpMethods::make(strtolower($route['methods'][0]), 'name'),
$route['uri'],
[],
$data
@ -655,29 +654,29 @@ class Utils
{
$message = "LDC CRM: $message";
if (\class_exists('\Illuminate\Support\Facades\Log')) {
switch ($level->value) {
case LogLevel::EMERG->value():
switch ($level) {
case LogLevel::EMERG:
\Illuminate\Support\Facades\Log::emergency($message);
break;
case LogLevel::ALERT->value():
case LogLevel::ALERT:
\Illuminate\Support\Facades\Log::alert($message);
break;
case LogLevel::CRIT->value():
case LogLevel::CRIT:
\Illuminate\Support\Facades\Log::critical($message);
break;
case LogLevel::ERR->value():
case LogLevel::ERR:
\Illuminate\Support\Facades\Log::error($message);
break;
case LogLevel::WARNING->value():
case LogLevel::WARNING:
\Illuminate\Support\Facades\Log::warning($message);
break;
case LogLevel::NOTICE->value():
case LogLevel::NOTICE:
\Illuminate\Support\Facades\Log::notice($message);
break;
case LogLevel::INFO->value():
case LogLevel::INFO:
\Illuminate\Support\Facades\Log::info($message);
break;
case LogLevel::DEBUG->value():
case LogLevel::DEBUG:
\Illuminate\Support\Facades\Log::debug($message);
break;
} //end switch

View file

@ -181,7 +181,7 @@ class WPCrm
public static function check()
{
self::bootSessionIfNeeded();
return (bool)self::getUser();
return (bool) self::getUser();
}
/**
@ -264,6 +264,7 @@ class WPCrm
return false;
}
try {
$customer->opt_in = !$customer->opt_in;
if (!self::makeApiV4Call($customer, 'save')) {
return false;
}
@ -276,7 +277,6 @@ class WPCrm
throw $e;
}
}
$customer->opt_in = !$customer->opt_in;
return true;
}
@ -284,8 +284,9 @@ class WPCrm
* Set the single optin status for an email
* on the crm
*
* @param string $email
* @param boolean $opt_in
* @param string $email
* @param boolean $opt_in
* @param array|null $answerId
*
* @return boolean true if the operation succeeded false otherwise
* @throws \LDC\LDCCRM\Exceptions\ValidationException If a field email could not be validated.
@ -293,20 +294,19 @@ class WPCrm
* @throws \LDC\LDCCRM\Exceptions\ApiErrorException If any error or \LDC\LDCCRM\Enums\ApiError occurs.
* Possibles are : - singleOptinCustomerExists, If a customer exists with this email.
*/
public static function setSingleOptin(string $email, bool $opt_in): bool
public static function setSingleOptin(string $email, bool $opt_in, ?array $answerId = null): bool
{
return self::makeApiV4Call(SingleOptin::class, 'setStatus', [
$email, $opt_in
]);
return self::makeApiV4Call(
SingleOptin::class,
'setStatus',
array_filter([$email, $opt_in, $answerId], fn($v) => !is_null($v))
);
}
/**
* Toggle the current user optin value
* on the current user and the crm
* Activate the current user
*
* @return boolean True if the operation succeeded.
* @throws \LDC\LDCCRM\Exceptions\ValidationException If a customer's hashcode could not be validated.
* @throws \LDC\LDCCRM\Exceptions\CrmException If an error occurs on server side or on getting response.
* @throws \LDC\LDCCRM\Exceptions\ApiErrorException If any error or \LDC\LDCCRM\Enums\ApiError occurs.
* Possibles are : - modelNotFound, If this customer hashcode could not be found.
* - customerAlreadyActive, It the customer is already activated.
@ -319,10 +319,19 @@ class WPCrm
if ($customer->status) {
return true;
}
if (!self::makeApiV4Call($customer, 'activate')) {
return false;
try {
if (!self::makeApiV4Call($customer, 'activate')) {
return false;
}
} catch (ApiErrorException $e) {
switch ($e->getApiError()) {
case ApiError::authorizationException->value():
case ApiError::modelNotFound->value():
return false;
default:
throw $e;
}
}
$customer->opt_in = !$customer->opt_in;
return true;
}
@ -442,7 +451,7 @@ class WPCrm
return \forward_static_call_array([$obj, $method], $arguments);
} catch (ApiErrorException $e) {
switch ($e->getApiError()) {
case ApiError::apiAuthFailed->value():
case ApiError::apiAuthFailed:
Utils::log($e->getMessage(), LogLevel::CRIT);
throw $e;
default:

View file

@ -187,6 +187,7 @@ class WPCrmUser implements JsonSerializable
*
* @return array
*/
#[\ReturnTypeWillChange]
public function jsonSerialize()
{
return [

View file

@ -108,5 +108,11 @@
"GET",
"HEAD"
]
},
"apiV4.claim.store": {
"uri": "api/v4/claim",
"methods": [
"POST"
]
}
}