018 fine debug

This commit is contained in:
msyu 2025-06-28 17:02:39 +03:00
parent a4f66bf6e8
commit 1c96679c29
7 changed files with 117 additions and 33 deletions

View File

@ -69,7 +69,7 @@
<!--- <cfset this.datasources["#this.datasource#"]=getDS("#this.datasource#","datasource_#this.datasource#")/> ---> <!--- <cfset this.datasources["#this.datasource#"]=getDS("#this.datasource#","datasource_#this.datasource#")/> --->
<cfset request.RECORDS_PER_PAGE=500/> <cfset request.RECORDS_PER_PAGE=500/>
<cfset request.APP_VERSION="0.00.017"/> <cfset request.APP_VERSION="0.00.018"/>
<cflock scope="application" type="readonly" timeout=3> <cflock scope="application" type="readonly" timeout=3>
<cfset request.APP_NAME=this.Name/> <cfset request.APP_NAME=this.Name/>

View File

@ -218,7 +218,7 @@
<!--- для identity проверка существования записи простая, а тут как? В принципе, бин должен экспортировать флаг существования записи ---> <!--- для identity проверка существования записи простая, а тут как? В принципе, бин должен экспортировать флаг существования записи --->
<cfif d.agreement_version GE 0> <cfif d.agreement_version GE 0>
<cfquery name="qItem" datasource="#request.DS#"> <cfquery name="qItem" datasource="#request.DS#">
select select
iv.specification_item_uid iv.specification_item_uid
,iv.agreement_version /*лучше читается, когда все одинаково берется из резалтсета*/ ,iv.agreement_version /*лучше читается, когда все одинаково берется из резалтсета*/
,i.svc_id ,i.svc_id
@ -291,9 +291,8 @@
join specification_item ii on (iiv.specification_item_uid=ii.specification_item_uid) join specification_item ii on (iiv.specification_item_uid=ii.specification_item_uid)
join specification isp on (ii.specification_id=isp.specification_id) 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) join agreement ia on (isp.contract_id=ia.contract_id AND iiv.agreement_version=ia.agreement_version)
where iiv.specification_item_uid=i.specification_item_uid where iiv.specification_item_uid=i.specification_item_uid
AND ia.is_actual AND iiv.agreement_version <= <cfqueryparam cfsqltype="cf_sql_integer" value="#d.agreement_version#"/>
AND iiv.agreement_version <=<cfqueryparam cfsqltype="cf_sql_integer" value="#d.agreement_version#"/>
) )
order by i.specification_id order by i.specification_id
</cfquery> </cfquery>
@ -322,6 +321,7 @@
<th>Имя для печати</th> <th>Имя для печати</th>
<th>Модель</th> <th>Модель</th>
<th>Версия</th>
<th>Дата с</th> <th>Дата с</th>
<th>Дата по</th> <th>Дата по</th>
<th>Кол-во</th> <th>Кол-во</th>
@ -346,7 +346,7 @@
<cfoutput group="specification_item_uid"> <cfoutput group="specification_item_uid">
<tr> <tr>
<td> <td>
<a href="specification_item_version.cfm?specification_item_uid=#specification_item_uid#&agreement_version=#agreement_version#&#tr.fwx#" class=<cfif pageInfo.writePermitted()>"edit"<cfelse>"view"</cfif>></a> <a href="specification_item_version.cfm?specification_item_uid=#specification_item_uid#&agreement_version=#d.agreement_version#&#tr.fwx#" class=<cfif pageInfo.writePermitted()>"edit"<cfelse>"view"</cfif>></a>
</td> </td>
<td> <td>
<a href="specification.cfm?specification_id=#specification_id#&#tr.fwx#">#specification#</a> <a href="specification.cfm?specification_id=#specification_id#&#tr.fwx#">#specification#</a>
@ -363,6 +363,7 @@
</td> </td>
<td>#specification_item_version#</td> <td>#specification_item_version#</td>
<td class="c">#pricing_model_short#</td> <td class="c">#pricing_model_short#</td>
<td class="c">#agreement_version#</td>
<td class="c">#dateFormat(dt_from,'DD.MM.YYYY')#</td> <td class="c">#dateFormat(dt_from,'DD.MM.YYYY')#</td>
<td class="c">#dateFormat(dt_to,'DD.MM.YYYY')#</td> <td class="c">#dateFormat(dt_to,'DD.MM.YYYY')#</td>
@ -383,7 +384,7 @@
<td class="c"> <td class="c">
<cfif pageInfo.writePermitted()> <cfif pageInfo.writePermitted()>
<a href="specification_item_version_del.cfm?specification_item_uid=#specification_item_uid#&agreement_version=#agreement_version#&#tr.fwx#" class="del"></a> <a href="specification_item_version_del.cfm?specification_item_uid=#specification_item_uid#&agreement_version=#d.agreement_version#&#tr.fwx#" class="del"></a>
</cfif> </cfif>
</td> </td>
</tr> </tr>

