246 lines
10 KiB
Plaintext
246 lines
10 KiB
Plaintext
<cfsilent>
|
||
<cfimport prefix="m" taglib="lib"/>
|
||
<cfimport prefix="c" taglib="lib/controls"/>
|
||
<cfimport prefix="d" taglib="lib/data"/>
|
||
<cfimport prefix="layout" taglib="layout"/>
|
||
</cfsilent><m:silent silent="No">
|
||
|
||
<cffunction name="hideNonPositive">
|
||
<cfargument name="a"/>
|
||
<cfreturn (a GT 0)? a : ""/>
|
||
</cffunction>
|
||
|
||
<m:prepare_ls entity="specification_item" accessObject="" pageInfoOut="pageInfo" trackOut="tr"/>
|
||
|
||
<!--- <m:filter_settings target="#pageInfo.entity#_ls">
|
||
<m:filterparam filter=#filter# param="quickfilter" ftype="string" prefix="%" suffix="%" expression="((p.project like ?) OR (p.customer like ?) OR (p.customer_alias like ?) OR (p.specification_item_class_type like ?) OR (p.division like ?) OR (p.performer_short like ?))" default=""/>
|
||
</m:filter_settings> --->
|
||
<!--- <cfset pageInfo.settings.filter=#filter#/> --->
|
||
|
||
|
||
<cfquery name="qRead" datasource="#request.DS#">
|
||
select
|
||
<d:field_set titleMapOut="titleMap" lengthOut="fieldCount">
|
||
<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_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">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="cnt" cfSqlType="CF_SQL_NUMERIC">cnt</d:field>
|
||
</d:field_set>
|
||
from (
|
||
select
|
||
--install
|
||
DATE_TRUNC('month', dayscale.dt)::date as m
|
||
,dayscale.dt::date
|
||
,COALESCE(sum(siv.price*siv.quantity*COALESCE(a.probability_perc,0)/100),0)
|
||
+ COALESCE(sum(siv0.price*siv0.quantity*(100-COALESCE(a.probability_perc,0))/100),0)
|
||
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 rec1
|
||
,0 as rec0
|
||
,count(*) as cnt
|
||
from (SELECT dd::date as dt FROM generate_series(
|
||
'2023-01-01'::timestamp
|
||
,'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
|
||
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 1=1 <m:filter_build filter=#pageInfo.settings.filter#/>
|
||
group by dayscale.dt
|
||
|
||
union all
|
||
|
||
--fix and payg
|
||
select
|
||
DATE_TRUNC('month', dayscale.dt)::date as m
|
||
,dayscale.dt::date
|
||
,0
|
||
,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
|
||
, 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 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
|
||
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 (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 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 AND (siv0.dt_to >= dayscale.dt OR siv0.dt_to IS NULL)))
|
||
where 1=1 <m:filter_build filter=#pageInfo.settings.filter#/>
|
||
group by dayscale.dt
|
||
) install_fix_payg
|
||
order by dt
|
||
|
||
</cfquery>
|
||
<!--- <cfdump var=#pageInfo.settings.filter#/> --->
|
||
|
||
|
||
|
||
|
||
<!--- <cfquery name="qCountTotal" datasource="#request.DS#">
|
||
select count(*) as cnt from specification_item where 1=1
|
||
</cfquery> --->
|
||
|
||
</m:silent><!---
|
||
-----------------------------------------------------------------------------------------
|
||
-----------------------------------------------------------------------------------------
|
||
-----------------------------------------------------------------------------------------
|
||
---><cfif isDefined("output_xls")>
|
||
<layout:xml qRead=#qRead# titleMap=#titleMap# filename="#pageInfo.entity#.xml"/>
|
||
<cfabort/>
|
||
</cfif><cfif isDefined("output_json")>
|
||
<layout:json qRead=#qRead# titleMap=#titleMap# filename="#pageInfo.entity#.json"/>
|
||
<cfabort/>
|
||
</cfif><!---
|
||
---><layout:page section="header" pageInfo=#pageInfo#>
|
||
|
||
<layout:attribute name="title">
|
||
<cfoutput><b>Выручка по дням 2023-01-01 .. 2029-12-31</b></cfoutput>
|
||
</layout:attribute>
|
||
<!--- <layout:attribute name="controls">
|
||
skip filter link, filter is not implemented
|
||
<layout:language_switch/>
|
||
</layout:attribute> --->
|
||
</layout:page>
|
||
|
||
<cfif pageInfo.readPermitted() AND !pageInfo.status.errorState>
|
||
|
||
|
||
|
||
<div style="display:inline-block; vertical-align:top;">
|
||
<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_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>
|
||
<br/>
|
||
Дни и месяцы с нулевой суммой не показаны
|
||
<table class="worktable">
|
||
|
||
<thead>
|
||
<tr>
|
||
<th>Дата</th>
|
||
<th>Инсталл</th>
|
||
<th>Инсталл 1</th>
|
||
<th>Инсталл 0</th>
|
||
<th>Ежемес</th>
|
||
<th>Ежемес 1</th>
|
||
<th>Ежемес 0</th>
|
||
<th>Выручка</th>
|
||
<th>cnt</th>
|
||
</tr>
|
||
</thead>
|
||
|
||
<cfoutput query="qRead">
|
||
<tr>
|
||
<td class="c">#dateFormat(dt,"DD.MM.YYYY")#</td>
|
||
<td class="r">#income_install#</td>
|
||
<td class="r">#inst1#</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>
|
||
</cfoutput>
|
||
|
||
</table>
|
||
</div>
|
||
|
||
<div style="display:inline-block; vertical-align:top;">
|
||
|
||
<cfquery dbtype="query" name="qMonthly">
|
||
select m
|
||
, sum(income_install) as income_install
|
||
, sum(income_recurring) as income_recurring
|
||
, sum(income) as income
|
||
from qRead
|
||
group by m
|
||
order by m
|
||
</cfquery>
|
||
<br/>
|
||
Суммировано по месяцам:
|
||
<table class="worktable">
|
||
|
||
<thead>
|
||
<tr>
|
||
<th>Месяц</th>
|
||
<th>Инсталл</th>
|
||
<th>Ежемес</th>
|
||
<th>Выручка</th>
|
||
</tr>
|
||
</thead>
|
||
|
||
<cfoutput query="qMonthly">
|
||
<tr>
|
||
<td class="c">#dateFormat(m,"MM.YYYY")#</td>
|
||
<td class="r">#nFmt(income_install)#</td>
|
||
<td class="r">#nFmt(income_recurring)#</td>
|
||
<td class="r">#nFmt(income)#</td>
|
||
</tr>
|
||
</cfoutput>
|
||
</table>
|
||
</div>
|
||
|
||
</cfif>
|
||
<layout:page section="footer"/>
|