From e96eedece5f10a7e627d94a2d4ee2393dae8625e Mon Sep 17 00:00:00 2001 From: msyu Date: Mon, 30 Jun 2025 10:31:42 +0300 Subject: [PATCH] 019 fine debug --- Application.cfc | 2 +- etc/db/3.sql | 90 +++++++++++++++++++++++++++++++++ img/favicon.ico | Bin 0 -> 15086 bytes img/favicon1.ico | Bin 0 -> 15086 bytes income_daily_rpt.cfm | 12 ++--- specification_item_version.cfm | 25 +++++++-- 6 files changed, 117 insertions(+), 12 deletions(-) create mode 100644 etc/db/3.sql create mode 100644 img/favicon.ico create mode 100644 img/favicon1.ico diff --git a/Application.cfc b/Application.cfc index 14a7217..ce4cfa3 100644 --- a/Application.cfc +++ b/Application.cfc @@ -69,7 +69,7 @@ - + diff --git a/etc/db/3.sql b/etc/db/3.sql new file mode 100644 index 0000000..cac61b4 --- /dev/null +++ b/etc/db/3.sql @@ -0,0 +1,90 @@ +/* +Для инсталла +- если в новой версии дата изменилась, то кажется, что прогноз нужно отнести на новую дату +- Если прежняя версия была действующей: кажется, что все действующие версии нужно оставить в прогнозе (потому что это уже факт) +а новую версию включить в прогноз с вероятностью +? Должен ли инсталл вести себя одинаково с 1-дневными ежемесами (похоже на критерий корректности модели) +Версии инсталла не интерферируют с действующими. Все действующие записываются в факт, из недействующих берется последняя +Версии ежемеса интерферируют с действующими, и для пересекающихся дат суммируются по правилу вероятностей с последней действующей +(вероятность которой автоматически принимается за 100%) +Почему тогда мы в ежемесе убираем из прогноза предыдущие действующие версии? скажем, у нас была версия на весь январь и весь март, +отмеченные как действующие +Сценарий: ежемес только март, ежемес только апрель. +Сценарий: завершение открытой услуги с dt_to +Интерференция между ежемесами - насущная необходимость. Самый важный сценарий - действующая услуга, без окончания, и новая версия с некоторой даты. +Причина криводиффа: идея закрыть действующую и запустить новую. Кажется некорректным по сравнению с формулой сложения вероятностей, +потому что на время пересечения будет просадка, которую непонятно, как компенсировать. +Как считать инсталл. Казалось бы, более простой вариант. Было состояние А. Стало состояние Б. Кажется, новая модель только частично +корректна - а именно, когда даты пересекаются, именно за счет пересечения (усреднение происходит на каждую дату). Проверить с непересекающимися диапазонами. + +Например, у меня есть услуга в течение месяца, закрытая по дате, факт. Мы делаем такую же версию на следующий месяц. Что это означает? +Что мы отменили факт? (задним числом?) Мы хотим эту версию учитывать в _дополнение_ к факту? А если цепочка таких фактов? +Или учитывать все факты с вероятностью 100%? + +*** Тест: поставить последней услуге флаг Действует (соглашению) +Сбивает с толку еще то, что цепочка версий и цепочка временных диапазонов кажутся параллельными, +монотонной последовательности версий как бы должна соответствовать монотонная цепочка интервалов (хотя бы для тех версий, которые учитываем) +Идея с диффами кажется ошибочной. Мы в этом случае пытаемся синтезировать сами не знаем что. + +Важно: наши версии не являются коррекциями, они отражают изменения ожиданий (прогноза), а постфактум - изменение факта! +Если есть продолженный ежемес, с некоторого числа мы создаем допродажу с определенной версией. Сначала она суммируется по вероятности, потом полностью перетирает старую. +Эта версия влияет на результат только со своей dt_from (мы еще не исследовали случай, когда это dt_from зайдет в прошлое) +Для продолженного "факта" мы, очевидно, допускаем модификацию в будущем (будущее в смысле версий или в смысле дат? в смысле дат), - +допродажу, завершение + +Затея: полностью повторить для инсталла поведение 1-дневных закрытых ежемесов + +Прозрение (может быть): каждая сделка - это скорее изменение, чем версия. По крайней мере, мы говорим о допродаже +Кто-то скажет, какая разница. А разница - хранить дельту или результат. Вопрос, можно ли корректно и компактно сохранить дельту? +Как часто нам понадобится отменять предыдущее значение? +Если для создания дельты нам нужно больше 1 записи +- сразу окажется, что 1 результата можно достичь разными путями (неоднозначность дельты) + +*/ +select + --install + dayscale.dt::date + ,(siv.price*siv.quantity*COALESCE(a.probability_perc,0)/100) as inst1 + ,(siv0.price*siv0.quantity*(100-COALESCE(a.probability_perc,0))/100) as inst0 + ,(select max(iiv.agreement_version) from specification_item_version iiv + join specification_item ii on (iiv.specification_item_uid=ii.specification_item_uid) + join specification isp on (ii.specification_id=isp.specification_id) + join agreement ia on (isp.contract_id=ia.contract_id AND iiv.agreement_version=ia.agreement_version) + where iiv.specification_item_uid=si.specification_item_uid) as max_a_v + ,a.* + --,a0.* + + ,siv.* + + from (SELECT dd::date as dt FROM generate_series( + '2023-01-01'::timestamp + ,'2029-12-31'::timestamp + ,'1 day'::interval) dd + ) dayscale + left outer join specification_item_version siv on (dayscale.dt=siv.dt_from) + left outer join specification_item si on (siv.specification_item_uid=si.specification_item_uid AND si.pricing_model_id in (1)) + left outer join specification s on (si.specification_id=s.specification_id) + left outer join agreement a on (s.contract_id=a.contract_id AND siv.agreement_version=a.agreement_version + AND a.agreement_version= + (select max(iiv.agreement_version) from specification_item_version iiv + join specification_item ii on (iiv.specification_item_uid=ii.specification_item_uid) + join specification isp on (ii.specification_id=isp.specification_id) + join agreement ia on (isp.contract_id=ia.contract_id AND iiv.agreement_version=ia.agreement_version) + where iiv.specification_item_uid=si.specification_item_uid + --AND ia.is_actual + )) + join contract d on s.contract_id=d.contract_id + join contragent k on d.contragent_id=k.contragent_id + join svc on (si.svc_id=svc.svc_id) + left outer join agreement a0 on (s.contract_id=a0.contract_id AND a0.agreement_version=( + select max(iiv.agreement_version) from specification_item_version iiv + join specification_item ii on (iiv.specification_item_uid=ii.specification_item_uid) + join specification isp on (ii.specification_id=isp.specification_id) + join agreement ia on (isp.contract_id=ia.contract_id AND iiv.agreement_version=ia.agreement_version) + where iiv.specification_item_uid=si.specification_item_uid + AND ia.agreement_version < a.agreement_version + AND ia.is_actual) + ) + left outer join specification_item_version siv0 on (siv0.specification_item_uid=si.specification_item_uid + AND siv0.agreement_version=a0.agreement_version AND (dayscale.dt=siv0.dt_from)) + where d.contragent_id=3 \ No newline at end of file diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6c926da92147ef2543b2691fce4489e460608320 GIT binary patch literal 15086 zcmd5@O=w(I6uxQNM*EjotbYp=5J6l81l+3lK(pSrl-61(@MR1MyY3rLm|pY`~<15+n;}? zF;Yn>0pwlT+IkT46spxNbE10vFx%1g+9@m9a7H^j$7DW-P1{K6ndfV@QRem>Vv?o- ze%7(RIsNP^bGe3)?ezwI=t&Od;Fvc2K*Vhbjtgyh@VW931DBC~(av|rqV4Tdh-aah zpT(DPu7!N*&pSuYdHIrux{JT9AD8|-bL2|QlLwB>Gw0w)T=;Ws3_SK@&R8XDjK)*< zlzOhC)ZKrTYB!bYG?XG&Jjhf$8YA=%|3#BpgGTFxTSv5ObqISWl&oPE*m?on{EFipedmzp-7jAzYl`FVWM zjdtrNz=zKVk?V^-HC$ZZy5PGsePYn_!AR>vJ~doipSs|>^n7B`U-bu|X` zI;sC#t?G`h>bAbkqtn#?bd=uX(N?-mqcclGC8JG9qcfvM$i-un2f28CW1Plhq*SG$ z)N+ePM;)qYHA&TUo!3KYiB!$f@L8uIdi=sV5C5MptleKvL3~&de-}24c56q6wQufg z_Vw4kvGpx|!`i>>5%YOkue|Wmi(kM7Dy?~CZD?NT3%Izxeq1((b$Y}ZW&EJ$vM;`F zZT;YS23M{n+xUa@p{K0#I(zQruk&(;v48GK_W#kw_YV!S&t5IM{>(LU^u^a~k7t>H z2eeR1cU`X6C%8Tep%=!hzyI_o{AnopQYVcc+K>AD>=|p*{|Ec>-k;?6fY1uvqe~Ap z->=sncJW-XD|c?3h7O~P8!{$qUU;SQRX^HNYY@lq@vXHpA#0lV1pZ83Nn5LQAuT^~QL;LEj8;|GC?Glk&1bu7S z_-0)j$K_kv{NV{xBd_h!^@*AF`pGr5T((ag7nh&WWF5JF?#i3#?m>~cK6970Z_KP~ z?kBP7nK{0;O|!7CdmooQxU?j%=-j1WC}tc3J^SoiOYisZ#XQbJJ!T}CHOjOzS}7E! za~^-bEwgWE7iusg>4RVDk3qj|%xI-hxa^*#exU{(N&H+V^~;_+TJa7oZQkEMQFh;~ zKfm+okvvV(^%(Edd{2BQZRX7{UOG33o@EWQhcr8?)%NWh;JpT2?uc!DPSz-EzO?!6 z$+Uh=Kb|kj>ZORT*`v!gpRJ_M5H&+-7w5hjzi+QDK7Us2w;x-6{QCo1Z$WLz$-91s+`P#5Ia$Ydp7r|`sh78>et70@ zN@RV^ee~t?vrpbIaru5^`>bQ@vBSHC=-ao}c!JF?HbxWs+O-5%ZYEg$yNfNtyGpG9 z+sm5wDplK+7&QyirX+oDQtKw;xL$1#>T$h7jc7flqZn7ZxY5O%@pplg1mvG(5x;dg zK`Ij4X-Gxmcr(FjgEv4a{Rx?j5h4AiYah~Xs@P_vFz>92i}DUDepM3a;WF(TCf5j& h8(nM?j*?CLvts0Ywpn+Mv8BfL7`0kXkWL@j{{ymJyQTmD literal 0 HcmV?d00001 diff --git a/img/favicon1.ico b/img/favicon1.ico new file mode 100644 index 0000000000000000000000000000000000000000..5c1bf556a8d2221dfa67eb4eb184b3ca64e88136 GIT binary patch literal 15086 zcmd5@O=w(I6u#-SjrK3GSpOC#AcD9G2nwQ1Dr()iD!7p*YC|mqT8vS<$-^$PoVA-~ zsg59s5*ig|+Qb-S5X2M&7mm1bIoVBN?Dd@Y=9`|m+;`v4+&41=x8FVIeCIpoz2?oE zcjt~$6RM=9rxoF>x^!5n=ao{kvyuG;`EQVKZmw%Tt<>vhlzN6Z6rzmCPZ0ZBe)&a> z5le~*An)q#?t_@eP_1s66Vz&l*$(zLPg%)^GiWr9$$So*wvo~^&sVD@=Jp(75~l%v z(y_ih_v{99xrUJK^#*$SKLca8;oulWpe91%ImEX3GOMjX*Kpb#A3W4G z(T8@DhFO!}=cF$wf6zE;nL6;lv-noojQO-t$JB(M(Tw@DQOBl9%|U?vk!5; z55{q_`dRbc_ZQEm$wPg{H2fsa>K{8Np_#-*9DE-=#w-J-N`vg-@bO!;EFg zlU&!_tdV3xi|^$wE_g}k(y+xYUVQH?G;MMA1^fF)!AZh64VPbP+ITXaG`Hoa@j*A( zubluNzAT8`teB;Si<`AB_%6*XG3aH%KVoUi%MuIzsyzTr6QvHvd>%8j z&6?5%r%06b%z2S@S=+2<+M}#L%-URwKVS0uSkZM^f7s_)9+O!cw&WBwN3A&I&w`_> zEqf}W2dSTSK1d(`A8Bo6bA1#-FO1iI|M5}y<52RYP8{F2ANBd!Gt}n)59&Sb{Yicg2rb_|y7W-< zgIeuj7ta;Ddgtb8=rFptK4Y@xh1beo4x%l!hH(s^+}=Fnv!;1Z;LqfF&Ii_zUAcT+ zn!WotXQrmBhq&0vPg{>bN9iECCc9*QKSa!iahj?9T7}m>w6ER1`FQHwE)ltTFl#Lv z->hrnxO}TS-#=k$q_thTSz>0rL2^wkmz|}Ki@QwEXtIu6KX>KLclV&k+$?jKcGj3# z*W6EH(=&6j+BVJHzV3Zo_TbWzyu5Rley*5t4D{^Nx0XKW--~&ixq3`UGHVoRC$y3) zOy@lOd|PDS(9YFhLehu7)EiNt`TH`T~#b<3FT4sMqwvU>=G}7+%#xeP->q`fH zr9odced*Y~cL=pBOCHU;0Jr@O?e5|8ab8m**nx z`xJRR_mp>Hj1RL9U;*H78BjW(*@xh`Lmww|*3 zR)5XEt~coMXYJL+=g+Ex_G8Nre}6#hEvPLyY1i+Nn-=*#C+lRLC;fg!>ZR>z5T5y) z5?LSfEc){KIZNI+aru5^`>bQ@vBSHC=-ao}RD{hg)=QCn{d$D!w<4_k-NhE+U8UB6 z?KRDNl`8FWh?<3IQXqP)Y3U*!mTxJLVi$u&Xb gdKa67C9-LMR*0O>HtQ}jw$$VSqgHDX(&;1ne}#6%IRF3v literal 0 HcmV?d00001 diff --git a/income_daily_rpt.cfm b/income_daily_rpt.cfm index 6c209ac..5e3c29e 100644 --- a/income_daily_rpt.cfm +++ b/income_daily_rpt.cfm @@ -52,10 +52,10 @@ from ( ,'2029-12-31'::timestamp ,'1 day'::interval) dd ) dayscale - join specification_item_version siv on (dayscale.dt=siv.dt_from) - join specification_item si on (siv.specification_item_uid=si.specification_item_uid AND si.pricing_model_id in (1)) - join specification s on (si.specification_id=s.specification_id) - join agreement a on (s.contract_id=a.contract_id AND siv.agreement_version=a.agreement_version AND a.agreement_version=(select max(iiv.agreement_version) from specification_item_version iiv + left outer join specification_item_version siv on (dayscale.dt=siv.dt_from) + left outer join specification_item si on (siv.specification_item_uid=si.specification_item_uid AND si.pricing_model_id in (1)) + left outer join specification s on (si.specification_id=s.specification_id) + left outer join agreement a on (s.contract_id=a.contract_id AND siv.agreement_version=a.agreement_version AND a.agreement_version=(select max(iiv.agreement_version) from specification_item_version iiv join specification_item ii on (iiv.specification_item_uid=ii.specification_item_uid) join specification isp on (ii.specification_id=isp.specification_id) join agreement ia on (isp.contract_id=ia.contract_id AND iiv.agreement_version=ia.agreement_version) @@ -103,7 +103,7 @@ from ( left outer join specification_item_version siv on (dayscale.dt >= siv.dt_from AND (siv.dt_to >= dayscale.dt OR siv.dt_to IS NULL)) left outer join specification_item si on (siv.specification_item_uid=si.specification_item_uid AND si.pricing_model_id in (2,3)) left outer join specification s on (si.specification_id=s.specification_id ) - left join agreement a on (s.contract_id=a.contract_id AND siv.agreement_version=a.agreement_version + left outer join agreement a on (s.contract_id=a.contract_id AND siv.agreement_version=a.agreement_version AND a.agreement_version=(select max(iiv.agreement_version) from specification_item_version iiv join specification_item ii on (iiv.specification_item_uid=ii.specification_item_uid) join specification isp on (ii.specification_id=isp.specification_id) @@ -172,7 +172,7 @@ select count(*) as cnt from specification_item where 1=1
- Дни и месяцы с нулевой суммой не показаны + Дни и месяцы с нулевой суммой не показаны. Инсталл и ежемес могут генерировать отдельные строки на один день diff --git a/specification_item_version.cfm b/specification_item_version.cfm index 57944c7..6247f07 100644 --- a/specification_item_version.cfm +++ b/specification_item_version.cfm @@ -62,7 +62,7 @@ - + @@ -103,10 +103,24 @@ where i.specification_item_uid= + + select + iv.agreement_version, a.probability_perc, a.is_actual + from specification_item_version iv + join specification_item si on (iv.specification_item_uid=si.specification_item_uid) + join specification s on (si.specification_id=s.specification_id) + join agreement a on (iv.agreement_version=a.agreement_version and s.contract_id=a.contract_id) + where iv.specification_item_uid= + AND iv.agreement_version= + + select - iv.agreement_version + iv.agreement_version, a.probability_perc, a.is_actual from specification_item_version iv + join specification_item si on (iv.specification_item_uid=si.specification_item_uid) + join specification s on (si.specification_id=s.specification_id) + join agreement a on (iv.agreement_version=a.agreement_version and s.contract_id=a.contract_id) where iv.specification_item_uid= order by 1 @@ -186,7 +200,7 @@ - #d.agreement_version# + #d.agreement_version# (#qAgreement.probability_perc#% ) @@ -239,9 +253,10 @@ - #agreement_version# + #agreement_version# (#qAgreement.probability_perc#% ) - #agreement_version# + #agreement_version# (#probability_perc#% + )