54
etc/db/2.sql Normal file
View File

@ -0,0 +1,54 @@
/*похоже, надо делать фулл джойн между базовым и актуальным временными диапазонами, может быть, неявно
актуальность соглашения зависит от времени. в нашем примере сначала актуально соглашение 0
*/
--fix and payg
select
dayscale.dt::date
,siv.agreement_version as actual_version
,siv0.agreement_version as base_version
,a.agreement_version
,siv.quantity
,siv0.quantity
,a.probability_perc as actual_probability
,a0.probability_perc as base_probability
,a.is_actual, a0.is_actual
--,sum(siv.price*siv.quantity*a.probability_perc/100/dayscale.days)+ sum(siv0.price*siv0.quantity*(100-a.probability_perc)/100/dayscale.days)
,(siv.price*siv.quantity*COALESCE(a.probability_perc,0)/100/dayscale.days) as rec1
,(siv0.price*siv0.quantity*(100-COALESCE(a.probability_perc,0))/100/dayscale.days) as rec0
--,count(*)
from (SELECT dd::date as dt
, DATE_PART('days', DATE_TRUNC('month', dd) + '1 MONTH'::INTERVAL - '1 DAY'::INTERVAL) days
FROM generate_series(
'2023-01-01'::timestamp
,'2029-12-31'::timestamp
,'1 day'::interval) dd
) dayscale
left join specification_item_version siv on (dayscale.dt >= siv.dt_from AND (siv.dt_to >= dayscale.dt OR siv.dt_to IS NULL))
left join specification_item si on (siv.specification_item_uid=si.specification_item_uid AND si.pricing_model_id in (2,3))
left 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
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)
where 1=1 and d.contragent_id=3
order by 1

View File

