019 day loop
This commit is contained in:
@@ -7,9 +7,5 @@ test
|
||||
<cfcatch type="any"><cfdump var=#cfcatch#/></cfcatch>
|
||||
</cftry> --->
|
||||
|
||||
|
||||
<cfif structKeyExists(request, "logout_url")>
|
||||
<cfoutput>
|
||||
<a href="#request.logout_url#">Log Out: #request.logout_url#</a>
|
||||
</cfoutput>
|
||||
</cfif>
|
||||
<cfmodule template="mod/crm_contract.cfm" wz="WZ01348"/>
|
||||
<cfdump var=#qComponent#/>
|
||||
|
||||
+20
-15
@@ -15,6 +15,7 @@
|
||||
<cfset this.mappings = structNew() />
|
||||
<cfset this.mappings["/mod"] = getDirectoryFromPath(getCurrentTemplatePath()) & "mod/" />
|
||||
<cfset this.customTagPaths = expandPath(getDirectoryFromPath(getCurrentTemplatePath()) & "mod")/>
|
||||
<!--- <cfset this.nullSupport = true/> --->
|
||||
|
||||
<!--- SSO --->
|
||||
<cfset this.client_id = "payg-report.deck.nubes.ru"/>
|
||||
@@ -24,8 +25,9 @@
|
||||
<cfset this.idpCertUrl = "https://keycloak.nubes.ru/realms/cloud/protocol/openid-connect/certs" />
|
||||
<cfset this.client_secret = createObject("java", "java.lang.System").getEnv("IDP_CLIENT_SECRET")/>
|
||||
<cfset this.iam_url = "https://auth-api.ngcloud.ru/api/v1/auth/user"/>
|
||||
<cfset this.redirect_uri = "https://#CGI.SERVER_NAME##CGI.SCRIPT_NAME#"/><!--- куда возвращаться от IDP --->
|
||||
|
||||
<cfset this.datasource = "rpt"/>
|
||||
<cfset this.datasource = "rpt"/><!--- к буферной базе --->
|
||||
<cfset this.defaultdatasource = this.datasource/>
|
||||
<!--- request scope is available in pseudoconstructor
|
||||
see also https://www.bennadel.com/blog/1437-coldfusion-scope-existence-during-various-request-types-and-events.htm --->
|
||||
@@ -75,7 +77,7 @@
|
||||
|
||||
<!--- global settings --->
|
||||
<cfset request.RECORDS_PER_PAGE=500/>
|
||||
<cfset request.APP_VERSION="0.00.016"/>
|
||||
<cfset request.APP_VERSION="0.00.019"/>
|
||||
<cfheader name="X-Application-Version" value=#request.APP_VERSION#/>
|
||||
<cfset request.STAND=getStand()/>
|
||||
|
||||
@@ -151,7 +153,7 @@
|
||||
<!--- <cfoutput>onRequest:check for cert finished #(getTickCount()-request.startTickCount)#</cfoutput> --->
|
||||
|
||||
|
||||
<cfset this.redirect_uri = "https://#CGI.SERVER_NAME##CGI.SCRIPT_NAME#" />
|
||||
|
||||
|
||||
<cfif structKeyExists(url,"logout")>
|
||||
<cflock scope="session" type="exclusive" timeout="3">
|
||||
@@ -175,12 +177,11 @@
|
||||
<!--- Вариант: если есть Authorization:bearer, идем с ним к IAM --->
|
||||
|
||||
<cfscript>
|
||||
|
||||
var requestData = GetHttpRequestData();
|
||||
var headers = requestData.headers;
|
||||
|
||||
//writedump(headers); flush;
|
||||
|
||||
if (structKeyExists(headers,"authorization")) {
|
||||
if (structKeyExists(headers,"authorization")) { // аутентификация для клиента ЛК
|
||||
var authorizationHeader = headers.authorization;
|
||||
if (authorizationHeader.startsWith("Bearer ")) {
|
||||
var bearerToken = Mid(authorizationHeader, 8);
|
||||
@@ -211,7 +212,9 @@
|
||||
}
|
||||
result = prefix.filecontent;
|
||||
var idpUserData=deserializeJson(result);
|
||||
request.auth.wz=idpUserData.userInfo.ClientId;//GUID!
|
||||
//request.auth.wz=idpUserData.userInfo.ClientId;//GUID!
|
||||
|
||||
|
||||
request.auth.login = idpUserData.userInfo.login;
|
||||
//request.usrUid=idpUserData.userInfo.contactId;//userId; //GUID!
|
||||
//writedump(idpUserData);abort;
|
||||
@@ -240,14 +243,14 @@
|
||||
// Приклеивать query_string как-то не пришлось, браузер сам справляется
|
||||
|
||||
// refresh
|
||||
idp = new lib.oauth2(this.client_id, this.client_secret, this.auth_endpoint, this.access_token_endpoint, this.redirect_uri);
|
||||
resp = idp.refreshAccessTokenRequest(request.auth.refresh_token);
|
||||
var idp = new lib.oauth2(this.client_id, this.client_secret, this.auth_endpoint, this.access_token_endpoint, this.redirect_uri);
|
||||
var resp = idp.refreshAccessTokenRequest(request.auth.refresh_token);
|
||||
|
||||
lock scope="application" type="readonly" timeout="1" {
|
||||
idpCertificate = application.idpCertificate;
|
||||
}
|
||||
|
||||
auth = parseIdpresponse(resp, idpCertificate, this.client_secret); //все эти сложности из-за опасений насчет многопоточности и блокировок
|
||||
var auth = parseIdpresponse(resp, idpCertificate, this.client_secret); //все эти сложности из-за опасений насчет многопоточности и блокировок
|
||||
|
||||
lock scope="session" type="exclusive" timeout="1" {
|
||||
session.auth = auth;
|
||||
@@ -264,7 +267,7 @@
|
||||
session.auth_state = request.auth_state;
|
||||
}
|
||||
|
||||
idp = new lib.oauth2(this.client_id, this.client_secret, this.auth_endpoint, this.access_token_endpoint, this.redirect_uri);
|
||||
var idp = new lib.oauth2(this.client_id, this.client_secret, this.auth_endpoint, this.access_token_endpoint, this.redirect_uri);
|
||||
/*
|
||||
часто появляется ошибка: после неудачного запроса к IDP
|
||||
в адресной строке браузера остается все, с чем его редиректил IDP,
|
||||
@@ -278,13 +281,13 @@
|
||||
try {
|
||||
//writeOutput("idp.makeAccessTokenRequest");
|
||||
//writeOutput(getTickCount()-request.startTickCount);
|
||||
resp = idp.makeAccessTokenRequest(url.code);
|
||||
var resp = idp.makeAccessTokenRequest(url.code);
|
||||
|
||||
lock scope="application" type="readonly" timeout="1" {
|
||||
idpCertificate = application.idpCertificate;
|
||||
}
|
||||
|
||||
auth = parseIdpresponse(resp, idpCertificate, this.client_secret); //все эти сложности из-за опасений насчет многопоточности и блокировок
|
||||
var auth = parseIdpresponse(resp, idpCertificate, this.client_secret); //все эти сложности из-за опасений насчет многопоточности и блокировок
|
||||
|
||||
lock scope="session" type="exclusive" timeout="1" {
|
||||
session.auth = auth;
|
||||
@@ -294,7 +297,7 @@
|
||||
} catch (e) {echo('<br>****************** #e.message# : #e.detail# **************');}
|
||||
|
||||
} else { //отправляем браузер к IDP
|
||||
strURL =idp.buildRedirectToAuthURL({"scope":'openid profile email',"state":request.auth_state,"allow_signup":false});
|
||||
var strURL =idp.buildRedirectToAuthURL({"scope":'openid profile email',"state":request.auth_state,"allow_signup":false});
|
||||
echo('<a href="#strURL#">self-made Auth link (idp) #strURL#</a> <br> <br>');
|
||||
location(strUrl,false);
|
||||
}
|
||||
@@ -309,6 +312,8 @@
|
||||
// внимание, здесь подразумевается, что redirect_uri не содержит query_string
|
||||
// после возвращения от IDP нам нужно будет зачистить сессию SSO, сделаем это по слову logout
|
||||
}
|
||||
|
||||
request.auth.wz='WZ01348'; //*******************
|
||||
</cfscript>
|
||||
|
||||
|
||||
@@ -472,7 +477,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
private struct function parseIdpresponse(struct resp, string certificate, string jwt_secret) {
|
||||
private struct function parseIdpResponse(struct resp, string certificate, string jwt_secret) {
|
||||
|
||||
var auth = structNew("linked");
|
||||
var data = deserializeJson(arguments.resp.content);
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
корректный период
|
||||
другие WZ
|
||||
? full join
|
||||
детализация - для S3 это бакеты
|
||||
|
||||
|
||||
@@ -0,0 +1,595 @@
|
||||
база rpt сделана из базы billing (название изменено, чтобы избежать путаницы)
|
||||
-- удалены последовательности, переназначены владельцы и права
|
||||
-- удалены внешние ключи
|
||||
|
||||
-- создать роль dbo (владелец), без connect
|
||||
-- создать пользователя nifi, с правом логина
|
||||
-- создать пользователя appserver, с правом логина
|
||||
-- дать права пользователю nifi на схемы и таблицы
|
||||
-- дать права пользователю appserver на схемы и таблицы на чтение
|
||||
|
||||
SET ROLE postgres;
|
||||
|
||||
CREATE SCHEMA IF NOT EXISTS s3billing;
|
||||
CREATE SCHEMA IF NOT EXISTS ngcloud_ru;
|
||||
|
||||
ALTER SCHEMA s3billing OWNER TO dbo;
|
||||
ALTER SCHEMA ngcloud_ru OWNER TO dbo;
|
||||
ALTER DATABASE rpt SET search_path TO s3billing, ngcloud_ru;
|
||||
|
||||
ALTER DEFAULT PRIVILEGES FOR ROLE dbo, postgres GRANT ALL ON TABLES TO nifi;
|
||||
ALTER DEFAULT PRIVILEGES FOR ROLE dbo, postgres GRANT SELECT ON TABLES TO appserver;
|
||||
|
||||
SET ROLE dbo;
|
||||
|
||||
GRANT USAGE ON SCHEMA s3billing TO appserver,nifi;
|
||||
GRANT USAGE ON SCHEMA ngcloud_ru TO appserver,nifi;
|
||||
|
||||
GRANT ALL ON ALL TABLES IN SCHEMA s3billing TO nifi;
|
||||
GRANT SELECT ON ALL TABLES IN SCHEMA s3billing TO appserver;
|
||||
|
||||
GRANT ALL ON ALL TABLES IN SCHEMA ngcloud_ru TO nifi;
|
||||
GRANT SELECT ON ALL TABLES IN SCHEMA ngcloud_ru TO appserver;
|
||||
|
||||
--GRANT ALL ON ALL SEQUENCES IN SCHEMA s3billing TO appserver,nifi;
|
||||
--GRANT ALL ON ALL SEQUENCES IN SCHEMA ngcloud_ru TO appserver,nifi;
|
||||
|
||||
|
||||
--ALTER DEFAULT PRIVILEGES FOR ROLE dbo GRANT ALL ON SEQUENCES TO appserver,nifi;
|
||||
|
||||
--
|
||||
-- PostgreSQL database dump
|
||||
--
|
||||
|
||||
-- Dumped from database version 16.0
|
||||
-- Dumped by pg_dump version 16.4
|
||||
|
||||
-- Started on 2025-09-15 09:50:58
|
||||
|
||||
SET statement_timeout = 0;
|
||||
SET lock_timeout = 0;
|
||||
SET idle_in_transaction_session_timeout = 0;
|
||||
SET client_encoding = 'UTF8';
|
||||
SET standard_conforming_strings = on;
|
||||
SELECT pg_catalog.set_config('search_path', '', false);
|
||||
SET check_function_bodies = false;
|
||||
SET xmloption = content;
|
||||
SET client_min_messages = warning;
|
||||
SET row_security = off;
|
||||
|
||||
SET default_tablespace = '';
|
||||
|
||||
SET default_table_access_method = heap;
|
||||
|
||||
--
|
||||
-- TOC entry 230 (class 1259 OID 2160668)
|
||||
-- Name: bucket_info; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS s3billing.bucket_info;
|
||||
CREATE TABLE s3billing.bucket_info (
|
||||
id integer NOT NULL,
|
||||
bucket_id character varying(255) NOT NULL,
|
||||
name character varying(255) NOT NULL,
|
||||
marker character varying(255) NOT NULL,
|
||||
placement_id bigint DEFAULT 0 NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 226 (class 1259 OID 2160642)
|
||||
-- Name: bucket_stat; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
DROP TABLE IF EXISTS s3billing.bucket_stat;
|
||||
CREATE TABLE s3billing.bucket_stat (
|
||||
bucket_id bigint,
|
||||
num_shards bigint NOT NULL,
|
||||
tenant character varying(255) DEFAULT NULL::character varying,
|
||||
zone_group bigint NOT NULL,
|
||||
placement_id bigint NOT NULL,
|
||||
explicit_placement_data_pool character varying(255) DEFAULT NULL::character varying,
|
||||
explicit_placement_data_extra_pool character varying(255) DEFAULT NULL::character varying,
|
||||
explicit_placement_index_pool character varying(255) DEFAULT NULL::character varying,
|
||||
index_type_id bigint NOT NULL,
|
||||
versioned boolean DEFAULT false,
|
||||
versioning_enabled boolean DEFAULT false,
|
||||
object_lock_enabled boolean DEFAULT false,
|
||||
mfa_enabled boolean DEFAULT false,
|
||||
owner character varying(255) NOT NULL,
|
||||
bucket_quota_enabled boolean DEFAULT false,
|
||||
bucket_quota_check_on_raw boolean DEFAULT false,
|
||||
bucket_quota_max_size bigint NOT NULL,
|
||||
bucket_quota_max_size_kb bigint NOT NULL,
|
||||
bucket_quota_max_objects bigint NOT NULL,
|
||||
usage_rgw_main_size bigint NOT NULL,
|
||||
usage_rgw_main_size_actual bigint NOT NULL,
|
||||
usage_rgw_main_size_utilized bigint NOT NULL,
|
||||
usage_rgw_main_size_kb bigint NOT NULL,
|
||||
usage_rgw_main_size_kb_actual bigint NOT NULL,
|
||||
usage_rgw_main_size_kb_utilized bigint NOT NULL,
|
||||
usage_rgw_main_num_objects bigint NOT NULL,
|
||||
usage_rgw_multimeta_size bigint,
|
||||
usage_rgw_multimeta_size_actual bigint,
|
||||
usage_rgw_multimeta_size_utilized bigint,
|
||||
usage_rgw_multimeta_size_kb bigint,
|
||||
usage_rgw_multimeta_size_kb_actual bigint,
|
||||
usage_rgw_multimeta_size_kb_utilized bigint,
|
||||
usage_rgw_multimeta_num_objects bigint,
|
||||
creation_time timestamp without time zone NOT NULL,
|
||||
mtime timestamp without time zone NOT NULL,
|
||||
timestamp_addition timestamp without time zone DEFAULT date_trunc('hour'::text, CURRENT_TIMESTAMP)
|
||||
);
|
||||
|
||||
--
|
||||
-- TOC entry 245 (class 1259 OID 2160763)
|
||||
-- Name: category; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
DROP TABLE IF EXISTS s3billing.category;
|
||||
CREATE TABLE s3billing.category (
|
||||
id integer NOT NULL,
|
||||
name character varying(255) NOT NULL
|
||||
);
|
||||
|
||||
--
|
||||
-- TOC entry 225 (class 1259 OID 2160635)
|
||||
-- Name: goose_db_version; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
DROP TABLE IF EXISTS s3billing.goose_db_version;
|
||||
CREATE TABLE s3billing.goose_db_version (
|
||||
id integer NOT NULL,
|
||||
version_id bigint NOT NULL,
|
||||
is_applied boolean NOT NULL,
|
||||
tstamp timestamp without time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 234 (class 1259 OID 2160684)
|
||||
-- Name: index_type; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
DROP TABLE IF EXISTS index_type;
|
||||
CREATE TABLE s3billing.index_type (
|
||||
id integer NOT NULL,
|
||||
name character varying(255) NOT NULL
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 232 (class 1259 OID 2160677)
|
||||
-- Name: placement; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
DROP TABLE IF EXISTS s3billing.placement;
|
||||
CREATE TABLE s3billing.placement (
|
||||
id integer NOT NULL,
|
||||
name character varying(255) NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 239 (class 1259 OID 2160705)
|
||||
-- Name: usage_bucket_by_user; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
DROP TABLE IF EXISTS s3billing.usage_bucket_by_user;
|
||||
CREATE TABLE s3billing.usage_bucket_by_user (
|
||||
bucketid bigint,
|
||||
"time" timestamp without time zone NOT NULL,
|
||||
bytes_sent bigint NOT NULL,
|
||||
bytes_received bigint NOT NULL,
|
||||
ops bigint NOT NULL,
|
||||
successful_ops bigint NOT NULL,
|
||||
date_start timestamp without time zone NOT NULL,
|
||||
date_end timestamp without time zone NOT NULL,
|
||||
user_id bigint NOT NULL,
|
||||
category_id bigint NOT NULL
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 238 (class 1259 OID 2160698)
|
||||
-- Name: usage_stat_summary; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
DROP TABLE IF EXISTS s3billing.usage_stat_summary;
|
||||
CREATE TABLE s3billing.usage_stat_summary (
|
||||
id integer NOT NULL,
|
||||
userid character varying(255) NOT NULL,
|
||||
category character varying(255) NOT NULL,
|
||||
bytes_sent bigint NOT NULL,
|
||||
bytes_received bigint NOT NULL,
|
||||
ops bigint NOT NULL,
|
||||
successful_ops bigint NOT NULL,
|
||||
date_start timestamp without time zone NOT NULL,
|
||||
date_end timestamp without time zone NOT NULL
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 236 (class 1259 OID 2160691)
|
||||
-- Name: usage_stat_total; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
DROP TABLE IF EXISTS s3billing.usage_stat_total;
|
||||
CREATE TABLE s3billing.usage_stat_total (
|
||||
id integer NOT NULL,
|
||||
userid character varying(255) NOT NULL,
|
||||
bytes_sent bigint NOT NULL,
|
||||
bytes_received bigint NOT NULL,
|
||||
ops bigint NOT NULL,
|
||||
successful_ops bigint NOT NULL,
|
||||
date_start timestamp without time zone NOT NULL,
|
||||
date_end timestamp without time zone NOT NULL
|
||||
);
|
||||
|
||||
--
|
||||
-- TOC entry 243 (class 1259 OID 2160751)
|
||||
-- Name: user_info; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
DROP TABLE IF EXISTS s3billing.user_info;
|
||||
CREATE TABLE s3billing.user_info (
|
||||
id integer NOT NULL,
|
||||
name character varying(255) NOT NULL,
|
||||
owner character varying(255) NOT NULL
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 241 (class 1259 OID 2160712)
|
||||
-- Name: user_quota_bucket; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
DROP TABLE IF EXISTS s3billing.user_quota_bucket;
|
||||
CREATE TABLE s3billing.user_quota_bucket (
|
||||
id integer NOT NULL,
|
||||
userid character varying(255) NOT NULL,
|
||||
enabled boolean DEFAULT false,
|
||||
check_on_raw boolean DEFAULT false,
|
||||
max_size bigint NOT NULL,
|
||||
max_size_kb bigint NOT NULL,
|
||||
max_objects bigint NOT NULL
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 228 (class 1259 OID 2160661)
|
||||
-- Name: zone_group; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
DROP TABLE IF EXISTS s3billing.zone_group;
|
||||
CREATE TABLE s3billing.zone_group (
|
||||
id integer NOT NULL,
|
||||
name uuid NOT NULL
|
||||
);
|
||||
|
||||
--
|
||||
-- TOC entry 3278 (class 2606 OID 2160675)
|
||||
-- Name: bucket_info bucket_info_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.bucket_info
|
||||
ADD CONSTRAINT bucket_info_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3273 (class 2606 OID 2476484)
|
||||
-- Name: bucket_stat bucket_stat_unique; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
--ALTER TABLE ONLY s3billing.bucket_stat
|
||||
-- ADD CONSTRAINT bucket_stat_unique UNIQUE (bucket_id, placement_id, timestamp_addition);
|
||||
|
||||
ALTER TABLE ONLY s3billing.bucket_stat
|
||||
ADD CONSTRAINT bucket_stat_pkey PRIMARY KEY (bucket_id, placement_id, timestamp_addition);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3298 (class 2606 OID 2160768)
|
||||
-- Name: category category_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.category
|
||||
ADD CONSTRAINT category_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3270 (class 2606 OID 2160640)
|
||||
-- Name: goose_db_version goose_db_version_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.goose_db_version
|
||||
ADD CONSTRAINT goose_db_version_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3284 (class 2606 OID 2160689)
|
||||
-- Name: index_type index_type_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.index_type
|
||||
ADD CONSTRAINT index_type_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3282 (class 2606 OID 2160682)
|
||||
-- Name: placement placement_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.placement
|
||||
ADD CONSTRAINT placement_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3290 (class 2606 OID 2476705)
|
||||
-- Name: usage_bucket_by_user usage_bucket_by_user_unique; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
--ALTER TABLE ONLY s3billing.usage_bucket_by_user
|
||||
-- ADD CONSTRAINT usage_bucket_by_user_unique UNIQUE (bucketid, date_start, date_end, user_id, category_id);
|
||||
ALTER TABLE ONLY s3billing.usage_bucket_by_user
|
||||
ADD CONSTRAINT usage_bucket_by_user_pkey PRIMARY KEY (bucketid, date_start, date_end, user_id, category_id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3288 (class 2606 OID 2160703)
|
||||
-- Name: usage_stat_summary usage_stat_summary_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.usage_stat_summary
|
||||
ADD CONSTRAINT usage_stat_summary_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3286 (class 2606 OID 2160696)
|
||||
-- Name: usage_stat_total usage_stat_total_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.usage_stat_total
|
||||
ADD CONSTRAINT usage_stat_total_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3295 (class 2606 OID 2160758)
|
||||
-- Name: user_info user_info_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.user_info
|
||||
ADD CONSTRAINT user_info_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3292 (class 2606 OID 2160719)
|
||||
-- Name: user_quota_bucket user_quota_bucket_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.user_quota_bucket
|
||||
ADD CONSTRAINT user_quota_bucket_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3275 (class 2606 OID 2160666)
|
||||
-- Name: zone_group zone_group_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.zone_group
|
||||
ADD CONSTRAINT zone_group_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3276 (class 1259 OID 2474077)
|
||||
-- Name: bucket_info_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE INDEX bucket_info_name_idx ON s3billing.bucket_info USING btree (name);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3279 (class 1259 OID 2474078)
|
||||
-- Name: bucket_info_placement_id_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE INDEX bucket_info_placement_id_idx ON s3billing.bucket_info USING btree (placement_id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3271 (class 1259 OID 2474094)
|
||||
-- Name: bucket_stat_owner_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE INDEX bucket_stat_owner_idx ON s3billing.bucket_stat USING btree (owner);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3296 (class 1259 OID 2474445)
|
||||
-- Name: category_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE UNIQUE INDEX category_name_idx ON s3billing.category USING btree (name);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3280 (class 1259 OID 2474468)
|
||||
-- Name: placement_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE UNIQUE INDEX placement_name_idx ON s3billing.placement USING btree (name);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3293 (class 1259 OID 2474438)
|
||||
-- Name: user_info_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE INDEX user_info_name_idx ON s3billing.user_info USING btree (name);
|
||||
|
||||
|
||||
|
||||
-- Completed on 2025-09-15 09:50:59
|
||||
|
||||
--
|
||||
-- PostgreSQL database dump complete
|
||||
--
|
||||
|
||||
-------------------------------------------------------------------------------------
|
||||
-------------------------------------------------------------------------------------
|
||||
-------------------------------------------------------------------------------------
|
||||
|
||||
DROP TABLE IF EXISTS ngcloud_ru.capacity_resource;
|
||||
CREATE TABLE ngcloud_ru.capacity_resource (
|
||||
vdc_id uuid NOT NULL,
|
||||
"timestamp" timestamp with time zone NOT NULL,
|
||||
cpu_allocated integer NOT NULL,
|
||||
cpu_limit integer NOT NULL,
|
||||
cpu_reserved integer NOT NULL,
|
||||
cpu_used integer NOT NULL,
|
||||
cpu_speed integer NOT NULL,
|
||||
mem_allocated integer NOT NULL,
|
||||
mem_limit integer NOT NULL,
|
||||
mem_reserved integer NOT NULL,
|
||||
mem_used integer NOT NULL
|
||||
);
|
||||
|
||||
--
|
||||
-- TOC entry 223 (class 1259 OID 1893993)
|
||||
-- Name: capacity_storage; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
DROP TABLE IF EXISTS ngcloud_ru.capacity_storage;
|
||||
CREATE TABLE ngcloud_ru.capacity_storage (
|
||||
vdc_id uuid NOT NULL,
|
||||
storage_profile_types_id integer NOT NULL,
|
||||
"timestamp" timestamp with time zone NOT NULL,
|
||||
id uuid NOT NULL,
|
||||
"limit" integer NOT NULL,
|
||||
used integer NOT NULL
|
||||
);
|
||||
|
||||
--
|
||||
-- TOC entry 220 (class 1259 OID 1893965)
|
||||
-- Name: storage_profile_types; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
DROP TABLE IF EXISTS ngcloud_ru.storage_profile_types;
|
||||
CREATE TABLE ngcloud_ru.storage_profile_types (
|
||||
id integer NOT NULL,
|
||||
name character varying(255) NOT NULL
|
||||
);
|
||||
|
||||
--
|
||||
-- TOC entry 218 (class 1259 OID 1893959)
|
||||
-- Name: tenant; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
DROP TABLE IF EXISTS ngcloud_ru.tenant;
|
||||
CREATE TABLE ngcloud_ru.tenant (
|
||||
id uuid NOT NULL,
|
||||
name character varying(255) NOT NULL,
|
||||
wzcode bigint
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 221 (class 1259 OID 1893973)
|
||||
-- Name: vdc; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
DROP TABLE IF EXISTS ngcloud_ru.vdc;
|
||||
CREATE TABLE ngcloud_ru.vdc (
|
||||
id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
name character varying(255) NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3255 (class 2606 OID 1893987)
|
||||
-- Name: capacity_resource capacity_resource_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.capacity_resource
|
||||
ADD CONSTRAINT capacity_resource_pkey PRIMARY KEY (vdc_id, "timestamp");
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3257 (class 2606 OID 1893997)
|
||||
-- Name: capacity_storage capacity_storage_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.capacity_storage
|
||||
ADD CONSTRAINT capacity_storage_pkey PRIMARY KEY (vdc_id, id, "timestamp");
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3249 (class 2606 OID 1893972)
|
||||
-- Name: storage_profile_types storage_profile_types_name_key; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.storage_profile_types
|
||||
ADD CONSTRAINT storage_profile_types_name_key UNIQUE (name);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3251 (class 2606 OID 1893970)
|
||||
-- Name: storage_profile_types storage_profile_types_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.storage_profile_types
|
||||
ADD CONSTRAINT storage_profile_types_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3247 (class 2606 OID 1893963)
|
||||
-- Name: tenant tenant_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.tenant
|
||||
ADD CONSTRAINT tenant_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3253 (class 2606 OID 1893977)
|
||||
-- Name: vdc vdc_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.vdc
|
||||
ADD CONSTRAINT vdc_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3259 (class 2606 OID 1893988)
|
||||
-- Name: capacity_resource capacity_resource_vdc_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
--ALTER TABLE ONLY ngcloud_ru.capacity_resource
|
||||
-- ADD CONSTRAINT capacity_resource_vdc_id_fkey FOREIGN KEY (vdc_id) REFERENCES ngcloud_ru.vdc(id) ON DELETE CASCADE;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3260 (class 2606 OID 1894003)
|
||||
-- Name: capacity_storage capacity_storage_storage_profile_types_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
--ALTER TABLE ONLY ngcloud_ru.capacity_storage
|
||||
-- ADD CONSTRAINT capacity_storage_storage_profile_types_id_fkey FOREIGN KEY (storage_profile_types_id) REFERENCES ngcloud_ru.storage_profile_types(id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3261 (class 2606 OID 1893998)
|
||||
-- Name: capacity_storage capacity_storage_vdc_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
--ALTER TABLE ONLY ngcloud_ru.capacity_storage
|
||||
-- ADD CONSTRAINT capacity_storage_vdc_id_fkey FOREIGN KEY (vdc_id) REFERENCES ngcloud_ru.vdc(id) ON DELETE CASCADE;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3258 (class 2606 OID 1893978)
|
||||
-- Name: vdc vdc_tenant_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
--ALTER TABLE ONLY ngcloud_ru.vdc
|
||||
-- ADD CONSTRAINT vdc_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES ngcloud_ru.tenant(id);
|
||||
|
||||
|
||||
-- Completed on 2025-09-15 09:53:18
|
||||
|
||||
--
|
||||
-- PostgreSQL database dump complete
|
||||
--
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,72 @@
|
||||
set role postgres;
|
||||
--
|
||||
CREATE SCHEMA IF NOT EXISTS gpu;
|
||||
--ALTER SCHEMA gpu OWNER TO dbo;
|
||||
GRANT USAGE ON SCHEMA gpu TO nifi;
|
||||
|
||||
GRANT ALL ON ALL TABLES IN SCHEMA gpu TO nifi;
|
||||
GRANT ALL ON ALL SEQUENCES IN SCHEMA gpu TO nifi;
|
||||
|
||||
--ALTER DEFAULT PRIVILEGES IN SCHEMA gpu GRANT ALL ON TABLES TO nifi;
|
||||
--ALTER DEFAULT PRIVILEGES IN SCHEMA gpu GRANT ALL ON SEQUENCES TO nifi;
|
||||
|
||||
ALTER DEFAULT PRIVILEGES FOR ROLE dbo, postgres IN SCHEMA gpu GRANT ALL ON TABLES TO nifi;
|
||||
ALTER DEFAULT PRIVILEGES FOR ROLE dbo, postgres IN SCHEMA gpu GRANT ALL ON SEQUENCES TO nifi;
|
||||
|
||||
--SET ROLE dbo;
|
||||
|
||||
DROP TABLE IF EXISTS gpu.vm;
|
||||
CREATE TABLE gpu.vm (
|
||||
objUUID uuid NOT NULL PRIMARY KEY
|
||||
,groupUUID uuid NULL
|
||||
,objId varchar(255) NULL
|
||||
,ClientID varchar(255) NULL -- WZ
|
||||
,VCD varchar(255) NULL
|
||||
,Org varchar(255) NULL
|
||||
,OrgVDC varchar(255) NULL
|
||||
,vCenter varchar(255) NULL
|
||||
,GPU varchar(255) NULL
|
||||
,dt_load timestamptz NOT NULL
|
||||
);
|
||||
ALTER TABLE gpu.vm OWNER TO dbo;
|
||||
/*
|
||||
{
|
||||
"type": "record",
|
||||
"name": "gpu.vm",
|
||||
"namespace": "org.apache.nifi",
|
||||
"fields": [
|
||||
{"name":"objUUID", "type":{"type": "string", "logicalType": "uuid"}},
|
||||
{"name":"groupUUID", "type":[{"type": "string", "logicalType": "uuid"} ,"null"]},
|
||||
{"name":"objId", "type":["string" ,"null"]},
|
||||
{"name":"ClientID", "type":["int" ,"null"]},
|
||||
{"name":"VCD", "type":["string" ,"null"]},
|
||||
{"name":"Org", "type":["string" ,"null"]},
|
||||
{"name":"OrgVDC", "type":["string" ,"null"]},
|
||||
{"name":"vCenter", "type":["string" ,"null"]},
|
||||
{"name":"GPU", "type":["string" ,"null"]},
|
||||
{"name":"VCD", "type":["string" ,"null"]},
|
||||
{"name":"dt_load","type":{"type": "long", "logicalType": "local-timestamp-millis"}}
|
||||
]
|
||||
}
|
||||
*/
|
||||
|
||||
DROP TABLE IF EXISTS gpu.vm_power_state;
|
||||
CREATE TABLE gpu.vm_power_state (
|
||||
objId varchar(255) NULL
|
||||
,ts timestamptz NOT NULL -- без таймштампа загрузки
|
||||
,value int NULL
|
||||
,CONSTRAINT PK_vm_power_state PRIMARY KEY(objId, ts)
|
||||
);
|
||||
ALTER TABLE gpu.vm_power_state OWNER TO dbo;
|
||||
/*
|
||||
{
|
||||
"type": "record",
|
||||
"name": "gpu.vm_power_state,
|
||||
"namespace": "org.apache.nifi",
|
||||
"fields": [
|
||||
{"name":"objId", "type":["string" ,"null"]},
|
||||
{"name":"ts","type":{"type": "long", "logicalType": "local-timestamp-millis"}},
|
||||
{"name":"value", "type":["int" ,"null"]}
|
||||
]
|
||||
}
|
||||
*/
|
||||
@@ -0,0 +1,828 @@
|
||||
--
|
||||
-- PostgreSQL database dump
|
||||
--
|
||||
|
||||
-- Dumped from database version 16.0
|
||||
-- Dumped by pg_dump version 16.4
|
||||
|
||||
-- Started on 2025-09-15 09:50:58
|
||||
|
||||
SET statement_timeout = 0;
|
||||
SET lock_timeout = 0;
|
||||
SET idle_in_transaction_session_timeout = 0;
|
||||
SET client_encoding = 'UTF8';
|
||||
SET standard_conforming_strings = on;
|
||||
SELECT pg_catalog.set_config('search_path', '', false);
|
||||
SET check_function_bodies = false;
|
||||
SET xmloption = content;
|
||||
SET client_min_messages = warning;
|
||||
SET row_security = off;
|
||||
|
||||
SET default_tablespace = '';
|
||||
|
||||
SET default_table_access_method = heap;
|
||||
|
||||
--
|
||||
-- TOC entry 230 (class 1259 OID 2160668)
|
||||
-- Name: bucket_info; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE TABLE s3billing.bucket_info (
|
||||
id integer NOT NULL,
|
||||
bucket_id character varying(255) NOT NULL,
|
||||
name character varying(255) NOT NULL,
|
||||
marker character varying(255) NOT NULL,
|
||||
placement_id bigint DEFAULT 0 NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE s3billing.bucket_info OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 229 (class 1259 OID 2160667)
|
||||
-- Name: bucket_info_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE SEQUENCE s3billing.bucket_info_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER SEQUENCE s3billing.bucket_info_id_seq OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 3448 (class 0 OID 0)
|
||||
-- Dependencies: 229
|
||||
-- Name: bucket_info_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER SEQUENCE s3billing.bucket_info_id_seq OWNED BY s3billing.bucket_info.id;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 226 (class 1259 OID 2160642)
|
||||
-- Name: bucket_stat; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE TABLE s3billing.bucket_stat (
|
||||
bucket_id bigint,
|
||||
num_shards bigint NOT NULL,
|
||||
tenant character varying(255) DEFAULT NULL::character varying,
|
||||
zone_group bigint NOT NULL,
|
||||
placement_id bigint NOT NULL,
|
||||
explicit_placement_data_pool character varying(255) DEFAULT NULL::character varying,
|
||||
explicit_placement_data_extra_pool character varying(255) DEFAULT NULL::character varying,
|
||||
explicit_placement_index_pool character varying(255) DEFAULT NULL::character varying,
|
||||
index_type_id bigint NOT NULL,
|
||||
versioned boolean DEFAULT false,
|
||||
versioning_enabled boolean DEFAULT false,
|
||||
object_lock_enabled boolean DEFAULT false,
|
||||
mfa_enabled boolean DEFAULT false,
|
||||
owner character varying(255) NOT NULL,
|
||||
bucket_quota_enabled boolean DEFAULT false,
|
||||
bucket_quota_check_on_raw boolean DEFAULT false,
|
||||
bucket_quota_max_size bigint NOT NULL,
|
||||
bucket_quota_max_size_kb bigint NOT NULL,
|
||||
bucket_quota_max_objects bigint NOT NULL,
|
||||
usage_rgw_main_size bigint NOT NULL,
|
||||
usage_rgw_main_size_actual bigint NOT NULL,
|
||||
usage_rgw_main_size_utilized bigint NOT NULL,
|
||||
usage_rgw_main_size_kb bigint NOT NULL,
|
||||
usage_rgw_main_size_kb_actual bigint NOT NULL,
|
||||
usage_rgw_main_size_kb_utilized bigint NOT NULL,
|
||||
usage_rgw_main_num_objects bigint NOT NULL,
|
||||
usage_rgw_multimeta_size bigint,
|
||||
usage_rgw_multimeta_size_actual bigint,
|
||||
usage_rgw_multimeta_size_utilized bigint,
|
||||
usage_rgw_multimeta_size_kb bigint,
|
||||
usage_rgw_multimeta_size_kb_actual bigint,
|
||||
usage_rgw_multimeta_size_kb_utilized bigint,
|
||||
usage_rgw_multimeta_num_objects bigint,
|
||||
creation_time timestamp without time zone NOT NULL,
|
||||
mtime timestamp without time zone NOT NULL,
|
||||
timestamp_addition timestamp without time zone DEFAULT date_trunc('hour'::text, CURRENT_TIMESTAMP)
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE s3billing.bucket_stat OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 245 (class 1259 OID 2160763)
|
||||
-- Name: category; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE TABLE s3billing.category (
|
||||
id integer NOT NULL,
|
||||
name character varying(255) NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE s3billing.category OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 244 (class 1259 OID 2160762)
|
||||
-- Name: category_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE SEQUENCE s3billing.category_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER SEQUENCE s3billing.category_id_seq OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 3451 (class 0 OID 0)
|
||||
-- Dependencies: 244
|
||||
-- Name: category_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER SEQUENCE s3billing.category_id_seq OWNED BY s3billing.category.id;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 225 (class 1259 OID 2160635)
|
||||
-- Name: goose_db_version; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE TABLE s3billing.goose_db_version (
|
||||
id integer NOT NULL,
|
||||
version_id bigint NOT NULL,
|
||||
is_applied boolean NOT NULL,
|
||||
tstamp timestamp without time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE s3billing.goose_db_version OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 224 (class 1259 OID 2160634)
|
||||
-- Name: goose_db_version_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE s3billing.goose_db_version ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY (
|
||||
SEQUENCE NAME s3billing.goose_db_version_id_seq
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 234 (class 1259 OID 2160684)
|
||||
-- Name: index_type; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE TABLE s3billing.index_type (
|
||||
id integer NOT NULL,
|
||||
name character varying(255) NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE s3billing.index_type OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 233 (class 1259 OID 2160683)
|
||||
-- Name: index_type_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE SEQUENCE s3billing.index_type_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER SEQUENCE s3billing.index_type_id_seq OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 3454 (class 0 OID 0)
|
||||
-- Dependencies: 233
|
||||
-- Name: index_type_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER SEQUENCE s3billing.index_type_id_seq OWNED BY s3billing.index_type.id;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 232 (class 1259 OID 2160677)
|
||||
-- Name: placement; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE TABLE s3billing.placement (
|
||||
id integer NOT NULL,
|
||||
name character varying(255) NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE s3billing.placement OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 231 (class 1259 OID 2160676)
|
||||
-- Name: placement_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE SEQUENCE s3billing.placement_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER SEQUENCE s3billing.placement_id_seq OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 3456 (class 0 OID 0)
|
||||
-- Dependencies: 231
|
||||
-- Name: placement_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER SEQUENCE s3billing.placement_id_seq OWNED BY s3billing.placement.id;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 239 (class 1259 OID 2160705)
|
||||
-- Name: usage_bucket_by_user; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE TABLE s3billing.usage_bucket_by_user (
|
||||
bucketid bigint,
|
||||
"time" timestamp without time zone NOT NULL,
|
||||
bytes_sent bigint NOT NULL,
|
||||
bytes_received bigint NOT NULL,
|
||||
ops bigint NOT NULL,
|
||||
successful_ops bigint NOT NULL,
|
||||
date_start timestamp without time zone NOT NULL,
|
||||
date_end timestamp without time zone NOT NULL,
|
||||
user_id bigint NOT NULL,
|
||||
category_id bigint NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE s3billing.usage_bucket_by_user OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 238 (class 1259 OID 2160698)
|
||||
-- Name: usage_stat_summary; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE TABLE s3billing.usage_stat_summary (
|
||||
id integer NOT NULL,
|
||||
userid character varying(255) NOT NULL,
|
||||
category character varying(255) NOT NULL,
|
||||
bytes_sent bigint NOT NULL,
|
||||
bytes_received bigint NOT NULL,
|
||||
ops bigint NOT NULL,
|
||||
successful_ops bigint NOT NULL,
|
||||
date_start timestamp without time zone NOT NULL,
|
||||
date_end timestamp without time zone NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE s3billing.usage_stat_summary OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 237 (class 1259 OID 2160697)
|
||||
-- Name: usage_stat_summary_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE SEQUENCE s3billing.usage_stat_summary_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER SEQUENCE s3billing.usage_stat_summary_id_seq OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 3459 (class 0 OID 0)
|
||||
-- Dependencies: 237
|
||||
-- Name: usage_stat_summary_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER SEQUENCE s3billing.usage_stat_summary_id_seq OWNED BY s3billing.usage_stat_summary.id;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 236 (class 1259 OID 2160691)
|
||||
-- Name: usage_stat_total; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE TABLE s3billing.usage_stat_total (
|
||||
id integer NOT NULL,
|
||||
userid character varying(255) NOT NULL,
|
||||
bytes_sent bigint NOT NULL,
|
||||
bytes_received bigint NOT NULL,
|
||||
ops bigint NOT NULL,
|
||||
successful_ops bigint NOT NULL,
|
||||
date_start timestamp without time zone NOT NULL,
|
||||
date_end timestamp without time zone NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE s3billing.usage_stat_total OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 235 (class 1259 OID 2160690)
|
||||
-- Name: usage_stat_total_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE SEQUENCE s3billing.usage_stat_total_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER SEQUENCE s3billing.usage_stat_total_id_seq OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 3461 (class 0 OID 0)
|
||||
-- Dependencies: 235
|
||||
-- Name: usage_stat_total_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER SEQUENCE s3billing.usage_stat_total_id_seq OWNED BY s3billing.usage_stat_total.id;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 243 (class 1259 OID 2160751)
|
||||
-- Name: user_info; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE TABLE s3billing.user_info (
|
||||
id integer NOT NULL,
|
||||
name character varying(255) NOT NULL,
|
||||
owner character varying(255) NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE s3billing.user_info OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 242 (class 1259 OID 2160750)
|
||||
-- Name: user_info_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE SEQUENCE s3billing.user_info_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER SEQUENCE s3billing.user_info_id_seq OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 3463 (class 0 OID 0)
|
||||
-- Dependencies: 242
|
||||
-- Name: user_info_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER SEQUENCE s3billing.user_info_id_seq OWNED BY s3billing.user_info.id;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 241 (class 1259 OID 2160712)
|
||||
-- Name: user_quota_bucket; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE TABLE s3billing.user_quota_bucket (
|
||||
id integer NOT NULL,
|
||||
userid character varying(255) NOT NULL,
|
||||
enabled boolean DEFAULT false,
|
||||
check_on_raw boolean DEFAULT false,
|
||||
max_size bigint NOT NULL,
|
||||
max_size_kb bigint NOT NULL,
|
||||
max_objects bigint NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE s3billing.user_quota_bucket OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 240 (class 1259 OID 2160711)
|
||||
-- Name: user_quota_bucket_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE SEQUENCE s3billing.user_quota_bucket_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER SEQUENCE s3billing.user_quota_bucket_id_seq OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 3465 (class 0 OID 0)
|
||||
-- Dependencies: 240
|
||||
-- Name: user_quota_bucket_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER SEQUENCE s3billing.user_quota_bucket_id_seq OWNED BY s3billing.user_quota_bucket.id;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 228 (class 1259 OID 2160661)
|
||||
-- Name: zone_group; Type: TABLE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE TABLE s3billing.zone_group (
|
||||
id integer NOT NULL,
|
||||
name uuid NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE s3billing.zone_group OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 227 (class 1259 OID 2160660)
|
||||
-- Name: zone_group_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE SEQUENCE s3billing.zone_group_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER SEQUENCE s3billing.zone_group_id_seq OWNER TO s3billing;
|
||||
|
||||
--
|
||||
-- TOC entry 3467 (class 0 OID 0)
|
||||
-- Dependencies: 227
|
||||
-- Name: zone_group_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER SEQUENCE s3billing.zone_group_id_seq OWNED BY s3billing.zone_group.id;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3258 (class 2604 OID 2160671)
|
||||
-- Name: bucket_info id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.bucket_info ALTER COLUMN id SET DEFAULT nextval('s3billing.bucket_info_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3268 (class 2604 OID 2160766)
|
||||
-- Name: category id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.category ALTER COLUMN id SET DEFAULT nextval('s3billing.category_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3261 (class 2604 OID 2160687)
|
||||
-- Name: index_type id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.index_type ALTER COLUMN id SET DEFAULT nextval('s3billing.index_type_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3260 (class 2604 OID 2160680)
|
||||
-- Name: placement id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.placement ALTER COLUMN id SET DEFAULT nextval('s3billing.placement_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3263 (class 2604 OID 2160701)
|
||||
-- Name: usage_stat_summary id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.usage_stat_summary ALTER COLUMN id SET DEFAULT nextval('s3billing.usage_stat_summary_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3262 (class 2604 OID 2160694)
|
||||
-- Name: usage_stat_total id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.usage_stat_total ALTER COLUMN id SET DEFAULT nextval('s3billing.usage_stat_total_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3267 (class 2604 OID 2160754)
|
||||
-- Name: user_info id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.user_info ALTER COLUMN id SET DEFAULT nextval('s3billing.user_info_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3264 (class 2604 OID 2160715)
|
||||
-- Name: user_quota_bucket id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.user_quota_bucket ALTER COLUMN id SET DEFAULT nextval('s3billing.user_quota_bucket_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3257 (class 2604 OID 2160664)
|
||||
-- Name: zone_group id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.zone_group ALTER COLUMN id SET DEFAULT nextval('s3billing.zone_group_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3278 (class 2606 OID 2160675)
|
||||
-- Name: bucket_info bucket_info_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.bucket_info
|
||||
ADD CONSTRAINT bucket_info_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3273 (class 2606 OID 2476484)
|
||||
-- Name: bucket_stat bucket_stat_unique; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.bucket_stat
|
||||
ADD CONSTRAINT bucket_stat_unique UNIQUE (bucket_id, placement_id, timestamp_addition);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3298 (class 2606 OID 2160768)
|
||||
-- Name: category category_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.category
|
||||
ADD CONSTRAINT category_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3270 (class 2606 OID 2160640)
|
||||
-- Name: goose_db_version goose_db_version_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.goose_db_version
|
||||
ADD CONSTRAINT goose_db_version_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3284 (class 2606 OID 2160689)
|
||||
-- Name: index_type index_type_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.index_type
|
||||
ADD CONSTRAINT index_type_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3282 (class 2606 OID 2160682)
|
||||
-- Name: placement placement_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.placement
|
||||
ADD CONSTRAINT placement_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3290 (class 2606 OID 2476705)
|
||||
-- Name: usage_bucket_by_user usage_bucket_by_user_unique; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.usage_bucket_by_user
|
||||
ADD CONSTRAINT usage_bucket_by_user_unique UNIQUE (bucketid, date_start, date_end, user_id, category_id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3288 (class 2606 OID 2160703)
|
||||
-- Name: usage_stat_summary usage_stat_summary_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.usage_stat_summary
|
||||
ADD CONSTRAINT usage_stat_summary_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3286 (class 2606 OID 2160696)
|
||||
-- Name: usage_stat_total usage_stat_total_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.usage_stat_total
|
||||
ADD CONSTRAINT usage_stat_total_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3295 (class 2606 OID 2160758)
|
||||
-- Name: user_info user_info_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.user_info
|
||||
ADD CONSTRAINT user_info_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3292 (class 2606 OID 2160719)
|
||||
-- Name: user_quota_bucket user_quota_bucket_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.user_quota_bucket
|
||||
ADD CONSTRAINT user_quota_bucket_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3275 (class 2606 OID 2160666)
|
||||
-- Name: zone_group zone_group_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY s3billing.zone_group
|
||||
ADD CONSTRAINT zone_group_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3276 (class 1259 OID 2474077)
|
||||
-- Name: bucket_info_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE INDEX bucket_info_name_idx ON s3billing.bucket_info USING btree (name);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3279 (class 1259 OID 2474078)
|
||||
-- Name: bucket_info_placement_id_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE INDEX bucket_info_placement_id_idx ON s3billing.bucket_info USING btree (placement_id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3271 (class 1259 OID 2474094)
|
||||
-- Name: bucket_stat_owner_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE INDEX bucket_stat_owner_idx ON s3billing.bucket_stat USING btree (owner);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3296 (class 1259 OID 2474445)
|
||||
-- Name: category_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE UNIQUE INDEX category_name_idx ON s3billing.category USING btree (name);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3280 (class 1259 OID 2474468)
|
||||
-- Name: placement_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE UNIQUE INDEX placement_name_idx ON s3billing.placement USING btree (name);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3293 (class 1259 OID 2474438)
|
||||
-- Name: user_info_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
CREATE INDEX user_info_name_idx ON s3billing.user_info USING btree (name);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3447 (class 0 OID 0)
|
||||
-- Dependencies: 230
|
||||
-- Name: TABLE bucket_info; Type: ACL; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE s3billing.bucket_info TO grafanabilling;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3449 (class 0 OID 0)
|
||||
-- Dependencies: 226
|
||||
-- Name: TABLE bucket_stat; Type: ACL; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE s3billing.bucket_stat TO grafanabilling;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3450 (class 0 OID 0)
|
||||
-- Dependencies: 245
|
||||
-- Name: TABLE category; Type: ACL; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE s3billing.category TO grafanabilling;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3452 (class 0 OID 0)
|
||||
-- Dependencies: 225
|
||||
-- Name: TABLE goose_db_version; Type: ACL; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE s3billing.goose_db_version TO grafanabilling;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3453 (class 0 OID 0)
|
||||
-- Dependencies: 234
|
||||
-- Name: TABLE index_type; Type: ACL; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE s3billing.index_type TO grafanabilling;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3455 (class 0 OID 0)
|
||||
-- Dependencies: 232
|
||||
-- Name: TABLE placement; Type: ACL; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE s3billing.placement TO grafanabilling;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3457 (class 0 OID 0)
|
||||
-- Dependencies: 239
|
||||
-- Name: TABLE usage_bucket_by_user; Type: ACL; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE s3billing.usage_bucket_by_user TO grafanabilling;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3458 (class 0 OID 0)
|
||||
-- Dependencies: 238
|
||||
-- Name: TABLE usage_stat_summary; Type: ACL; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE s3billing.usage_stat_summary TO grafanabilling;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3460 (class 0 OID 0)
|
||||
-- Dependencies: 236
|
||||
-- Name: TABLE usage_stat_total; Type: ACL; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE s3billing.usage_stat_total TO grafanabilling;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3462 (class 0 OID 0)
|
||||
-- Dependencies: 243
|
||||
-- Name: TABLE user_info; Type: ACL; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE s3billing.user_info TO grafanabilling;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3464 (class 0 OID 0)
|
||||
-- Dependencies: 241
|
||||
-- Name: TABLE user_quota_bucket; Type: ACL; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE s3billing.user_quota_bucket TO grafanabilling;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3466 (class 0 OID 0)
|
||||
-- Dependencies: 228
|
||||
-- Name: TABLE zone_group; Type: ACL; Schema: s3billing; Owner: s3billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE s3billing.zone_group TO grafanabilling;
|
||||
|
||||
|
||||
-- Completed on 2025-09-15 09:50:59
|
||||
|
||||
--
|
||||
-- PostgreSQL database dump complete
|
||||
--
|
||||
|
||||
@@ -0,0 +1,278 @@
|
||||
--
|
||||
-- PostgreSQL database dump
|
||||
--
|
||||
|
||||
-- Dumped from database version 16.0
|
||||
-- Dumped by pg_dump version 16.4
|
||||
|
||||
-- Started on 2025-09-15 09:53:16
|
||||
|
||||
SET statement_timeout = 0;
|
||||
SET lock_timeout = 0;
|
||||
SET idle_in_transaction_session_timeout = 0;
|
||||
SET client_encoding = 'UTF8';
|
||||
SET standard_conforming_strings = on;
|
||||
SELECT pg_catalog.set_config('search_path', '', false);
|
||||
SET check_function_bodies = false;
|
||||
SET xmloption = content;
|
||||
SET client_min_messages = warning;
|
||||
SET row_security = off;
|
||||
|
||||
SET default_tablespace = '';
|
||||
|
||||
SET default_table_access_method = heap;
|
||||
|
||||
--
|
||||
-- TOC entry 222 (class 1259 OID 1893983)
|
||||
-- Name: capacity_resource; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
CREATE TABLE ngcloud_ru.capacity_resource (
|
||||
vdc_id uuid NOT NULL,
|
||||
"timestamp" timestamp with time zone NOT NULL,
|
||||
cpu_allocated integer NOT NULL,
|
||||
cpu_limit integer NOT NULL,
|
||||
cpu_reserved integer NOT NULL,
|
||||
cpu_used integer NOT NULL,
|
||||
cpu_speed integer NOT NULL,
|
||||
mem_allocated integer NOT NULL,
|
||||
mem_limit integer NOT NULL,
|
||||
mem_reserved integer NOT NULL,
|
||||
mem_used integer NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE ngcloud_ru.capacity_resource OWNER TO vc_billing;
|
||||
|
||||
--
|
||||
-- TOC entry 223 (class 1259 OID 1893993)
|
||||
-- Name: capacity_storage; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
CREATE TABLE ngcloud_ru.capacity_storage (
|
||||
vdc_id uuid NOT NULL,
|
||||
storage_profile_types_id integer NOT NULL,
|
||||
"timestamp" timestamp with time zone NOT NULL,
|
||||
id uuid NOT NULL,
|
||||
"limit" integer NOT NULL,
|
||||
used integer NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE ngcloud_ru.capacity_storage OWNER TO vc_billing;
|
||||
|
||||
--
|
||||
-- TOC entry 220 (class 1259 OID 1893965)
|
||||
-- Name: storage_profile_types; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
CREATE TABLE ngcloud_ru.storage_profile_types (
|
||||
id integer NOT NULL,
|
||||
name character varying(255) NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE ngcloud_ru.storage_profile_types OWNER TO vc_billing;
|
||||
|
||||
--
|
||||
-- TOC entry 219 (class 1259 OID 1893964)
|
||||
-- Name: storage_profile_types_id_seq; Type: SEQUENCE; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
CREATE SEQUENCE ngcloud_ru.storage_profile_types_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER SEQUENCE ngcloud_ru.storage_profile_types_id_seq OWNER TO vc_billing;
|
||||
|
||||
--
|
||||
-- TOC entry 3413 (class 0 OID 0)
|
||||
-- Dependencies: 219
|
||||
-- Name: storage_profile_types_id_seq; Type: SEQUENCE OWNED BY; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER SEQUENCE ngcloud_ru.storage_profile_types_id_seq OWNED BY ngcloud_ru.storage_profile_types.id;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 218 (class 1259 OID 1893959)
|
||||
-- Name: tenant; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
CREATE TABLE ngcloud_ru.tenant (
|
||||
id uuid NOT NULL,
|
||||
name character varying(255) NOT NULL,
|
||||
wzcode bigint
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE ngcloud_ru.tenant OWNER TO vc_billing;
|
||||
|
||||
--
|
||||
-- TOC entry 221 (class 1259 OID 1893973)
|
||||
-- Name: vdc; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
CREATE TABLE ngcloud_ru.vdc (
|
||||
id uuid NOT NULL,
|
||||
tenant_id uuid NOT NULL,
|
||||
name character varying(255) NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE ngcloud_ru.vdc OWNER TO vc_billing;
|
||||
|
||||
--
|
||||
-- TOC entry 3245 (class 2604 OID 1893968)
|
||||
-- Name: storage_profile_types id; Type: DEFAULT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.storage_profile_types ALTER COLUMN id SET DEFAULT nextval('ngcloud_ru.storage_profile_types_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3255 (class 2606 OID 1893987)
|
||||
-- Name: capacity_resource capacity_resource_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.capacity_resource
|
||||
ADD CONSTRAINT capacity_resource_pkey PRIMARY KEY (vdc_id, "timestamp");
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3257 (class 2606 OID 1893997)
|
||||
-- Name: capacity_storage capacity_storage_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.capacity_storage
|
||||
ADD CONSTRAINT capacity_storage_pkey PRIMARY KEY (vdc_id, id, "timestamp");
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3249 (class 2606 OID 1893972)
|
||||
-- Name: storage_profile_types storage_profile_types_name_key; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.storage_profile_types
|
||||
ADD CONSTRAINT storage_profile_types_name_key UNIQUE (name);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3251 (class 2606 OID 1893970)
|
||||
-- Name: storage_profile_types storage_profile_types_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.storage_profile_types
|
||||
ADD CONSTRAINT storage_profile_types_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3247 (class 2606 OID 1893963)
|
||||
-- Name: tenant tenant_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.tenant
|
||||
ADD CONSTRAINT tenant_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3253 (class 2606 OID 1893977)
|
||||
-- Name: vdc vdc_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.vdc
|
||||
ADD CONSTRAINT vdc_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3259 (class 2606 OID 1893988)
|
||||
-- Name: capacity_resource capacity_resource_vdc_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.capacity_resource
|
||||
ADD CONSTRAINT capacity_resource_vdc_id_fkey FOREIGN KEY (vdc_id) REFERENCES ngcloud_ru.vdc(id) ON DELETE CASCADE;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3260 (class 2606 OID 1894003)
|
||||
-- Name: capacity_storage capacity_storage_storage_profile_types_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.capacity_storage
|
||||
ADD CONSTRAINT capacity_storage_storage_profile_types_id_fkey FOREIGN KEY (storage_profile_types_id) REFERENCES ngcloud_ru.storage_profile_types(id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3261 (class 2606 OID 1893998)
|
||||
-- Name: capacity_storage capacity_storage_vdc_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.capacity_storage
|
||||
ADD CONSTRAINT capacity_storage_vdc_id_fkey FOREIGN KEY (vdc_id) REFERENCES ngcloud_ru.vdc(id) ON DELETE CASCADE;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3258 (class 2606 OID 1893978)
|
||||
-- Name: vdc vdc_tenant_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY ngcloud_ru.vdc
|
||||
ADD CONSTRAINT vdc_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES ngcloud_ru.tenant(id);
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3410 (class 0 OID 0)
|
||||
-- Dependencies: 222
|
||||
-- Name: TABLE capacity_resource; Type: ACL; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE ngcloud_ru.capacity_resource TO grafanabilling;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3411 (class 0 OID 0)
|
||||
-- Dependencies: 223
|
||||
-- Name: TABLE capacity_storage; Type: ACL; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE ngcloud_ru.capacity_storage TO grafanabilling;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3412 (class 0 OID 0)
|
||||
-- Dependencies: 220
|
||||
-- Name: TABLE storage_profile_types; Type: ACL; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE ngcloud_ru.storage_profile_types TO grafanabilling;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3414 (class 0 OID 0)
|
||||
-- Dependencies: 218
|
||||
-- Name: TABLE tenant; Type: ACL; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE ngcloud_ru.tenant TO grafanabilling;
|
||||
|
||||
|
||||
--
|
||||
-- TOC entry 3415 (class 0 OID 0)
|
||||
-- Dependencies: 221
|
||||
-- Name: TABLE vdc; Type: ACL; Schema: ngcloud_ru; Owner: vc_billing
|
||||
--
|
||||
|
||||
GRANT SELECT ON TABLE ngcloud_ru.vdc TO grafanabilling;
|
||||
|
||||
|
||||
-- Completed on 2025-09-15 09:53:18
|
||||
|
||||
--
|
||||
-- PostgreSQL database dump complete
|
||||
--
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
CREATE INDEX ON ngcloud_ru.capacity_resource (timestamp);
|
||||
CREATE INDEX ON ngcloud_ru.capacity_storage (timestamp);
|
||||
|
||||
CREATE INDEX ON s3billing.bucket_stat (timestamp_addition);
|
||||
CREATE INDEX ON s3billing.usage_bucket_by_user (time);
|
||||
|
||||
CREATE INDEX ON gpu.vm (dt_load);
|
||||
CREATE INDEX ON gpu.vm_power_state (ts);
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
<cfimport prefix="m" taglib="../lib"/>
|
||||
<cfimport prefix="d" taglib="../lib/data"/>
|
||||
|
||||
<cfparam name="ATTRIBUTES.wz"/>
|
||||
<cfparam name="ATTRIBUTES.crm_cache_base" default="https://elma-cache.adl.nubes.ru/contract_ls.cfm"/>
|
||||
<cfparam name="ATTRIBUTES.out" default="qComponent"/>
|
||||
|
||||
<cfhttp method="get"
|
||||
url="#ATTRIBUTES.crm_cache_base#?wz=#ATTRIBUTES.wz#"
|
||||
timeout=10
|
||||
charset="utf-8"
|
||||
result="res"
|
||||
>
|
||||
</cfhttp>
|
||||
|
||||
<cfset local={}/>
|
||||
|
||||
<cfset company=deserializeJson(res.fileContent)/>
|
||||
<!--- <cfdump var=#company#/> --->
|
||||
<!--- *** это не слишком надежно, некорректно представленный NULL (обыкновенно представляемый пустой строкой) может все сломать. Да и корректный --->
|
||||
<!--- мартышкин труд собирать этот запрос из JSON , может, лучше было динамически --->
|
||||
<cfset qComponent = queryNew("
|
||||
contractId
|
||||
,contractOutsideId
|
||||
|
||||
,additionalAgreementId
|
||||
,additionalAgreementName
|
||||
|
||||
,dealIndex
|
||||
,serviceId
|
||||
,serviceType
|
||||
,catalogName
|
||||
,serviceCode
|
||||
,serviceCustomName
|
||||
,serviceStart
|
||||
,serviceEnd
|
||||
,serviceDiscount
|
||||
,serviceQuantity
|
||||
,serviceHash
|
||||
|
||||
,paramId
|
||||
,componentCode
|
||||
,component
|
||||
,measureShort
|
||||
,quantity
|
||||
,priceWVat
|
||||
,discount
|
||||
,atomicCode
|
||||
,fullCode
|
||||
")/>
|
||||
|
||||
<!--- this.nullSupport = true in Application.cfc ... no way --->
|
||||
<cfloop array=#company.contracts# item="local.contract"><!--- имя массива писать в ##, иначе думает, что это строковый литерал --->
|
||||
<cfloop array=#local.contract.additionalAgreements# item="local.additionalAgreement">
|
||||
<cfif NOT local.additionalAgreement.isActual><cfcontinue/></cfif>
|
||||
<cfloop array=#local.additionalAgreement.services# item="local.service">
|
||||
<cfloop array=#local.service.components# item="local.component">
|
||||
<cfset queryAddRow(qComponent, [{
|
||||
contractId=local.contract.contractId,
|
||||
contractOutsideId=local.contract.contractOutsideId,
|
||||
|
||||
additionalAgreementId=local.additionalAgreement.additionalAgreementId,
|
||||
additionalAgreementName=local.additionalAgreement.additionalAgreementName,
|
||||
|
||||
dealIndex=local.service.dealIndex ,
|
||||
serviceId=local.service.serviceId ,
|
||||
serviceType=local.service.serviceType,
|
||||
catalogName=local.service.catalogName,
|
||||
serviceCode=local.service.serviceCode,
|
||||
serviceCustomName=local.service.serviceCustomName,
|
||||
serviceStart=parseDateTime(local.service.serviceStart.ts),
|
||||
serviceEnd=isDate(structGet("local.service.serviceEnd.ts"))? parseDateTime(local.service.serviceEnd.ts):javacast('null',''),
|
||||
serviceDiscount=local.service.discount,
|
||||
serviceQuantity=local.service.quantity,
|
||||
serviceHash=local.service.serviceHash,
|
||||
|
||||
paramId=local.component.paramId,
|
||||
componentCode=local.component.componentCode,
|
||||
component=local.component.component,
|
||||
measureShort=local.component.measureShort,
|
||||
quantity=local.component.quantity,
|
||||
priceWVat=local.component.priceWVat,
|
||||
discount=local.component.discount,
|
||||
atomicCode=local.component.atomicCode,
|
||||
fullCode="#local.component.componentCode#-#listGetAt('i,f,m',local.service.serviceType)#"
|
||||
}])/>
|
||||
</cfloop>
|
||||
</cfloop>
|
||||
</cfloop>
|
||||
</cfloop>
|
||||
|
||||
<!--- <cfdump var=#qComponent#/> --->
|
||||
<cfset "CALLER.#ATTRIBUTES.out#" = qComponent/>
|
||||
<cfexit method="exittag"/>
|
||||
+176
-101
@@ -7,34 +7,89 @@
|
||||
<cfparam name="ATTRIBUTES.debug" type="boolean" default=false/>
|
||||
<cfparam name="ATTRIBUTES.tenant_wz_index" type="string"/>
|
||||
|
||||
<cfset hours=dateDiff('h', ATTRIBUTES.dt_start, ATTRIBUTES.dt_finish)/>
|
||||
|
||||
<cfset hours=dateDiff('h', ATTRIBUTES.dt_start, ATTRIBUTES.dt_finish)/> <!--- *** нужно для каждого фрагмента --->
|
||||
<!---
|
||||
*** ВНИМАНИЕ! Вычитать минимальный лимит нужно после агрегации!
|
||||
Исходная последовательность расчетов сначала делает агрегацию по месяцу, при расчете по дням нужно менять порядок
|
||||
--->
|
||||
<!---
|
||||
Скрытое противоречие, которое требует разрешения: если у нас несколько периодов тарификации в одном месяце (по разной цене), ИЗ КАКОГО вычитать минимальный лимит?
|
||||
Еще сложность, если лимита хватает на несколько периодов тарификации, как его распределять по периодам. Если тарификация строго по месяцам, этой проблемы нет.
|
||||
Это можно сделать процедурно, но сложность расчета все возрастает
|
||||
--->
|
||||
<!--- *** Проверить, что у нас не биллится закрытый период (закрытый следующим) - возможно, с учетом line_key
|
||||
- насколько вижу, прошлый период закрывается, причем концы отрезки закрытые (конец включается). Считаем, что этой проблемы нет
|
||||
--->
|
||||
|
||||
|
||||
<!--- QoQ does not support join syntax, and of course outer joins, at least of Lucee 5.4--->
|
||||
<!--- а внешние джойны хорошо подсвечивают ошибки, особенно помогает full --->
|
||||
|
||||
<cfmodule template="crm_contract.cfm" wz="WZ01348" out="qSpecification"/>
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qSpecification#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="qComputingAge">
|
||||
select max(capacity_resource.timestamp) as dt_load from ngcloud_ru.capacity_resource
|
||||
</cfquery>
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qComputingAge#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="qStorageAge" datasource="rpt">
|
||||
select max(capacity_storage.timestamp) as dt_load from ngcloud_ru.capacity_storage
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qStorage#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="qS3VolAge">
|
||||
select max(timestamp_addition) as dt_load from s3billing.bucket_stat
|
||||
</cfquery>
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qS3VolAge#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="qS3OpsTrfAge">
|
||||
select max(time) as dt_load from s3billing.usage_bucket_by_user
|
||||
</cfquery>
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qS3OpsTrfAge#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
|
||||
|
||||
<!--- QoQ does not support join syntax, at least of Lucee 5.4--->
|
||||
|
||||
|
||||
<!--- Для начала выкатываем просто кусок каталога, не фильтруя по спеке (которой иногда нет) --->
|
||||
<cfquery name="qSpec">
|
||||
select * from (
|
||||
values
|
||||
('Объектное хранилище S3 CEPH','Дисковое пространство: Объем хранения (HOT)','paas.s3.ceph.vol-m','ГБайт',1.80,0)
|
||||
,('Объектное хранилище S3 CEPH','Исходящий трафик (HOT)','paas.s3.ceph.trf-m','ГБайт',1.50,0)
|
||||
,('Объектное хранилище S3 CEPH','Запросы GET, HEAD, OPTIONS (HOT)','paas.s3.ceph.get-m','10тыс.шт.',0.35,0)
|
||||
,('Объектное хранилище S3 CEPH','Запросы PUT, POST, PATCH (HOT)','paas.s3.ceph.put-m','10тыс.шт.',4.50,0)
|
||||
|
||||
,('Объектное хранилище S3 CEPH','Дисковое пространство: Объем хранения (COLD)','paas.s3.cphc.vol-m','ГБайт',0.84*1.2,0)
|
||||
,('Объектное хранилище S3 CEPH','Исходящий трафик (COLD)','paas.s3.cphc.trf-m','ГБайт',1.25*1.2,0)
|
||||
,('Объектное хранилище S3 CEPH','Запросы GET, HEAD, OPTIONS (COLD)','paas.s3.cphc.get-m','10тыс.шт.',0.8*1.2,0)
|
||||
,('Объектное хранилище S3 CEPH','Запросы PUT, POST, PATCH (COLD)','paas.s3.cphc.put-m','10тыс.шт.',9.7*1.2,0)
|
||||
) as
|
||||
s (svc, component, code, unit, price, discount)
|
||||
order by code
|
||||
<!--- здесь нужно организовать пересечение версионной спецификации с анализируемым диапазоном дат --->
|
||||
<cfquery name="qSpec" dbtype="query">
|
||||
select catalogName as svc, component, fullCode as code, measureShort as unit
|
||||
, priceWVat as price, (discount + serviceDiscount - discount*serviceDiscount/100) as discount
|
||||
,serviceStart, serviceEnd, serviceHash
|
||||
from qSpecification
|
||||
</cfquery>
|
||||
|
||||
|
||||
<!--- Нужно еще реализовать в модели данных политики бесплатного минимума --->
|
||||
<cfquery name="qComputing">
|
||||
<cfset qTotal=""/>
|
||||
|
||||
<cfloop from=#attributes.dt_start# to=#attributes.dt_finish# step="#CreateTimeSpan( 1, 0, 0, 0 )#" index="local.dt">
|
||||
<cfdump var=#dateFormat(local.dt,"YYYY-MM-DD")#/>
|
||||
|
||||
<!--- *** Нужно еще реализовать в модели данных политики бесплатного минимума, сейчас пробито гвоздями --->
|
||||
<cfquery name="qComputing">
|
||||
select 'WZ'||to_char(tenant.wzcode,'FM00000') as wz, vdc.name as vdc_name,
|
||||
case
|
||||
when vdc.name like '%-v1cl1%' then 'iaas.ngc.i29'
|
||||
@@ -48,24 +103,20 @@
|
||||
join ngcloud_ru.vdc on capacity_resource.vdc_id=vdc.id
|
||||
join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
|
||||
where tenant.wzcode = <cfqueryparam cfsqltype="cf_sql_integer" value=#ATTRIBUTES.tenant_wz_index#/>
|
||||
AND capacity_resource.timestamp >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_start#/>
|
||||
AND capacity_resource.timestamp < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_finish#/>
|
||||
AND capacity_resource.timestamp::date = <cfqueryparam cfsqltype="cf_sql_timestamp" value=#local.dt#/>
|
||||
|
||||
group by tenant.wzcode, vdc.name
|
||||
order by tenant.wzcode, vdc.name;
|
||||
</cfquery>
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qComputing#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="qComputingAge">
|
||||
select max(capacity_resource.timestamp) as dt_load from ngcloud_ru.capacity_resource
|
||||
</cfquery>
|
||||
|
||||
|
||||
<!--- переделать storage_profile_types с расшифровкой ssd, sata, можно прямо до каталожного кода --->
|
||||
<cfquery name="qStorage">
|
||||
<!--- переделать storage_profile_types с расшифровкой ssd, sata, можно прямо до каталожного кода --->
|
||||
<cfquery name="qStorage">
|
||||
select 'WZ'||to_char(tenant.wzcode,'FM00000') as wz, vdc.name as vdc_name,
|
||||
case
|
||||
WHEN vdc.name LIKE '%-v1cl1%' THEN 'iaas.ngc.i29'
|
||||
@@ -87,26 +138,18 @@
|
||||
join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
|
||||
join ngcloud_ru.storage_profile_types on capacity_storage.storage_profile_types_id=storage_profile_types.id
|
||||
where tenant.wzcode = <cfqueryparam cfsqltype="cf_sql_integer" value=#ATTRIBUTES.tenant_wz_index#/>
|
||||
AND capacity_storage.timestamp >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_start#/>
|
||||
AND capacity_storage.timestamp < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_finish#/>
|
||||
AND capacity_storage.timestamp ::date = <cfqueryparam cfsqltype="cf_sql_timestamp" value=#local.dt#/>
|
||||
group by tenant.wzcode, vdc.name, storage_profile_types.name
|
||||
order by tenant.wzcode, vdc.name, storage_profile_types.name;
|
||||
</cfquery>
|
||||
<cfquery name="qStorageAge" datasource="rpt">
|
||||
select max(capacity_storage.timestamp) as dt_load from ngcloud_ru.capacity_storage
|
||||
</cfquery>
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfdump var=#qStorage#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
<!---
|
||||
"placement" "size_gb" "get_10k" "put_10k" "bytes_sent_gb"
|
||||
HOT_FREE_LIMIT 1 10 1 100
|
||||
--->
|
||||
<!--- надо дисконтировать не ГБ-часы а ГБ-месяцы --->
|
||||
<cfquery name="qS3Vol">
|
||||
<!---
|
||||
"placement" "size_gb" "get_10k" "put_10k" "bytes_sent_gb"
|
||||
HOT_FREE_LIMIT 1 10 1 100
|
||||
--->
|
||||
<!--- надо дисконтировать не ГБ-часы а ГБ-месяцы --->
|
||||
<cfquery name="qS3Vol">
|
||||
select /* *** ниже дублирование кода агрегации - round ceil etc, обратить внимание при правке */
|
||||
(sum(bucket_stat.usage_rgw_main_size_actual)/<cfqueryparam cfsqltype="cf_sql_integer" value=#hours#/>) as vol_B
|
||||
,ceil(sum(bucket_stat.usage_rgw_main_size_actual)/<cfqueryparam cfsqltype="cf_sql_integer" value=#hours#/>/1024/1024/1024) as vol_GB
|
||||
@@ -125,23 +168,21 @@ HOT_FREE_LIMIT 1 10 1 100
|
||||
join s3billing.bucket_info ON bucket_info.id=bucket_stat.bucket_id
|
||||
where bucket_stat.placement_id in (1,2)
|
||||
AND bucket_stat.owner = <cfqueryparam cfsqltype="cf_sql_varchar" value=#ATTRIBUTES.tenant_wz_index#/>
|
||||
AND bucket_stat.timestamp_addition >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_start#/>
|
||||
AND bucket_stat.timestamp_addition < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_finish#/>
|
||||
AND bucket_stat.timestamp_addition::date = <cfqueryparam cfsqltype="cf_sql_timestamp" value=#local.dt#/>
|
||||
|
||||
group by bucket_stat.owner, bucket_stat.placement_id
|
||||
order by bucket_stat.owner, bucket_stat.placement_id;
|
||||
</cfquery>
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qS3Vol#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="qS3VolAge">
|
||||
select max(timestamp_addition) as dt_load from s3billing.bucket_stat
|
||||
</cfquery>
|
||||
|
||||
<cfquery name="qS3OpsTrf">
|
||||
select
|
||||
<cfquery name="qS3OpsTrf">
|
||||
select
|
||||
sum(
|
||||
CASE WHEN
|
||||
(category.name LIKE 'get%'
|
||||
@@ -195,7 +236,6 @@ select
|
||||
,ceil(sum(bytes_sent)/1024/1024/1024) as bytes_sent_GB
|
||||
,greatest(ceil(sum(bytes_sent)/1024/1024/1024) - CASE WHEN bucket_info.placement_id = 1 THEN 100 ELSE 0 END, 0
|
||||
) as bytes_sent_GB_free_tier_subtracted
|
||||
|
||||
,case
|
||||
when bucket_info.placement_id = 1 then 'paas.s3.ceph'
|
||||
when bucket_info.placement_id = 2 then 'paas.s3.cphc'
|
||||
@@ -210,46 +250,55 @@ select
|
||||
join s3billing.placement on bucket_info.placement_id=placement.id
|
||||
where 1=1
|
||||
AND user_info.name = <cfqueryparam cfsqltype="cf_sql_varchar" value=#ATTRIBUTES.tenant_wz_index#/>
|
||||
AND usage_bucket_by_user.time >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_start#/>
|
||||
AND usage_bucket_by_user.time < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_finish#/>
|
||||
AND usage_bucket_by_user.time::date = <cfqueryparam cfsqltype="cf_sql_timestamp" value=#local.dt#/>
|
||||
group by user_info.name, bucket_info.placement_id
|
||||
order by user_info.name, bucket_info.placement_id;
|
||||
</cfquery>
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qS3OpsTrf#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="qS3OpsTrfAge">
|
||||
select max(time) as dt_load from s3billing.usage_bucket_by_user
|
||||
</cfquery>
|
||||
<!--- собрали все метрики в один резалтсет --->
|
||||
<cfquery name="qUnifiedMetric" dbType="query">
|
||||
select wz, code || '.vcpu-m' as code, core_h as raw_metric, core_h as metric, core_h as chargeable_metric from qComputing
|
||||
union all
|
||||
select wz, code || '.ram-m' as code, gb_h as raw_metric, gb_h as metric, gb_h as chargeable_metric from qComputing
|
||||
union all
|
||||
select wz, code, gb_h_used as raw_metric, gb_h_used as metric, gb_h_used as chargeable_metric from qStorage
|
||||
union all
|
||||
select wz, code || '.vol-m', vol_b as raw_metric, vol_gb as metric, vol_GB_free_tier_subtracted as chargeable_metric from qS3Vol
|
||||
union all
|
||||
select wz, code || '.get-m', get as raw_metric, get_10k as metric, get_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
|
||||
union all
|
||||
select wz, code || '.put-m', put as raw_metric, put_10k as metric, put_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
|
||||
union all
|
||||
select wz, code || '.trf-m', bytes_sent as raw_metric, bytes_sent_gb as metric, bytes_sent_gb_free_tier_subtracted as chargeable_metric from qS3OpsTrf
|
||||
</cfquery>
|
||||
|
||||
|
||||
<cfquery name="qUnifiedMetric" dbType="query">
|
||||
select wz, code || '.vcpu-m' as code, core_h as raw_metric, core_h as metric, core_h as chargeable_metric from qComputing
|
||||
union all
|
||||
select wz, code || '.ram-m' as code, gb_h as raw_metric, gb_h as metric, gb_h as chargeable_metric from qComputing
|
||||
union all
|
||||
select wz, code, gb_h_used as raw_metric, gb_h_used as metric, gb_h_used as chargeable_metric from qStorage
|
||||
union all
|
||||
select wz, code || '.vol-m', vol_b as raw_metric, vol_gb as metric, vol_GB_free_tier_subtracted as chargeable_metric from qS3Vol
|
||||
union all
|
||||
select wz, code || '.get-m', get as raw_metric, get_10k as metric, get_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
|
||||
union all
|
||||
select wz, code || '.put-m', put as raw_metric, put_10k as metric, put_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
|
||||
union all
|
||||
select wz, code || '.trf-m', bytes_sent as raw_metric, bytes_sent_gb as metric, bytes_sent_gb_free_tier_subtracted as chargeable_metric from qS3OpsTrf
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfdump var=#qUnifiedMetric#/>
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qUnifiedMetric#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="qCharge" dbType="query">
|
||||
SELECT
|
||||
<d:field_set titleMapOut="titleMap" lengthOut="fieldCount">
|
||||
|
||||
<!--- умножаем на цену, вычисляем дисконт (довольно поздно) и форматируем
|
||||
*** здесь нужно учесть версионность. Самым простым кажется декомпозировать по дням и снова собрать
|
||||
*** только как нам это сделать без нормального SQL движка
|
||||
Может быть, процедурная обработка не будет выглядеть ужасно, и не хуже SQL
|
||||
В конце концов, можно просто В ЦИКЛЕ обсчитать диапазон по дням, выполнив запрос 30 раз, или сколько надо
|
||||
Если будет тупить - оптимизируем
|
||||
--->
|
||||
|
||||
<!--- Для декомпозиции на более мелкие объекты мы можем как полумеру - профильтровать по конкретному бакету или ВМ-ВДЦ
|
||||
Что не нравится - для ВМ у нас может быть целое дерево нижележащих объектов вместо линейного списка бакетов --->
|
||||
<cfquery name="qCharge" dbType="query">
|
||||
SELECT
|
||||
<d:field_set titleMapOut="titleMap" lengthOut="fieldCount">
|
||||
<d:field title="Артикул">s.code</d:field>
|
||||
<d:field title="Артикул">m.code as m_code</d:field>
|
||||
<d:field title="Услуга">s.svc</d:field>
|
||||
@@ -258,25 +307,51 @@ SELECT
|
||||
<d:field title="Ед.изм.">s.unit</d:field>
|
||||
<d:field title="Цена &##8381; с НДС" cfSqlType="CF_SQL_NUMERIC">s.price*(100-s.discount)/100 as discounted_price</d:field>
|
||||
<d:field title="Стоимость &##8381; с НДС" cfSqlType="CF_SQL_NUMERIC">s.price*(100-s.discount)/100*m.chargeable_metric as charge</d:field>
|
||||
<!--- <d:field title="Дата НОУ" cfSqlType="CF_SQL_TIMESTAMP">s.dt_from</d:field> --->
|
||||
<!--- <d:field title="Дата оконч." cfSqlType="CF_SQL_TIMESTAMP">s.dt_to</d:field>
|
||||
<!--- <d:field title="Дата НОУ" cfSqlType="CF_SQL_TIMESTAMP">s.dt_from</d:field> --->
|
||||
<!--- <d:field title="Дата оконч." cfSqlType="CF_SQL_TIMESTAMP">s.dt_to</d:field>
|
||||
<d:field title="Ключ строки">s.line_key</d:field> --->
|
||||
<d:field title="GPL с НДС" cfSqlType="CF_SQL_NUMERIC">s.price</d:field>
|
||||
<d:field title="Цена с НДС" cfSqlType="CF_SQL_NUMERIC">s.price</d:field>
|
||||
<d:field title="Скидка%" cfSqlType="CF_SQL_NUMERIC">s.discount</d:field>
|
||||
<d:field title="Сырая метрика" cfSqlType="CF_SQL_NUMERIC">m.raw_metric</d:field>
|
||||
<d:field title="Приведенная метрика" cfSqlType="CF_SQL_NUMERIC">m.metric</d:field>
|
||||
<d:field title="serviceStart" cfSqlType="CF_SQL_TIMESTAMP">s.serviceStart</d:field>
|
||||
<d:field title="serviceEnd" cfSqlType="CF_SQL_TIMESTAMP">s.serviceEnd</d:field>
|
||||
<d:field title="serviceHash">s.serviceHash</d:field>
|
||||
<d:field title="dt" cfSqlType="CF_SQL_TIMESTAMP"><cfqueryparam cfsqltype="cf_sql_timestamp" value=#local.dt#/>as dt</d:field>
|
||||
<!--- <d:field title="Клиентс. назв.">s.user_description</d:field> --->
|
||||
</d:field_set>
|
||||
FROM qSpec as s, qUnifiedMetric as m
|
||||
WHERE m.wz=<cfqueryparam cfsqltype="cf_sql_varchar" value=#request.auth.wz#/> AND s.code=m.code
|
||||
AND s.serviceStart <= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#local.dt#/>
|
||||
AND (<cfqueryparam cfsqltype="cf_sql_timestamp" value=#local.dt#/> <= s.serviceEnd OR s.serviceEnd IS NULL)
|
||||
order by s.code
|
||||
</cfquery>
|
||||
|
||||
<!--- <d:field title="Клиентс. назв.">s.user_description</d:field> --->
|
||||
</d:field_set>
|
||||
FROM qSpec as s, qUnifiedMetric as m
|
||||
WHERE m.wz=<cfqueryparam cfsqltype="cf_sql_varchar" value=#request.auth.wz#/> AND s.code=m.code
|
||||
order by s.code
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<!--- тут могут быть подводные камни с копированием и переиспользованием объектов --->
|
||||
<cfif isQuery(qTotal)>
|
||||
<cfquery name="qTotalNew" dbType="query">
|
||||
select * from qTotal
|
||||
union all
|
||||
select * from qCharge
|
||||
</cfquery>
|
||||
<cfset qTotal = qTotalNew/>
|
||||
<cfelse>
|
||||
<cfset qTotal = qCharge/>
|
||||
</cfif>
|
||||
<cfdump var=#qTotal#/>
|
||||
<!--- *** проверить краевые даты --->
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qCharge#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
</cfif>
|
||||
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfflush/>
|
||||
</cfloop>
|
||||
|
||||
<cfdump var=#qTotal#/>
|
||||
|
||||
|
||||
<cfset var report={}/>
|
||||
|
||||
|
||||
@@ -0,0 +1,346 @@
|
||||
<cfimport prefix="m" taglib="../lib"/>
|
||||
<cfimport prefix="d" taglib="../lib/data"/>
|
||||
|
||||
<cfparam name="ATTRIBUTES.dt_finish" type="date" default=#createDateTime(year(Now()),month(Now()),1,0,0,0)#/>
|
||||
<cfparam name="ATTRIBUTES.dt_start" type="date" default=#dateAdd('m',-1,ATTRIBUTES.dt_finish)#/>
|
||||
<cfparam name="ATTRIBUTES.output" type="string" default="report"/>
|
||||
<cfparam name="ATTRIBUTES.debug" type="boolean" default=false/>
|
||||
<cfparam name="ATTRIBUTES.tenant_wz_index" type="string"/>
|
||||
|
||||
|
||||
<cfset hours=dateDiff('h', ATTRIBUTES.dt_start, ATTRIBUTES.dt_finish)/>
|
||||
|
||||
|
||||
|
||||
<!--- QoQ does not support join syntax, and of course outer joins, at least of Lucee 5.4--->
|
||||
<!--- а внешние джойны хорошо подсвечивают ошибки, особенно помогает full --->
|
||||
|
||||
<cfmodule template="crm_contract.cfm" wz="WZ01348" out="qSpecification"/>
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qSpecification#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
<!--- Для начала выкатываем просто кусок каталога, не фильтруя по спеке (которой иногда нет) --->
|
||||
<!--- <cfquery name="qSpec">
|
||||
select * from (
|
||||
values
|
||||
('Объектное хранилище S3 CEPH','Дисковое пространство: Объем хранения (HOT)','paas.s3.ceph.vol-m','ГБайт',1.80,0)
|
||||
,('Объектное хранилище S3 CEPH','Исходящий трафик (HOT)','paas.s3.ceph.trf-m','ГБайт',1.50,0)
|
||||
,('Объектное хранилище S3 CEPH','Запросы GET, HEAD, OPTIONS (HOT)','paas.s3.ceph.get-m','10тыс.шт.',0.35,0)
|
||||
,('Объектное хранилище S3 CEPH','Запросы PUT, POST, PATCH (HOT)','paas.s3.ceph.put-m','10тыс.шт.',4.50,0)
|
||||
|
||||
,('Объектное хранилище S3 CEPH','Дисковое пространство: Объем хранения (COLD)','paas.s3.cphc.vol-m','ГБайт',0.84*1.2,0)
|
||||
,('Объектное хранилище S3 CEPH','Исходящий трафик (COLD)','paas.s3.cphc.trf-m','ГБайт',1.25*1.2,0)
|
||||
,('Объектное хранилище S3 CEPH','Запросы GET, HEAD, OPTIONS (COLD)','paas.s3.cphc.get-m','10тыс.шт.',0.8*1.2,0)
|
||||
,('Объектное хранилище S3 CEPH','Запросы PUT, POST, PATCH (COLD)','paas.s3.cphc.put-m','10тыс.шт.',9.7*1.2,0)
|
||||
) as
|
||||
s (svc, component, code, unit, price, discount)
|
||||
order by code
|
||||
</cfquery> --->
|
||||
<!--- здесь нужно организовать пересечение версионной спецификации с анализируемым диапазоном дат --->
|
||||
<cfquery name="qSpec" dbtype="query">
|
||||
select catalogName as svc, component, fullCode as code, measureShort as unit
|
||||
, priceWVat as price, (discount + serviceDiscount - discount*serviceDiscount/100) as discount
|
||||
,serviceStart, serviceEnd
|
||||
from qSpecification
|
||||
</cfquery>
|
||||
|
||||
|
||||
<!--- Нужно еще реализовать в модели данных политики бесплатного минимума --->
|
||||
<cfquery name="qComputing">
|
||||
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,
|
||||
sum(cpu_used/cpu_speed)/4. as core_h,
|
||||
sum(mem_used)/1024/4. as gb_h
|
||||
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
|
||||
where tenant.wzcode = <cfqueryparam cfsqltype="cf_sql_integer" value=#ATTRIBUTES.tenant_wz_index#/>
|
||||
AND capacity_resource.timestamp >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_start#/>
|
||||
AND capacity_resource.timestamp < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_finish#/>
|
||||
group by tenant.wzcode, vdc.name
|
||||
order by tenant.wzcode, vdc.name;
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qComputing#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="qComputingAge">
|
||||
select max(capacity_resource.timestamp) as dt_load from ngcloud_ru.capacity_resource
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qComputingAge#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
|
||||
<!--- переделать storage_profile_types с расшифровкой ssd, sata, можно прямо до каталожного кода --->
|
||||
<cfquery name="qStorage">
|
||||
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
|
||||
|| CASE
|
||||
WHEN storage_profile_types.name ILIKE '%-SSD%' THEN '.ssd-m'
|
||||
WHEN storage_profile_types.name ILIKE '%-SAS' THEN '.sas-m'
|
||||
WHEN storage_profile_types.name ILIKE '%-SATA' THEN '.sata-m'
|
||||
ELSE '.['|| storage_profile_types.name ||']' END
|
||||
as code,
|
||||
storage_profile_types.name, -- *** это не тип, а профайл
|
||||
sum("limit")/1024./4 as gb_h_limit, -- 4 потому, что сбор раз в 15 минут
|
||||
sum(used)/1024./4 as gb_h_used
|
||||
from ngcloud_ru.capacity_storage
|
||||
join ngcloud_ru.vdc on capacity_storage.vdc_id=vdc.id
|
||||
join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
|
||||
join ngcloud_ru.storage_profile_types on capacity_storage.storage_profile_types_id=storage_profile_types.id
|
||||
where tenant.wzcode = <cfqueryparam cfsqltype="cf_sql_integer" value=#ATTRIBUTES.tenant_wz_index#/>
|
||||
AND capacity_storage.timestamp >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_start#/>
|
||||
AND capacity_storage.timestamp < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_finish#/>
|
||||
group by tenant.wzcode, vdc.name, storage_profile_types.name
|
||||
order by tenant.wzcode, vdc.name, storage_profile_types.name;
|
||||
</cfquery>
|
||||
<cfquery name="qStorageAge" datasource="rpt">
|
||||
select max(capacity_storage.timestamp) as dt_load from ngcloud_ru.capacity_storage
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qStorage#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
<!---
|
||||
"placement" "size_gb" "get_10k" "put_10k" "bytes_sent_gb"
|
||||
HOT_FREE_LIMIT 1 10 1 100
|
||||
--->
|
||||
<!--- надо дисконтировать не ГБ-часы а ГБ-месяцы --->
|
||||
<cfquery name="qS3Vol">
|
||||
select /* *** ниже дублирование кода агрегации - round ceil etc, обратить внимание при правке */
|
||||
(sum(bucket_stat.usage_rgw_main_size_actual)/<cfqueryparam cfsqltype="cf_sql_integer" value=#hours#/>) as vol_B
|
||||
,ceil(sum(bucket_stat.usage_rgw_main_size_actual)/<cfqueryparam cfsqltype="cf_sql_integer" value=#hours#/>/1024/1024/1024) as vol_GB
|
||||
,greatest(ceil(sum(bucket_stat.usage_rgw_main_size_actual)/<cfqueryparam cfsqltype="cf_sql_integer" value=#hours#/>
|
||||
/1024/1024/1024)-
|
||||
case when bucket_stat.placement_id = 1 then 1 else 0 end, 0) as vol_GB_free_tier_subtracted /*считается не в точности так, как в функции*/
|
||||
,case
|
||||
when bucket_stat.placement_id = 1 then 'paas.s3.ceph'
|
||||
when bucket_stat.placement_id = 2 then 'paas.s3.cphc'
|
||||
else '['|| TO_CHAR(bucket_stat.placement_id,'FM9') ||']' end as code
|
||||
--,bucket_stat.placement_id
|
||||
,'WZ'||lpad(bucket_stat.owner, 5, '0') as wz -- *** здесь не число, а строка, поэтому другая формула обратной сборки WZ
|
||||
|
||||
from s3billing.bucket_stat
|
||||
join s3billing.placement ON s3billing.placement.id=bucket_stat.placement_id
|
||||
join s3billing.bucket_info ON bucket_info.id=bucket_stat.bucket_id
|
||||
where bucket_stat.placement_id in (1,2)
|
||||
AND bucket_stat.owner = <cfqueryparam cfsqltype="cf_sql_varchar" value=#ATTRIBUTES.tenant_wz_index#/>
|
||||
AND bucket_stat.timestamp_addition >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_start#/>
|
||||
AND bucket_stat.timestamp_addition < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_finish#/>
|
||||
group by bucket_stat.owner, bucket_stat.placement_id
|
||||
order by bucket_stat.owner, bucket_stat.placement_id;
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qS3Vol#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="qS3VolAge">
|
||||
select max(timestamp_addition) as dt_load from s3billing.bucket_stat
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qS3VolAge#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="qS3OpsTrf">
|
||||
select
|
||||
sum(
|
||||
CASE WHEN
|
||||
(category.name LIKE 'get%'
|
||||
OR category.name LIKE 'head%'
|
||||
OR category.name LIKE 'options%'
|
||||
) THEN ops ELSE 0 END
|
||||
) as get
|
||||
,ceil(sum(
|
||||
CASE WHEN
|
||||
(category.name LIKE 'get%'
|
||||
OR category.name LIKE 'head%'
|
||||
OR category.name LIKE 'options%'
|
||||
) THEN ops ELSE 0 END
|
||||
)/10000) as get_10k
|
||||
,greatest(ceil(sum(
|
||||
CASE WHEN
|
||||
(category.name LIKE 'get%'
|
||||
OR category.name LIKE 'head%'
|
||||
OR category.name LIKE 'options%'
|
||||
) THEN ops ELSE 0 END
|
||||
)/10000) - CASE WHEN bucket_info.placement_id = 1 THEN 10 ELSE 0 END, 0
|
||||
) as get_10k_free_tier_subtracted
|
||||
|
||||
,sum(
|
||||
CASE WHEN
|
||||
(category.name LIKE 'put%'
|
||||
OR category.name LIKE 'post%'
|
||||
OR category.name LIKE 'patch%'
|
||||
OR category.name LIKE 'list%'
|
||||
) THEN ops ELSE 0 END
|
||||
) as put
|
||||
,ceil(sum(
|
||||
CASE WHEN
|
||||
(category.name LIKE 'put%'
|
||||
OR category.name LIKE 'post%'
|
||||
OR category.name LIKE 'patch%'
|
||||
OR category.name LIKE 'list%'
|
||||
) THEN ops ELSE 0 END
|
||||
)/10000) as put_10k
|
||||
,greatest(ceil(sum(
|
||||
CASE WHEN
|
||||
(category.name LIKE 'put%'
|
||||
OR category.name LIKE 'post%'
|
||||
OR category.name LIKE 'patch%'
|
||||
OR category.name LIKE 'list%'
|
||||
) THEN ops ELSE 0 END
|
||||
)/10000) - CASE WHEN bucket_info.placement_id = 1 THEN 1 ELSE 0 END, 0
|
||||
) as put_10k_free_tier_subtracted
|
||||
|
||||
,(sum(bytes_sent)) as bytes_sent
|
||||
,ceil(sum(bytes_sent)/1024/1024/1024) as bytes_sent_GB
|
||||
,greatest(ceil(sum(bytes_sent)/1024/1024/1024) - CASE WHEN bucket_info.placement_id = 1 THEN 100 ELSE 0 END, 0
|
||||
) as bytes_sent_GB_free_tier_subtracted
|
||||
|
||||
,case
|
||||
when bucket_info.placement_id = 1 then 'paas.s3.ceph'
|
||||
when bucket_info.placement_id = 2 then 'paas.s3.cphc'
|
||||
else '['|| TO_CHAR(bucket_info.placement_id,'FM9') ||']' end as code --*** зачем делать там ключ bigint
|
||||
,bucket_info.placement_id
|
||||
--category.name, bucket_info.name
|
||||
,'WZ'||lpad(user_info.name, 5, '0') as wz
|
||||
from s3billing.usage_bucket_by_user
|
||||
join s3billing.user_info on usage_bucket_by_user.user_id=user_info.id
|
||||
join s3billing.category on usage_bucket_by_user.category_id=category.id
|
||||
join s3billing.bucket_info on usage_bucket_by_user.bucketid=bucket_info.id
|
||||
join s3billing.placement on bucket_info.placement_id=placement.id
|
||||
where 1=1
|
||||
AND user_info.name = <cfqueryparam cfsqltype="cf_sql_varchar" value=#ATTRIBUTES.tenant_wz_index#/>
|
||||
AND usage_bucket_by_user.time >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_start#/>
|
||||
AND usage_bucket_by_user.time < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#ATTRIBUTES.dt_finish#/>
|
||||
group by user_info.name, bucket_info.placement_id
|
||||
order by user_info.name, bucket_info.placement_id;
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qS3OpsTrf#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="qS3OpsTrfAge">
|
||||
select max(time) as dt_load from s3billing.usage_bucket_by_user
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qS3OpsTrfAge#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
<!--- собрали все метрики в один резалтсет --->
|
||||
<cfquery name="qUnifiedMetric" dbType="query">
|
||||
select wz, code || '.vcpu-m' as code, core_h as raw_metric, core_h as metric, core_h as chargeable_metric from qComputing
|
||||
union all
|
||||
select wz, code || '.ram-m' as code, gb_h as raw_metric, gb_h as metric, gb_h as chargeable_metric from qComputing
|
||||
union all
|
||||
select wz, code, gb_h_used as raw_metric, gb_h_used as metric, gb_h_used as chargeable_metric from qStorage
|
||||
union all
|
||||
select wz, code || '.vol-m', vol_b as raw_metric, vol_gb as metric, vol_GB_free_tier_subtracted as chargeable_metric from qS3Vol
|
||||
union all
|
||||
select wz, code || '.get-m', get as raw_metric, get_10k as metric, get_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
|
||||
union all
|
||||
select wz, code || '.put-m', put as raw_metric, put_10k as metric, put_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
|
||||
union all
|
||||
select wz, code || '.trf-m', bytes_sent as raw_metric, bytes_sent_gb as metric, bytes_sent_gb_free_tier_subtracted as chargeable_metric from qS3OpsTrf
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qUnifiedMetric#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
<!--- умножаем на цену, вычисляем дисконт (довольно поздно) и форматируем
|
||||
*** здесь нужно учесть версионность. Самым простым кажется декомпозировать по дням и снова собрать
|
||||
*** только как нам это сделать без нормального SQL движка
|
||||
Может быть, процедурная обработка не будет выглядеть ужасно, и не хуже SQL
|
||||
В конце концов, можно просто В ЦИКЛЕ обсчитать диапазон по дням, выполнив запрос 30 раз, или сколько надо
|
||||
Если будет тупить - оптимизируем
|
||||
--->
|
||||
|
||||
<!--- Для декомпозиции на более мелкие объекты мы можем как полумеру - профильтровать по конкретному бакету или ВМ-ВДЦ
|
||||
Что не нравится - для ВМ у нас может быть целое дерево нижележащих объектов --->
|
||||
|
||||
<cfloop from=#attribute.dt_start# to=#attribute.dt_finish# index="dt">
|
||||
</cfloop>
|
||||
|
||||
<cfquery name="qCharge" dbType="query">
|
||||
SELECT
|
||||
<d:field_set titleMapOut="titleMap" lengthOut="fieldCount">
|
||||
<d:field title="Артикул">s.code</d:field>
|
||||
<d:field title="Артикул">m.code as m_code</d:field>
|
||||
<d:field title="Услуга">s.svc</d:field>
|
||||
<d:field title="Компонент">s.component</d:field>
|
||||
<d:field title="Кол-во (метрика)" cfSqlType="CF_SQL_NUMERIC">m.chargeable_metric</d:field>
|
||||
<d:field title="Ед.изм.">s.unit</d:field>
|
||||
<d:field title="Цена &##8381; с НДС" cfSqlType="CF_SQL_NUMERIC">s.price*(100-s.discount)/100 as discounted_price</d:field>
|
||||
<d:field title="Стоимость &##8381; с НДС" cfSqlType="CF_SQL_NUMERIC">s.price*(100-s.discount)/100*m.chargeable_metric as charge</d:field>
|
||||
<!--- <d:field title="Дата НОУ" cfSqlType="CF_SQL_TIMESTAMP">s.dt_from</d:field> --->
|
||||
<!--- <d:field title="Дата оконч." cfSqlType="CF_SQL_TIMESTAMP">s.dt_to</d:field>
|
||||
<d:field title="Ключ строки">s.line_key</d:field> --->
|
||||
<d:field title="Цена с НДС" cfSqlType="CF_SQL_NUMERIC">s.price</d:field>
|
||||
<d:field title="Скидка%" cfSqlType="CF_SQL_NUMERIC">s.discount</d:field>
|
||||
<d:field title="Сырая метрика" cfSqlType="CF_SQL_NUMERIC">m.raw_metric</d:field>
|
||||
<d:field title="Приведенная метрика" cfSqlType="CF_SQL_NUMERIC">m.metric</d:field>
|
||||
|
||||
<!--- <d:field title="Клиентс. назв.">s.user_description</d:field> --->
|
||||
</d:field_set>
|
||||
FROM qSpec as s, qUnifiedMetric as m
|
||||
WHERE m.wz=<cfqueryparam cfsqltype="cf_sql_varchar" value=#request.auth.wz#/> AND s.code=m.code
|
||||
order by s.code
|
||||
</cfquery>
|
||||
|
||||
<cfif (ATTRIBUTES.debug)>
|
||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||
<cfdump var=#qCharge#/>
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
<cfset var report={}/>
|
||||
|
||||
<cfset report.qComputingAge = qComputingAge/>
|
||||
<cfset report.qStorageAge = qStorageAge/>
|
||||
<cfset report.qS3VolAge = qS3VolAge/>
|
||||
<cfset report.qS3OpsTrfAge = qS3OpsTrfAge/>
|
||||
<cfset report.qCharge = qCharge/>
|
||||
<cfset report.chargeTitleMap = titleMap/>
|
||||
<cfset report.chargeFieldCount = fieldCount/>
|
||||
|
||||
<cfset "CALLER.#ATTRIBUTES.output#" = report/>
|
||||
|
||||
<cfexit method="exittag"/>
|
||||
@@ -10,6 +10,7 @@
|
||||
<cfparam name="dt_finish" type="date" default=#createDateTime(year(Now()),month(Now()),1,0,0,0)#/>
|
||||
<cfparam name="dt_start" type="date" default=#dateAdd('m',-1,dt_finish)#/>
|
||||
<cfset hours=dateDiff('h',dt_start,dt_finish)/>
|
||||
|
||||
<cfset tenant_wz_index=val(mid(request.auth.wz,3,5))/><!--- cut off WZ --->
|
||||
|
||||
|
||||
@@ -49,12 +50,12 @@
|
||||
Период с <input type="text" name="dt_start" value="#dateFormat(dt_start,'YYYY-MM-DD')#"/>
|
||||
по <input type="text" name="dt_finish" value="#dateFormat(dt_finish,'YYYY-MM-DD')#"/>
|
||||
<input type="submit" style="cursor:pointer;"/>
|
||||
<!--- <input type="submit" name="DEBUG" value="DEBUG" style="cursor:pointer;"/> --->
|
||||
<input type="submit" name="DEBUG" value="DEBUG" style="cursor:pointer;"/><!--- ********* --->
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
<cfflush/>
|
||||
<!--- <cfflush/> --->
|
||||
|
||||
<cfmodule template="mod/payg.cfm"
|
||||
dt_finish=#dt_finish#
|
||||
@@ -82,9 +83,10 @@ S3 операции и трафик: <b>#dateFormat(report.qS3OpsTrfAge.dt_load,
|
||||
<td width="1%"></td>
|
||||
<!--- <th width="3%">WZ</th> --->
|
||||
<th width="7%">Артикул</th>
|
||||
<th width="7%">Кол-во (метрика)</th>
|
||||
<th width="3%">Кол-во (метрика)</td>
|
||||
<th width="7%">Оплачиваемый объем</th>
|
||||
<th width="3%">Ед.изм.</th>
|
||||
<th width="3%">Цена ₽ GPL, с НДС</th>
|
||||
<th width="3%">Цена ₽ с НДС</th>
|
||||
<th width="3%">Стоимость ₽ с НДС</th>
|
||||
|
||||
<td width="3%"> </td>
|
||||
@@ -101,7 +103,7 @@ S3 операции и трафик: <b>#dateFormat(report.qS3OpsTrfAge.dt_load,
|
||||
|
||||
<td width="3%">Ключ строки</td> --->
|
||||
<!--- <td width="3%">Сырая метрика</td> --->
|
||||
<td width="3%">Оплачиваемый объем</td>
|
||||
|
||||
|
||||
<!--- <td width="5%">Договор</td>
|
||||
<td width="10%">Допник</td>
|
||||
@@ -123,6 +125,7 @@ S3 операции и трафик: <b>#dateFormat(report.qS3OpsTrfAge.dt_load,
|
||||
<td>#currentRow#</a></td>
|
||||
|
||||
<td>#code#</td>
|
||||
<td class="r">#metric#</td>
|
||||
<td class="r" style="font-size:120%; padding:0 1em;">#chargeable_metric#</td>
|
||||
<td class="c" style="font-size:90%;">#unit#</td>
|
||||
<td class="r">#discounted_price#</td>
|
||||
@@ -137,7 +140,7 @@ S3 операции и трафик: <b>#dateFormat(report.qS3OpsTrfAge.dt_load,
|
||||
<!--- <td class="r">#price#</td>
|
||||
<td class="r">#discount#</td> --->
|
||||
|
||||
<td class="r">#metric#</td>
|
||||
|
||||
|
||||
</tr>
|
||||
</cfoutput>
|
||||
|
||||
Reference in New Issue
Block a user