initial draft

This commit is contained in:
msyu
2025-06-02 16:16:51 +03:00
commit 529334d03b
272 changed files with 22684 additions and 0 deletions
+37
View File
@@ -0,0 +1,37 @@
create table if not exists: не заменяет декларацию... затупил, не догадался
drop table if exists;
14:04 17.04.2023
ERROR: operator does not exist: uuid = character varying
Использовать для POSTGRESQL UUID: CF GUID+CF_SQL_OTHER
Ошибка при записи в базу данных. ERROR: column "is_payg" is of type bit but expression is of type boolean Подсказка: You will need to rewrite or cast the expression. Позиция: 723 То же самое работает для abstract_service_param_class.cfm ???
Очень странная разница: в abstract_service_param_class.cfm числа в d возвращаются как числа, а в tariff как строки
Ошибка: в БД нужно boolean, а в форме bit (транслируется в cf_sql_bit)
Теперь проблема с датой - добавил формат, ок. timestamp для Postgre работает
Message ERROR: invalid input syntax for type uuid: ""
Где: unnamed portal parameter $1 = ''
SQL select count(*) as cnt
from service_tariff
where 1=1
AND service_tariff_guid=
DatabaseName PostgreSQL
DatabaseVersion 15.1
DriverName PostgreSQL JDBC Driver
DriverVersion 42.6.0
Datasource svc
Stacktrace The Error Occurred in
D:\wwwroot\svc3\lib\data\bean.cfm: line 94
- и как это работает для INT? ответ: <cfif !keyInvalid> (а у нас other... когда был idstam, все было однозначно, но с Postgre почему-то idstamp не работает - "Использовать для POSTGRESQL UUID: CF GUID+CF_SQL_OTHER" - вероятно, надо сделать свои типы и маппинг чуть сложнее, чем cf_sql_#type#)
ошибка в dispatch_detail.cfm, рассчитанном на целочисленный id
для idstamp
ERROR: operator does not exist: uuid = character
Подсказка: No operator matches the given name and argument types. You might need to add explicit type casts.
Позиция: 96
для other
ERROR: invalid input syntax for type uuid: ""
Где: unnamed portal parameter $1 = ''
Но! в соседнем шаблоне tariff.cfm "other" работает, и в этом раньше работало - разница была в вызове, в одном случае было пустая строка, в другом отсутствовал параметр
+238
View File
@@ -0,0 +1,238 @@
/*Êàòàëîã óñëóã
Ïîääåðæêà êîìïîçèòíûõ óñëóã
Ïîääåðæêà âàðèàòèâíîñòè óñëóãè
Ïîääåðæêà âàðèàòèâíîñòè ïàðàìåòðà
Ïðàéñ-ëèñò
*/
-- ìîæíî äîáàâèòü áàçîâûå åäèíèöû è ïåðåñ÷åò
if exists (select * from sysobjects where name='measure') drop table measure
create table measure (
measure_id int identity PRIMARY KEY NOT NULL
,measure varchar(255) NOT NULL
,measure_short varchar(9) NOT NULL
,measure_short_en varchar(9) NULL
,descr varchar(MAX) NULL
)
go
insert into measure (measure, measure_short) values ('øòóêà','øò.')
insert into measure (measure, measure_short) values ('êèëîâàòò','êÂò')
insert into measure (measure, measure_short) values ('êèëîâàòò-÷àñ','êÂò-÷')
insert into measure (measure, measure_short) values ('ãèãàãåðö','ÃÃö')
insert into measure (measure, measure_short) values ('ãèãàáàéò','ÃÁàéò')
insert into measure (measure, measure_short) values ('10000 øò.','10òûñ.øò.')
go
if exists (select * from sysobjects where name='service_type') drop table service_type
create table service_type (
service_type_id int PRIMARY KEY NOT NULL
,service_type varchar(255) NOT NULL
)
go
insert into service_type (service_type_id, service_type) values (1,'èíñòàëëÿöèîííàÿ')
insert into service_type (service_type_id, service_type) values (2,'ïåðèîäè÷åñêàÿ') -- ïåðèîä ôèêñèðóåòñÿ â êîíòðàêòå, ïî óìîë÷àíèþ ìåñÿö
insert into service_type (service_type_id, service_type) values (3,'òàðèôèöèðóåìàÿ')
go
-- âàðèàíò âûáèðàåòñÿ èç ãðóïïû. Ýòî, ñêîðåå, íå ñåìàíòèêà ïðåäìåòíîé îáëàñòè, à èñêóññòâåííàÿ êîíñòðóêöèÿ
-- âàðèàíò çàäàåòñÿ îïðåäåëÿþùåé õàðàêòåðèñòèêîé, êîòîðàÿ ìîæåò êîìáèíèðîâàòü íåñêîëüêî óñëîâèé
if exists (select * from sysobjects where name='modifier_class') drop table modifier_class
create table modifier_class (
modifier_class_id int identity PRIMARY KEY NOT NULL
,modifier_class varchar(255) NOT NULL
,descr varchar(MAX) NULL
)
go
-- çíà÷åíèå ìîäèôèêàòîðà
if exists (select * from sysobjects where name='modifier') drop table modifier
create table modifier (
modifier_id int identity PRIMARY KEY NOT NULL
,modifier_class_id int NOT NULL
,modifier varchar(255) NOT NULL
,modifier_en varchar(255) NULL
,descr varchar(MAX) NULL
)
go
--alter table modifier add modifier_en varchar(255) NULL
-- ýêâèâàëåíò íîìåíêëàòóðû â 1Ñ
if exists (select * from sysobjects where name='abstract_service') drop table abstract_service
create table abstract_service (
abstract_service_id int identity PRIMARY KEY NOT NULL
,abstract_service varchar(255) NOT NULL
,service_type_id INT NOT NULL
,modifier_class_id INT NULL -- migrated from service (no support for multiple modifier classes)
,code varchar(31) NOT NULL
,version int NOT NULL
,descr varchar(MAX) NULL
)
go
/*
-- ïðèøëîñü âûäåëèòü ýòó ñóùíîñòü
-- âåðîÿòíî, äëÿ áîëüøèíñòâà íîìåíêëàòóð îíà íå íóæíà (ïðèäåòñÿ äîáàâëÿòü òðèâèàëüíóþ),
-- äîñòàòî÷íî ìèãðàöèè àòðèáóòà modifier_class_id â abstract_service
if exists (select * from sysobjects where name='service_class') drop table service_class
create table service_class (
service_class_id int identity PRIMARY KEY NOT NULL
,abstract_service_id int NOT NULL
,modifier_class_id INT NULL
--,service_class varchar(255) NOT NULL -- íå èñïîëüçóåòñÿ
,descr varchar(MAX) NULL
)
go
*/
-- êîíêðåòíûé âàðèàíò ñåðâèñà
-- â 1Ñ ðåàëèçóåòñÿ ËÈÁÎ ôîðìîé êîìïîíîâêè, ËÈÁÎ ìîäèôèêàöèåé íîìåíêëàòóðû
-- ìîäèôèêàòîð îòíîñèòñÿ ê ôîðìå êîìïîíîâêè
-- ôîðìà êîìïîíîâêè åñòü äëÿ ëþáîé êîíêðåòíîé êîìïëåêñíîé (êîìïîçèòíîé) íîìåíêëàòóðû, îíà îïðåäåëÿåò ñîñòàâ ïàðàìåòðîâ
-- ïðè ýòîì îíà ñâÿçûâàåòñÿ ëèáî ñ íîìåíêëàòóðîé, ëèáî ñ êîíêðåòíîé ðåàëèçàöèåé íîìåíêëàòóðû
if exists (select * from sysobjects where name='service') drop table service
create table service (
service_id int identity PRIMARY KEY NOT NULL
,abstract_service_id int NOT NULL
,modifier_id INT NULL
--,service varchar(255) NOT NULL -- íå èñïîëüçóåòñÿ
,descr varchar(MAX) NULL
,measure_id int NULL --*** ìèãðèðîâàòü â àáñòðàêòíóþ óñëóãó?
,precision int NULL
,base_price decimal(15,4) NULL
,CONSTRAINT UK_abstract_service_modifier UNIQUE(abstract_service_id, modifier_id)
)
go
--alter table service add measure_id int NULL
--alter table service add precision int NULL
--alter table service add base_price decimal(15,4) NULL
--alter table service add CONSTRAINT UK_abstract_service_modifier UNIQUE(abstract_service_id, modifier_id)
-- íàäî ïðîâåðÿòü, ïàðàìåòðû äëÿ âàðèàíòà ðåàëèçàöèè âñåãäà ñîáñòâåííûå, ëèáî øàðÿòñÿ
-- áóäåò ïîíÿòíî ïðè âûãðóçêå
if exists (select * from sysobjects where name='param_class') drop table param_class
create table param_class (
param_class_id int identity PRIMARY KEY NOT NULL
,param_class varchar(255) NOT NULL
,measure_id int NULL
/*,precision int NULL
,show_in_spec bit NOT NULL*/
,descr varchar(MAX) NULL
)
go
if exists (select * from sysobjects where name='param') drop table param
create table param (
param_id int identity PRIMARY KEY NOT NULL
,param_class_id int NULL--NOT NULL
,param varchar(255) NOT NULL
,measure_id int NULL -- overrides param_class.measure
,precision int NULL -- *** âèäèìî, ïîñòóïèòü, êàê ñ åäèíèöåé èçìåðåíèÿ, â param_class.precision øàáëîí
--,show_in_spec bit NOT NULL default 1
,base_price decimal(15,4) NULL -- Íà ñàìîì äåëå áàçîâûå öåíû îòäåëüíî, ýòî îáåñïå÷èâàåò âåðñèîííîñòü ïðàéñ-ëèñòà
,descr varchar(MAX) NULL
)
--alter table param add base_price decimal(15,4) NULL
--alter table param add measure_id int NULL
go
-- ñîñòàâ ïàðàìåòðîâ, ýêâèâàëåíò òàáëè÷íîé ÷àñòè ôîðìû êîìïîíîâêè
-- øàáëîí
-- â ñåðâèñå äîëæíû áûòü ïëåéñõîëäåðû äëÿ ïàðàìåòðîâ, îïðåäåëÿåìûõ ïðè ôîðìèðîâàíèè ñïåöèôèêàöèè è ôèêñèðîâàííûå ïàðàìåòðû
-- ìîæíî ñäåëàòü 2 òàáëèöû: øàáëîí ïàðàìåòðîâ è öåíû ïàðàìåòðîâ
-- ïðè ýòîì çàïèñè äëÿ ïðîñòûõ ïàðàìåòðîâ áóäóò äóáëèðîâàòüñÿ 1:1, à äëÿ âàðèàòèâíûõ 1:n
if exists (select * from sysobjects where name='service_param') drop table service_param
create table service_param (
service_param_id int identity PRIMARY KEY NOT NULL
,service_id int NOT NULL -- FK
--,modifier_id int NULL -- FK êîíòåêñò âàðèàíòà
,param_class_id int NULL -- êîíêðåòíûé ïàðàìåòð ìîæåò âûáèðàòüñÿ ïðè ââîäå ñïåöèôèêàöèè. Â 1Ñ ýòî ðåøàåòñÿ òàê: åñëè ó ïàðàìåòðà åñòü ïîòîìêè, âûáîð â ñïåöèôèêàöèè
,param_id int NULL
--,base_price decimal(15,4) NULL -- Íàñëåäîâàòü îò ïàðàìåòðà. Íà ñàìîì äåëå áàçîâûå öåíû îòäåëüíî, ýòî îáåñïå÷èâàåò âåðñèîííîñòü ïðàéñ-ëèñòà
,descr varchar(MAX) NULL
,CONSTRAINT CK_param_xor_class CHECK (((param_class_id IS NULL) AND NOT (param_id IS NULL)) OR ((param_id IS NULL) AND NOT (param_class_id IS NULL)))
-- óäàëèòü îãðàíè÷åíèå, â êîíòåêñòå óñëóãè äîëæíû áûòü çàäàíû òàêæå öåíû êîíêðåòíûõ ïàðàìåòðîâ
-- alter table service_param drop CONSTRAINT CK_param_xor_class
)
go
-- åñëè â service_param óêàçàí êîíêðåòíûé ïàðàìåòð, òî îòíîøåíèå 1:1, åñëè êëàññ - òî 1:n
-- â äàëüíåéøåì ìîæíî ñäåëàòü âåðñèîííîñòü öåí
-- íå òîëüêî öåíû, íî è âàðèàíòû âûáîðà äëÿ àáñòðàêòíûõ ïàðàìåòðîâ
if exists (select * from sysobjects where name='service_param_price') drop table service_param_price
create table service_param_price (
service_param_price_id int identity PRIMARY KEY NOT NULL
,service_param_id int NOT NULL -- FK, äëÿ êîíêðåòíûõ ïàðàìåòðîâ 1:1. Êàê ýòî çàùèòèòü îãðàíè÷åíèÿìè, íå ïðèäóìàë
--,param_class_id int NOT NULL
,param_id int NOT NULL
,base_price decimal(15,4) NULL -- Íàñëåäîâàòü îò ïàðàìåòðà, äëÿ óäîáñòâà. Íà ñàìîì äåëå áàçîâûå öåíû äîëæíû âåñòèñü îòäåëüíî, ýòî îáåñïå÷èâàåò âåðñèîííîñòü ïðàéñ-ëèñòà
CONSTRAINT UK_service_param_price UNIQUE (service_param_id, param_id)
)
go
if exists (select * from sysobjects where name='specification') drop table specification
create table specification (
specification_id int identity PRIMARY KEY NOT NULL
,specification varchar(255) NOT NULL
,descr varchar(MAX) NULL
)
go
if exists (select * from sysobjects where name='specification_item') drop table specification_item
create table specification_item (
specification_item_id int identity PRIMARY KEY NOT NULL
,specification_id int NOT NULL
,service_id int NOT NULL
--,modifier_id int NULL
,specification_item varchar(1023) NOT NULL -- èìÿ äëÿ ïå÷àòè
,quantity decimal(15,4) NULL
,price decimal(15,4) NULL -- äëÿ êîìïîçèòíûõ ñåðâèñîâ ðàñ÷åò ïî ïàðàìåòðàì
)
go
--alter table specification_item alter column specification_item varchar (1023) NOT NULL
if exists (select * from sysobjects where name='specification_item_param') drop table specification_item_param
create table specification_item_param (
specification_item_param_id int identity PRIMARY KEY NOT NULL
,specification_item_id int NOT NULL
,service_param_id int NOT NULL -- åñëè ïàðàìåòð êîíêðåòíûé, òî param_id îòñþäà
,param_id int NULL -- åñëè â ñåðâèñå çàäàí òîëüêî êëàññ ïàðàìåòðà, òî çäåñü íàäî êîíêðåòèçèðîâàòü *** Ìîæíî äåíîðìàëèçîâàòü, âñåãäà ïîìåùàÿ ñþäà çíà÷åíèå
,quantity decimal(15,4) NULL
,price decimal(15,4) NULL
)
go
----------------------------------------
--9:00 24.09.2020
-- ýòî íå ÖÎÄû, à ïëîùàäêè
if exists (select * from sysobjects where name='site') drop table site
create table site (
site_id int identity PRIMARY KEY NOT NULL
,site varchar(255) NOT NULL
,descr varchar(MAX) NULL
)
go
insert into site(site) values('ÖÎÄ ÌÌÒÑ-9')
insert into site(site) values('ÖÎÄ ÌÌÒÑ-10')
insert into site(site) values('ÖÎÄ Êóð÷àòîâñêèé')
insert into site(site) values('ÖÎÄ Îñòàïîâñêèé')
insert into site(site) values('ÖÎÄ Óäîìëÿ')
insert into site(site) values('ÖÎÄ Åêàòåðèíáóðã')
insert into site(site) values('ÖÎÄ Àäëåð')
insert into site(site) values('ÖÎÄ NORD')
insert into site(site) values('ÖÎÄ OST')
go
+8
View File
@@ -0,0 +1,8 @@
REM set Windows env
setx datasource_svc_class org.postgresql.Driver /M
setx datasource_svc_connectionString jdbc:postgresql://localhost:5432/svc /M
setx datasource_svc_username postgres /M
setx datasource_svc_password encrypted:8ea2101f286dfcf2947cb2162e927cb769b3f845b6d4c57ef2ae89463d72d97842a2228c7ba562a24ee8eaf728350ab6 /M
setx datasource_svc_connectionLimit 5 /M
pause
+409
View File
@@ -0,0 +1,409 @@
/*Ñïåöèôèêàöèè ñ âåðñèîííîñòüþ
*/
-- ìîæíî äîáàâèòü áàçîâûå åäèíèöû è ïåðåñ÷åò
drop table if exists measure CASCADE;
create table measure (
measure_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY NOT NULL
,measure varchar(255) NOT NULL
,measure_short varchar(9) NOT NULL
,creator_id int NULL
,updater_id int NULL
,dt_created timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà çàïèñè
,dt_updated timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà ïîñëåäíåé ìîäèôèêàöèè
);
insert into measure (measure, measure_short) values ('øòóêà','øò.');
insert into measure (measure, measure_short) values ('êèëîâàòò','êÂò');
insert into measure (measure, measure_short) values ('êèëîâàòò-÷àñ','êÂò-÷');
insert into measure (measure, measure_short) values ('ãèãàãåðö','ÃÃö');
insert into measure (measure, measure_short) values ('ãèãàáàéò','ÃÁàéò');
insert into measure (measure, measure_short) values ('10000 øò.','10òûñ.øò.');
drop table if exists contragent CASCADE;
create table contragent (
contragent_id int GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY
,contragent varchar(255) NULL
,descr text NULL -- comments
,is_provider bool NOT NULL DEFAULT false
,external_uid uuid NULL
,external_code varchar(255) NULL --WZ
,dt_created timestamptz NOT NULL default CURRENT_TIMESTAMP -- âðåìÿ çàïèñè ïî ÷àñàì ñåðâåðà ÁÄ
,creator_id int NULL -- èäåíòèôèêàòîð ïîëüçîâàòåëÿ, ñîçäàâøåãî çàïèñü
,dt_updated timestamptz NOT NULL default CURRENT_TIMESTAMP
,updater_id int NULL -- èäåíòèôèêàòîð ïîëüçîâàòåëÿ, îáíîâèâøåãî çàïèñü
);
ALTER TABLE contragent OWNER TO dbo;
-- äàííûå äëÿ òåñòèðîâàíèÿ
insert into contragent (contragent, is_provider) values ('NUBES', true); -- ïðåäïîëàãàåòñÿ, ÷òî ïðîâàéäåð òîëüêî îäèí, íî ýòî íå ïîääåðæèâàåòñÿ îãðàíè÷åíèÿìè
insert into contragent (contragent) values
('Ðîãà è Êîïûòà ÎÎÎ')
,('Ëþòèê ÇÀÎ')
;
drop table if exists contract CASCADE;
create table contract (
contract_id int GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY
,contragent_id int NOT NULL
,contract varchar(255) NULL -- íîìåð êîíòðàêòà
,dt_contract timestamptz NOT NULL
,is_closed bool NOT NULL default false
,dt_closed timestamptz NULL -- äàòà çàâåðøåíèÿ êîíòðàêòà
,descr text NULL -- comments
,dt_created timestamptz NOT NULL default CURRENT_TIMESTAMP --
,creator_id int NULL -- èäåíòèôèêàòîð ïîëüçîâàòåëÿ, ñîçäàâøåãî çàïèñü
,dt_updated timestamptz NOT NULL default CURRENT_TIMESTAMP --
,updater_id int NULL -- èäåíòèôèêàòîð ïîëüçîâàòåëÿ, îáíîâèâøåãî çàïèñü
);
ALTER TABLE contract OWNER TO dbo;
insert into contract (contragent_id,contract,dt_contract) values (2,'test',CURRENT_TIMESTAMP);
-- ñîãëàøåíèå îáåñïå÷èâàåò ÿâíóþ ïðèêëàäíóþ âåðñèîííîñòü
drop table if exists agreement CASCADE;
create table agreement (
--agreement_id int GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY
--,
contract_id int NOT NULL
,agreement_version int NOT NULL
,agreement varchar(255) NULL -- íàçâàíèå ñîãëàøåíèÿ
,dt_agreement timestamptz NOT NULL -- ôîðìàëüíàÿ äàòà, íå ñâÿçàíà ñ âåðñèîííîñòüþ (ìîæåò áûòü, ïîðÿäîê)
,is_actual boolean NOT NULL -- ñ÷èòàåì, ÷òî íà äîãîâîð 1 äåéñòâóþùåå ñîãëàøåíèå - êîòîðûå äî íåãî, òå óñòàðåëè, êîòîðûå ïîñëå, òå â ïðîåêòå
,descr text NULL
,dt_created timestamptz NOT NULL default CURRENT_TIMESTAMP --
,creator_id int NULL -- èäåíòèôèêàòîð ïîëüçîâàòåëÿ, ñîçäàâøåãî çàïèñü
,dt_updated timestamptz NOT NULL default CURRENT_TIMESTAMP --
,updater_id int NULL -- èäåíòèôèêàòîð ïîëüçîâàòåëÿ, îáíîâèâøåãî çàïèñü
,CONSTRAINT PK_agreement PRIMARY KEY (contract_id, agreement_version)
);
ALTER TABLE agreement OWNER TO dbo;
insert into agreement (contract_id,agreement_version,dt_agreement,is_actual) values (1,0,CURRENT_TIMESTAMP,true);
-- øàïêà ñïåöèôèêàöèè, íå âåðñèîííàÿ (íå òåìïîðàëüíàÿ)
drop table if exists specification CASCADE;
create table specification (
specification_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY NOT NULL
,specification varchar(255) NOT NULL
,contract_id int NOT NULL
,descr text NULL
,creator_id int NULL
,updater_id int NULL
,dt_created timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà çàïèñè
,dt_updated timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà ïîñëåäíåé ìîäèôèêàöèè
);
ALTER TABLE specification OWNER TO dbo;
insert into specification (specification,contract_id) values ('first spec',1);
-- íà ñîãëàøåíèå äîëæíà áûòü îäíà àêòóàëüíàÿ âåðñèÿ ñïåöèôèêàöèè
drop table if exists specification_version CASCADE;
create table specification_version (
specification_id int
,agreement_version int NOT NULL -- FK agreement
,descr text NULL
,creator_id int NULL
,updater_id int NULL
,dt_created timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà çàïèñè
,dt_updated timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà ïîñëåäíåé ìîäèôèêàöèè
,CONSTRAINT PK_specification_version PRIMARY KEY (specification_id, agreement_version)
);
ALTER TABLE specification_version OWNER TO dbo;
-- ñòðîêà ñïåöèôèêàöèè
drop table if exists specification_item CASCADE;
create table specification_item (
specification_item_uid uuid NOT NULL PRIMARY KEY DEFAULT gen_random_uuid() -- êëþ÷ ñòðîêè
,specification_id int NOT NULL --FK
,svc_id int NOT NULL --immutable
,creator_id int NULL
,updater_id int NULL
,dt_created timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà çàïèñè
,dt_updated timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà ïîñëåäíåé ìîäèôèêàöèè
);
ALTER TABLE specification_item OWNER TO dbo;
-- âåðñèÿ ñòðîêè ñïåöèôèêàöèè (âåðñèîííîñòü áåðåòñÿ îò ñïåêè)
drop table if exists specification_item_version CASCADE;
create table specification_item_version (
specification_item_uid uuid NOT NULL -- êëþ÷ ñòðîêè
,agreement_version int NOT NULL -- ÂÀÆÍÎ: åñëè ñòðîêà íå ðåäàêòèðîâàëàñü - âåðñèÿ áóäåò ñòàðîé (ýêîíîìèì âåðñèé, *** íî ìîæíî ñäåëàòü òàáëèöó, ñîáèðàþùóþ âåðñèè ñòðîê)
,dt_from timestamptz NULL
,dt_to timestamptz NULL
,specification_item_version varchar(1023) NOT NULL -- èìÿ äëÿ ïå÷àòè
,quantity decimal(15,4) NULL
,price decimal(15,4) NULL
,creator_id int NULL
,updater_id int NULL
,dt_created timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà çàïèñè
,dt_updated timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà ïîñëåäíåé ìîäèôèêàöèè
,CONSTRAINT PK_specification_item_version PRIMARY KEY (specification_item_uid, agreement_version)
);
ALTER TABLE specification_item OWNER TO dbo;
-- ïàðàìåòð (êîìïîíåíò) ñîáñòâåííîé âåðñèîííîñòè íå èìååò, ïðè ñîçäàíèè íîâîé âåðñèè ñòðîêè êëîíèðóåòñÿ
drop table if exists specification_item_param CASCADE;
create table specification_item_param (
specification_item_param_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY NOT NULL
,specification_item_uid uuid NOT NULL
,agreement_version int NOT NULL
,service_param_id int NOT NULL
,quantity decimal(15,4) NULL
,price decimal(15,4) NULL
,creator_id int NULL
,updater_id int NULL
,dt_created timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà çàïèñè
,dt_updated timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà ïîñëåäíåé ìîäèôèêàöèè
);
ALTER TABLE specification_item_param OWNER TO dbo;
drop table if exists svc CASCADE;
CREATE TABLE svc (
svc_id integer NOT NULL,
svc character varying(255),
descr text,
dt_created timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
creator_id integer,
dt_updated timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
updater_id integer,
is_production_ready boolean DEFAULT false NOT NULL,
code character varying(255),
man text,
svc_short character varying(255),
resource_realm_type_id integer,
version character varying(255),
orchestrator_name character varying(255),
sort integer
);
ALTER TABLE svc OWNER TO dbo;
INSERT INTO svc VALUES (92, 'k8s_mongodb', '', '2024-09-09 12:53:00.022+03', 3, '2024-09-09 12:53:00.022+03', 3, false, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO svc VALUES (95, 'NodeJS - ñåðâåð ïðèëîæåíèé', 'Îáðàç: node:16', '2024-12-10 17:57:41.06+03', 3, '2025-03-07 18:12:53.508+03', 3, true, '', 'Îáðàç: node:16', 'nodejs', 3, '0.0.6', 'Node', NULL);
INSERT INTO svc VALUES (50, 'Nextcloud - ïëàòôîðìà ñîâìåñòíîé ðàáîòû', 'Ðåñóðñíàÿ ïëàòôîðìà: k8s. Àâòîìàòèçàöèÿ: helm chart', '2024-09-09 12:51:27.551+03', 3, '2025-02-28 18:11:26.017+03', 3, true, '', 'Ðåñóðñíàÿ ïëàòôîðìà: k8s. Àâòîìàòèçàöèÿ: helm chart', 'nextcloud', 3, '0.0.3', 'Nextcloud', NULL);
INSERT INTO svc VALUES (21, 'Âèðòóàëüíûé ÄÖ äëÿ VM (vc_vdc)', 'Âèðòóàëüíûé ÄÖ â Cloud Director. Òðåáóåò íàëè÷èå Îðãàíèçàöèè', '2024-04-08 10:59:07.350806+03', NULL, '2025-02-12 15:42:07.821+03', 10, false, '', 'Âèðòóàëüíûé ÄÖ â Cloud Director. Òðåáóåò íàëè÷èå Îðãàíèçàöèè', '', NULL, NULL, NULL, NULL);
INSERT INTO svc VALUES (26, 'vApp äëÿ VM (vc_vapp)', 'Ïàïêà â êëàóä äèðåêòîðå. Äëÿ óñòàíîâêè íóæåí vc_nsxt', '2024-12-23 14:54:46.277+03', 3, '2025-02-12 15:42:46.017+03', 10, false, '', 'Ïàïêà â êëàóä äèðåêòîðå. Äëÿ óñòàíîâêè íóæåí vc_nsxt', '', NULL, NULL, NULL, NULL);
INSERT INTO svc VALUES (111, 'DNS-çàïèñü', '', '2024-09-17 14:22:05.028+03', 11, '2025-02-28 16:45:10.351+03', 3, true, '', '', 'dnsrecord', 4, '0.0.4', 'Records', NULL);
INSERT INTO svc VALUES (13, 'S3 áàêåò (s3_bucket)', 'Òðåáóåò íàëè÷èÿ ó÷åòíîé çàïèñì S3<br/>Ðåñóðñíàÿ ïëàòôîðìà: Ceph', '2024-12-11 23:19:43.469+03', 3, '2025-02-28 16:43:49.758+03', 3, true, '', 'Òðåáóåò íàëè÷èÿ ó÷åòíîé çàïèñì S3<br/>Ðåñóðñíàÿ ïëàòôîðìà: Ceph', 's3bucket', 1, '0.0.3', 'Bucket', NULL);
INSERT INTO svc VALUES (20, 'Îðãàíèçàöèÿ äëÿ VM â Cloud Director (vc_organization)', 'Îðãàíèçàöèÿ â êëàóä äèðåêòîðå', '2024-04-08 10:59:07.350806+03', NULL, '2025-02-12 15:41:57.046+03', 10, false, '', 'Îðãàíèçàöèÿ â êëàóä äèðåêòîðå', '', NULL, NULL, NULL, NULL);
INSERT INTO svc VALUES (12, 'S3 - ó÷åòíàÿ çàïèñü', 'S3 account, ðåñóðñíàÿ ïëàòôîðìà CEPH (S3 CEPH). Íàñòðîåí ñáîð ìåòðèê, àâòîìàòèçàöèÿ áèëëèíãà â ðàçðàáîòêå', '2024-04-08 10:59:07.350806+03', NULL, '2025-02-28 16:42:41.829+03', 3, true, '', 'S3 account, ðåñóðñíàÿ ïëàòôîðìà CEPH (S3 CEPH). Íàñòðîåí ñáîð ìåòðèê, àâòîìàòèçàöèÿ áèëëèíãà â ðàçðàáîòêå', 's3', 1, '1.0.0', 'Ceph', NULL);
INSERT INTO svc VALUES (32, 'PostgreSQL íà ÂÌ (vc_vm_postgresql_std)', 'Ñåðâèñ íàñòðîéêè PostgreSQL äëÿ âèðòóàëüíîé ìàøèíû.<br/>Òðåáóåò íàëè÷èÿ ÂÌ<br/><br/>Âåðñèÿ Postgre - 17', '2024-08-05 12:47:46.275+03', 3, '2025-02-12 15:42:55.441+03', 10, false, '', 'Ñåðâèñ íàñòðîéêè PostgreSQL äëÿ âèðòóàëüíîé ìàøèíû.<br/>Òðåáóåò íàëè÷èÿ ÂÌ<br/><br/>Âåðñèÿ Postgre - 17', '', NULL, NULL, NULL, NULL);
INSERT INTO svc VALUES (100, 'tenantOpenwhisk', 'Äîáàâëåíèå è óäàëåíèÿ ïîëüçîâàòåëÿ äëÿ ðàáîòû ñ Openwhisk', '2024-09-12 13:43:55.166+03', 3, '2024-12-26 13:06:02.166+03', 3, false, '', 'Äîáàâëåíèå è óäàëåíèÿ ïîëüçîâàòåëÿ äëÿ ðàáîòû ñ Openwhisk', NULL, NULL, NULL, NULL, NULL);
INSERT INTO svc VALUES (25, 'Âíåøíèé IP àäðåñ äëÿ VM (vc_external_ip)', 'Ñîçäàíèå external Ip â Cloud Director. <br/>Òðåáóåò íàëè÷èå óñëóãè', '2024-12-12 16:32:45.488+03', 3, '2025-02-28 16:47:42.541+03', 3, true, '', 'Ñîçäàíèå external Ip â Cloud Director. <br/>Òðåáóåò íàëè÷èå óñëóãè', 'vcexternalip', 2, '0.0.2', 'Ip', NULL);
INSERT INTO svc VALUES (96, 'pgAdmin - êîíñîëü äëÿ PostgreSQL', '', '2024-12-10 18:28:43.874+03', 3, '2025-02-28 17:48:10.242+03', 3, true, '', '', 'pgadmin', 3, '0.0.2', 'Pgadmin', NULL);
INSERT INTO svc VALUES (110, 'DNS-çîíà', '', '2024-09-16 18:52:52.357+03', 11, '2025-02-28 16:45:17.753+03', 3, true, '', '', 'dnszone', 4, '0.0.3', 'Zones', NULL);
INSERT INTO svc VALUES (99, 'k8s_gitea', '', '2025-02-28 17:18:32.548+03', 3, '2025-02-28 17:43:41.652+03', 3, true, '', '', '', 3, '0.0.1', 'Gitea', NULL);
INSERT INTO svc VALUES (82, 'Harbor Registry (registry_k8s)', 'Harbor Registry. Ðåñóðñíàÿ ïëàòôîðìà: k8s. Àâòîìàòèçàöèÿ: helm chart. Àâòîðèçàöèÿ: keycloak', '2024-09-09 12:52:04.345+03', 3, '2025-02-28 18:09:50.071+03', 3, true, '', 'Harbor Registry. Ðåñóðñíàÿ ïëàòôîðìà: k8s. Àâòîìàòèçàöèÿ: helm chart. Àâòîðèçàöèÿ: keycloak', 'harbor', 3, '0.0.2', 'Registry', NULL);
INSERT INTO svc VALUES (2, 'k8sTemplate', '', '2025-02-28 17:06:21.371+03', 3, '2025-02-28 17:06:48.617+03', 3, false, '', '', '', 3, '0.0.1', 'Template', NULL);
INSERT INTO svc VALUES (23, 'VM â Cloud Director (vc_vm)', 'Âèðòóàëüíàÿ ìàøèíà áåç êàêèõ-ëèáî îñîáåííîñòåé. <br/>Äàííàÿ óñëóãà çàïóñêàåò vc_ip äëÿ âûäà÷è áåëîãî àäðåñà è ïîäêëþ÷åíèÿ ê ÂÌ', '2024-08-02 12:53:13.869+03', 3, '2025-02-12 15:42:20.771+03', 10, false, '', 'Âèðòóàëüíàÿ ìàøèíà áåç êàêèõ-ëèáî îñîáåííîñòåé. <br/>Äàííàÿ óñëóãà çàïóñêàåò vc_ip äëÿ âûäà÷è áåëîãî àäðåñà è ïîäêëþ÷åíèÿ ê ÂÌ', '', NULL, NULL, NULL, NULL);
INSERT INTO svc VALUES (91, 'Redis In-Memory DB Cluster on k8s', 'Redis êëàñòåð. Ïîä êåøè. <br/>Ðåñóðñíàÿ ïëàòôîðìà: k8s. <br/>Àâòîìàòèçàöèÿ: k8s operator<br/>port 6379', '2024-09-09 12:52:49.473+03', 3, '2025-03-07 11:39:36.69+03', 3, true, '', '', 'redis', 3, '0.0.3', 'Redis', NULL);
INSERT INTO svc VALUES (81, 'Apache Superset - àíàëèòè÷åñêèé ñåðâåð (superset_k8s)', 'Apache Superset êàê ñåðâèñ. <br/>Ðåñóðñíàÿ ïëàòôîðìà: k8s. <br/>Àâòîìàòèçàöèÿ: k8s operator.<br/>Àâòîðèçàöèÿ: 2FA keycloak (äëÿ äîìåííîãî ëîãèíà @mgmt.nubes.ru)', '2024-09-09 12:51:49.122+03', 3, '2025-02-28 18:09:54.127+03', 3, true, '', 'Apache Superset êàê ñåðâèñ. <br/>Ðåñóðñíàÿ ïëàòôîðìà: k8s. <br/>Àâòîìàòèçàöèÿ: k8s operator.<br/>Àâòîðèçàöèÿ: 2FA keycloak (äëÿ äîìåííîãî ëîãèíà @mgmt.nubes.ru)', 'superset', 3, '0.0.1', 'Superset', NULL);
INSERT INTO svc VALUES (22, 'Ñåòåâûå àäàïòåðû äëÿ VM (vc_nsxt)', '', '2024-04-08 10:59:07.350806+03', NULL, '2025-02-28 17:19:33.266+03', 3, false, '', '', '', NULL, '', '', NULL);
INSERT INTO svc VALUES (93, 'RabbitMQ - ñåðâåð î÷åðåäåé (rabbitmq_k8s)', 'RabbitMQ', '2024-09-09 12:53:09.059+03', 3, '2025-03-07 11:39:29.483+03', 3, true, '', '', 'rabbitmq', 3, '0.0.3', 'Rabbitmq', NULL);
INSERT INTO svc VALUES (90, 'PostgreSQL RDBMS Cluster', 'PostgreSQL êëàñòåð. Ðåñóðñíàÿ ïëàòôîðìà: k8s. Àâòîìàòèçàöèÿ: k8s operator.<br/>Àâòîìàòè÷åñêîå ðåçåðâíîå êîïèðîâàíèå, ðó÷íîå âîññòàíîâëåíèå.', '2024-09-09 12:52:34.457+03', 3, '2025-03-12 10:36:06.529+03', 3, true, '', 'PostgreSQL êëàñòåð. Ðåñóðñíàÿ ïëàòôîðìà: k8s. Àâòîìàòèçàöèÿ: k8s operator.<br/>Àâòîìàòè÷åñêîå ðåçåðâíîå êîïèðîâàíèå, ðó÷íîå âîññòàíîâëåíèå.', 'postgres', 3, '0.0.5', 'Pgsql', NULL);
INSERT INTO svc VALUES (98, 'k8s_simple_http_container', '', '2025-02-28 17:18:40.813+03', 3, '2025-02-28 17:43:48.248+03', 3, true, '', '', 'http', 3, '0.0.3', 'SimpleHttpContainer', NULL);
INSERT INTO svc VALUES (94, 'Lucee - ñåðâåð ïðèëîæåíèé', 'Îáðàç: lucee/lucee:latest', '2024-12-10 16:53:24.068+03', 3, '2025-03-10 10:13:04.713+03', 3, true, '', 'Îáðàç: lucee/lucee:latest', 'lucee', 3, '0.0.9', 'Lucee', NULL);
INSERT INTO svc VALUES (1, 'dummy service', 'Áîëâàíêà äëÿ òåñòîâ', '2024-04-19 19:10:30.206+03', 3, '2025-04-30 19:00:08.473+03', 10, true, '', '', 'dummy', 7, '', 'dummy', NULL);
INSERT INTO svc VALUES (112, 'grafana_tenant', '', '2025-03-12 12:30:15.669+03', 3, '2025-04-28 18:40:23.781+03', 10, false, '', '', 'tenant', 6, '0.0.2', 'Tenant', NULL);
ALTER TABLE ONLY svc
ADD CONSTRAINT PK_svc PRIMARY KEY (svc_id);
-------------------------------------------------------------------------
-- IAM
-------------------------------------------------------------------------
-- usr is normally shared view
drop table if exists usr;
create table usr(
usr_id int GENERATED BY DEFAULT AS IDENTITY(START WITH 11) PRIMARY KEY NOT NULL
,firstname varchar(255) NULL
,middlename varchar(255) NULL
,lastname varchar(255) NOT NULL
,login varchar(255) NOT NULL
,password varchar(255) NULL -- changed from varbinary for postgre and Argon2
,email varchar(255) NOT NULL
,phone_cell varchar(50) NULL
,descr text NULL
,settings text NULL
,locked boolean NOT NULL CONSTRAINT DF_usr_locked DEFAULT(false)
,creator_id int NULL
,updater_id int NULL
,dt_created timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà çàïèñè
,dt_updated timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà ïîñëåäíåé ìîäèôèêàöèè
,fullname varchar GENERATED ALWAYS AS ((lastname||rtrim(' '||coalesce(firstname,'')))||rtrim(' '||coalesce(middlename,''))) STORED
,shortname varchar GENERATED ALWAYS AS (replace((lastname||rtrim(' '||coalesce(left(firstname,(1))||'.','')))||rtrim(' '||coalesce(left(middlename,(1))||'.','')),' .','')) STORED
);
create unique index UX_login on usr(login);
insert into usr (usr_id,firstname,middlename,lastname,login,password,email,phone_cell)
values (2,'','','Àíîíèìíûé ïîëüçîâàòåëü','anonymous',null,'',null);
insert into usr (usr_id,firstname,middlename,lastname,login,password,email,phone_cell)
values (10,'Ñåðãåé','Þðüåâè÷','Ìèùóê','smishchuk','$argon2id$v=19$m=500,t=3,p=4$d37RBdizC3rwQfINGSoQmg$Bwvr1f+RQf9hpXwV58sgUYzYpupp7iUzfUBACGApT80','msyu@mail.ru',null);
------------------------------
drop table if exists obj;
create table obj ( --
obj varchar(63) NOT NULL PRIMARY KEY
,descr text NULL -- ïðèìå÷àíèÿ
,creator_id int NULL
,updater_id int NULL
,dt_created timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà çàïèñè
,dt_updated timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà ïîñëåäíåé ìîäèôèêàöèè
);
drop table if exists role;
create table role ( --
role_id int /*identity*/ NOT NULL PRIMARY KEY
,role varchar(255) NOT NULL
,descr text NULL -- ïðèìå÷àíèÿ
,creator_id int NULL
,updater_id int NULL
,dt_created timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà çàïèñè
,dt_updated timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà ïîñëåäíåé ìîäèôèêàöèè
);
insert into role (role_id,role) values (1,'Àäìèíèñòðàòîð');
insert into role (role_id,role) values (2,'×èòàòåëü'); -- òîëüêî ÷òåíèå îãðàíè÷åííîãî ñïèñêà ýêðàíîâ
drop table if exists usr_role;
create table usr_role ( --
role_id int NOT NULL
,usr_id int NOT NULL
,CONSTRAINT PK_usr_role primary key (usr_id, role_id)
,creator_id int NULL
,dt_created timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà çàïèñè
);
insert into usr_role (role_id,usr_id) values (2,2);
insert into usr_role (role_id,usr_id) values (1,10);
drop table if exists acl;
create table acl(
obj varchar(63) NOT NULL
,role_id int NOT NULL
,permission int NOT NULL -- 1=READ 2=WRITE
,creator_id int NULL
,modifier_id int NULL
,dt_created timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà çàïèñè
,dt_modified timestamp NOT NULL default CURRENT_TIMESTAMP -- äàòà ïîñëåäíåé ìîäèôèêàöèè
,CONSTRAINT PK_acl PRIMARY KEY (obj, role_id)
);
/* insert into obj (obj,descr) values ('abstract_service','Àáñòðàêòíàÿ óñëóãà êàòàëîãà');
insert into obj (obj,descr) values ('price','Ïðàéñ-ëèñò áàçîâûé');
insert into obj (obj,descr) values ('service','Óñëóãà (ðàçâåðíóòûé êàòàëîã)');
insert into obj (obj,descr) values ('abstract_service_rpt','Êàòàëîã');
insert into obj (obj,descr) values ('price_rpt','Ïðàéñ-ëèñò: óñëóãà ñ ïàðàìåòðîì');
insert into obj (obj,descr) values ('export','Îò÷åòû ýêñïîðòà');
insert into obj (obj,descr) values ('modifier_class','Êëàññ õàðàêòåðèñòèêè');
insert into obj (obj,descr) values ('modifier','Õàðàêòåðèñòèêà');
insert into obj (obj,descr) values ('param_class','Êëàññ ïàðàìåòðà');
insert into obj (obj,descr) values ('param','Ïàðàìåòð');
insert into obj (obj,descr) values ('measure','Åäèíèöà èçìåðåíèÿ');
insert into obj (obj,descr) values ('site','Òàðèôíàÿ çîíà');
insert into obj (obj,descr) values ('provider','Ïîñòàâùèê (ÄÇÎ)');
insert into obj (obj,descr) values ('area','Ãðóïïà êàòàëîãà');
insert into obj (obj,descr) values ('service_param','Ïàðàìåòð êîíêðåòíîé óñëóãè');
insert into obj (obj,descr) values ('specification','Ñïåöèôèêàöèÿ');
insert into obj (obj,descr) values ('specification_item','Ñòðîêà ñïåöèôèêàöèè');
insert into obj (obj,descr) values ('specification_item_param','Ðåñóðñ ñòðîêè ñïåöèôèêàöèè (ýêçåìïëÿðà óñëóãè)');
insert into obj (obj,descr) values ('usr','Ïîëüçîâàòåëü');
insert into obj (obj,descr) values ('acl','Ïðàâà äîñòóïà');
insert into obj (obj,descr) values ('service_param_price','Öåíà êîìïîíåíòà');
insert into obj (obj,descr) values ('service_price','Öåíà óñëóãè');
insert into obj (obj,descr) values ('abstract_service_complementary','Äîïîëíèòåëüíàÿ óñëóãà'); */
/* --÷èòàòåëü
insert into acl(obj,role_id,permission) values ('abstract_service',2,1);
insert into acl(obj,role_id,permission) values ('price',2,1);
insert into acl(obj,role_id,permission) values ('service',2,1);
insert into acl(obj,role_id,permission) values ('abstract_service_rpt',2,1);
insert into acl(obj,role_id,permission) values ('abstract_service_doc',2,1);
insert into acl(obj,role_id,permission) values ('price_rpt',2,1);
insert into acl(obj,role_id,permission) values ('modifier_class',2,1);
insert into acl(obj,role_id,permission) values ('modifier',2,1);
insert into acl(obj,role_id,permission) values ('param_class',2,1);
insert into acl(obj,role_id,permission) values ('param',2,1);
insert into acl(obj,role_id,permission) values ('measure',2,1);
insert into acl(obj,role_id,permission) values ('site',2,1);
insert into acl(obj,role_id,permission) values ('provider',2,1);
insert into acl(obj,role_id,permission) values ('area',2,1);
insert into acl(obj,role_id,permission) values ('specification',2,1);
insert into acl(obj,role_id,permission) values ('specification_item',2,1);
insert into acl(obj,role_id,permission) values ('specification_item_param',2,1);
insert into acl(obj,role_id,permission) values ('service_param',2,1);
insert into acl(obj,role_id,permission) values ('abstract_service_param_class',2,1);
insert into acl(obj,role_id,permission) values ('service_param_price',2,1);
insert into acl(obj,role_id,permission) values ('service_price',2,1);
insert into acl(obj,role_id,permission) values ('abstract_service_complementary',2,1);
--àäìèí
insert into acl(obj,role_id,permission) values ('abstract_service',1,2);
insert into acl(obj,role_id,permission) values ('price',1,2);
insert into acl(obj,role_id,permission) values ('service',1,2);
insert into acl(obj,role_id,permission) values ('abstract_service_rpt',1,2);
insert into acl(obj,role_id,permission) values ('abstract_service_doc',1,2);
insert into acl(obj,role_id,permission) values ('price_rpt',1,2);
insert into acl(obj,role_id,permission) values ('export',1,2);
insert into acl(obj,role_id,permission) values ('modifier_class',1,2);
insert into acl(obj,role_id,permission) values ('modifier',1,2);
insert into acl(obj,role_id,permission) values ('param_class',1,2);
insert into acl(obj,role_id,permission) values ('param',1,2);
insert into acl(obj,role_id,permission) values ('measure',1,2);
insert into acl(obj,role_id,permission) values ('site',1,2);
insert into acl(obj,role_id,permission) values ('provider',1,2);
insert into acl(obj,role_id,permission) values ('area',1,2);
insert into acl(obj,role_id,permission) values ('specification',1,2);
insert into acl(obj,role_id,permission) values ('specification_item',1,2);
insert into acl(obj,role_id,permission) values ('specification_item_param',1,2);
insert into acl(obj,role_id,permission) values ('usr',1,2);
insert into acl(obj,role_id,permission) values ('acl',1,2);
insert into acl(obj,role_id,permission) values ('service_param',1,2);
insert into acl(obj,role_id,permission) values ('abstract_service_param_class',1,2);
insert into acl(obj,role_id,permission) values ('service_param_price',1,2);
insert into acl(obj,role_id,permission) values ('service_price',1,2);
insert into acl(obj,role_id,permission) values ('abstract_service_complementary',1,2); */
+30
View File
@@ -0,0 +1,30 @@
2025-06-02
можно отметить, что тут смешаны версионность допника и темпоральность строки
Можно сделать таблицу, собирающую версии строк, чтобы не искать каждый раз (а может, нам не нужен снапшот на произвольную дату? или версию допника - вот, я уже запутался)
в сервисе нет единиц измерения у меня
31.05.2025
Спецификация относится к договору. В принципе, в договоре может быть несколько спецификаций, но поддерживать это не кажется безусловно нужным. Каждая новая действующая версия спецификации относится к доп соглашению (возможно для договора ввести нулевой допник). Возможно, для редактирования захочется ввести редакторскую версионность, эту мы не рассматриваем.
Для обсуждения версионности важно, что мы имеем дело с услугами, которые длятся (в отличие от них, для продажи товаров, видимо, имеет смысл только тривиальная редакторская версионность, не имеющая отношения к учету).
Спецификация состоит из номенклатурных позиций с ценой, количеством, датой начала и окончания действия, уникальным ключом строки. Ключ строки может соотноситься 1 к 1 с объектом биллинга для индивидуальных объектов (облачный пул) или 1 ко многим для счетных объектов (ip адрес). Включение разнородных объектов, отличающихся модификаторами (соответственно, кодами) или значениями параметров, не поддерживается.
Версионность спецификации поддерживает: добавление, удаление, изменение строки (почти тоже самое, что услуги) . При добавлении или удалении услуги обязательный атрибут - дата начала или завершения оказания услуги (обе даты имеют смысл "включительно": первый и последний день оказания услуги). Дата начала/завершения может быть какой угодно (хоть через 5 лет, мы не реализуем проверок), но с одним ограничением: даты в цепочке версий строки должны быть последовательными (монотонными), дата завершения не меньше даты начала, дата начала следующей версии не меньше даты завершения предыдущей версии.
Добавленная услуга получает уникальный ключ строки. Ключ удаленной услуги (строки) дискардится. Видимо, есть разные похожие сценарии: удалить услугу (вместе со строкой) с некоторой даты, обнулить количество с некоторой даты, завершить обслуживание с некоторой даты. Разница будет видна, когда дойдем до модификации.
Разница между строкой и инстансом услуги, возможно, нуждается в пояснении. Когда мы редактируем строку, мы подразумеваем, что за ней могут стоять индивидуальные инстансы. Например, при расширении вычислительного пула мы говорим про конкретный пул (в том числе имеющий уникальный идентификатор) , а не просто докидываем куда-то гигабайт или рублей. В случае со счетными объектами обычно подразумевается, что при увеличении количества объекты добавляются к множеству, при уменьшении - убираются из него (строго говоря, это не так - увеличение просто значит, что добавили больше, чем убрали, причем поменяться могли все элементы). Счетные объекты (те же стойки) обычно имеют индивидуальность: у каждого стойко-места свой номер, но это обычно отражается не в спецификации, а в ТУ (возможно, это связано с тем, что индивидуальность элемента не влияет на взаиморасчеты, только количество). Может быть, это не важно.
При изменении строки не может меняться номенклатура. Может меняться количество, параметры (компоненты) композитной услуги, цена (или частные цены компонентов). Чтобы не путаться: дата начала/окончания меняться не может, это не обычный прикладной атрибут, а "драйвер" версионности. Иначе говоря, при изменении строки меняются только числовые значения (можно, наверно, менять примечания и пользовательские названия – они на учет не влияют)
Модификация строки нетривиальна по сравнению с созданием и удалением. Когда мы меняем строку, мы создаем новую версию, завершая действие прежней версии некоторым числом и создавая новую версию (непременно) более поздним числом (чаще всего следующим днем, пропуск мы, скорее всего, не захотим поддерживать: это может несколько усложнить формирование счетов... но паузу можно оформить периодом с нулевым количеством).
Таким образом, спецификация содержит версии строк, которые на любую дату составляют актуальную картину, причем на любую дату актуально не более одной версии каждой строки. За расчетный период могут быть актуальными несколько вариантов строки, логических препятствий для этого нет (может быть, этого придется избегать, чтобы исключить противоречия при формировании счетов). Строки не удаляются, а закрываются некоторой датой.
Редактирование (включая возможность двигать даты начала/окончания) в некоторый момент замораживается, и строку нельзя уже поменять задним числом (условия уточнить). Может быть, необходим будет механизм компенсирующих проводок для корректировки задним числом.
Таким образом, мы семантически объединяем даты начала/окончания оказания услуги и даты актуальности версий строк (чтобы не усложнять, и они кажутся очень близкими по смыслу).
Возобновления оказания услуги, наверное, предусматривать не надо: достаточно создать новую строку спецификации с теми же реквизитами и новым уникальным ключом строки - тогда можно рассчитывать на непрерывность цепочек версий (это ограничение выглядит успокаивающим, но непонятно, так ли оно полезно или необходимо). ВременнАя монотонность цепочек версий, напротив, кажется совершенно обязательной.
Номера версий строк монотонны (реализация может позволить наличие пропусков – оно логически ничему не противоречит)
Теперь что такое версия спецификации и откуда берется номер версии спецификации. Предлагается считать версией спецификации снапшот версий строк, последовательность таких снапшотов соответствует истории спецификации.
Каждая версия спецификации вносит изменения: строка добавилась, строка удалилась, строка изменилась. Строки, которые не менялись, просто остаются в кумулятивном представлении, и отсутствуют в дифференциальном представлении. Измененная строка в кумулятивном представлении выглядит как «стало вот так с такой даты», а в дифференциальном «изменилось на столько с такой даты».
Если нам нужно 2 раза поменять некоторую строку (скажем, с 15 и 20 числа месяца) – нам придется выпустить 2 версии спецификации: формат не предусматривает замножение строк. Вероятно, 2 версии спецификации, в свою очередь, потребуют 2 дополнительных соглашений (кажется, в структуре доп соглашения, даже если предусмотрено несколько спецификаций, то это не версии одной спецификации). Впрочем, не припомню практической необходимости в таких изысках.
Может быть, тут не хватает вопросов, на которые должна отвечать модель, но мне она пока кажется информационно полной и не сильно противоречивой.