@ -24,18 +24,29 @@ select
<d:field title="Месяц" cfSqlType="CF_SQL_TIMESTAMP">m</d:field> <d:field title="Месяц" cfSqlType="CF_SQL_TIMESTAMP">m</d:field>
<d:field title="Дата" cfSqlType="CF_SQL_TIMESTAMP">dt</d:field> <d:field title="Дата" cfSqlType="CF_SQL_TIMESTAMP">dt</d:field>
<d:field title="Инсталл" cfSqlType="CF_SQL_NUMERIC">income_install</d:field> <d:field title="Инсталл" cfSqlType="CF_SQL_NUMERIC">income_install</d:field>
<d:field title="Инсталл" cfSqlType="CF_SQL_NUMERIC">inst1</d:field>
<d:field title="Инсталл" cfSqlType="CF_SQL_NUMERIC">inst0</d:field>
<d:field title="Ежемес" cfSqlType="CF_SQL_NUMERIC">income_recurring</d:field> <d:field title="Ежемес" cfSqlType="CF_SQL_NUMERIC">income_recurring</d:field>
<d:field title="Ежемес+" cfSqlType="CF_SQL_NUMERIC">rec1+rec0 as rec</d:field>
<d:field title="Ежемес" cfSqlType="CF_SQL_NUMERIC">rec1</d:field>
<d:field title="Ежемес" cfSqlType="CF_SQL_NUMERIC">rec0</d:field>
<d:field title="Выручка" cfSqlType="CF_SQL_NUMERIC">income_install+income_recurring as income</d:field> <d:field title="Выручка" cfSqlType="CF_SQL_NUMERIC">income_install+income_recurring as income</d:field>
<d:field title="cnt" cfSqlType="CF_SQL_NUMERIC">cnt</d:field>
</d:field_set> </d:field_set>
from ( from (
select select
--install --install
DATE_TRUNC('month', dayscale.dt)::date as m DATE_TRUNC('month', dayscale.dt)::date as m
,dayscale.dt::date ,dayscale.dt::date
,sum(siv.price*siv.quantity*a.probability_perc/100 ,COALESCE(sum(siv.price*siv.quantity*COALESCE(a.probability_perc,0)/100),0)
+ COALESCE(siv0.price*siv0.quantity*(100-a.probability_perc)/100, 0) + COALESCE(sum(siv0.price*siv0.quantity*(100-COALESCE(a.probability_perc,0))/100),0)
) as income_install as income_install
,sum(siv.price*siv.quantity*COALESCE(a.probability_perc,0)/100) as inst1
,sum(siv0.price*siv0.quantity*(100-COALESCE(a.probability_perc,0))/100) as inst0
,0 as income_recurring ,0 as income_recurring
,0 as rec1
,0 as rec0
,count(*) as cnt
from (SELECT dd::date as dt FROM generate_series( from (SELECT dd::date as dt FROM generate_series(
'2023-01-01'::timestamp '2023-01-01'::timestamp
,'2029-12-31'::timestamp ,'2029-12-31'::timestamp
@ -54,7 +65,7 @@ from (
join contract d on s.contract_id=d.contract_id join contract d on s.contract_id=d.contract_id
join contragent k on d.contragent_id=k.contragent_id join contragent k on d.contragent_id=k.contragent_id
join svc on (si.svc_id=svc.svc_id) join svc on (si.svc_id=svc.svc_id)
left outer join agreement a0 on (s.contract_id=a0.contract_id /*AND siv.agreement_version=a0.agreement_version*/ AND a0.agreement_version=(select max(iiv.agreement_version) from specification_item_version iiv 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_item ii on (iiv.specification_item_uid=ii.specification_item_uid)
join specification isp on (ii.specification_id=isp.specification_id) 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) join agreement ia on (isp.contract_id=ia.contract_id AND iiv.agreement_version=ia.agreement_version)
@ -63,7 +74,7 @@ from (
AND ia.is_actual AND ia.is_actual
)) ))
left outer join specification_item_version siv0 on (siv0.specification_item_uid=si.specification_item_uid left outer join specification_item_version siv0 on (siv0.specification_item_uid=si.specification_item_uid
AND siv0.agreement_version=a0.agreement_version) AND siv0.agreement_version=a0.agreement_version AND (dayscale.dt=siv0.dt_from))
where 1=1 <m:filter_build filter=#pageInfo.settings.filter#/> where 1=1 <m:filter_build filter=#pageInfo.settings.filter#/>
group by dayscale.dt group by dayscale.dt
@ -74,9 +85,14 @@ from (
DATE_TRUNC('month', dayscale.dt)::date as m DATE_TRUNC('month', dayscale.dt)::date as m
,dayscale.dt::date ,dayscale.dt::date
,0 ,0
,sum(siv.price*siv.quantity*a.probability_perc/100/dayscale.days ,0
+ COALESCE(siv0.price*siv0.quantity*(100-a.probability_perc)/100/dayscale.days, 0) ,0
) ,COALESCE(sum(siv.price*siv.quantity*COALESCE(a.probability_perc,0)/100/dayscale.days),0)
+ COALESCE(sum(siv0.price*siv0.quantity*(100-COALESCE(a.probability_perc,0))/100/dayscale.days),0)
,sum(siv.price*siv.quantity*COALESCE(a.probability_perc,0)/100/dayscale.days)
,sum(siv0.price*siv0.quantity*(100-COALESCE(a.probability_perc,0))/100/dayscale.days)
,count(*)
from (SELECT dd::date as dt from (SELECT dd::date as dt
, DATE_PART('days', DATE_TRUNC('month', dd) + '1 MONTH'::INTERVAL - '1 DAY'::INTERVAL) days , DATE_PART('days', DATE_TRUNC('month', dd) + '1 MONTH'::INTERVAL - '1 DAY'::INTERVAL) days
FROM generate_series( FROM generate_series(
@ -84,20 +100,23 @@ from (
,'2029-12-31'::timestamp ,'2029-12-31'::timestamp
,'1 day'::interval) dd ,'1 day'::interval) dd
) dayscale ) dayscale
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_version siv on (dayscale.dt >= siv.dt_from AND (siv.dt_to >= dayscale.dt OR siv.dt_to IS NULL))
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_item si on (siv.specification_item_uid=si.specification_item_uid AND si.pricing_model_id in (2,3))
join specification s on (si.specification_id=s.specification_id ) left outer 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 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_item ii on (iiv.specification_item_uid=ii.specification_item_uid)
join specification isp on (ii.specification_id=isp.specification_id) 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) 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 where iiv.specification_item_uid=si.specification_item_uid
--AND ia.is_actual AND (dayscale.dt >= iiv.dt_from AND (iiv.dt_to >= dayscale.dt OR iiv.dt_to IS NULL))
/*AND ia.is_actual*/
)) ))
join contract d on s.contract_id=d.contract_id join contract d on s.contract_id=d.contract_id
join contragent k on d.contragent_id=k.contragent_id join contragent k on d.contragent_id=k.contragent_id
join svc on (si.svc_id=svc.svc_id) join svc on (si.svc_id=svc.svc_id)
left outer join agreement a0 on (s.contract_id=a0.contract_id /*AND siv.agreement_version=a0.agreement_version*/ AND a0.agreement_version=(select max(iiv.agreement_version) from specification_item_version iiv
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_item ii on (iiv.specification_item_uid=ii.specification_item_uid)
join specification isp on (ii.specification_id=isp.specification_id) 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) join agreement ia on (isp.contract_id=ia.contract_id AND iiv.agreement_version=ia.agreement_version)
@ -106,7 +125,7 @@ from (
AND ia.is_actual AND ia.is_actual
)) ))
left outer join specification_item_version siv0 on (siv0.specification_item_uid=si.specification_item_uid left outer join specification_item_version siv0 on (siv0.specification_item_uid=si.specification_item_uid
AND siv0.agreement_version=a0.agreement_version) AND siv0.agreement_version=a0.agreement_version AND (dayscale.dt >= siv0.dt_from AND (siv0.dt_to >= dayscale.dt OR siv0.dt_to IS NULL)))
where 1=1 <m:filter_build filter=#pageInfo.settings.filter#/> where 1=1 <m:filter_build filter=#pageInfo.settings.filter#/>
group by dayscale.dt group by dayscale.dt
) install_fix_payg ) install_fix_payg
@ -148,7 +167,7 @@ select count(*) as cnt from specification_item where 1=1
<div style="display:inline-block; width:30%; vertical-align:top;"> <div style="display:inline-block; vertical-align:top;">
<cfoutput><b>#qRead.recordCount#</b> записей</cfoutput> <cfoutput><b>#qRead.recordCount#</b> записей</cfoutput>
<a href="?output_xls" title="экспорт в Excel" style="margin:.5em; height:100%;" target="_blank"><img src="img/xls.gif" style="vertical-align:text-bottom;"/></a> <a href="?output_xls" title="экспорт в Excel" style="margin:.5em; height:100%;" target="_blank"><img src="img/xls.gif" style="vertical-align:text-bottom;"/></a>
<a href="?output_json" title="экспорт в json" style="margin:.5em; height:100%;" target="_blank"><img src="img/json.svg" style="vertical-align:text-bottom;" width="13" height="13"/></a> <a href="?output_json" title="экспорт в json" style="margin:.5em; height:100%;" target="_blank"><img src="img/json.svg" style="vertical-align:text-bottom;" width="13" height="13"/></a>
@ -160,24 +179,34 @@ select count(*) as cnt from specification_item where 1=1
<tr> <tr>
<th>Дата</th> <th>Дата</th>
<th>Инсталл</th> <th>Инсталл</th>
<th>Инсталл 1</th>
<th>Инсталл 0</th>
<th>Ежемес</th> <th>Ежемес</th>
<th>Ежемес 1</th>
<th>Ежемес 0</th>
<th>Выручка</th> <th>Выручка</th>
<th>cnt</th>
</tr> </tr>
</thead> </thead>
<cfoutput query="qRead"> <cfoutput query="qRead">
<tr> <tr>
<td class="c">#dateFormat(dt,"DD.MM.YYYY")#</td> <td class="c">#dateFormat(dt,"DD.MM.YYYY")#</td>
<td class="r">#nFmt(income_install)#</td> <td class="r">#income_install#</td>
<td class="r">#nFmt(income_recurring)#</td> <td class="r">#inst1#</td>
<td class="r">#nFmt(income)#</td> <td class="r">#inst0#</td>
<td class="r">#income_recurring#</td>
<td class="r">#rec1#</td>
<td class="r">#rec0#</td>
<td class="r">#income#</td>
<td class="r">#cnt#</td>
</tr> </tr>
</cfoutput> </cfoutput>
</table> </table>
</div> </div>
&nbsp;
<div style="display:inline-block; width:30%; vertical-align:top;"> <div style="display:inline-block; vertical-align:top;">
<cfquery dbtype="query" name="qMonthly"> <cfquery dbtype="query" name="qMonthly">
select m select m

