From 3bc7cea1d1ef199a534967c0524552f21ec3e2e0 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 20 Jul 2026 11:06:58 +0300 Subject: [PATCH] 021 dimensions dimension1 --- Application.cfc | 93 +++- etc/db/20260610_vmreports_back.sql | 205 +++++++++ etc/db/billing_schema_vmreports.sql | 128 ++++++ etc/db/dwh_vmreports_schema.sql | 204 +++++++++ etc/db/reassign_permissions.sql | 101 +++++ etc/db/vmreports_foreign.02.sql | 65 +++ etc/db/vmreports_foreign.03.sql | 37 ++ etc/db/vmreports_foreign.05.sql | 113 +++++ etc/db/vmreports_foreign.sql | 47 +++ etc/db/vsan.sql | 52 +++ etc/info/1.json | 633 ++++++++++++++++++++++++++++ json.cfm | 143 +++++-- mod/{payg.cfm => compute_payg.cfm} | 249 +++++++---- mod/crm_contract.cfm | 13 +- mod/new 1.txt | 22 + payg.cfm | 201 ++++++--- 16 files changed, 2121 insertions(+), 185 deletions(-) create mode 100644 etc/db/20260610_vmreports_back.sql create mode 100644 etc/db/billing_schema_vmreports.sql create mode 100644 etc/db/dwh_vmreports_schema.sql create mode 100644 etc/db/reassign_permissions.sql create mode 100644 etc/db/vmreports_foreign.02.sql create mode 100644 etc/db/vmreports_foreign.03.sql create mode 100644 etc/db/vmreports_foreign.05.sql create mode 100644 etc/db/vmreports_foreign.sql create mode 100644 etc/db/vsan.sql create mode 100644 etc/info/1.json rename mod/{payg.cfm => compute_payg.cfm} (64%) create mode 100644 mod/new 1.txt diff --git a/Application.cfc b/Application.cfc index d3f85af..72eb710 100644 --- a/Application.cfc +++ b/Application.cfc @@ -8,6 +8,7 @@ + @@ -24,7 +25,8 @@ - + + @@ -38,19 +40,30 @@ - - - + + + + + + + + + + + + + - + @@ -176,16 +189,30 @@ Кладем данные из токена в реквест и наслаждаемся ---> - - + var requestData = GetHttpRequestData(); var headers = requestData.headers; + + //var authorizationHeader = server.system.environment?.AUTHORIZATION; + + if (structKeyExists(headers,"Authorization")) { + request.auth_header = headers.Authorization; + } else { + //request.auth_header = createObject("java", "java.lang.System").getEnv("AUTHORIZATION"); + request.auth_header = server.system.environment?.AUTHORIZATION; //так короче + if (isNull(request.auth_header)){ /*for local debug we can inject long-living token into environment*/ + structDelete(request,"auth_header"); + } else { + request.auth_header = "Bearer #request.auth_header#"; + } + } - if (structKeyExists(headers,"authorization")) { // аутентификация для клиента ЛК - var authorizationHeader = headers.authorization; + // if (structKeyExists(headers,"authorization")) { // аутентификация для клиента ЛК + if (structKeyExists(request,"auth_header")) { // аутентификация для клиента ЛК + var authorizationHeader = request.auth_header; if (authorizationHeader.startsWith("Bearer ")) { var bearerToken = Mid(authorizationHeader, 8); - writeDump(bearerToken); + //writeDump(bearerToken); //var token=toString(binaryDecode(bearerToken, "base64")); //writeDump(token); //jwt = new lib.jwt(this.client_secret); @@ -194,7 +221,7 @@ //} var result=""; //try { - var iamService = new http(method = "GET", charset = "utf-8", url = #this.iam_url#, timeout="5"); + var iamService = new http(method = "GET", charset = "utf-8", url = #this.iamServiceUrl#, timeout="5"); iamService.addParam(type = "HEADER", name = "Accept", value = "application/json"); iamService.addParam(type = "HEADER", name = "Authorization", value = "#authorizationHeader#"); //passthrough //writedump(this.iamServiceUrl);abort; @@ -206,7 +233,7 @@ //writedump(this.iamServiceUrl); //writedump(resp); var iamStatusCode = (isValid("integer", prefix.status_code)) ? val(prefix.status_code) : 500; - throw(message="IAM error", detail="URL: #this.iam_url# Status Code: #prefix.status_code#"); + throw(message="IAM error", detail="URL: #this.iamServiceUrl# Status Code: #prefix.status_code#"); //abort; //throw("IDP response not OK"); } @@ -314,6 +341,10 @@ } request.auth.wz='WZ01348'; //******************* + request.auth.wz='WZ01005'; //******************* + request.auth.wz='WZ01653'; //******************* + request.auth.wz='WZ02319'; //******************* + request.auth.wz='WZ01762'; //******************* @@ -519,4 +550,40 @@ + + + + + + + + + + select value as stand from config + where name='STAND' + + + + + + + + + + + + + + + + + + + + + + + + ---> + \ No newline at end of file diff --git a/etc/db/20260610_vmreports_back.sql b/etc/db/20260610_vmreports_back.sql new file mode 100644 index 0000000..922b0b9 --- /dev/null +++ b/etc/db/20260610_vmreports_back.sql @@ -0,0 +1,205 @@ +DROP FOREIGN TABLE IF EXISTS vmreports.compute CASCADE; +DROP FOREIGN TABLE IF EXISTS vmreports.storage CASCADE; +DROP FOREIGN TABLE IF EXISTS vmreports.host CASCADE; +DROP FOREIGN TABLE IF EXISTS vmreports.vm_gpu CASCADE; +DROP FOREIGN TABLE IF EXISTS vmreports.vm_power_state CASCADE; + +-------------------------------------------------------------------------------- + +CREATE SCHEMA IF NOT EXISTS vmreports; +ALTER SCHEMA vmreports OWNER TO dbo; +GRANT USAGE ON SCHEMA vmreports TO nifi,appserver,reader,analytics,analyst; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT SELECT ON TABLES TO appserver,reader; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT SELECT, REFERENCES ON TABLES TO appserver,analytics,analyst; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT ALL ON TABLES TO nifi; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT USAGE ON SEQUENCES TO nifi, appserver; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- TOC entry 721 (class 1259 OID 9816992) +-- Name: compute; Type: TABLE; Schema: vmreports; Owner: smishchuk +-- + +CREATE TABLE vmreports.compute ( + "Name" character varying(255), + "UUID_VM" character varying(255), + "VDC" character varying(255), + "Organization_UUID" uuid, + "Organization" character varying(255), + "WZ" character varying(255), + "Cluster" character varying(255), + "Host" character varying(255), + "Host_Model" character varying(255), + "CPU_Model" character varying(255), + "Host_CPU_Cores" double precision, + "Host_CPU_Sockets" double precision, + "Host_CPU_Speed" double precision, + "Host_RAM" double precision, + "Host_CPU_Used" double precision, + "Host_CPU_Used_Avg" double precision, + "VDC_CPU_Reserv" double precision, + "VDC_CPU_Speed" double precision, + "VM_vCPU_count" double precision, + "VM_CPU_Used" double precision, + "VM_CPU_Used_AVG" double precision, + "VM_CPU_Reserv_GHz" double precision, + "VM_CPU_Reserv_perc" double precision, + "VM_RAM_Allocated" double precision, + "VM_RAM_Used" double precision, + "VM_is_ON" double precision, + "Object_UUID" uuid NOT NULL, + ts timestamp with time zone NOT NULL +); + + +ALTER TABLE vmreports.compute OWNER TO dbo; + +-- +-- TOC entry 722 (class 1259 OID 9817004) +-- Name: storage; Type: TABLE; Schema: vmreports; Owner: smishchuk +-- + +CREATE TABLE vmreports.storage ( + "Name" character varying(255), + "VM_UUID" character varying(255), + "VDC" character varying(255), + "Organization_UUID" uuid, + "Organization" character varying(255), + "WZ" character varying(255), + "Cluster" character varying(255), + "Disk" character varying(255), + "Storage_Policy" character varying(255), + "Disk_Allocated" double precision, + "Disk_Used" double precision, + "VM_is_ON" double precision, + "Object_UUID" uuid NOT NULL, + ts timestamp with time zone NOT NULL +); + + +ALTER TABLE vmreports.storage OWNER TO dbo; + +-- +-- TOC entry 720 (class 1259 OID 9816984) +-- Name: host; Type: TABLE; Schema: vmreports; Owner: smishchuk +-- + +CREATE TABLE vmreports.host ( + "Name" character varying(255), + "Model" character varying(255), + "Cluster" character varying(255), + "Maintenance" character varying(255), + "CPU_Cores" double precision, + "CPU_Sockets" double precision, + "CPU_Speed" double precision, + "RAM_Total" double precision, + "RAM_Used" double precision, + "CPU_Used" double precision, + "CPU_Used_AVG" double precision, + "CPU_Contention_95" double precision, + "Object_UUID" uuid NOT NULL, + ts timestamp with time zone NOT NULL, + "Cluster_v2" character varying(255), + "HT_Active" boolean, + "CPUtoVM" double precision, + "RAMtoVM" double precision +); + + +ALTER TABLE vmreports.host OWNER TO dbo; + +-- +-- TOC entry 733 (class 1259 OID 11093092) +-- Name: vm_gpu; Type: TABLE; Schema: vmreports; Owner: smishchuk +-- + +CREATE TABLE vmreports.vm_gpu ( + "Name" character varying(255), + "ClientID" character varying(255), + "VCD" character varying(255), + "Org" character varying(255), + "OrgVDC" character varying(255), + "vCenter" character varying(255), + "GPU" jsonb, + "OrgStatus" character varying(255), + "Object_UUID" uuid NOT NULL, + ts timestamp with time zone NOT NULL +); + + +ALTER TABLE vmreports.vm_gpu OWNER TO dbo; + +-- +-- TOC entry 732 (class 1259 OID 11093087) +-- Name: vm_power_state; Type: TABLE; Schema: vmreports; Owner: smishchuk +-- + +CREATE TABLE vmreports.vm_power_state ( + "Object_UUID" uuid NOT NULL, + ts timestamp with time zone NOT NULL, + value double precision +); + + +ALTER TABLE vmreports.vm_power_state OWNER TO dbo; + +-- +-- TOC entry 4761 (class 2606 OID 9816998) +-- Name: compute pk_compute; Type: CONSTRAINT; Schema: vmreports; Owner: smishchuk +-- + +ALTER TABLE ONLY vmreports.compute + ADD CONSTRAINT pk_compute PRIMARY KEY (ts, "Object_UUID"); + + +-- +-- TOC entry 4759 (class 2606 OID 9816990) +-- Name: host pk_host; Type: CONSTRAINT; Schema: vmreports; Owner: smishchuk +-- + +ALTER TABLE ONLY vmreports.host + ADD CONSTRAINT pk_host PRIMARY KEY (ts, "Object_UUID"); + + +-- +-- TOC entry 4763 (class 2606 OID 9817010) +-- Name: storage pk_storage; Type: CONSTRAINT; Schema: vmreports; Owner: smishchuk +-- + +ALTER TABLE ONLY vmreports.storage + ADD CONSTRAINT pk_storage PRIMARY KEY (ts, "Object_UUID"); + + +-- +-- TOC entry 4767 (class 2606 OID 11093098) +-- Name: vm_gpu pk_vm_gpu; Type: CONSTRAINT; Schema: vmreports; Owner: smishchuk +-- + +ALTER TABLE ONLY vmreports.vm_gpu + ADD CONSTRAINT pk_vm_gpu PRIMARY KEY (ts, "Object_UUID"); + + +-- +-- TOC entry 4765 (class 2606 OID 11093091) +-- Name: vm_power_state pk_vm_power_state; Type: CONSTRAINT; Schema: vmreports; Owner: smishchuk +-- + +ALTER TABLE ONLY vmreports.vm_power_state + ADD CONSTRAINT pk_vm_power_state PRIMARY KEY ("Object_UUID", ts); + + +-- +-- TOC entry 5168 (class 0 OID 0) +-- Dependencies: 10 +-- Name: SCHEMA vmreports; Type: ACL; Schema: -; Owner: dbo +-- + +GRANT ALL ON SCHEMA vmreports TO nifi; + + + +GRANT ALL ON ALL TABLES IN SCHEMA vmreports TO nifi; +GRANT SELECT, REFERENCES ON ALL TABLES IN SCHEMA vmreports TO analytics, analyst; \ No newline at end of file diff --git a/etc/db/billing_schema_vmreports.sql b/etc/db/billing_schema_vmreports.sql new file mode 100644 index 0000000..b6726ee --- /dev/null +++ b/etc/db/billing_schema_vmreports.sql @@ -0,0 +1,128 @@ +CREATE SCHEMA IF NOT EXISTS vmreports; + +ALTER SCHEMA vmreports OWNER TO dbo; +GRANT USAGE ON SCHEMA vmreports TO nifi; + +GRANT ALL ON ALL TABLES IN SCHEMA vmreports TO nifi; +GRANT ALL ON ALL SEQUENCES IN SCHEMA vmreports TO nifi; + +--ALTER DEFAULT PRIVILEGES IN SCHEMA vmreports GRANT ALL ON TABLES TO nifi; +--ALTER DEFAULT PRIVILEGES IN SCHEMA vmreports GRANT ALL ON SEQUENCES TO nifi; + +ALTER DEFAULT PRIVILEGES FOR ROLE dbo, postgres IN SCHEMA vmreports GRANT ALL ON TABLES TO nifi; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo, postgres IN SCHEMA vmreports GRANT SELECT ON TABLES TO appserver; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo, postgres IN SCHEMA vmreports GRANT ALL ON SEQUENCES TO nifi; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo, postgres IN SCHEMA vmreports GRANT USAGE ON SEQUENCES TO appserver; + +drop table if exists vmreports.host; +create table vmreports.host( +"Name" varchar(255) NULL, +"Model" varchar(255) NULL, +"Cluster" varchar(255) NULL, +"Cluster_v2" varchar(255) NULL, +"Maintenance" varchar(255) NULL, + +"CPU_Cores" float NULL, -- per host, not per socket +"CPU_Sockets" float NULL, -- not used in caclulations +"CPU_Speed" float NULL, +"RAM_Total" float NULL, +"RAM_Used" float NULL, +"CPU_Used" float NULL, +"CPU_Used_AVG" float NULL, +"CPU_Contention_95" float NULL, +"HT_Active" boolean NULL, +"CPUtoVM" float NULL, +"RAMtoVM" float NULL, +"Object_UUID" uuid NOT NULL, +ts timestamptz NOT NULL +,CONSTRAINT PK_host PRIMARY KEY (ts, "Object_UUID") +); +--grant all on vmreports.host to nifi; + +drop table if exists vmreports.compute; +create table vmreports.compute ( + + "Name" varchar(255) NULL, + "UUID_VM" varchar(255) NULL, + "VDC" varchar(255) NULL, + "Organization_UUID" uuid NULL, + "Organization" varchar(255) NULL, + "WZ" varchar(255) NULL, + "Cluster" varchar(255) NULL, + "Host" varchar(255) NULL, + "Host_Model" varchar(255) NULL, + "CPU_Model" varchar(255) NULL, + + "Host_CPU_Cores" float NULL, + "Host_CPU_Sockets" float NULL, + "Host_CPU_Speed" float NULL, + "Host_RAM" float NULL, + "Host_CPU_Used" float NULL, + "Host_CPU_Used_Avg" float NULL, + "VDC_CPU_Reserv" float NULL, + "VDC_CPU_Speed" float NULL, + "VM_vCPU_count" float NULL, + "VM_CPU_Used" float NULL, + "VM_CPU_Used_AVG" float NULL, + "VM_CPU_Reserv_GHz" float NULL, + "VM_CPU_Reserv_perc" float NULL, + "VM_RAM_Allocated" float NULL, + "VM_RAM_Used" float NULL, + "VM_is_ON" float NULL, + --"Summary": false, + --"Grand Total": false, + --"Group UUID": null, + "Object_UUID" uuid NOT NULL, + ts timestamptz NOT NULL + ,CONSTRAINT PK_compute PRIMARY KEY (ts, "Object_UUID") +); +--grant all on vmreports.compute to nifi; + +drop table if exists vmreports.storage; +create table vmreports.storage ( + + "Name" varchar(255) NULL, + "VM_UUID" varchar(255) NULL, + "VDC" varchar(255) NULL, + "Organization_UUID" uuid NULL, + "Organization" varchar(255) NULL, + "WZ" varchar(255) NULL, + "Cluster" varchar(255) NULL, + "Disk" varchar(255) NULL, + "Storage_Policy" varchar(255) NULL, + + "Disk_Allocated" float NULL, + "Disk_Used" float NULL, + "VM_is_ON" float NULL, + "Object_UUID" uuid NOT NULL, + ts timestamptz NOT NULL + ,CONSTRAINT PK_storage PRIMARY KEY (ts, "Object_UUID") +); +--grant all on vmreports.storage to nifi; + +drop table if exists vmreports.vm_gpu; +create table vmreports.vm_gpu ( + "Name" varchar(255) NULL, + "ClientID" varchar(255) NULL, --WZ + "VCD" varchar(255) NULL, --vcloud + "Org" varchar(255) NULL, + "OrgVDC" varchar(255) NULL, + "vCenter" varchar(255) NULL, + "GPU" jsonb NULL, + "OrgStatus" varchar(255) NULL, + "Object_UUID" uuid NOT NULL, + ts timestamptz NOT NULL + ,CONSTRAINT PK_vm_gpu PRIMARY KEY (ts, "Object_UUID") +); +--grant all on vmreports.vm_gpu to nifi; + +DROP TABLE IF EXISTS vmreports.vm_power_state; +CREATE TABLE IF NOT EXISTS vmreports.vm_power_state +( + "Object_UUID" uuid NOT NULL, + ts timestamp with time zone NOT NULL, + value float, + CONSTRAINT PK_vm_power_state PRIMARY KEY ("Object_UUID", ts) +); +--grant all on vmreports.vm_power_state to nifi; + diff --git a/etc/db/dwh_vmreports_schema.sql b/etc/db/dwh_vmreports_schema.sql new file mode 100644 index 0000000..fcbc5ca --- /dev/null +++ b/etc/db/dwh_vmreports_schema.sql @@ -0,0 +1,204 @@ +-- +-- PostgreSQL database dump +-- + + +-- +-- TOC entry 10 (class 2615 OID 9816969) +-- Name: vmreports; Type: SCHEMA; Schema: -; Owner: dbo +-- + +CREATE SCHEMA IF NOT EXISTS vmreports; +ALTER SCHEMA vmreports OWNER TO dbo; +GRANT USAGE ON SCHEMA vmreports TO nifi,appserver; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT SELECT ON TABLES TO appserver; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT ALL ON TABLES TO nifi; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT USAGE ON SEQUENCES TO nifi, appserver; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- TOC entry 721 (class 1259 OID 9816992) +-- Name: compute; Type: TABLE; Schema: vmreports; Owner: smishchuk +-- + +CREATE TABLE vmreports.compute ( + "Name" character varying(255), + "UUID_VM" character varying(255), + "VDC" character varying(255), + "Organization_UUID" uuid, + "Organization" character varying(255), + "WZ" character varying(255), + "Cluster" character varying(255), + "Host" character varying(255), + "Host_Model" character varying(255), + "CPU_Model" character varying(255), + "Host_CPU_Cores" double precision, + "Host_CPU_Sockets" double precision, + "Host_CPU_Speed" double precision, + "Host_RAM" double precision, + "Host_CPU_Used" double precision, + "Host_CPU_Used_Avg" double precision, + "VDC_CPU_Reserv" double precision, + "VDC_CPU_Speed" double precision, + "VM_vCPU_count" double precision, + "VM_CPU_Used" double precision, + "VM_CPU_Used_AVG" double precision, + "VM_CPU_Reserv_GHz" double precision, + "VM_CPU_Reserv_perc" double precision, + "VM_RAM_Allocated" double precision, + "VM_RAM_Used" double precision, + "VM_is_ON" double precision, + "Object_UUID" uuid NOT NULL, + ts timestamp with time zone NOT NULL +); + + +ALTER TABLE vmreports.compute OWNER TO dbo; + +-- +-- TOC entry 722 (class 1259 OID 9817004) +-- Name: storage; Type: TABLE; Schema: vmreports; Owner: smishchuk +-- + +CREATE TABLE vmreports.storage ( + "Name" character varying(255), + "VM_UUID" character varying(255), + "VDC" character varying(255), + "Organization_UUID" uuid, + "Organization" character varying(255), + "WZ" character varying(255), + "Cluster" character varying(255), + "Disk" character varying(255), + "Storage_Policy" character varying(255), + "Disk_Allocated" double precision, + "Disk_Used" double precision, + "VM_is_ON" double precision, + "Object_UUID" uuid NOT NULL, + ts timestamp with time zone NOT NULL +); + + +ALTER TABLE vmreports.storage OWNER TO dbo; + +-- +-- TOC entry 720 (class 1259 OID 9816984) +-- Name: host; Type: TABLE; Schema: vmreports; Owner: smishchuk +-- + +CREATE TABLE vmreports.host ( + "Name" character varying(255), + "Model" character varying(255), + "Cluster" character varying(255), + "Maintenance" character varying(255), + "CPU_Cores" double precision, + "CPU_Sockets" double precision, + "CPU_Speed" double precision, + "RAM_Total" double precision, + "RAM_Used" double precision, + "CPU_Used" double precision, + "CPU_Used_AVG" double precision, + "CPU_Contention_95" double precision, + "Object_UUID" uuid NOT NULL, + ts timestamp with time zone NOT NULL, + "Cluster_v2" character varying(255), + "HT_Active" boolean, + "CPUtoVM" double precision, + "RAMtoVM" double precision +); + + +ALTER TABLE vmreports.host OWNER TO dbo; + +-- +-- TOC entry 733 (class 1259 OID 11093092) +-- Name: vm_gpu; Type: TABLE; Schema: vmreports; Owner: smishchuk +-- + +CREATE TABLE vmreports.vm_gpu ( + "Name" character varying(255), + "ClientID" character varying(255), + "VCD" character varying(255), + "Org" character varying(255), + "OrgVDC" character varying(255), + "vCenter" character varying(255), + "GPU" jsonb, + "OrgStatus" character varying(255), + "Object_UUID" uuid NOT NULL, + ts timestamp with time zone NOT NULL +); + + +ALTER TABLE vmreports.vm_gpu OWNER TO dbo; + +-- +-- TOC entry 732 (class 1259 OID 11093087) +-- Name: vm_power_state; Type: TABLE; Schema: vmreports; Owner: smishchuk +-- + +CREATE TABLE vmreports.vm_power_state ( + "Object_UUID" uuid NOT NULL, + ts timestamp with time zone NOT NULL, + value double precision +); + + +ALTER TABLE vmreports.vm_power_state OWNER TO dbo; + +-- +-- TOC entry 4761 (class 2606 OID 9816998) +-- Name: compute pk_compute; Type: CONSTRAINT; Schema: vmreports; Owner: smishchuk +-- + +ALTER TABLE ONLY vmreports.compute + ADD CONSTRAINT pk_compute PRIMARY KEY (ts, "Object_UUID"); + + +-- +-- TOC entry 4759 (class 2606 OID 9816990) +-- Name: host pk_host; Type: CONSTRAINT; Schema: vmreports; Owner: smishchuk +-- + +ALTER TABLE ONLY vmreports.host + ADD CONSTRAINT pk_host PRIMARY KEY (ts, "Object_UUID"); + + +-- +-- TOC entry 4763 (class 2606 OID 9817010) +-- Name: storage pk_storage; Type: CONSTRAINT; Schema: vmreports; Owner: smishchuk +-- + +ALTER TABLE ONLY vmreports.storage + ADD CONSTRAINT pk_storage PRIMARY KEY (ts, "Object_UUID"); + + +-- +-- TOC entry 4767 (class 2606 OID 11093098) +-- Name: vm_gpu pk_vm_gpu; Type: CONSTRAINT; Schema: vmreports; Owner: smishchuk +-- + +ALTER TABLE ONLY vmreports.vm_gpu + ADD CONSTRAINT pk_vm_gpu PRIMARY KEY (ts, "Object_UUID"); + + +-- +-- TOC entry 4765 (class 2606 OID 11093091) +-- Name: vm_power_state pk_vm_power_state; Type: CONSTRAINT; Schema: vmreports; Owner: smishchuk +-- + +ALTER TABLE ONLY vmreports.vm_power_state + ADD CONSTRAINT pk_vm_power_state PRIMARY KEY ("Object_UUID", ts); + + +-- +-- TOC entry 5168 (class 0 OID 0) +-- Dependencies: 10 +-- Name: SCHEMA vmreports; Type: ACL; Schema: -; Owner: dbo +-- + +GRANT ALL ON SCHEMA vmreports TO nifi; + + + diff --git a/etc/db/reassign_permissions.sql b/etc/db/reassign_permissions.sql new file mode 100644 index 0000000..f28811d --- /dev/null +++ b/etc/db/reassign_permissions.sql @@ -0,0 +1,101 @@ +ALTER TABLE IF EXISTS vmreports.storage + OWNER to dbo; + +REVOKE ALL ON TABLE vmreports.storage FROM analyst; +REVOKE ALL ON TABLE vmreports.storage FROM analytics; +REVOKE ALL ON TABLE vmreports.storage FROM appserver; + +GRANT SELECT ON TABLE vmreports.storage TO analyst; + +GRANT SELECT ON TABLE vmreports.storage TO analytics; + +GRANT SELECT ON TABLE vmreports.storage TO appserver; + +GRANT ALL ON TABLE vmreports.storage TO dbo; + +GRANT ALL ON TABLE vmreports.storage TO designer; + +GRANT ALL ON TABLE vmreports.storage TO nifi; + +--------------- +ALTER TABLE IF EXISTS vmreports.compute + OWNER to dbo; + +REVOKE ALL ON TABLE vmreports.compute FROM analyst; +REVOKE ALL ON TABLE vmreports.compute FROM analytics; +REVOKE ALL ON TABLE vmreports.compute FROM appserver; + +GRANT SELECT ON TABLE vmreports.compute TO analyst; + +GRANT SELECT ON TABLE vmreports.compute TO analytics; + +GRANT SELECT ON TABLE vmreports.compute TO appserver; + +GRANT ALL ON TABLE vmreports.compute TO dbo; + +GRANT ALL ON TABLE vmreports.compute TO designer; + +GRANT ALL ON TABLE vmreports.compute TO nifi; + + +-------------------- +ALTER TABLE IF EXISTS vmreports.host + OWNER to dbo; + +REVOKE ALL ON TABLE vmreports.host FROM analyst; +REVOKE ALL ON TABLE vmreports.host FROM analytics; +REVOKE ALL ON TABLE vmreports.host FROM appserver; + +GRANT SELECT ON TABLE vmreports.host TO analyst; + +GRANT SELECT ON TABLE vmreports.host TO analytics; + +GRANT SELECT ON TABLE vmreports.host TO appserver; + +GRANT ALL ON TABLE vmreports.host TO dbo; + +GRANT ALL ON TABLE vmreports.host TO designer; + +GRANT ALL ON TABLE vmreports.host TO nifi; + +------------------------------------ +ALTER TABLE IF EXISTS vmreports.vm_gpu + OWNER to dbo; + +REVOKE ALL ON TABLE vmreports.vm_gpu FROM analyst; +REVOKE ALL ON TABLE vmreports.vm_gpu FROM analytics; +REVOKE ALL ON TABLE vmreports.vm_gpu FROM appserver; + +GRANT SELECT ON TABLE vmreports.vm_gpu TO analyst; + +GRANT SELECT ON TABLE vmreports.vm_gpu TO analytics; + +GRANT SELECT ON TABLE vmreports.vm_gpu TO appserver; + +GRANT ALL ON TABLE vmreports.vm_gpu TO dbo; + +GRANT ALL ON TABLE vmreports.vm_gpu TO designer; + +GRANT ALL ON TABLE vmreports.vm_gpu TO nifi; + +----------------- +ALTER TABLE IF EXISTS vmreports.vm_power_state + OWNER to dbo; + +REVOKE ALL ON TABLE vmreports.vm_power_state FROM analyst; +REVOKE ALL ON TABLE vmreports.vm_power_state FROM analytics; +REVOKE ALL ON TABLE vmreports.vm_power_state FROM appserver; + +GRANT SELECT ON TABLE vmreports.vm_power_state TO analyst; + +GRANT SELECT ON TABLE vmreports.vm_power_state TO analytics; + +GRANT SELECT ON TABLE vmreports.vm_power_state TO appserver; + +GRANT ALL ON TABLE vmreports.vm_power_state TO dbo; + +GRANT ALL ON TABLE vmreports.vm_power_state TO designer; + +GRANT ALL ON TABLE vmreports.vm_power_state TO nifi; + + diff --git a/etc/db/vmreports_foreign.02.sql b/etc/db/vmreports_foreign.02.sql new file mode 100644 index 0000000..84c3d09 --- /dev/null +++ b/etc/db/vmreports_foreign.02.sql @@ -0,0 +1,65 @@ +SET ROLE dbo; +DROP SCHEMA IF EXISTS vmreports CASCADE; +CREATE SCHEMA IF NOT EXISTS vmreports AUTHORIZATION dbo; + +GRANT USAGE ON SCHEMA vmreports TO appserver; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT SELECT ON TABLES TO appserver; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT USAGE ON SEQUENCES TO appserver; + +GRANT USAGE ON SCHEMA vmreports TO nifi,analytics,analyst; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT SELECT ON TABLES TO nifi,analytics,analyst; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT USAGE ON SEQUENCES TO nifi,analytics,analyst; + +/* +конструкция осложняется тем, что +нужен один пользователь-владелец и второй читатель +Это вызывает множество телодвижений при создании. +Необходимость указывать пароль при локальном коннекте не очень радует +(ведь пользователь локальный, прописан на этом же сервере) +*/ + +--DROP FOREIGN TABLE IF EXISTS host; +--CREATE FOREIGN TABLE vmreports.host () SERVER billing OPTIONS (schema_name 'vmreports', table_name 'host'); -- вместо этого лучше импортировать схему +DROP SERVER IF EXISTS billing CASCADE; +CREATE SERVER billing + FOREIGN DATA WRAPPER postgres_fdw + OPTIONS (host 'localhost', port '5432', dbname 'billing', updatable 'false'); +-- для импорта схемы мы создаем маппинг владельцу +DROP USER MAPPING IF EXISTS FOR PUBLIC SERVER billing; +CREATE USER MAPPING FOR PUBLIC SERVER billing OPTIONS (user 'appserver', password '***'); + +IMPORT FOREIGN SCHEMA vmreports FROM SERVER billing INTO vmreports; +--GRANT SELECT ON vmreports.host to appserver; +--DROP USER MAPPING IF EXISTS FOR dbo SERVER billing; -- мы импортировали схему, маппинг больше не нужен. +-- Но нам все равно пришлось указать пароль дважды + + +--DROP USER MAPPING IF EXISTS FOR appserver SERVER billing; +--CREATE USER MAPPING FOR appserver SERVER billing OPTIONS (user 'nifi', password '***'); +--проверка +--set role appserver; select * from vmreports.host; + +-- это если интересно, не разрешен ли локальный коннект +--SELECT * FROM pg_hba_file_rules; + +/* +Довольно тонкий нюанс, легко ускользающий +ALTER DEFAULT PRIVILEGES FOR ROLE target_creator_role +IN SCHEMA schema_name +GRANT privilege_type ON TABLES TO recipient_role; +Recommended Strategy for "Any User"Because there is no "FOR ALL ROLES" option, the best practice is to have all users create objects as a shared group role.Create a group role (e.g., schema_owner_role).Grant that role to all relevant users.Instruct users to run SET ROLE schema_owner_role; before creating objects.Run ALTER DEFAULT PRIVILEGES FOR ROLE schema_owner_role ... once to cover all objects created under that role. +*/ +/* +Best Practices for Role Owners:Dedicated Schema Owner: Create a dedicated, non-login role for managing database schema objects (DDL) and make it the owner of the database/schemas.Separation of Duties: Separate the application user (DML - SELECT, INSERT, UPDATE) from the owner role (DDL - CREATE, ALTER, DROP).Use ALTER DEFAULT PRIVILEGES: Set up default privileges for new objects to ensure that user roles automatically gain access to new tables or functions created by the owner role.Leverage Role Hierarchy: Create group roles (e.g., app_reader, app_writer) and grant these to individual user roles for easier permission management.Avoid Public Schema: Create specific schemas and revoke CREATE privileges on the public schema to prevent accidental object creation.Secure SUPERUSER Usage: Only use the default postgres superuser role for initial setup and critical administrative tasks. Never use it for applications.Example Implementation:sql-- Create a schema owner +CREATE ROLE ddl_user NOLOGIN; +-- Create an app user +CREATE ROLE dml_user LOGIN PASSWORD 'secure_password'; + +-- Assign ownership +ALTER DATABASE mydb OWNER TO ddl_user; +ALTER SCHEMA public OWNER TO ddl_user; + +-- Grant future access +ALTER DEFAULT PRIVILEGES FOR ROLE ddl_user IN SCHEMA public +GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO dml_user; +*/ \ No newline at end of file diff --git a/etc/db/vmreports_foreign.03.sql b/etc/db/vmreports_foreign.03.sql new file mode 100644 index 0000000..23ed379 --- /dev/null +++ b/etc/db/vmreports_foreign.03.sql @@ -0,0 +1,37 @@ +CREATE EXTENSION IF NOT EXISTS postgres_fdw; +GRANT USAGE ON FOREIGN DATA WRAPPER postgres_fdw TO dbo; + +SET ROLE dbo; +DROP SCHEMA IF EXISTS vmreports CASCADE; +CREATE SCHEMA IF NOT EXISTS vmreports AUTHORIZATION dbo; + +GRANT USAGE ON SCHEMA vmreports TO nifi,analytics,analyst; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT SELECT ON TABLES TO nifi,analytics,analyst; -- это работает и для внешних таблиц +--ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT USAGE ON SEQUENCES TO nifi,analytics,analyst; + +/* +конструкция осложняется тем, что +нужен один пользователь-владелец и второй читатель +Это вызывает множество телодвижений при создании. +Необходимость указывать пароль при локальном коннекте не очень радует +(ведь пользователь локальный, прописан на этом же сервере) +*/ + +DROP SERVER IF EXISTS billing CASCADE; +CREATE SERVER billing + FOREIGN DATA WRAPPER postgres_fdw + OPTIONS (host 'localhost', port '5432', dbname 'billing', updatable 'false'); +DROP USER MAPPING IF EXISTS FOR PUBLIC SERVER billing; +CREATE USER MAPPING FOR PUBLIC SERVER billing OPTIONS (user 'nifi', password '***'); + +IMPORT FOREIGN SCHEMA vmreports FROM SERVER billing INTO vmreports; + +--select * from vmreports.host; + +/* +план миграции +Забекапить схему vmreports +Восстановить схему vmreports в базу биллинг +Поменять целевую базу импорта НиФи (для прода - втащить новый обмен из репозитория) +Выполнить скрипт в базе DWH - он удалит физические таблицы и создаст внешние таблицы на базу billing +*/ \ No newline at end of file diff --git a/etc/db/vmreports_foreign.05.sql b/etc/db/vmreports_foreign.05.sql new file mode 100644 index 0000000..5d7b81b --- /dev/null +++ b/etc/db/vmreports_foreign.05.sql @@ -0,0 +1,113 @@ +-- выполнить в базе dwh для создания внешних таблиц схемы vmreports +-- перед выполнением забекапить схему vmreports для восстановления в БД billing +CREATE EXTENSION IF NOT EXISTS postgres_fdw; +GRANT USAGE ON FOREIGN DATA WRAPPER postgres_fdw TO dbo; + +SET ROLE dbo; +--DROP SCHEMA IF EXISTS vmreports CASCADE; +CREATE SCHEMA IF NOT EXISTS vmreports AUTHORIZATION dbo; + +GRANT USAGE ON SCHEMA vmreports TO nifi,analytics,analyst; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT SELECT ON TABLES TO nifi,analytics,analyst; -- это работает и для внешних таблиц +--ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT USAGE ON SEQUENCES TO nifi,analytics,analyst; + +/* +конструкция осложняется тем, что +нужен один пользователь-владелец и второй читатель +Это вызывает множество телодвижений при создании. +Необходимость указывать пароль при локальном коннекте не очень радует +(ведь пользователь локальный, прописан на этом же сервере) +А при смене его пароля все сломается, и поиск ошибки будет неочевиден +*/ + +DO $$ +DECLARE + rec RECORD; +BEGIN + FOR rec IN + SELECT tablename + FROM pg_tables + WHERE schemaname = 'vmreports' + LOOP + EXECUTE format('ALTER TABLE vmreports.%I RENAME TO %I', + rec.tablename, + 'del_' || rec.tablename); + END LOOP; +END $$; + +DROP SERVER IF EXISTS billing CASCADE; +CREATE SERVER billing + FOREIGN DATA WRAPPER postgres_fdw + OPTIONS (host 'localhost', port '5432', dbname 'billing', updatable 'false'); +DROP USER MAPPING IF EXISTS FOR PUBLIC SERVER billing; +CREATE USER MAPPING FOR PUBLIC SERVER billing OPTIONS (user 'nifi', password '***'); + +IMPORT FOREIGN SCHEMA vmreports FROM SERVER billing INTO vmreports; + +--select * from vmreports.host; + +/* +план миграции - черновик +Забекапить схему vmreports +Восстановить схему vmreports из бэкапа в базу биллинг +Поменять целевую базу импорта НиФи (для прода - втащить новый обмен из репозитория) +Выполнить скрипт в базе DWH - он удалит (переименует) физические таблицы и создаст внешние таблицы на базу billing +*/ + +/* +Исходно данные host, compute, storage, (gpu) +загружались в dwh.vmreports, +для анализа capacity + +В текущей конфигурации, +чтобы избежать дублирования +таблиц, данных и обменов NiFi +Направляем загрузку данных из VROPS в схему billing.vmreports +и в базе dwh (схема vmreports) создаем Foreign Tables на billing.vmreports. +----------------------------------------------- +Миграция на проде: +убедиться, что новый обмен VROPS->billing.vmreports (billing/vmReports) загружен в NiFi Registry +найти пароль nifi (под ним коннект к localhost) +остановить загрузку из VROPS на nifi-01 (billing/vmReports), +сделать бэкап схемы dwh.vmreports (займет минут 10 ... заняло 215 сек), +Восстановить схему vmreports в БД billing - запустить восстановление (Clean Before Restore) (РИСК: восстановление может занять много времени и завершиться с ошибками, обычно так бывает) +select count (*) from vmreports.storage +Выполнить этот скрипт (заменив пароль nifi на актуальный перед выполнением) + переименовать таблицы из схемы vmreports для удаления (есть в скрипте выше) + создать Foreign Tables (коннект проверится при импорте схемы) +Проверить, что права назначились коррректно + +Обновить обмен billing/vmReports на продуктиве, запустить +----------------------------------------------------------------- +Данные из billing.vmreports также реплицируются +(процессорами группы LK) +в буферную базу rpt + +*/ + +/* +17:04:49 MSKERROR0dff1f93-153d-3a90-ed64-55d23960b88c +EvaluateJsonPath[id=0dff1f93-153d-3a90-ed64-55d23960b88c] FlowFile FlowFile[filename=06c68bec-d824-4114-913b-bda34cb4fb1d] did not have valid JSON content. +-- со второй попытки отработало +17:05:15 MSKERROR239db407-76f2-3660-7fad-c4bedff6a4f8 +InvokeHTTP[id=239db407-76f2-3660-7fad-c4bedff6a4f8] Request Processing failed: FlowFile[filename=3474c340-f360-4a1e-a27e-283be41fc264]: java.net.SocketTimeoutException: timeout +- Caused by: java.net.SocketException: Socket closed + +https://payg.adl.nubes.ru/payg.cfm с первого раза таймаут, со второго посчиталось +*/ + +/* +теперь ищу в нифи примеры с кроном + +17:25:05 MSKERROR16efa0f6-f1e7-3755-04fc-5be0383244ec +PutDatabaseRecord[id=16efa0f6-f1e7-3755-04fc-5be0383244ec] Failed to put Records to database for FlowFile[filename=11f8176f-2a98-4199-932e-22e2fc2073b1]. Routing to failure.: org.apache.nifi.serialization.MalformedRecordException: Record does not have a value for the UpdateKey column 'obj_uuid' +17:25:05 MSKERROR16efa0f6-f1e7-3755-04fc-5be0383244ec +PutDatabaseRecord[id=16efa0f6-f1e7-3755-04fc-5be0383244ec] Record does not have a value for the UpdateKey column 'obj_uuid' +17:25:05 MSKERROR16efa0f6-f1e7-3755-04fc-5be0383244ec +PutDatabaseRecord[id=16efa0f6-f1e7-3755-04fc-5be0383244ec] Failed to put Records to database for FlowFile[filename=5039a3b6-2244-4451-81fc-deb8074f3cc7]. Routing to failure.: org.apache.nifi.serialization.MalformedRecordException: Record does not have a value for the UpdateKey column 'obj_uuid' +17:25:05 MSKERROR16efa0f6-f1e7-3755-04fc-5be0383244ec +PutDatabaseRecord[id=16efa0f6-f1e7-3755-04fc-5be0383244ec] Record does not have a value for the UpdateKey column 'obj_uuid' +17:25:05 MSKERROR16efa0f6-f1e7-3755-04fc-5be0383244ec +PutDatabaseRecord[id=16efa0f6-f1e7-3755-04fc-5be0383244ec] Failed to put Records to database for FlowFile[filename=8c6e9efb-198d-4303-897a-53fcfdf4d0f6]. Routing to failure.: org.apache.nifi.serialization.MalformedRecordException: Record does not have a value for the UpdateKey column 'obj_uuid' + +*/ \ No newline at end of file diff --git a/etc/db/vmreports_foreign.sql b/etc/db/vmreports_foreign.sql new file mode 100644 index 0000000..2bc947b --- /dev/null +++ b/etc/db/vmreports_foreign.sql @@ -0,0 +1,47 @@ +SET ROLE dbo; +DROP SCHEMA IF EXISTS vmreports CASCADE; +CREATE SCHEMA IF NOT EXISTS vmreports AUTHORIZATION dbo; + +--GRANT ALL ON SCHEMA vmreports TO postgres; +BEGIN +GRANT USAGE ON SCHEMA vmreports TO appserver; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT SELECT ON TABLES TO appserver; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT USAGE ON SEQUENCES TO appserver; +EXCEPTION END; + +BEGIN +GRANT USAGE ON SCHEMA vmreports TO nifi,analytics,analyst; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT SELECT ON TABLES TO nifi,analytics,analyst; +ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT USAGE ON SEQUENCES TO nifi,analytics,analyst; +EXCEPTION WHEN others THEN END; +/* +конструкция осложняется тем, что +нужен один пользователь-владелец и второй читатель +Это вызывает множество телодвижений при создании. +Необходимость указывать пароль при локальном коннекте не очень радует +(ведь пользователь локальный, прописан на этом же сервере) +*/ + +--DROP FOREIGN TABLE IF EXISTS host; +--CREATE FOREIGN TABLE vmreports.host () SERVER billing OPTIONS (schema_name 'vmreports', table_name 'host'); -- вместо этого лучше импортировать схему +DROP SERVER IF EXISTS billing CASCADE; +CREATE SERVER billing + FOREIGN DATA WRAPPER postgres_fdw + OPTIONS (host 'localhost', port '5432', dbname 'billing'); +-- для импорта схемы мы создаем маппинг владельцу +DROP USER MAPPING IF EXISTS FOR dbo SERVER billing; +CREATE USER MAPPING FOR dbo SERVER billing OPTIONS (user 'appserver', password '***'); + +IMPORT FOREIGN SCHEMA vmreports FROM SERVER billing INTO vmreports; +GRANT SELECT ON vmreports.host to appserver; +DROP USER MAPPING IF EXISTS FOR dbo SERVER billing; -- мы импортировали схему, маппинг больше не нужен. +-- Но нам все равно пришлось указать пароль дважды + + +DROP USER MAPPING IF EXISTS FOR appserver SERVER billing; +CREATE USER MAPPING FOR appserver SERVER billing OPTIONS (user 'appserver', password '***'); +--проверка +--set role appserver; select * from vmreports.host; + +-- это если интересно, не разрешен ли локальный коннект +--SELECT * FROM pg_hba_file_rules; \ No newline at end of file diff --git a/etc/db/vsan.sql b/etc/db/vsan.sql new file mode 100644 index 0000000..8256733 --- /dev/null +++ b/etc/db/vsan.sql @@ -0,0 +1,52 @@ +SET ROLE dbo; +DROP TABLE IF EXISTS vmreports.vsan_storage CASCADE; +CREATE TABLE vmreports.vsan_storage ( + "Name" varchar(255) NULL, + "ClusterNew" varchar(255) NULL, + + "Total" float NULL, + "Usable" float NULL, + "Used" float NULL, + "EffectiveFree" float NULL, + + "Object_UUID" uuid NOT NULL, + ts timestamptz NOT NULL + ,CONSTRAINT PK_vsan_storage PRIMARY KEY (ts, "Object_UUID") +); +--ALTER TABLE vmreports.vsan_storage OWNER TO dbo; +GRANT ALL ON vmreports.vsan_storage TO nifi; +--select * from vmreports.vsan_storage; + +/* +{ +"type": "record", +"name": "vmreports.vsan_storage", +"namespace": "org.apache.nifi", +"fields": [ + {"name":"Object_UUID", "type":{"type": "string", "logicalType": "uuid"}}, + {"name":"ts","type":{"type": "long", "logicalType": "local-timestamp-millis"}}, + + {"name":"Name", "type":["string" ,"null"]}, + {"name":"ClusterNew", "type":["string" ,"null"]}, + + {"name":"Total", "type":["float" ,"null"]}, + {"name":"Usable", "type":["float" ,"null"]}, + {"name":"Used", "type":["float" ,"null"]}, + {"name":"EffectiveFree", "type":["float" ,"null"]} +] +} +*/ + +/* +{ + "*": { + "objId":"[&1].Name", + "1":"[&1].ClusterNew", + "2":"[&1].Total", + "3":"[&1].Usable", + "4":"[&1].Used", + "5":"[&1].EffectiveFree", + "objUUID":"[&1].Object_UUID" + } + } +*/ \ No newline at end of file diff --git a/etc/info/1.json b/etc/info/1.json new file mode 100644 index 0000000..8998c8f --- /dev/null +++ b/etc/info/1.json @@ -0,0 +1,633 @@ +{ + "companyId": "1", + "contracts": [ + { + "contractId": "01983721-6049-72dd-a682-a5af1bd72420", + "contractInsideId": "02319_1", + "contractOutsideId": "02319_1", + "contractStartDate": "20250801", + "isContractTerminated": false, + "CalculationPeriod": "20260701", + "additionalAgreements": [ + { + "additionalAgreementId": "019b6ec1-1984-78fc-9e48-0984aa1f3ca7", + "additionalAgreementIndex": 3, + "additionalAgreementName": "Доп соглашение 3, к сделке №3768 Сделка на изменения договора", + "additionalAgreementStartDate": "", + "additionalAgreementBaseBy": "019a5ef8-eebe-76b3-acb9-b5c37748f4ef", + "isActual": true, + "CalculationPeriod": "20260701", + "services": [ + { + "components": [ + { + "paramId": 118, + "componentCode": "paas.s3.ceph.vol", + "component": "Дисковое пространство: Объем хранения", + "measureShort": "ГБайт", + "quantity": 1, + "priceWVat": 1.8300000000000001, + "discount": 0, + "atomicCode": "paas.s3.ceph.vol" + }, + { + "paramId": 69, + "componentCode": "paas.s3.ceph.trf", + "component": "Исходящий трафик", + "measureShort": "ГБайт", + "quantity": 1, + "priceWVat": 1.5249999999999999, + "discount": 0, + "atomicCode": "paas.s3.ceph.trf" + }, + { + "paramId": 68, + "componentCode": "paas.s3.ceph.get", + "component": "Запросы GET, HEAD, OPTIONS", + "measureShort": "10тыс.шт.", + "quantity": 1, + "priceWVat": 0.3538, + "discount": 0, + "atomicCode": "paas.s3.ceph.get" + }, + { + "paramId": 70, + "componentCode": "paas.s3.ceph.put", + "component": "Запросы PUT, POST, PATCH, LIST", + "measureShort": "10тыс.шт.", + "quantity": 1, + "priceWVat": 4.5750000000000002, + "discount": 0, + "atomicCode": "paas.s3.ceph.put" + } + ], + "staticId": "e57bb0bd-8946-4603-95e8-c9c331378bce", + "serviceId": "2e1681d7-542e-489c-9169-de562bdca83a", + "serviceHash": "e57bb0bd-8946-4603-95e8-c9c331378bce3", + "LineCRMID": "019b6ec6-a779-7902-abeb-d2f7e746d64e", + "serviceCode": "paas.s3.ceph", + "endCustomerName": "", + "endCustomerINN": "", + "catalogName": "Объектное хранилище", + "discount": 0.24125452, + "quantity": 1, + "dateStartProvision": "20260101", + "dateEndProvision": "", + "serviceStart": { + "currentTimeZoneName": "UTC", + "ts": "2026-01-01T00:00:00.000Z" + }, + "serviceCustomName": "Объектное хранилище: S3 CEPH, в составе:\n Дисковое пространство: Объем хранения - 1 ГБайт\nИсходящий трафик - 1 ГБайт\nЗапросы GET, HEAD, OPTIONS - 1 10тыс.шт.\nЗапросы PUT, POST, PATCH, LIST - 1 10тыс.шт.\n", + "serviceType": 3, + "service_is_easy": false, + "vat": 22, + "vatRate": 0.22, + "vatPerc": 22, + "vatFree": 0, + "priceWVat": "", + "serviceVersionGuid": "2e1681d7-542e-489c-9169-de562bdca83a", + "dealIndex": 3768, + "CalculationPeriod": "20260701" + }, + { + "components": [ + { + "paramId": 118, + "componentCode": "paas.s3.cphc.vol", + "component": "Дисковое пространство: Объем хранения", + "measureShort": "ГБайт", + "quantity": 1, + "priceWVat": 1.026833333333, + "discount": 0, + "atomicCode": "paas.s3.cphc.vol" + }, + { + "paramId": 69, + "componentCode": "paas.s3.cphc.trf", + "component": "Исходящий трафик", + "measureShort": "ГБайт", + "quantity": 1, + "priceWVat": 1.5249999999999999, + "discount": 0, + "atomicCode": "paas.s3.cphc.trf" + }, + { + "paramId": 68, + "componentCode": "paas.s3.cphc.get", + "component": "Запросы GET, HEAD, OPTIONS", + "measureShort": "10тыс.шт.", + "quantity": 1, + "priceWVat": 0.97599999999999998, + "discount": 0, + "atomicCode": "paas.s3.cphc.get" + }, + { + "paramId": 70, + "componentCode": "paas.s3.cphc.put", + "component": "Запросы PUT, POST, PATCH, LIST", + "measureShort": "10тыс.шт.", + "quantity": 1, + "priceWVat": 11.834, + "discount": 0, + "atomicCode": "paas.s3.cphc.put" + } + ], + "staticId": "2031f3ac-e921-4816-b91f-9b5b1cf5bf94", + "serviceId": "5271dc39-2ec5-4f20-b91e-fdffb4f363b9", + "serviceHash": "2031f3ac-e921-4816-b91f-9b5b1cf5bf943", + "LineCRMID": "019b6ec6-a82c-7902-93a3-48ba4e25d71d", + "serviceCode": "paas.s3.cphc", + "endCustomerName": "", + "endCustomerINN": "", + "catalogName": "Объектное хранилище", + "discount": 0, + "quantity": 1, + "dateStartProvision": "20260101", + "dateEndProvision": "", + "serviceStart": { + "currentTimeZoneName": "UTC", + "ts": "2026-01-01T00:00:00.000Z" + }, + "serviceCustomName": "Объектное хранилище: S3 CEPH Холодное, в составе:\n Дисковое пространство: Объем хранения - 1 ГБайт\nИсходящий трафик - 1 ГБайт\nЗапросы GET, HEAD, OPTIONS - 1 10тыс.шт.\nЗапросы PUT, POST, PATCH, LIST - 1 10тыс.шт.\n", + "serviceType": 3, + "service_is_easy": false, + "vat": 22, + "vatRate": 0.22, + "vatPerc": 22, + "vatFree": 0, + "priceWVat": "", + "serviceVersionGuid": "5271dc39-2ec5-4f20-b91e-fdffb4f363b9", + "dealIndex": 3768, + "CalculationPeriod": "20260701" + }, + { + "components": [ + { + "paramId": 175, + "componentCode": "paas.s3.cphc.volq", + "component": "Дисковое пространство: Квота", + "measureShort": "ГБайт", + "quantity": 1, + "priceWVat": 2.7999999999999998, + "discount": 0, + "atomicCode": "paas.s3.cphc.volq" + } + ], + "staticId": "f216f0ac-6c61-42aa-a454-56a93c707d11", + "serviceId": "776a3490-cb3a-4721-b521-7bf97073e104", + "serviceHash": "f216f0ac-6c61-42aa-a454-56a93c707d112", + "LineCRMID": "019b6ec6-a86d-7902-9ba2-defe46f2a036", + "serviceCode": "paas.s3.cphc", + "endCustomerName": "", + "endCustomerINN": "", + "catalogName": "Объектное хранилище", + "discount": 63.928570999999998, + "quantity": 1000, + "dateStartProvision": "20250826", + "dateEndProvision": "20250930", + "serviceStart": { + "currentTimeZoneName": "UTC", + "ts": "2025-08-26T00:00:00.000Z" + }, + "serviceEnd": { + "currentTimeZoneName": "UTC", + "ts": "2025-09-30T00:00:00.000Z" + }, + "serviceCustomName": "Объектное хранилище: S3 CEPH Холодное (Квота), в составе:\n Дисковое пространство: Квота - 1 ГБайт\n", + "serviceType": 2, + "service_is_easy": false, + "vat": 20, + "vatRate": 0.20000000000000001, + "vatPerc": 20, + "vatFree": 0, + "priceWVat": "", + "serviceVersionGuid": "776a3490-cb3a-4721-b521-7bf97073e104", + "dealIndex": 3768, + "CalculationPeriod": "20260701" + }, + { + "components": [ + { + "paramId": 175, + "componentCode": "paas.s3.cphc.volq", + "component": "Дисковое пространство: Квота", + "measureShort": "ГБайт", + "quantity": 1, + "priceWVat": 2.7999999999999998, + "discount": 0, + "atomicCode": "paas.s3.cphc.volq" + } + ], + "staticId": "78707549-a675-46e0-bc5b-790ef4d21b6d", + "serviceId": "2e9369bc-7f3e-4c31-bb72-3d19e979964e", + "serviceHash": "78707549-a675-46e0-bc5b-790ef4d21b6d2", + "LineCRMID": "019b6ec6-a8ab-7902-af73-1034bf013a16", + "serviceCode": "paas.s3.cphc", + "endCustomerName": "", + "endCustomerINN": "", + "catalogName": "Объектное хранилище", + "discount": 63.928570999999998, + "quantity": 40000, + "dateStartProvision": "20250826", + "dateEndProvision": "20250930", + "serviceStart": { + "currentTimeZoneName": "UTC", + "ts": "2025-08-26T00:00:00.000Z" + }, + "serviceEnd": { + "currentTimeZoneName": "UTC", + "ts": "2025-09-30T00:00:00.000Z" + }, + "serviceCustomName": "Объектное хранилище: S3 CEPH Холодное (Квота), в составе:\n Дисковое пространство: Квота - 1 ГБайт\n", + "serviceType": 2, + "service_is_easy": false, + "vat": 20, + "vatRate": 0.20000000000000001, + "vatPerc": 20, + "vatFree": 0, + "priceWVat": "", + "serviceVersionGuid": "2e9369bc-7f3e-4c31-bb72-3d19e979964e", + "dealIndex": 3768, + "CalculationPeriod": "20260701" + }, + { + "components": [ + { + "paramId": 118, + "componentCode": "paas.s3.cphc.vol", + "component": "Дисковое пространство: Объем хранения", + "measureShort": "ГБайт", + "quantity": 1, + "priceWVat": 1.01, + "discount": 0, + "atomicCode": "paas.s3.cphc.vol" + }, + { + "paramId": 69, + "componentCode": "paas.s3.cphc.trf", + "component": "Исходящий трафик", + "measureShort": "ГБайт", + "quantity": 1, + "priceWVat": 1.5, + "discount": 0, + "atomicCode": "paas.s3.cphc.trf" + }, + { + "paramId": 68, + "componentCode": "paas.s3.cphc.get", + "component": "Запросы GET, HEAD, OPTIONS", + "measureShort": "10тыс.шт.", + "quantity": 1, + "priceWVat": 0.95999999999999996, + "discount": 0, + "atomicCode": "paas.s3.cphc.get" + }, + { + "paramId": 70, + "componentCode": "paas.s3.cphc.put", + "component": "Запросы PUT, POST, PATCH", + "measureShort": "10тыс.шт.", + "quantity": 1, + "priceWVat": 11.640000000000001, + "discount": 0, + "atomicCode": "paas.s3.cphc.put" + } + ], + "staticId": "20240911T125603868", + "serviceId": "a564eda1-b716-42ca-9ae7-efc49b112a58", + "serviceHash": "20240911T1256038683", + "LineCRMID": "019b6ec6-a949-7902-b473-8741f2a18efa", + "serviceCode": "paas.s3.cphc", + "endCustomerName": "", + "endCustomerINN": "", + "catalogName": "Объектное хранилище", + "discount": 0, + "quantity": 1, + "dateStartProvision": "20250826", + "dateEndProvision": "20250930", + "serviceStart": { + "currentTimeZoneName": "UTC", + "ts": "2025-08-26T00:00:00.000Z" + }, + "serviceEnd": { + "currentTimeZoneName": "UTC", + "ts": "2025-09-30T00:00:00.000Z" + }, + "serviceCustomName": "Объектное хранилище: S3 CEPH Холодное, в составе:\n Дисковое пространство: Объем хранения - 1 ГБайт\nИсходящий трафик - 1 ГБайт\nЗапросы GET, HEAD, OPTIONS - 1 10тыс.шт.\nЗапросы PUT, POST, PATCH - 1 10тыс.шт.\n", + "serviceType": 3, + "service_is_easy": false, + "vat": 20, + "vatRate": 0.20000000000000001, + "vatPerc": 20, + "vatFree": 0, + "priceWVat": "", + "serviceVersionGuid": "a564eda1-b716-42ca-9ae7-efc49b112a58", + "dealIndex": 3768, + "CalculationPeriod": "20260701" + }, + { + "components": [ + { + "paramId": 118, + "componentCode": "paas.s3.ceph.vol", + "component": "Дисковое пространство: Объем хранения", + "measureShort": "ГБайт", + "quantity": 1, + "priceWVat": 1.8, + "discount": 0, + "atomicCode": "paas.s3.ceph.vol" + }, + { + "paramId": 69, + "componentCode": "paas.s3.ceph.trf", + "component": "Исходящий трафик", + "measureShort": "ГБайт", + "quantity": 1, + "priceWVat": 1.5, + "discount": 0, + "atomicCode": "paas.s3.ceph.trf" + }, + { + "paramId": 68, + "componentCode": "paas.s3.ceph.get", + "component": "Запросы GET, HEAD, OPTIONS", + "measureShort": "10тыс.шт.", + "quantity": 1, + "priceWVat": 0.34999999999999998, + "discount": 0, + "atomicCode": "paas.s3.ceph.get" + }, + { + "paramId": 70, + "componentCode": "paas.s3.ceph.put", + "component": "Запросы PUT, POST, PATCH", + "measureShort": "10тыс.шт.", + "quantity": 1, + "priceWVat": 4.5, + "discount": 0, + "atomicCode": "paas.s3.ceph.put" + } + ], + "staticId": "20241015T124353835", + "serviceId": "5371b7cb-6f6c-4c7d-85b4-609eb52f994a", + "serviceHash": "20241015T1243538353", + "LineCRMID": "019b6ec6-aa03-7902-9c40-06f6d5cf6e13", + "serviceCode": "paas.s3.ceph", + "endCustomerName": "", + "endCustomerINN": "", + "catalogName": "Объектное хранилище", + "discount": 0, + "quantity": 1, + "dateStartProvision": "20250801", + "dateEndProvision": "20250930", + "serviceStart": { + "currentTimeZoneName": "UTC", + "ts": "2025-08-01T00:00:00.000Z" + }, + "serviceEnd": { + "currentTimeZoneName": "UTC", + "ts": "2025-09-30T00:00:00.000Z" + }, + "serviceCustomName": "Объектное хранилище: S3 CEPH, в составе:\n Дисковое пространство: Объем хранения - 1 ГБайт\nИсходящий трафик - 1 ГБайт\nЗапросы GET, HEAD, OPTIONS - 1 10тыс.шт.\nЗапросы PUT, POST, PATCH - 1 10тыс.шт.\n", + "serviceType": 3, + "service_is_easy": false, + "vat": 20, + "vatRate": 0.20000000000000001, + "vatPerc": 20, + "vatFree": 0, + "priceWVat": "", + "serviceVersionGuid": "5371b7cb-6f6c-4c7d-85b4-609eb52f994a", + "dealIndex": 3768, + "CalculationPeriod": "20260701" + }, + { + "components": [ + { + "paramId": 69, + "componentCode": "paas.s3.ceph.trf", + "component": "Исходящий трафик", + "measureShort": "ГБайт", + "quantity": 1, + "priceWVat": 1.5, + "discount": 0, + "atomicCode": "paas.s3.ceph.trf" + }, + { + "paramId": 70, + "componentCode": "paas.s3.ceph.put", + "component": "Запросы PUT, POST, PATCH, LIST", + "measureShort": "10тыс.шт.", + "quantity": 1, + "priceWVat": 4.5, + "discount": 0, + "atomicCode": "paas.s3.ceph.put" + }, + { + "paramId": 118, + "componentCode": "paas.s3.ceph.vol", + "component": "Дисковое пространство: Объем хранения", + "measureShort": "ГБайт", + "quantity": 1, + "priceWVat": 1.8, + "discount": 0, + "atomicCode": "paas.s3.ceph.vol" + }, + { + "paramId": 68, + "componentCode": "paas.s3.ceph.get", + "component": "Запросы GET, HEAD, OPTIONS", + "measureShort": "10тыс.шт.", + "quantity": 1, + "priceWVat": 0.34999999999999998, + "discount": 0, + "atomicCode": "paas.s3.ceph.get" + } + ], + "staticId": "e57bb0bd-8946-4603-95e8-c9c331378bce", + "serviceId": "09fd617a-9ffc-4b98-ad66-3fedac52c7b9", + "serviceHash": "e57bb0bd-8946-4603-95e8-c9c331378bce3", + "LineCRMID": "019a732b-22a2-7545-91ce-819207c779a0", + "catalogName": "Объектное хранилище", + "endCustomerName": "", + "endCustomerINN": "", + "serviceCode": "paas.s3.ceph", + "discount": 0, + "quantity": 1, + "dateStartProvision": "20251001", + "CalculationPeriod": "20260701", + "dateEndProvision": "20251231", + "serviceStart": { + "currentTimeZoneName": "UTC", + "ts": "2025-10-01T00:00:00.000Z" + }, + "serviceEnd": { + "currentTimeZoneName": "UTC", + "ts": "2025-12-31T00:00:00.000Z" + }, + "serviceCustomName": "Объектное хранилище: S3 CEPH, в составе:\n Исходящий трафик - 1 ГБайт\nЗапросы PUT, POST, PATCH, LIST - 1 10тыс.шт.\nДисковое пространство: Объем хранения - 1 ГБайт\nЗапросы GET, HEAD, OPTIONS - 1 10тыс.шт.\n", + "serviceType": 3, + "service_is_easy": false, + "vat": 20, + "vatRate": 0.20000000000000001, + "vatPerc": 20, + "vatFree": 0, + "priceWVat": "", + "serviceVersionGuid": "09fd617a-9ffc-4b98-ad66-3fedac52c7b9", + "dealIndex": 3274 + }, + { + "components": [ + { + "paramId": 118, + "componentCode": "paas.s3.cphc.vol", + "component": "Дисковое пространство: Объем хранения", + "measureShort": "ГБайт", + "quantity": 1, + "priceWVat": 1.01, + "discount": 0, + "atomicCode": "paas.s3.cphc.vol" + }, + { + "paramId": 69, + "componentCode": "paas.s3.cphc.trf", + "component": "Исходящий трафик", + "measureShort": "ГБайт", + "quantity": 1, + "priceWVat": 1.5, + "discount": 0, + "atomicCode": "paas.s3.cphc.trf" + }, + { + "paramId": 68, + "componentCode": "paas.s3.cphc.get", + "component": "Запросы GET, HEAD, OPTIONS", + "measureShort": "10тыс.шт.", + "quantity": 1, + "priceWVat": 0.95999999999999996, + "discount": 0, + "atomicCode": "paas.s3.cphc.get" + }, + { + "paramId": 70, + "componentCode": "paas.s3.cphc.put", + "component": "Запросы PUT, POST, PATCH, LIST", + "measureShort": "10тыс.шт.", + "quantity": 1, + "priceWVat": 11.640000000000001, + "discount": 0, + "atomicCode": "paas.s3.cphc.put" + } + ], + "staticId": "2031f3ac-e921-4816-b91f-9b5b1cf5bf94", + "serviceId": "539d210f-2e5a-45e2-b148-b0b0834c138c", + "serviceHash": "2031f3ac-e921-4816-b91f-9b5b1cf5bf943", + "LineCRMID": "019a732b-22d4-7545-83af-18b7f8867eaa", + "catalogName": "Объектное хранилище", + "endCustomerName": "", + "endCustomerINN": "", + "serviceCode": "paas.s3.cphc", + "discount": 0, + "quantity": 1, + "dateStartProvision": "20251001", + "CalculationPeriod": "20260701", + "dateEndProvision": "20251231", + "serviceStart": { + "currentTimeZoneName": "UTC", + "ts": "2025-10-01T00:00:00.000Z" + }, + "serviceEnd": { + "currentTimeZoneName": "UTC", + "ts": "2025-12-31T00:00:00.000Z" + }, + "serviceCustomName": "Объектное хранилище: S3 CEPH Холодное, в составе:\n Дисковое пространство: Объем хранения - 1 ГБайт\nИсходящий трафик - 1 ГБайт\nЗапросы GET, HEAD, OPTIONS - 1 10тыс.шт.\nЗапросы PUT, POST, PATCH, LIST - 1 10тыс.шт.\n", + "serviceType": 3, + "service_is_easy": false, + "vat": 20, + "vatRate": 0.20000000000000001, + "vatPerc": 20, + "vatFree": 0, + "priceWVat": "", + "serviceVersionGuid": "539d210f-2e5a-45e2-b148-b0b0834c138c", + "dealIndex": 3274 + }, + { + "components": [ + { + "paramId": 118, + "componentCode": "paas.s3.cphc.vol", + "component": "Дисковое пространство: Объем хранения", + "measureShort": "ГБайт", + "quantity": 40000, + "priceWVat": 1.01, + "discount": 0, + "atomicCode": "paas.s3.cphc.vol" + }, + { + "paramId": 68, + "componentCode": "paas.s3.cphc.get", + "component": "Запросы GET, HEAD, OPTIONS", + "measureShort": "10тыс.шт.", + "quantity": 1, + "priceWVat": 0.95999999999999996, + "discount": 0, + "atomicCode": "paas.s3.cphc.get" + }, + { + "paramId": 69, + "componentCode": "paas.s3.cphc.trf", + "component": "Исходящий трафик", + "measureShort": "ГБайт", + "quantity": 1, + "priceWVat": 1.5, + "discount": 0, + "atomicCode": "paas.s3.cphc.trf" + }, + { + "paramId": 70, + "componentCode": "paas.s3.cphc.put", + "component": "Запросы PUT, POST, PATCH", + "measureShort": "10тыс.шт.", + "quantity": 1, + "priceWVat": 11.640000000000001, + "discount": 0, + "atomicCode": "paas.s3.cphc.put" + } + ], + "staticId": "20240911T125603868", + "serviceId": "67dffa20-a69e-449a-b02c-edf78d9ff192", + "serviceHash": "20240911T1256038683", + "LineCRMID": "01983726-3501-7496-b7f3-6f58f4d7f209", + "catalogName": "Объектное хранилище", + "endCustomerName": "", + "endCustomerINN": "", + "serviceCode": "paas.s3.cphc", + "discount": 0, + "quantity": 1, + "dateStartProvision": "20250801", + "CalculationPeriod": "20260701", + "dateEndProvision": "20250825", + "serviceStart": { + "currentTimeZoneName": "UTC", + "ts": "2025-08-01T00:00:00.000Z" + }, + "serviceEnd": { + "currentTimeZoneName": "UTC", + "ts": "2025-08-25T00:00:00.000Z" + }, + "serviceCustomName": "Объектное хранилище: S3 CEPH Холодное, в составе:\n Дисковое пространство: Объем хранения - 40000 ГБайт\nЗапросы GET, HEAD, OPTIONS - 1 10тыс.шт.\nИсходящий трафик - 1 ГБайт\nЗапросы PUT, POST, PATCH - 1 10тыс.шт.\n", + "serviceType": 3, + "service_is_easy": false, + "vat": 20, + "vatRate": 0.20000000000000001, + "vatPerc": 20, + "vatFree": 0, + "priceWVat": "", + "serviceVersionGuid": "67dffa20-a69e-449a-b02c-edf78d9ff192", + "dealIndex": 1450 + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/json.cfm b/json.cfm index f6e9f59..e844ee9 100644 --- a/json.cfm +++ b/json.cfm @@ -4,7 +4,7 @@ - @@ -30,7 +30,7 @@ - @@ -41,11 +41,11 @@ - + - //copy fields to structure, renaming fields, this preserves data type + @@ -53,42 +53,129 @@ - - + + - + { + result.append(row); + return result; + }, [])#/> - + ---> + + +function gaussianRound(numeric number, numeric precision = 0) { + var factor = 10 ^ precision; + var scaledNumber = number * factor; + var absScaled = abs(scaledNumber); + var sign = sgn(scaledNumber); + var floored = int(absScaled); + + // If it's not ending in exactly .5, use standard rounding or precision scaling + if (absScaled - floored != 0.5) { + return round(number * factor) / factor; + } + + // If it is exactly .5, round towards the nearest even number + if (floored % 2 != 0) { + // Nearest even is UP + return (floored + 1) * sign / factor; + } else { + // Nearest even is DOWN + return floored * sign / factor; + } +} + - - { - result.append(row); - return result; - }, [])# -}/> + + + + + + + + + + + + + ,"hash"="#serviceHash#" + + ,"components"=[] + ]/> + + + + + + + + + + + + + ]/> + + + + + + + + + + + + + + + + + + + + + + + + #serializeJSON(out)# + />#serializeJSON(temp.out)# diff --git a/mod/payg.cfm b/mod/compute_payg.cfm similarity index 64% rename from mod/payg.cfm rename to mod/compute_payg.cfm index 2ca1bf9..5a3051c 100644 --- a/mod/payg.cfm +++ b/mod/compute_payg.cfm @@ -8,9 +8,13 @@ + + + + - - - + - + + qSpecification (from CRM) #getTickCount() - request.startTickCount# @@ -77,41 +80,55 @@ -- бесплатный лимит есть только для S3 HOT (в месяц в единицах измерения) ---> - - -select s.catalogName as svc, s.component, s.fullCode as code, s.measureShort as unit -, s.priceWVat as price, (s.discount + s.serviceDiscount - s.discount*s.serviceDiscount/100) as discount -,s.serviceStart, s.serviceEnd, s.serviceHash, s.serviceCustomName, f.free_tier -from qSpecification s, qFreeTier f -WHERE s.fullCode=f.code + + + + + + select s.catalogName as svc, s.component, s.serviceCode as service_code, s.fullCode as code, s.measureShort as unit + , s.priceWVat as price, (s.discount + s.serviceDiscount - s.discount*s.serviceDiscount/100) as discount + ,s.serviceStart, s.serviceEnd, s.serviceHash, s.serviceCustomName, f.free_tier + from qSpecification s, qFreeTier f + WHERE s.fullCode=f.code + AND s.serviceType = 3 -UNION + UNION -select s.catalogName as svc, s.component, s.fullCode as code, s.measureShort as unit -, s.priceWVat as price, (s.discount + s.serviceDiscount - s.discount*s.serviceDiscount/100) as discount -,s.serviceStart, s.serviceEnd, s.serviceHash, s.serviceCustomName, 0 -from qSpecification s -WHERE s.fullCode NOT IN () - + select s.catalogName as svc, s.component, s.serviceCode as service_code, s.fullCode as code, s.measureShort as unit + , s.priceWVat as price, (s.discount + s.serviceDiscount - s.discount*s.serviceDiscount/100) as discount + ,s.serviceStart, s.serviceEnd, s.serviceHash, s.serviceCustomName, 0 + from qSpecification s + WHERE s.fullCode NOT IN () + AND s.serviceType = 3 + - + + qSpec (Left Outer Join with Free Tier) + #getTickCount() - request.startTickCount# + + + - + select 'WZ'||to_char(tenant.wzcode,'FM00000') as wz, vdc.name as vdc_name, case - when vdc.name like '%-v1cl1%' then 'iaas.ngc.i29' - when vdc.name like '%-v1cl2%' then 'iaas.ngc.i31' - when vdc.name like '%-v1cl4%' then 'iaas.ngc.a28' - when vdc.name like '%-v1cl6%' then 'iaas.ngc.i28' - else '['||vdc.name||']' end as code, + WHEN vdc.name LIKE '%-v1cl1%' THEN 'iaas.ngc.i29' + WHEN vdc.name LIKE '%-v1cl2%' THEN 'iaas.ngc.i31' + WHEN vdc.name LIKE '%-v1cl4%' THEN 'iaas.ngc.a28' + WHEN vdc.name LIKE '%-v1cl5%' THEN 'iaas.ngc.a45' + WHEN vdc.name LIKE '%-v1cl6%' THEN 'iaas.ngc.i28' -- *** смапить все кластера + WHEN vdc.name LIKE '%-v1cl7%' THEN 'iaas.ngc.a40' -- *** смапить все кластера + ELSE '['||vdc.name||']' end as code, sum(cpu_used/cpu_speed)/4. as core_h, sum(mem_used)/1024/4. as gb_h, - capacity_resource.timestamp::date as dt + capacity_resource.timestamp::date as dt, + vdc.name as dimension_1, + null as dimension_2 from ngcloud_ru.capacity_resource join ngcloud_ru.vdc on capacity_resource.vdc_id=vdc.id join ngcloud_ru.tenant on tenant.id=vdc.tenant_id @@ -123,19 +140,23 @@ WHERE s.fullCode NOT IN ( + qComputing #getTickCount() - request.startTickCount# + select 'WZ'||to_char(tenant.wzcode,'FM00000') as wz, vdc.name as vdc_name, case WHEN vdc.name LIKE '%-v1cl1%' THEN 'iaas.ngc.i29' WHEN vdc.name LIKE '%-v1cl2%' THEN 'iaas.ngc.i31' WHEN vdc.name LIKE '%-v1cl4%' THEN 'iaas.ngc.a28' + WHEN vdc.name LIKE '%-v1cl5%' THEN 'iaas.ngc.a45' WHEN vdc.name LIKE '%-v1cl6%' THEN 'iaas.ngc.i28' + WHEN vdc.name LIKE '%-v1cl7%' THEN 'iaas.ngc.a40' ELSE '['||vdc.name||']' END || CASE WHEN storage_profile_types.name ILIKE '%-SSD%' THEN '.ssd-m' @@ -144,9 +165,11 @@ WHERE s.fullCode NOT IN () as vol_B ,ceil(sum(bucket_stat.usage_rgw_main_size_actual)//1024/1024/1024) as vol_GB - ,greatest(ceil(sum(bucket_stat.usage_rgw_main_size_actual)/ + ,case when bucket_stat.placement_id = 1 then 'paas.s3.ceph' when bucket_stat.placement_id = 2 then 'paas.s3.cphc' @@ -178,6 +201,8 @@ WHERE s.fullCode NOT IN ( AND bucket_stat.timestamp_addition::date >= AND bucket_stat.timestamp_addition::date <= - group by bucket_stat.owner, bucket_stat.placement_id, bucket_stat.timestamp_addition::date - order by bucket_stat.owner, bucket_stat.placement_id, bucket_stat.timestamp_addition::date; + group by bucket_stat.owner, bucket_stat.placement_id, bucket_info.name, bucket_stat.timestamp_addition::date + order by bucket_stat.owner, bucket_stat.placement_id, bucket_info.name, bucket_stat.timestamp_addition::date; + qS3Vol #getTickCount() - request.startTickCount# @@ -212,14 +238,14 @@ WHERE s.fullCode NOT IN ( AND usage_bucket_by_user.time::date >= AND usage_bucket_by_user.time::date <= - group by user_info.name, bucket_info.placement_id, usage_bucket_by_user.time::date - order by user_info.name, bucket_info.placement_id, usage_bucket_by_user.time::date; + group by user_info.name, bucket_info.placement_id, bucket_info.name, usage_bucket_by_user.time::date + order by user_info.name, bucket_info.placement_id, bucket_info.name, usage_bucket_by_user.time::date; + + + qS3OpsTrf #getTickCount() - request.startTickCount# @@ -280,25 +311,55 @@ WHERE s.fullCode NOT IN ( - select dt, wz, code || '.vcpu-m' as code, core_h as raw_metric, core_h as metric from qComputing - union all - select dt, wz, code || '.ram-m' as code, gb_h as raw_metric, gb_h as metric from qComputing - union all - select dt, wz, code, gb_h_used as raw_metric, gb_h_used as metric from qStorage - union all - select dt, wz, code || '.vol-m', vol_b as raw_metric, vol_gb as metric from qS3Vol - union all - select dt, wz, code || '.get-m', get as raw_metric, get_10k as metric from qS3OpsTrf - union all - select dt, wz, code || '.put-m', put as raw_metric, put_10k as metric from qS3OpsTrf - union all - select dt, wz, code || '.trf-m', bytes_sent as raw_metric, bytes_sent_gb as metric from qS3OpsTrf + select dt, wz, code || '.vcpu-m' as code, core_h as raw_metric, core_h as metric, + dimension_1, 'vdc' as dimension_1_name, dimension_2, NULL as dimension_2_name + from qComputing - order by dt, code + union all + select dt, wz, code || '.ram-m' as code, gb_h as raw_metric, gb_h as metric, + dimension_1, 'vdc' as dimension_1_name, dimension_2, NULL as dimension_2_name + from qComputing + + union all + select dt, wz, code, gb_m_used as raw_metric, gb_m_used as metric, + dimension_1, 'vdc' as dimension_1_name, dimension_2, 'storage policy' as dimension_2_name + from qStorage + + union all + select dt, wz, code || '.vol-m', vol_b as raw_metric, vol_gb as metric, + dimension_1, 'bucket' as dimension_1_name, dimension_2, NULL as dimension_2_name + from qS3Vol + + union all + select dt, wz, code || '.get-m', get as raw_metric, get_10k as metric, + dimension_1, 'bucket' as dimension_1_name, dimension_2, NULL as dimension_2_name + from qS3OpsTrf + + union all + select dt, wz, code || '.put-m', put as raw_metric, put_10k as metric, + dimension_1, 'bucket' as dimension_1_name, dimension_2, NULL as dimension_2_name + from qS3OpsTrf + + union all + select dt, wz, code || '.trf-m', bytes_sent as raw_metric, bytes_sent_gb as metric, + dimension_1, 'bucket' as dimension_1_name, dimension_2, NULL as dimension_2_name + from qS3OpsTrf + + order by dt, code, dimension_1, dimension_2 + + + + + + + + + + qUnifiedMetric #getTickCount() - request.startTickCount# @@ -318,15 +379,19 @@ WHERE s.fullCode NOT IN ( + SELECT - s.code - m.code as m_code + s.code + m.code as m_code + s.service_code as service_code s.svc s.component s.unit - s.price*(100-s.discount)/100 as discounted_price + + s.price*(100-s.discount)/100 as discounted_price + s.price s.discount m.raw_metric @@ -337,54 +402,77 @@ WHERE s.fullCode NOT IN (s.serviceCustomName m.dt s.free_tier + m.dimension_1 + m.dimension_1_name + m.dimension_2 + m.dimension_2_name FROM qSpec as s, qUnifiedMetric as m WHERE m.wz= AND s.code=m.code AND s.serviceStart <= m.dt AND (m.dt <= s.serviceEnd OR s.serviceEnd IS NULL) + - UNION - SELECT NULL, m.code, NULL, NULL, NULL, NULL, NULL, NULL, m.raw_metric, m.metric, NULL, NULL, NULL, NULL, m.dt, 0 + UNION ALL + SELECT NULL, m.code, NULL, NULL, NULL, NULL, 0, + NULL, NULL, m.raw_metric, m.metric, NULL, NULL, NULL, NULL, m.dt, 0, m.dimension_1, m.dimension_1_name, m.dimension_2, m.dimension_2_name FROM qUnifiedMetric as m where m.code NOT IN () - UNION - SELECT s.code, NULL, s.svc, s.component, s.unit, s.price*(100-s.discount)/100, s.price, s.discount, NULL, NULL, s.serviceStart, s.serviceEnd, s.serviceHash, s.serviceCustomName, NULL, 0 + UNION ALL + SELECT s.code, NULL, s.service_code, s.svc, s.component, s.unit, s.price*(100-s.discount)/100 as discounted_price, + s.price, s.discount, NULL, NULL, s.serviceStart, s.serviceEnd, s.serviceHash, s.serviceCustomName, NULL, 0, NULL, NULL, NULL, NULL FROM qSpec as s where s.code NOT IN () - - order by m.dt, s.code - + order by dt, code, dimension_1, dimension_2 + + + + + qChargeDaily + #getTickCount() - request.startTickCount# + + + + + + SELECT code m_code - svc + service_code + svc + serviceCustomName component unit discounted_price sum(raw_metric) as raw_metric sum(metric) as metric - sum(metric) - free_tier as chargeable_metric - (sum(metric) - free_tier)*discounted_price as charge serviceStart serviceEnd + min(dt) as dt_billed_from + max(dt) as dt_billed_to serviceHash - serviceCustomName free_tier + dimension_1 + dimension_1_name + dimension_2 + dimension_2_name year(dt) as year month(dt) as month from qChargeDaily - group by code, m_code, svc, serviceCustomName, component, unit, discounted_price, serviceStart, ServiceEnd, serviceHash, free_tier, year(dt), month(dt) - order by year(dt), month(dt), code, m_code + group by m_code, code, svc, service_code, serviceCustomName, component, unit, discounted_price, serviceStart, ServiceEnd, serviceHash, free_tier, year(dt), month(dt), + dimension_1_name, dimension_1, dimension_2_name, dimension_2 + order by year(dt), month(dt), m_code, code, serviceStart, dimension_1, dimension_2 - + - + ---> @@ -402,14 +490,14 @@ WHERE s.fullCode NOT IN ( ---> - - #getTickCount() - request.startTickCount# - - - - + #getTickCount() - request.startTickCount# + + + +#getTickCount() - request.startTickCount# + @@ -420,6 +508,7 @@ WHERE s.fullCode NOT IN ( + diff --git a/mod/crm_contract.cfm b/mod/crm_contract.cfm index 0b2fbf1..94142d6 100644 --- a/mod/crm_contract.cfm +++ b/mod/crm_contract.cfm @@ -14,9 +14,12 @@ - - - + + + + + + +", +"varChar,varChar,varChar,varChar,integer,varChar,integer,varChar,varChar,varChar,timestamp,timestamp,decimal,decimal,varChar,integer,varChar,varChar,varChar,decimal,decimal,decimal,varChar,varChar")/> + diff --git a/mod/new 1.txt b/mod/new 1.txt new file mode 100644 index 0000000..ae86f15 --- /dev/null +++ b/mod/new 1.txt @@ -0,0 +1,22 @@ + +SQL SELECT +s.code,m.code as m_code,s.service_code as service_code,s.svc,s.component,s.unit, +s.price*(100-s.discount)/100 as discounted_price +,s.price,s.discount,m.raw_metric,m.metric,s.serviceStart,s.serviceEnd,s.serviceHash,s.serviceCustomName,m.dt,s.free_tier,m.dimension_1,m.dimension_1_name ||'x' as dimension_1_name,m.dimension_2,m.dimension_2_name +FROM qSpec as s, qUnifiedMetric as m +WHERE m.wz='62' +AND s.code=m.code +AND s.serviceStart <= m.dt +AND (m.dt <= s.serviceEnd OR s.serviceEnd IS NULL) + + +UNION ALL +SELECT NULL, m.code, NULL, NULL, NULL, NULL, 0, +NULL, NULL, m.raw_metric, m.metric, NULL, NULL, NULL, NULL, m.dt, 0, m.dimension_1, m.dimension_1_name ||'y', m.dimension_2, m.dimension_2_name +FROM qUnifiedMetric as m where m.code NOT IN ('5','6') + +UNION ALL +SELECT s.code, NULL, s.service_code, s.svc, s.component, s.unit, s.price*(100-s.discount)/100 as discounted_price, +s.price, s.discount, NULL, NULL, s.serviceStart, s.serviceEnd, s.serviceHash, s.serviceCustomName, NULL, 0, NULL, NULL, NULL, NULL +FROM qSpec as s where s.code NOT IN ('5','6') +order by m.dt, m.code, dimension_1, dimension_2 \ No newline at end of file diff --git a/payg.cfm b/payg.cfm index 69140bd..a7f9dd6 100644 --- a/payg.cfm +++ b/payg.cfm @@ -6,15 +6,22 @@ + - - - + + + + + + + + - - - -
-Период с -по - - + + Период с + по + +
- - + +прошлый месяц +
- Часов в периоде: #hours# Строк в отчете: #report.qCharge.recordCount#
Актуальность данных: -VCD Computing: #dateFormat(report.qComputingAge.dt_load,'YYYY-MM-DD')# #timeFormat(report.qComputingAge.dt_load,'HH:MM:SS')# -VCD Storage: #dateFormat(report.qStorageAge.dt_load,'YYYY-MM-DD')# #timeFormat(report.qStorageAge.dt_load,'HH:MM:SS')# -S3 хранение: #dateFormat(report.qS3VolAge.dt_load,'YYYY-MM-DD')# #timeFormat(report.qS3VolAge.dt_load,'HH:MM:SS')# -S3 операции и трафик: #dateFormat(report.qS3OpsTrfAge.dt_load,'YYYY-MM-DD')# #timeFormat(report.qS3OpsTrfAge.dt_load,'HH:MM:SS')# -Цены GPL
- +VCD Computing: class="err"
> + #dateFormat(report.qComputingAge.dt_load,'YYYY-MM-DD')# #timeFormat(report.qComputingAge.dt_load,'HH:MM:SS')# + +VCD Storage: class="err"
> + #dateFormat(report.qStorageAge.dt_load,'YYYY-MM-DD')# #timeFormat(report.qStorageAge.dt_load,'HH:MM:SS')# +S3 хранение: class="err"
> + #dateFormat(report.qS3VolAge.dt_load,'YYYY-MM-DD')# #timeFormat(report.qS3VolAge.dt_load,'HH:MM:SS')# + +S3 операции и трафик: class="err"
> + #dateFormat(report.qS3OpsTrfAge.dt_load,'YYYY-MM-DD')# #timeFormat(report.qS3OpsTrfAge.dt_load,'HH:MM:SS')# +
+ @@ -81,19 +95,21 @@ S3 операции и трафик: #dateFormat(report.qS3OpsTrfAge.dt_load, - - + + + + - - - + - + + - + - + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + +
АртикулАртикулС + По Кол-во (метрика) + Free Tier Оплачиваемый объемЕд.изм.Цена ₽ с НДС Стоимость ₽ с НДС   Услуга КомпонентЕд.изм.
#year#-#numberFormat(month,"00")#
#year#-#numberFormat(month,"00")#
- #svc# + + #svc# #service_code# (#serviceCustomName#) (не найдено в договоре)
#currentRow##code# (#m_code#)#metric##chargeable_metric##discounted_price##numberFormat(charge,".00")##svc##component##unit#
#code# (#m_code#)#svc##component#
#currentRow##dimension_1_name##dimension_1##dateFormat(dt_billed_from,"YYYY-MM-DD")##dateFormat(dt_billed_to,"YYYY-MM-DD")##round(metric,3)##unit##gaussianRound(discounted_price,2)#
Итого #code# (#m_code#):#round(accum_metric_dimension_1,3)##free_tier##round(max(accum_metric_dimension_1 - free_tier, 0),3)##unit##gaussianRound(discounted_price,2)##cost_dimension_1##svc# #component#
Итого     #svc#:#NumFmt(acc,2)# + Итого     + + #svc# #service_code# + + (#m_code#) + + за #year#-#numberFormat(month,"00")#: + #accum_cost_svc#
 
- - + + + +function gaussianRound(numeric number, numeric precision = 0) { + var factor = 10 ^ precision; + var scaledNumber = number * factor; + var absScaled = abs(scaledNumber); + var sign = sgn(scaledNumber); + var floored = int(absScaled); + + // If it's not ending in exactly .5, use standard rounding or precision scaling + if (absScaled - floored != 0.5) { + return round(number * factor) / factor; + } + + // If it is exactly .5, round towards the nearest even number + if (floored % 2 != 0) { + // Nearest even is UP + return (floored + 1) * sign / factor; + } else { + // Nearest even is DOWN + return floored * sign / factor; + } +} +