WITH 
status(status, status_id, probability_pc) as (VALUES
	('Закрыта неуспешно',7,0),('Закрыта успешно',6,100),('Договор подписан',5,100),('Договор на подписании',15,90),('Договор на согласовании',12,70),
	('Тестирование',8,50),('Отправлено ТКП',10,20),('Внутреннее согласование',37,10),('Проработка решения',4,10),('Сбор потребностей',1,0)
),
line as (
	SELECT siv.__id as siv_uid, siv.discount, siv.type as line_pricing_model_id
	,siv.hash as line_key, siv.is_actual as siv_is_actual
	,siv.version::numeric as line_version
	,d.__index as deal_index
	,d._companies
	,a.index as agreement_version
	,siv.date_nop::date as dt_from
	,siv.date_end::date as dt_to 
	,siv.is_easy as is_simple
	,siv.cnt -- should mutiliply
	,s.probability_pc
	,a.__id as agreement_uid, a.contract_uid, a.is_actual as agreement_is_actual, a.deal_uid
	,d.__name as deal, d.__status_status as deal_status_id
	--,c.__name as contract
	,siv.user_description
	,siv.params
	--,(SELECT sum(p.price*p.cnt*(100.0-COALESCE(p.discount,0.0))/100.0) FROM elma.service_parametrs p WHERE(p.__id = ANY (siv.params))) as cost
	FROM elma.deals_services siv
	JOIN elma.deals d on (d.__id = ANY(siv.deal)) 
	JOIN status s on (d.__status_status=s.status_id)
	LEFT OUTER JOIN elma.additional_agreements a on (a.__id = ANY(siv.additional_agreement)) 
	WHERE siv.is_actual AND siv."__deletedAt" IS NULL AND d."__deletedAt" IS NULL AND a."__deletedAt" IS NULL
	AND a.is_actual
	AND siv.type IN (2,3)
),
component as (
	SELECT 
	 price*cnt*(100.0-COALESCE(discount,0))/100.0 as cost 
	,price
	,cnt
	,code
	,__id
	FROM elma.service_parametrs 
	where "__deletedAt" IS NULL
),
stair as ( -- рабочая лесенка (инстансы строк, имеющие нетривиальную вероятность)	
	select * FROM (
	  SELECT *,
	    MIN(dt_from) OVER (PARTITION BY line_key ORDER BY deal_index desc) running_min_dt	
	  FROM line --WHERE probability_pc > 0
	) t 
	WHERE t.dt_from = t.running_min_dt 
),
alloc as (select c."WZ" as wz
, round(sum(c."VM_RAM_Allocated")) as ram
, round(sum(CASE WHEN "VM_is_ON" > 0 THEN c."VM_RAM_Allocated" ELSE 0 END)) as ram_on
, round(sum(c."VM_vCPU_count")) as cpu
, round(sum(CASE WHEN "VM_is_ON" > 0 THEN c."VM_vCPU_count" ELSE 0 END)) as cpu_on
from vmreports.compute c 
where ts=(select max(ts) from vmreports.compute)
group by c."WZ"
),
disk_alloc as (select c."WZ" as wz
, round(sum(c."Disk_Allocated")) as disk_alloc
from vmreports.storage c 
where ts=(select max(ts) from vmreports.storage)
group by c."WZ"
),
sold_ram as (SELECT
z.id_klienta as WZ, z.__name as client, round(sum(c.cnt*o.cnt)) as quantity
,count(*) as lines, STRING_AGG(c.code,', ') as codes
/*,o.line_key, o.probability_pc, dt_next,  o.deal_uid, o.deal, o.agreement_uid, o.line_pricing_model_id,o.dt_from, o.dt_to*/ 
FROM stair o
JOIN elma.companies z on (o._companies=z.__id)
LEFT OUTER JOIN component c on (c.__id = ANY (o.params))
WHERE c.code LIKE 'iaas.ngc.%.ram-_'
GROUP BY z.id_klienta, z.__name
),
sold_cpu as (SELECT
z.id_klienta as WZ, z.__name as client, round(sum(c.cnt*o.cnt)) as quantity
,count(*) as lines, STRING_AGG(c.code,', ') as codes
/*,o.line_key, o.probability_pc, dt_next,  o.deal_uid, o.deal, o.agreement_uid, o.line_pricing_model_id,o.dt_from, o.dt_to*/ 
FROM stair o
JOIN elma.companies z on (o._companies=z.__id)
LEFT OUTER JOIN component c on (c.__id = ANY (o.params))
WHERE c.code LIKE 'iaas.ngc.%.vcpu-_'
GROUP BY z.id_klienta, z.__name
),
sold_disk as (SELECT
z.id_klienta as WZ, z.__name as client, round(sum(c.cnt*o.cnt)) as quantity
,count(*) as lines, STRING_AGG(c.code,', ') as codes
/*,o.line_key, o.probability_pc, dt_next,  o.deal_uid, o.deal, o.agreement_uid, o.line_pricing_model_id,o.dt_from, o.dt_to*/ 
FROM stair o
JOIN elma.companies z on (o._companies=z.__id)
LEFT OUTER JOIN component c on (c.__id = ANY (o.params))
WHERE c.code SIMILAR TO 'iaas.ngc.%.(ssd|fstssd|sata)-_'
GROUP BY z.id_klienta, z.__name
),
deal_stat as (
select STRING_AGG(distinct deal_status_id::text,', ') as status_ids
, z.id_klienta as WZ 
from line o join elma.companies z on (o._companies=z.__id) 
GROUP BY z.id_klienta
)

select
      r.wz as wz_sold,
      r.client as client_sold,
      a.wz as wz_alloc,
	  ds.status_ids,
	  r.codes as ram_codes,
      r.quantity as ram_sold,
      a.ram as ram_alloc,
	  a.ram_on as ram_alloc_on,
	  c.codes as cpu_codes,
	  c.quantity as cpu_sold,
	  a.cpu as cpu_alloc,
	  a.cpu_on as cpu_alloc_on,
	  d.quantity as disk_sold,
	  da.disk_alloc,
	  d.codes as disk_codes
from sold_ram r
join deal_stat ds on (r.wz=ds.wz)
join sold_cpu c on (r.wz=c.wz)
left join sold_disk d on (r.wz=d.wz)
full join alloc a on (r.wz=a.wz)
left join disk_alloc da on (a.wz=da.wz)


--where s.quantity=a.ram
order by 1,3

--select * from vmreports.compute where "WZ"='WZ01005'
--select * from vmreports.compute where "WZ"='WZ01038' AND 

--select distinct "WZ" from vmreports.compute a where not exists (select * from elma.companies z where lower(trim(a."WZ"))=lower(trim(z.id_klienta)))
--select distinct "WZ" from vmreports.compute a where not exists (select * from elma.companies z where a."WZ"=z.id_klienta)

--select * from elma.companies where id_klienta='WZ00114'
--select * from vmreports.compute where "WZ"='WZ00114'
--select * from vmreports.compute where "WZ"='WZ00195'

--select d.* from elma.companies z join elma.deals d on (z.__id=d._companies) where id_klienta='WZ03378'
--select aa.* from elma.additional_agreements aa join elma.aggrements a on (aa.contract_uid=a.__id) join elma.companies z on (a.company_uid=z.__id)where id_klienta='WZ03378'