View File

@ -134,7 +134,7 @@
)) ))
left outer join specification_item_version siv0 on (siv0.specification_item_uid=si.specification_item_uid left outer join specification_item_version siv0 on (siv0.specification_item_uid=si.specification_item_uid
AND siv0.agreement_version=a0.agreement_version) AND siv0.agreement_version=a0.agreement_version)
--where 1=1 <m:filter_build filter=#pageInfo.settings.filter#/> where 1=1 <m:filter_build filter=#pageInfo.settings.filter#/>
order by 1 order by 1

View File

@ -224,7 +224,7 @@
<th></th> <th></th>
<th>Версия N</th> <th>Версия N</th>
<th>Соглашение</th> <th>Соглашение</th>
<th>Дата соглашения</th> <!--- <th>Дата соглашения</th> --->
<th>Согл. действ.</th> <th>Согл. действ.</th>
<th>Вер-ть%</th> <th>Вер-ть%</th>
<th>Дата с</th> <th>Дата с</th>
@ -245,7 +245,7 @@
</td> </td>
<td class="c"><a href="agreement.cfm?contract_id=#contract_id#&agreement_version=#agreement_version#&#tr.fwx#">#agreement_version#</a></td> <td class="c"><a href="agreement.cfm?contract_id=#contract_id#&agreement_version=#agreement_version#&#tr.fwx#">#agreement_version#</a></td>
<td>#agreement#</td> <td>#agreement#</td>
<td class="c">#dateFormat(dt_agreement,'DD.MM.YYYY')#</td> <!--- <td class="c">#dateFormat(dt_agreement,'DD.MM.YYYY')#</td> --->
<td class="c"><cfif is_actual GT 0><img src="img/ok.png"/></cfif></td> <td class="c"><cfif is_actual GT 0><img src="img/ok.png"/></cfif></td>
<td class="c">#probability_perc#</td> <td class="c">#probability_perc#</td>
<td class="c">#dateFormat(dt_from, 'DD.MM.YYYY')#</td> <td class="c">#dateFormat(dt_from, 'DD.MM.YYYY')#</td>

