diff --git a/docs/logical_data_model.encoded b/docs/logical_data_model.encoded index ec5698656b..93aff94573 100644 --- a/docs/logical_data_model.encoded +++ b/docs/logical_data_model.encoded @@ -1 +1 @@ -xLrjSzmsalxENy7IVaZYccnjaijLdMhlQcLPTbndoof9pjOcbL9193I3c0Hc0L2Eaij_lmB05m04IO3ao7Q2JzA0O7VpGQFHwCRBFnW7b5TbaQJfPocu9oXFzvJS5h1awNl4Tod0smBcQKR9UvRUGSYJD6Nl4Du32igqG1ZoXprC2UKxOZpA2i1O-bkIfcdwbD0SqbDI49h-vPjl_lFal_wcbL_lKFOEGyRIhvCq_LsASYhUXYn9Qped6KVtY3zSmWpj4SIS_PQaJrAKfySfmXnk8KsFqxzl8OOKS9Z_Jv9kAS3yfLdXykpvsUNP-UdPLNhqGZndHtz5UP8IleFq37F47qRUUDFMGh1-yKaAMidsX8xnEp4gjkzd50g1JtXwd79KGiP1kLVOYv_fhmJ3z3Z5vFtdNuZwrJxth_zxajZu2UOd-pqbzv1EWxZy-oe6wSXRRncaZuD5ciC2JjLEKaouU8V3NtYICWvunTBZ5EAg74Bpb1G5k2KKSFBdGdG0Z-UeW8-1mnqguCXRKemG77o_V-YxNn1GF4Umo2yXsnFCPe0WI7W38Igt7xWbeBY6vRu074eXBYWfzwFsp_t6OI1BQOr9tRL-_6aCnKl8I4MpHmMGrZn7tcx5EWn4YhXiYiRaA9Z4V_BdpGXKDyRhloKf1gN2NPOdajCT5OKrINzgV_-_BxySQwRXbfnkGKBH5c5GJBISqLPBBSSsWDUwRPmLXC6hYkqXpay95bsX7MpqPvSGC8ARWIU5E7y6vBWac2GfOlBBOF5mbYCEnQVS4b9085wv0mMJTIuv1tlG4X4AqOriikNQP-r0TmzejWFqyw-__VOBJMUQzmOwxPlRdw4Kw9HKT8xXQmbuDsRxHjTIalS8WLgu3pasjbBF6oJNWEbZ6pPR2UTR_JLW-GJjVn-vtY2WctzUY3ySN51oZtAO3um3KrGTWq7_bOcclYPxb7sOTkQ2zSZxIhGFqW7y1qiV8FgVldJO9BEu7dPI1-WR4KCmvFbgzZZRVk6f4lexI64tjWuEawpQ2w2kHIIa8INxMyjJwtOJG-byAnZUe9-WpHisTMUdh_xtj7tybi4yIK6U8uu81iKvuIASb2bT4DDyx7gXjPTks-Xl4YSiuNJh5e3njmh3fmz-q_sGm025MqJmQCEB2e_KYv-a8Xg5P4_inFawqJIyZllLVSpiVrOpjxqEg3ZNf5CEYgmIq-3yoeZtDDhIMGu10g6NfEZwUGuBT0_fmsl8ToJlYPPN573rOJdCK0cApx_PVFM5IrsxgN7Vto-5qiWgFpE2RuLwu6q5jZOMukK2Ra6cLCQKnQdp6bTSbRUGlhcx09IZ3Er5VBHha2JTWoqK2C5Q355YrBGbsLEofQ0KRUPwJ1lZst_mxmeoBfN0ihGYNcr0mwhR4Z6XErRZoGUSGnD93kWMyWko5mqk5Dp1Nhe8pWSSEFHFFBb7b5UWU5OhWqjBMtklnmk5AeLRUfs2jzKtmfIj6I2Zam4ftc5z8LqigIYJQ9HWpwx9o2pF8jZ8VmyAb3yVHUpxkifSgrTFiKsTVIBwmHvi0OTly6j8jz2OhdDQmGC5ipMGoxB2A9Cg_ufiVMUVcVNUwEJQhFeHpJTxedbyEMq6dD4Xiab67IeqB-hbW8FExeT_krz0Ph9JBGgT6A6d9-bU3FQCipVuxRuWm1c-Eco7EBk7c2kxU84Ami-1yXzE8UQGodRoK19eKHbfUfjX2oKsE8zGC4Lyb6oGATkvsxY5Udf2O1UfmRRnCrJwYAXvBM9mzlxmqxUNbsVdrpVNBr-VNLsVlBvmzJ_o7fk8kztf06WSRFiEtvvazeUrY7cRSq-J8qps5VeLcb_p3Zuuchy9IGWP1ZJ4pA86cp0HZW_DiMQM4p0wS0tu2o5PWayjorqW_EufoDwr-cMW7Pp5387gmsKg2Jvf9eINUbH7Fh5A5cSrG_EO8H0UCcxZ1aaVbqsmGaTihvZFqipcL2xJcRqKXLUeH0MWY3-yeAJQ-wKmm_NVOZFngbNxGA4u-4jML3dCNzwT4twIbmWx6ldt4R2cWReBJVJEyyBNnKKPz-y0Uudb318Cv5jx4ImBB3a8dku0tdhOWv3nPErizlonnuwNOVZ-oXqn9qK-yAGD2YaIGzwYV2334_reZ86xQ-3mxD7Dgvv3KxYffRde4AQNjPSYQfCbCv7WlT00L7NOKRrt9pxVI53i4ExOa7qJ36k2WRMkrwKotEV4jSlfDJ0S65rYC_J9Hirket1NjM4LElZFnUEJIE8uWPaQsFNHVEBbTbJlrNCrpNIJ728zqjP31BVPWcPAj0DiftVwMj9pCt2Y5xycERf3gpMYp3VL-O29bXwSkVkvI_ELNGMfBW25c8Uu4I5BmJycJxcMv7i4z7IJn_IklrxiEINbLGaePpi8-JK75mN0-fHdVBaOvUuy-z9bP1BvSvbtUeNmktLNzVitvROJ8tYa3GiyIlakuRu06IphVERYwAoJw4gnsaD6OMsvFPlV-j8fRHW2Xgho_4MGIgct4Dw-M5qJvplUjFj4lT-RGFVH3H_d3ZSXCrImwOdBOiq0umeKpokS8xnzJJ3VzKXcEN8Pw5gDNOywqpfi4gIMGdSuL3wxsiCCWG8nVbO2L4nLSX92M2Q5fJinAP5UsLhpL2VffqJgLNCAfUVdHzm8iOZWbEJEznq3YAR7fDf_a5ZmL9Z62CpyWQB1CWhcjXwEQKoGIGp3z40JDh_0bJ_x6QEdyBqkgji2PSPImnsWCFydaaRBt7xsKYQ7dW4EV1C_AftqV3mJ_xAj50owaU59ZzFFNZuxExz--VpbsRFFZe-Fv2pEalf6lNFaZv9SI83lI9SJCoPD56Q4vgUaKckHwYeisy4Iz1LR-rYFiAN_2WQ5z2JAuQi0o7iiKkKdNCm1zNLPwN7wjpfmb476XYluDzBS1kBxvwDjPA6_Ph_BuHt2I0zNoMGjnE2sW0CB3Exu_WfoZl3MUCVgmaA3ycf624wepMl0thKlxW7lG_4Qe09ISrNAhKYfSlSgC6tajfU5pKrxjsCB52E_d6VOwzkUf3-JMyUImYTYcPs8iIrsrYXaLS7RbOMioeGsQnPHHmnpY07Ee0zidABj5j9s6MrRI--L5issTm8EjuG-Q93FMBOZ8pTwwDL_NBXICDnLXHC9WX4d5E6jt2z_LPKbe0Xw3zN6ZDSrLcipywE_7cdl7Ad9m3s2xr_cRWATS9UoNaEbUUieQ82HSORJeDflVTCxdZlt06EKaF8DtGACVhLNzNwx-GzlVmkMH2sikL8R1tfaZ84DOSPfbOs_GQK5QDQVJdlW4g5dGRFrha6V8pcbylOBxrJzQKsf2JUgqhvtrAeiXDDKNgYAXjgAzuwwKN1aWEv9en9L3RNc_QEm1JMIKfr_QOOHA-RxCUWuON1wUfiHIg7KnsSGvAyGXii3PBK2Ut1lGuxwHjQ5clmTOkAtbo-uN9N3LL39zp2YYOzeY-yCcLgM7uSA-obR3Zca9SB0o94Q_H43AdPkt7UQvaZNhgXyUkEkw1VtTUrGaUtnx_9oIWxHCMPEt3yLJLv50zTMEjj8FfhANN60Sq3pntDAMCtHIsaRyJH5hL_-n9pXHzJDFvnPFAWzZ8PmKTiygjs8qv0u3N7CM5UqSlQC-V0sJaqlwi_nZaCjdjH_Oj4iLUyQbV23Z_HF7u9rewatAVzZ66wjDLRiE9OkF5Q_-UFuElhthEtgzB2Adavmo_XjWLvi45TjLR6ve5vUq3JP7st6PA_Rj29IchgIYcT4Nw2f3lRb76IxqeGfC3MW6j3m4GCqhdz2XqC7ZNdmkfQkDna_lAqB2Jgi6Yv0N2ItpKzTqai-lea0ucQ4rgyNRIkKYqpkBFtLDp2rZJtlU82FRMj_-F8eIx2bwvG7llEGQwkwJu6_y2iEzo7RSd3zpbZJrLK-hUquFJ3wMt48Tst5cNXHRiFfrR6Ru36EjlFMAVsuT_NpUivIZOoKUs5Ud2EVTZpkuozTdNTgunzd2UkC3OeVo-wlQslhfr7-0VP_zJ7rs-tbjqzBtzqrvu3JDJQ6BhW89BGN77hxcBOjUzvXgBDtdzqXolXfRH1zwhx45s9tWLozEbtxdF0hCSdmawF-DY_zzvHPLFKMMLJsbbXKzXLuS4lUq1uypPPq7LdNv9LcOXu7uiqxIlr2hDcGHptwXI_2Z3ZBoEW0UoMUVyINi5oe3JeNa3A2CIoMEkisFUCKQMYUbXFwXRsD8lK2Ti6mTxIMEcrrsUfYU7UdxFra-0CwTpyfm-DIPjc_NG_s5DwXNnndHT-vYflkwTxtLBU5QmVV8NOtptVMkW2MTVIi6w7sUDZHZMIE9_-2W8Pk7XkvE-n3cRQnZOPqzCZZ2YAhJEpe-EpuMFm6cJWxznxG1uItEW1RJzk9nyxdkrIdyvvHQanYXZOjh3kvBTt7B9CzRCzPji-JaT8-9Vb3kno_ERRBMUZSbrXHD8A7VqJ1VxjF2H2UavgZHVkMz2RKiKFgcrfjBo47vhc6JObV0Az49NIgfTlB4EVqU5_v478aySTmcOFl4Sw-t17hzjYQe-m2Y-FjkbT5uHpDR6UX-txb5nt0TymXooZQEtlrofxb5PHkfNRegE_Eof2zWQp7PSpTx5K-i1xt6TPxJH3UTdcbFpictiS2ppaBUCrZQcUVFTjzF2glCaAXF7yLPBjLhPm82trb-R4455_Rn-hMFj2DxQqn8LdlKeNWzaKSdXJGRolg8T8nFgT9F4bBo9Ywww7DpQdJUPkTl4rciDt7sttOZQZQ9ECzpcQOU-2STSZlFQ08I7VGtBlkxGO49eKEEIWEZtrlcqC8L_PhFdpcJx2eDqU_kOUKeXoktKUgZiN4AyqkxKCTy7aFYWhsCmSwQn-DbI_rLJ5W2pleja3V3X-v7TwItxU7EQhvm0UoTfoyWovVZhkc4hxDrnxA6e37D00xKiBB0z-Hj6Fo2XuwOCB4zEqLsQffuFgH6dUSgm3RBccS7gSdbvSd__hnfsPSaU3To5f7ubm0yGad5TyHAYF8ZfC3cezqtKVa30hj28RdpWEWZ1Is9ed8LmDyBm-iG8oZZ3Lho6-4Jt5JYZjNRaXjneGz5-T2tPI0lfCLn1WfJp9EqdzNe43yuGOmLb6nXkGc1sntIm3DcxGWA1HLxG6d0664jpTggHNJdZM9SrrScIMN1OrEDlVEB8tPBhs_1Z7bbhgpJezuCjmF9y_gsPy7ADrKaT1UxE67a-Ueu93wPTkh4ZkdltAbrUYj5J-Sl3gnBolpY8u9j_r6go7Bok86i5xHxKElg0DoOcWHTN-HRAfAgOOiqbSwT1XQpZQ6xsyeUNzZpZ18aJjAw-dS3KDRHqkyCXThrFbF6c4QXMbWqKY4gW-L5RM94FKX6hlV8-BbniiHuOzGkQ6A48r2fAq4jEvbYsYDe1NjkZzMqLY5uML792DO8s15d4PnYdtF2wO8ZmNFo9NG4I0R8ElAX0YG0cZqXkS8aWka250Fe3WhSS3oxDah3qZoW0_BhGyJ5wq3dDzmiEt5daLb2MBxQOFVhBR0tA0SoYqi_MMIwhaptwPEIhzn9cKcy0cwJJkgb0ko2905K1p07A2CN8KT0Me0Yj7jAOJYD7K4dF4he2DE0pX5Z5mOkIzzZW0r08tVpXnnid4QEymWecMZ5SSv3v0YE0vm8YWsA8CNzKPyMdo6x_MD8Bb0YW2v08gez50PllKr8jGY59Ld49g8YeNAu1Mo4PuEdWZD83GH5WkMa6jS_tJ8X5pN-gU3P_8EruYJYTF0xQCH9YTCZgij8r8ZIBdlOOoGJKCMLMmIhwXLFYWvBbI8I0qX5MrL45RHI4q25H4QHCXzJrz4oKHfw1B0Y9CBfwXC7Y35WIuGgjZlfd2A00q2D70_MuJ93LE4o88exly8X2Z2OyCpV5jR14W7A09Z0JDrrrf4oK0fhWATGYWYOoFZlZCgWYF0STvH5Q6Hq0nUK1NnqV29UcFX4ezJ7KPc6msD2vOuQN03uxY7AIBJ81D1iK2nRtQAg4XKfkwAYZ2vOPguJYh2veOjGcH3D78lLKH88TI_rYeY8v29teyB5SSrLX6O1fZXMx0YHXP64Hi7DiDtRqMC6emYA1Oe_GkX8Yu25_UzK14RXOrzqzMV6fVai_I4CP8XQNjPaYHodfuUVNMKVldbZt-vBK3sRhCl0C8RlaFPEmmP---lV_hoIrb5sm8iv6f_RUJrnedQVUPBp3uz9JrEjw9ee_vqJv9avEudYvkuP0xc5hlVqlG87wMz0yNJOt6zcLcsIS4WiyHnjKi0_waxXz9ZYxUeid6KcQ-jBbKRAlOMg7qZ6ReYORP0zkKmFPdQ2fkX1_MR1vIjwH6Xaidt3YZNS4jEo_OORQfcdZE4KozQaiqJgCcZzQJGcJULLk5eNFFdOjiyMusRQJ77FhHNUpKPt7raazBkwMgyb0sS-avPQpMUMh-OOjnLNOtxS4-tcG_rwn3UxKAxz3XbUvWXK236sz9DTqUzLcQAaVHkhvWvagjtZ-jROEqd6rd-d9AozyuY2Ng7JWllnIhR6Dw5uB2CPU_49-anMOKhCtMl74oFwrFphGTEvjRr4a7DxBY_GpfjPlccLwBCIUCohEXxPFA_ILSZd7F7ebDOnQfHRF4hwHsH7y32uqO2CGSHjJRgptZbHS8uSZh2cEYbh9R2EKS97tZkv4H57swMqUrvVpe3oyKBvJIa-Og5Mzj3UGpaRBjMa3_hgTrouivCfs3cAcycb8uZjGEDjElayjfMMuyshaAM39t8lEx4Ro-9DjhJpUrMu3x1pyKfbBnJGWLoysXJiro7KN-fTe_TThJwAbBeJjSmyyxXMiApuS5CuidowNv3UPCIAc9Qe1YQval73Z26jXZc3aB1mWnvKPkUBpMFTa_j5N5JwKE9sgskX3LRUKKhvJHBy-7kcLCngBHjFcW1WzdeX_otNyBqqbbqfUq25E8w5fNjK97FGyEOiBNkRDs_Wgdr5s28iKsKlC5me_wxVayKTLaak_5xalJYeFvCXyv94rxamAD-T7KL_kRn1WP_yz40V_kKwA1vaUlzpe-s7ZKEjLMykXXjF5ils_IAEjwBmrTrzDmHjGgctngWEY2lEbWm5GSaLFtCNoZAwcTpYiZ6V6mYPrRLdysHh3qRk9b4grzr0uLJj3ToA1_BA5fActKqvyjPuHpU8GppJZqBbGpQeJPA0r_qdYJXtlTWl6BJ3rlCfM-suKPloaJFLlcJjKu1jl9So7nQymYdRzBUQ3nOOXqE6cAFhJUFKqxHTWifp9y-RBeVYSSvVxE60VjyHMCWw9tFjUa_RDzy717RK_fSWbfL6lT53bhkK-oM2DHgybr7q05GhTlhynzji_3MMYnFUv34W0wfXniThWD8uUG-nNKb5MqrWetrc265M4c8iGxYrpDM4cIe9PoizJF9Lcc2RKVGfmqMym_mfqiNryHvejRQKukEz6Pmmh6Y9AEMoYtBYA5QAira4zcoc2-iBebB1BPnIfMC72MsG0AdhJ0V3VJNDQKOmC79rpZKQQtHQjHSjnLNbS8zM3Qb5kpMCJkhPv2mKUgNIfelavyC-80yk-ppkSMr2K5OzPCkVnwUSzV3ZxWksxJ_TM58HuXynLWxiGid0-wBv1cCrVNaIDPSdsHmw-BZq-kJHYBbskAFMQ9EP-GtxkJyKdvTw5NxVXb_rJz9FmTbQK2BjCGUd66jkSpCzjMPTAgLz08wYs91ZIMuwCM4bEMmovCsvhD626hJYqKb6j3pqz8ge5SJwkUbsJmk0saAZP4pJJ6FL-FWwzILDp-BdZiDK1Vg2wEI-foAsKPA2Ires5Q8pQ1jfYOxohfHdqMtmxScs80RIiav33LKIN-y2UUW7LEaaTvtfJDeDlv89VvkqXqfeIAITEFuMckrQVt_-0hjvNoTouk7c3lM4o-Nm8VnCdx3s6uNepcqXC3aqLy-C8UNosli-FIzHhKlOjcU2ahK8YNhIJ3jxcIMbYXjYuAfjVjvwzvOx_OG51DrgCTiKy74wwQbS2rlMt5fLhEqLr-fjJhFmHLRJXcSjPEw_TRRAS35FrFx0eAv6gfMiz1qJT_E6wXozavfYPyisaWrj9ydQiHOOr-18D-iA6lB5zAt9nqw3tEoiOoFNCTUyPrOKrm0nj_kSx5JJsInQEtaX39mEQyDYxxd6ahTBpIYuF89Y8JoTosbKjpwIwdcqBONz7IqZIVXj5rPuffuFqaSIdsi5V0Ag0zEnXMBWNbuA1Tpj56azS4cb5vt58fOqKwXMhhFsj9WWlROkkb6s5cq74Qp8xlOOheE86Wvt5iFacRN-SBjAVSrcVuMYLaisbUQqEFtBVqcrD2KJ6oVnKVfxnfFmhc3PpD6DfuOCpzZO0-gFsc7Tyfyjclf4IrlRlPk3jPRjByA6ttD_e5OUE6sBalJIs8XMzkM8RU4eBM0sWwNB21iv8TN9JqGyluduZjIDSknpV9UuQho6C5MFMwArcNafTJEtNjpzI7psHeOe1Drm5BwBwkJ7qo5hCl625nTxoYfjhkUZxan7_VyDVEvsrbo23x0RgJcz2x8KI5SknJdMgj2p1xgHOVUD4Ptmx5sZYrx-TNmXYbHqpaDTs-acjjVcFyUgRai1ZOBBJKYPZXx9JTbgsy_cDV1x2NMyurD7LyFRc9R7DMmlHJvN7fuE0E-5FucY6dcD-SAgcK0ssY_VpTMSSGw8YXTbwrA791YcPT5zGZgt6zJH9fWvrmgwjkIv1yGvrLP9FyF \ No newline at end of file +xLrjSzmsalxENy7IVaZYccnjaijLdMhlQcLPTbndoof9pjOcbL9193I3c0Hc0L2Eaij_lmB05m04IO3ao7Q2JzA0O7VpGQFHwCRBFnW7b5TbaQJfPocu9oXFzvJS5h1awNl4Tod0smBcQKR9UvRUGSYJD6Nl4Du32igqG1ZoXprC2UKxOZpA2i1O-bkIfcdwbD0SqbDI49h-vPjl_lFal_wcbL_lKFOEGyRIhvCq_LsASYhUXYn9Qped6KVtY3zSmWpj4SIS_PQaJrAKfySfmXnk8KsFqxzl8OOKS9Z_Jv9kAS3yfLdXykpvsUNP-UdPLNhqGZndHtz5UP8IleFq37F47qRUUDFMGh1-yKaAMidsX8xnEp4gjkzd50g1JtXwd79KGiP1kLVOYv_fhmJ3z3Z5vFtdNuZwrJxth_zxajZu2UOd-pqbzv1EWxZy-oe6wSXRRncaZuD5ciC2JjLEKaouU8V3NtYICWvunTBZ5EAg74Bpb1G5k2KKSFBdGdG0Z-UeW8-1mnqguCXRKemG77o_V-YxNn1GF4Umo2yXsnFCPe0WI7W38Igt7xWbeBY6vRu074eXBYWfzwFsp_t6OI1BQOr9tRL-_6aCnKl8I4MpHmMGrZn7tcx5EWn4YhXiYiRaA9Z4V_BdpGXKDyRhloKf1gN2NPOdajCT5OKrINzgV_-_BxySQwRXbfnkGKBH5c5GJBISqLPBBSSsWDUwRPmLXC6hYkqXpay95bsX7MpqPvSGC8ARWIU5E7y6vBWac2GfOlBBOF5mbYCEnQVS4b9085wv0mMJTIuv1tlG4X4AqOriikNQP-r0TmzejWFqyw-__VOBJMUQzmOwxPlRdw4Kw9HKT8xXQmbuDsRxHjTIalS8WLgu3pasjbBF6oJNWEbZ6pPR2UTR_JLW-GJjVn-vtY2WctzUY3ySN51oZtAO3um3KrGTWq7_bOcclYPxb7sOTkQ2zSZxIhGFqW7y1qiV8FgVldJO9BEu7dPI1-WR4KCmvFbgzZZRVk6f4lexI64tjWuEawpQ2w2kHIIa8INxMyjJwtOJG-byAnZUe9-WpHisTMUdh_xtj7tybi4yIK6U8uu81iKvuIASb2bT4DDyx7gXjPTks-Xl4YSiuNJh5e3njmh3fmz-q_sGm025MqJmQCEB2e_KYv-a8Xg5P4_inFawqJIyZllLVSpiVrOpjxqEg3ZNf5CEYgmIq-3yoeZtDDhIMGu10g6NfEZwUGuBT0_fmsl8ToJlYPPN573rOJdCK0cApx_PVFM5IrsxgN7Vto-5qiWgFpE2RuLwu6q5jZOMukK2Ra6cLCQKnQdp6bTSbRUGlhcx09IZ3Er5VBHha2JTWoqK2C5Q355YrBGbsLEofQ0KRUPwJ1lZst_mxmeoBfN0ihGYNcr0mwhR4Z6XErRZoGUSGnD93kWMyWko5mqk5Dp1Nhe8pWSSEFHFFBb7b5UWU5OhWqjBMtklnmk5AeLRUfs2jzKtmfIj6I2Zam4ftc5z8LqigIYJQ9HWpwx9o2pF8jZ8VmyAb3yVHUpxkifSgrTFiKsTVIBwmHvi0OTly6j8jz2OhdDQmGC5ipMGoxB2A9Cg_ufiVMUVcVNUwEJQhFeHpJTxedbyEMq6dD4Xiab67IeqB-hbW8FExeT_krz0Ph9JBGgT6A6d9-bU3FQCipVuxRuWm1c-Eco7EBk7c2kxU84Ami-1yXzE8UQGodRoK19eKHbfUfjX2oKsE8zGC4Lyb6oGATkvsxY5Udf2O1UfmRRnCrJwYAXvBM9mzlxmqxUNbsVdrpVNBr-VNLsVlBvmzJ_o7fk8kztf06WSRFiEtvvazeUrY7cRSq-J8qps5VeLcb_p3Zuuchy9IGWP1ZJ4pA86cp0HZW_DiMQM4p0wS0tu2o5PWayjorqW_EufoDwr-cMW7Pp5387gmsKg2Jvf9eINUbH7Fh5A5cSrG_EO8H0UCcxZ1aaVbqsmGaTihvZFqipcL2xJcRqKXLUeH0MWY3-yeAJQ-wKmm_NVOZFngbNxGA4u-4jML3dCNzwT4twIbmWx6ldt4R2cWReBJVJEyyBNnKKPz-y0Uudb318Cv5jx4ImBB3a8dku0tdhOWv3nPErizlonnuwNOVZ-oXqn9qK-yAGD2YaIGzwYV2334_reZ86xQ-3mxD7Dgvv3KxYffRde4AQNjPSYQfCbCv7WlT00L7NOKRrt9pxVI53i4ExOa7qJ36k2WRMkrwKotEV4jSlfDJ0S65rYC_J9Hirket1NjM4LElZFnUEJIE8uWPaQsFNHVEBbTbJlrNCrpNIJ728zqjP31BVPWcPAj0DiftVwMj9pCt2Y5xycERf3gpMYp3VL-O29bXwSkVkvI_ELNGMfBW25c8Uu4I5BmJycJxcMv7i4z7IJn_IklrxiEINbLGaePpi8-JK75mN0-fHdVBaOvUuy-z9bP1BvSvbtUeNmktLNzVitvROJ8tYa3GiyIlakuRu06IphVERYwAoJw4gnsaD6OMsvFPlV-j8fRHW2Xgho_4MGIgct4Dw-M5qJvplUjFj4lT-RGFVH3H_d3ZSXCrImwOdBOiq0umeKpokS8xnzJJ3VzKXcEN8Pw5gDNOywqpfi4gIMGdSuL3wxsiCCWG8nVbO2L4nLSX92M2Q5fJinAP5UsLhpL2VffqJgLNCAfUVdHzm8iOZWbEJEznq3YAR7fDf_a5ZmL9Z62CpyWQB1CWhcjXwEQKoGIGp3z40JDh_0bJ_x6QEdyBqkgji2PSPImnsWCFydaaRBt7xsKYQ7dW4EV1C_AftqV3mJ_xAj50owaU59ZzFFNZuxExz--VpbsRFFZe-Fv2pEalf6lNFaZv9SI83lI9SJCoPD56Q4vgUaKckHwYeisy4Iz1LR-rYFiAN_2WQ5z2JAuQi0o7iiKkKdNCm1zNLPwN7wjpfmb476XYluDzBS1kBxvwDjPA6_Ph_BuHt2I0zNoMGjnE2sW0CB3Exu_WfoZl3MUCVgmaA3ycf624wepMl0thKlxW7lG_4Qe09ISrNAhKYfSlSgC6tajfU5pKrxjsCB52E_d6VOwzkUf3-JMyUImYTYcPs8iIrsrYXaLS7RbOMioeGsQnPHHmnpY07Ee0zidABj5j9s6MrRI--L5issTm8EjuG-Q93FMBOZ8pTwwDL_NBXICDnLXHC9WX4d5E6jt2z_LPKbe0Xw3zN6ZDSrLcipywE_7cdl7Ad9m3s2xr_cRWATS9UoNaEbUUieQ82HSORJeDflVTCxdZlt06EKaF8DtGACVhLNzNwx-GzlVmkMH2sikL8R1tfaZ84DOSPfbOs_GQK5QDQVJdlW4g5dGRFrha6V8pcbylOBxrJzQKsf2JUgqhvtrAeiXDDKNgYAXjgAzuwwKN1aWEv9en9L3RNc_QEm1JMIKfr_QOOHA-RxCUWuON1wUfiHIg7KnsSGvAyGXii3PBK2Ut1lGuxwHjQ5clmTOkAtbo-uN9N3LL39zp2YYOzeY-yCcLgM7uSA-obR3Zca9SB0o94Q_H43AdPkt7UQvaZNhgXyUkEkw1VtTUrGaUtnx_9oIWxHCMPEt3yLJLv50zTMEjj8FfhANN60Sq3pntDAMCtHIsaRyJH5hL_-n9pXHzJDFvnPFAWzZ8PmKTiygjs8qv0u3N7CM5UqSlQC-V0sJaqlwi_nZaCjdjH_Oj4iLUyQbV23Z_HF7u9rewatAVzZ66wjDLRiE9OkF5Q_-UFuElhthEtgzB2Adavmo_XjWLvi45TjLR6ve5vUq3JP7st6PA_Rj29IchgIYcT4Nw2f3lRb76IxqeGfC3MW6j3m4GCqhdz2XqC7ZNdmkfQkDna_lAqB2Jgi6Yv0N2ItpKzTqai-lea0ucQ4rgyNRIkKYqpkBFtLDp2rZJtlU82FRMj_-F8eIx2bwvG7llEGQwkwJu6_y2iEzo7RSd3zpbZJrLK-hUquFJ3wMt48Tst5cNXHRiFfrR6Ru36EjlFMAVsuT_NpUivIZOoKUs5Ud2EVTZpkuozTdNTgunzd2UkC3OeVo-wlQslhfr7-0VP_zJ7rs-tbjqzBtzqrvu3JDJQ6BhW89BGN77hxcBOjUzvXgBDtdzqXolXfRH1zwhx45s9tWLozEbtxdF0hCSdmawF-DY_zzvHPLFKMMLJsbbXKzXLuS4lUq1uypPPq7LdNv9LcOXu7uiqxIlr2hDcGHptwXI_2Z3ZBoEW0UoMUVyINi5oe3JeNa3A2CIoMEkisFUCKQMYUbXFwXRsD8lK2Ti6mTxIMEcrrsUfYU7UdxFra-0CwTpyfm-DIPjc_NG_s5DwXNnndHT-vYflkwTxtLBU5QmVV8NOtptVMkW2MTVIi6w7sUDZHZMIE9_-2W8Pk7XkvE-n3cRQnZOPqzCZZ2YAhJEpe-EpuMFm6cJWxznxG1uItEW1RJzk9nyxdkrIdyvvHQanYXZOjh3kvBTt7B9CzRCzPji-JaT8-9Vb3kno_ERRBMUZSbrXHD8A7VqJ1VxjF2H2UavgZHVkMz2RKiKFgcrfjBo47vhc6JObV0Az49NIgfTlB4EVqU5_v478aySTmcOFl4Sw-t17hzjYQe-m2Y-FjkbT5uHpDR6UX-txb5nt0TymXooZQEtlrofxb5PHkfNRegE_Eof2zWQp7PSpTx5K-i1xt6TPxJH3UTdcbFpictiS2ppaBUCrZQcUVFTjzF2glCaAXF7yLPBjLhPm82trb-R4455_Rn-hMFj2DxQqn8LdlKeNWzaKSdXJGRolg8T8nFgT9F4bBo9Ywww7DpQdJUPkTl4rciDt7sttOZQZQ9ECzpcQOU-2STSZlFQ08I7VGtBlkxGO49eKEEIWEZtrlcqC8L_PhFdpcJx2eDqU_kOUKeXoktKUgZiN4AyqkxKCTy7aFYWhsCmSwQn-DbI_rLJ5W2pleja3V3X-v7TwItxU7EQhvm0UoTfoyWovVZhkc4hxDrnxA6e37D00xKiBB0z-Hj6Fo2XuwOCB4zEqLsQffuFgH6dUSgm3RBccS7gSdbvSd__hnfsPSaU3To5f7ubm0yGad5TyHAYF8ZfC3cezqtKVa30hj28RdpWEWZ1Is9ed8LmDyBm-iG8oZZ3Lho6-4Jt5JYZjNRaXjneGz5-T2tPI0lfCLn1WfJp9Eqh9TV7CZcrm55PBqtnKe47-u0OnLLAmjkSa1szqIGFCcNGWAnKrxm2b0MD1IIx2Ozgn9gEkV8RFdig3HrUO-cgMntANtsY2ct5LtDkeHJupxuUHPFIlq0AMRGXBQYqdySF8S5HnIlonyLMBdj5Ykm1gzpUA7arSdzYLc7b4puSxVQ3LaMLdS0DOhkdte5NL0JWmvekulaarLATMGHVeAY0v3omd7yFqD9Uzlp9a7AN97QJtDks5ewsY9L-OYZZelIYDCep0DB2Q9KFMXig8v4Q8-H6FtVaIyt7Wv8lyHAZTK4Q9HYBGLWjPzRH6j4RIYNVV7AXghCBpiI6K4QmIiYDCeJh7lUS4KuR7W6RagEW9a0sHTfH01KW2DtlmSGNA1507g0HHd9GvOdZrxvG597l1XkVLXuW9sWFCR3hQzsBEeB45iFstmczNMc1kKGxcrfRzyKZrtvk7K2UetpcJD13v1jsn7bN915W6o08e3c0EKaIko8q0DG36wFOLGdAQEW3D-DNJ4QG2dY94B8_Tbq16W1g3nMviZJZPEOuSSHBHijE8uvm5I1CS1JWJ51cNm0j-8JulFy7s_4IGNI14W5q0HbHugmxV1HeHQXABo348JKR5G6RnQDiBJmHEX6OGcmcB14dAzwvyEcP1hNFzqy4pUxHfnCd4Qk9KqmkI4oN7bPKHg12dt_OmHicd8eefDuXMroWSbnqKB4QaXfAAj2i8g6gb9e292WmYvx--BA9ae3LqE675ouHILoGEaED05GXNxtHHE4Q11W0RkROimkM6A45aGnVqVWH15U6nuXcznYm3f04LWB62cxc2BA1aenLMWKmX5P6nat7T9HN04ECwxgo8q4fh1YwiYFXe-KMyiNE9ngiF8RAEXSS4I9mrkO1ptCqLa6cGYA1OezerF4HM9ojGTKX4cDqmJrqn5sDomHOXiY4Rkgue8AOJwrrr5P0GoqVjneUAutYe2qm0pV3jMnCZ2A6BZm6RuJgw8KODH1CK2fNyXLCH5uEA-5ofYex2nRxhwK-EIV9QUC4Oo96qlIv94pjFJew-EqY-__F4ljmN8tcts1K1umtSeUuSXO__zzKzVVYchQ5k0XLpjhusyzZXHkyzyYTcdfwJ7wLOKRTIVxacIZDpzP74Jbyp1t6BtMveUuQEqTw1uUYokDpFBDYaOP9OuhdO9u3zrvr1wRF4MLJQEClErrQLgGyNU0hLl94DN9CmMoBuSfYTJMs4pzA1-yu2oDJqYL3BvtW7b6cx9QTaUeqtLp7E6SEf5Ix9v0ZLvj9uKElEcqYeSZMl-N6oRPwjnCotcs8VsQgycWxkFR5BQFLsDbxA1KzyfQwt6K-iNKuoxggjn7-xfDlEXVXt2krrebnwdR0yp10h4U5kwwUwkryfCCPBUxHKpHtBrxd5z2wpzP2FBdrDIzjvP947lq6dXlLXb6yEx41oMiUoT-2Gz9gjmPQRkbOFfSNrgllN0oTowNYAecHttTqYdpIpVz4gKEMbSXXLzZqp-D-bgX7FkM7GAgrWrYYr-9RqZyWDOUDn88EOWejP6_Hcll4WOHqv761EzbDLIEESeuGFFdPoewCFDChezxqzdOBbuePo6D5-nS6jxA8-1d6tN2l9dFRLRJjoPwHJCNENDXD9nf7QWaNQTN5xRQklHnbN8ag4JcTUT-EqbqKPxkhdT2jmd-BauXP9tIgX0RXvjQfRhCEelrUwnsuvMNqKAtUaQPjuvN4juDZoOIJnPFjrlA6zIGaLC2nH3qtpfs076q1R3t44eM9WXBshJywNcqUwflI9kAdqeKRlLbR1cAwzefPncQJxSFNCg1fMspGSjO30R_P3_zakONZgBhhHTW49SnwAo7IhoUMWO4xRMdQtxLp2r_W8CCRQ9aZSORjH_r--9eYwBP3T-Jv9U7DIVwT0vQSAB77ZKZwwkmjyyti3WRpuQu6-V4XqqBtAzt_dHrgF6eRQALnUZZMVhPPjUKSTxSVYgZfuxebR1z5i3L0VaLGSBfkA0XAgV-Gj5MVriJX7Pc8zDvCog-hCvahLd0pUJQFMhRg1mYlP63kLZ6KLBQREEvdmvAvp3EuHXtgbdeP91EzH6QU2BtfCatFiUZ5Ti-c6BkVJDDjpeJPdesIf_ijOfm5QU2vbFQnxXz4tQ6uq7Iwp3GKFiiVNcSSefscuXXVdJXqtt8_4uvs_MC62VhsWC1BtpkJRzX-sRZoDYUqgVIr2hIkE-o47BVOhT4e5QJRxh23e0gdLxVVwZRHRUMelbQG-I6D0XzN2ZmtK0APpSfxYkfAAjHh2n7ZEa42i9CTP1_7h6Ie8CjOIJjNucsIfDiEq8-hJ1Olu1_dJfufeuJzHQUshHaTuCJZXMb6JKKhbb6J5KIwMPR29R5lE5rILnYS0sJgcIaQF45aZWj1Nceu7-kgOK0pWu-Hg7EgqrMesQwxRYgbAu1ykcr8BTEcPdzGmIDahzKadpPVAJ0H-GPvTzFhUuDY48gtxIvS_3S-vw-17NPPlslouCwGYHhnXh9tRXPC1zaJo3iRgU7CcQwvCCRbryV7fzqaYaN5lyCKlKwOpynfsSNygl2xrgto_Zh_edwUUWB0reaPROWpEiDPUPsRuwaqwrabv0Pr4igB445xsOaB8STddIndpM245jUh6eH0DwVbfQ1VHgGlsyD9l7PI1DeJ5ofYdcyMeSV9swykPdqNEd0Uf2VM5KKfzJCTj8AQ453TiAiHcqpTHaHratwhFeTlZM11jmGoavXw66AkcFD-4Sj6EADDBxhdG6pSOVgSJVJReZ9LH4acuSNskjDgt_7r-XlPolStdn47F7UkBb4lWmNiPl6DljOZI7bX2OFFhB1-RmSdcD7P--rwZsHIpRKq69MgHaFGcctPtCqXAbRL4mjNO_RzqRwzqUWcAY3lMORIgOUDsq5AxbRIikpMgMzkehjLRdERXYooc3itPIjzzwEmMu-6TgNq0mLqFLQXQQhkdRUGDLpjufBV6JHHkfXlRpH8qOQ-mh4EIR5MLj-KBwzgH3vs5EDfRnaUlOAxuJQueBmFZRVIvsweai5gsTd506BkUrOT7tN4Ef-uL655m-0P5G_gwbL8fRVodL7DhsWfwEjl4adBOhIrmJxoU9GwcFjG9U0VN1oRXYCJ0F3-LYZZQAj3xOXDBhZa8HAzefL4ltMLiQJD0UMpVT23kBbiDeTcGNMqpN0GGjXtlhGTBiEb-uFUM-9jFV8Z6BHVjA4thylgNVX1gQaedji_We_LtZIJXty6p6oCOJO-Pd3En1zIVjy4wPptOjFQBbpStUpS5wY_PNOQElsJyG2o_SrcLfUaaiP6lRCkIM4BGMKDlXaWM4ZVpmggG7Gjx_H7n7gcOvjbdUArnL7YFOgiTDqRgCl9JQkNjlhZvaFbi30tIY3bXA_sLryeEfa7NP686hwnqbrNRNyp4tvkEUlsO-TpjB3i47s8tKdDu5EIg4QvVYN6jLYDb3lUZGcyReRZZMph5bBxyQtZ0bQZgduUwDL7Fx2_FV8pMNnS1ceQL6n0ndh-IcRFNj1_CwcBt4UhwngUFhmKriYwCQjfSYdqiF3sV0byBV137D_EPSGRKCO1ljz-_6AevOHmIbwx9LYGDIBFEog1v1dVjjYaWJx9nBHNrRalm3uhmgY-J_0G00 \ No newline at end of file diff --git a/docs/logical_data_model.puml b/docs/logical_data_model.puml index 5ccd5efd4b..e54c2637a7 100644 --- a/docs/logical_data_model.puml +++ b/docs/logical_data_model.puml @@ -1115,6 +1115,7 @@ enum enum_Users_flags { anv_statistics closed_goal_merge_override manual_mark_goals_similar + monitoring_integration quality_assurance_dashboard regional_goal_dashboard training_reports_dashboard diff --git a/src/constants.js b/src/constants.js index a5b5870552..83a54d484c 100644 --- a/src/constants.js +++ b/src/constants.js @@ -240,6 +240,7 @@ const FEATURE_FLAGS = [ 'training_reports_dashboard', 'quality_assurance_dashboard', 'manual_mark_goals_similar', + 'monitoring_integration', ]; const MAINTENANCE_CATEGORY = { diff --git a/src/migrations/20241114222525-add-monitoring-feature-flag.js b/src/migrations/20241114222525-add-monitoring-feature-flag.js new file mode 100644 index 0000000000..995394faee --- /dev/null +++ b/src/migrations/20241114222525-add-monitoring-feature-flag.js @@ -0,0 +1,18 @@ +const { prepMigration } = require('../lib/migration'); + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface) { + await queryInterface.sequelize.transaction(async (transaction) => { + const sessionSig = __filename; + await prepMigration(queryInterface, transaction, sessionSig); + return queryInterface.sequelize.query(` + ALTER TYPE "enum_Users_flags" ADD VALUE IF NOT EXISTS 'monitoring_integration'; + `); + }); + }, + + async down() { + // no rollbacks + }, +}; diff --git a/src/scopes/grants/activeWithin.js b/src/scopes/grants/activeWithin.js index 41668beb05..ea81dd0d47 100644 --- a/src/scopes/grants/activeWithin.js +++ b/src/scopes/grants/activeWithin.js @@ -14,7 +14,6 @@ export function activeBefore(dates) { where: { [Op.or]: scopes, }, - include: [], }; } diff --git a/src/services/course.ts b/src/services/course.ts index f4b64406a7..ae21149dd0 100644 --- a/src/services/course.ts +++ b/src/services/course.ts @@ -17,7 +17,10 @@ interface DecodedCSV { export async function getAllCourses(where: WhereOptions = {}) { return Course.findAll({ - where, + where: { + ...where, + mapsTo: null, + }, order: [['persistsOnUpload', 'ASC'], ['name', 'ASC']], attributes: ['name', 'id'], }); @@ -44,6 +47,12 @@ export async function csvImport(buffer: Buffer | string) { const parsed = parse(buffer, { skipEmptyLines: true, columns: true }); let rowCount = 1; let results; + + const baseCourseScopes = { + persistsOnUpload: false, // We don't want to delete courses that persist on import. + mapsTo: null, // we only want to update courses that are not mapped to another course. + }; + try { results = await Promise.all(parsed.map(async (course: DecodedCSV) => { // Trim unexpected chars. @@ -62,6 +71,7 @@ export async function csvImport(buffer: Buffer | string) { // Always trim leading and trailing spaces. rawCourseName = rawCourseName.trim(); + rawCourseName.replace('’', '\''); // Remove all spaces and special characters from the course name. const cleanCourseName = rawCourseName.replace(/[^a-zA-Z0-9]/g, '').toLowerCase(); @@ -74,10 +84,7 @@ export async function csvImport(buffer: Buffer | string) { Sequelize.fn('lower', Sequelize.fn('regexp_replace', Sequelize.col('name'), '[^a-zA-Z0-9]', '', 'g')), { [Op.like]: cleanCourseName }, ), - { - deletedAt: null, - persistsOnUpload: false, // We don't want to delete courses that persist on import. - }, + baseCourseScopes, ], }, }); @@ -111,7 +118,6 @@ export async function csvImport(buffer: Buffer | string) { id: { [Op.in]: existingCourses.map((c: ICourse) => c.id), }, - deletedAt: null, }, }); @@ -141,8 +147,7 @@ export async function csvImport(buffer: Buffer | string) { id: { [Op.notIn]: importedCourseIds, }, - deletedAt: null, - persistsOnUpload: false, + ...baseCourseScopes, }, returning: true, }); diff --git a/src/widgets/helpers.js b/src/widgets/helpers.js index 8c7cfec2e2..39d1dfa44d 100644 --- a/src/widgets/helpers.js +++ b/src/widgets/helpers.js @@ -9,7 +9,6 @@ import { Topic, sequelize, } from '../models'; -import { mergeIncludes } from '../scopes'; export const getAllTopicsForWidget = async () => Topic.findAll({ attributes: ['id', 'name', 'deletedAt'], @@ -82,13 +81,13 @@ export async function getAllRecipientsFiltered(scopes) { required: true, attributes: [], where: scopes.grant.where, - include: mergeIncludes(scopes.grant.include, [ + include: [ { model: GrantReplacements, as: 'replacedGrantReplacements', attributes: [], }, - ]), + ], }, ], });