View File

@ -168,7 +168,7 @@
<!--- <layout:detail_line title="Версия">#d.agreement_version# (версия-номер соглашения)</layout:detail_line> ---> <!--- <layout:detail_line title="Версия">#d.agreement_version# (версия-номер соглашения)</layout:detail_line> --->
<layout:detail_line title="Версия"> <layout:detail_line title="Версия">
<cfquery name="qList" datasource="#request.DS#"> <cfquery name="qList" datasource="#request.DS#">
select a.agreement_version, a.agreement, a.dt_agreement select a.agreement_version, a.agreement, a.dt_agreement, a.probability_perc
from agreement a from agreement a
where a.contract_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#qSpecificationItem.contract_id#" null=#!isValid('integer',qSpecificationItem.contract_id)#/> where a.contract_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#qSpecificationItem.contract_id#" null=#!isValid('integer',qSpecificationItem.contract_id)#/>
order by 1 desc order by 1 desc
@ -179,7 +179,7 @@
id="agreement_version" id="agreement_version"
key="agreement_version" key="agreement_version"
selected="#d.agreement_version#" selected="#d.agreement_version#"
displayf="##agreement## [##agreement_version##] ##dateFormat(dt_agreement,'DD.MM.YYYY')##" displayf="##agreement## [##agreement_version##] ##dateFormat(dt_agreement,'DD.MM.YYYY')## ##probability_perc##%"
class="" class=""
/> />
(версия-номер соглашения) (версия-номер соглашения)