diff --git a/README.md b/README.md
index eb7208f..3bd5b44 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,3 @@
-# Svc
+# Spec
-Каталог услуг
\ No newline at end of file
+Макет версионных спецификаций. Отработка модели данных
\ No newline at end of file
diff --git a/abstract_service.cfm b/abstract_service.cfm
deleted file mode 100644
index 9f89a55..0000000
--- a/abstract_service.cfm
+++ /dev/null
@@ -1,575 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- pageInfo=#pageInfo#
- id="#d.abstract_service_id#"
- status=#pageInfo.status#
- trackOut="tr"
- idAttributesOut="id"
-/>
-
-
-
-
-
-
- select a.analytic_code, a.area_code, a.area
- from area a
- where area_id=
-
-
- select
- a.login as creator, a.shortname as creator_shortname, m.login as updater, m.shortname as updater_shortname
- from #pageInfo.entity# e
- left outer join usr a on (e.creator_id=a.usr_id)
- left outer join usr m on (e.updater_id=m.usr_id)
- where e.#pageInfo.key#=
-
-
-
-
-
- Абстрактная услуга
-
- #d.abstract_service#
- [#d.abstract_service_id#]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Номенклатура (RUS)
-
-
-
-
-
-
-
Номенклатура (ENG)
-
-
-
-
-
-
-
Группа услуг
-
-
- select area_id, area_code, analytic_code, area
- from area
- order by 3
-
-
- />
-
-
-
-
-
Код услуги
-
- #qArea.area_code#.
-
-
-
-
-
Единица измерения
-
-
- select measure_id, measure
- from measure
- order by 2
-
-
- />
- для композитных услуг (состоящих из компонентов) указывать штуки. Часто композитные услуги попадают в спецификацию в количестве 1 шт.
-
-
-
-
-
Точность
-
-
- Количество знаков после запятой, 0 - целое число
-
-
-
-
-
Класс характеристики
-
-
- select modifier_class_id, modifier_class
- from modifier_class
- order by 2
-
-
- />
-
-
-
-
-
-
-
-
-
-
-
- Список, из которого выбирается значение характеристики-модификатора, определяющее конкретную услугу (вариант).
- Если варианты не предусмотрены, нужно оставить поле пустым.
-
-
-
-
-
-
Ответственный
-
-
- select usr_id, firstname, middlename, lastname
- from usr
- order by 4,2,3
-
-
-
-
-
-
-
-
Версия
-
-
-
-
-
-
-
Статус
-
-
- select status_id, status
- from status
- order by 1
-
-
- />
- с
-
-
-
-
-
-
-
-
- select
- s.service_id
- ,m.modifier_id
- ,m.modifier
-
- ,c.modifier_class_id
- ,c.modifier_class
- ,m.code as modifier_code
- ,(select count(*) from service_param sp where sp.service_id=s.service_id) as param_count
- ,(select count(*) from service_param sp join service_param_price spp on (sp.service_param_id=spp.service_param_id) where sp.service_id=s.service_id) as service_param_price_count
-
- ,(select sp.price from service_price sp where sp.service_id=s.service_id AND sp.pricing_model_id=1 order by service_price_id desc limit 1) as prc_inst
- ,(select count(*) from service_price sp where sp.service_id=s.service_id AND sp.pricing_model_id=1) as prc_inst_cnt
- ,(select sp.service_price_id from service_price sp where sp.service_id=s.service_id AND sp.pricing_model_id=1 order by service_price_id desc limit 1) as prc_inst_id
-
- ,(select sp.price from service_price sp where sp.service_id=s.service_id AND sp.pricing_model_id=2 order by service_price_id desc limit 1)as prc_fix
- ,(select count(*) from service_price sp where sp.service_id=s.service_id AND sp.pricing_model_id=2) as prc_fix_cnt
- ,(select sp.service_price_id from service_price sp where sp.service_id=s.service_id AND sp.pricing_model_id=2 order by service_price_id desc limit 1)as prc_fix_id
-
- ,(select sp.price from service_price sp where sp.service_id=s.service_id AND sp.pricing_model_id=3 order by service_price_id desc limit 1) as prc_payg
- ,(select count(*) from service_price sp where sp.service_id=s.service_id AND sp.pricing_model_id=3) as prc_payg_cnt
- ,(select sp.service_price_id from service_price sp where sp.service_id=s.service_id AND sp.pricing_model_id=3 order by service_price_id desc limit 1) as prc_payg_id
-
- from service s
- left outer join modifier m on (s.modifier_id=m.modifier_id)
- left outer join modifier_class c on (m.modifier_class_id=c.modifier_class_id)
- where s.abstract_service_id=
- order by m.sort, m.code, m.modifier
-
-
-
-
-
-
-
-
-
-
-
- Варианты услуги (#qService.recordCount#)
-
-
-
-
-
-
-
-
-
-
-
- select
- ac.abstract_service_complementary_id
- ,ac.abstract_service_id
- ,ac.complementary_id
- ,ac.quantity
- ,ac.sort
- ,c.code
- ,c.abstract_service
- ,c.area_id
- ,g.area_code
- from abstract_service_complementary ac
- left outer join abstract_service c on (ac.complementary_id=c.abstract_service_id)
- left outer join area g on (c.area_id=g.area_id)
- where ac.abstract_service_id=
- order by ac.sort
-
-
-
-
- Дополнительные услуги (#qAbstractServiceComplementary.recordCount#)
-
-
-
-
-
-
-
-
- select
- a.abstract_service
- ,a.abstract_service_id
- ,a.code
- ,g.area_code
- from abstract_service a
- left outer join area g on (a.area_id=g.area_id)
- where a.abstract_service_id <>
-
- order by g.analytic_code, a.code
-
-
-
-
-
-
-
-
- Эта услуга предлагается дополнительно к основной при формировании спецификации
-
-
-
-
-
Кол-во по умолчанию
-
-
- В каком количестве предлагать на каждый экземпляр основной услуги
-
-
-
-
-
Сортировка
-
-
- Целое число - порядок, в котором Компонент будет выводиться в составе данной услуги. Рекомендуется ставить через 100, чтобы потом удобнее было тасовать
-
-
-
-
-
-
\ No newline at end of file
diff --git a/abstract_service_ls.cfm b/abstract_service_ls.cfm
deleted file mode 100644
index ea92ddd..0000000
--- a/abstract_service_ls.cfm
+++ /dev/null
@@ -1,164 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- select
-
- a.abstract_service_id
- g.area_code
- g.analytic_code
- g.area
- a.area_id
- a.abstract_service
- a.abstract_service_en
- a.code/***use case: составное поле. А как сортировать*/
- a.status_id
- s.status
- m.measure
- m.measure_short
-
- a.manager_id
- u.login
- u.firstname
- u.middlename
- u.lastname
- u.email
- a.descr
- a.commercial_note
-
-
-
-
-
- (select count(*) from abstract_service_param_class ac where ac.abstract_service_id=a.abstract_service_id) as param_count
- c.modifier_class
- a.modifier_class_id
- (select count(*) from service s where s.abstract_service_id=a.abstract_service_id) as service_count
- (select count(*) from abstract_service_complementary ac where ac.abstract_service_id=a.abstract_service_id) as complementary_count
- (select count(*) from abstract_service_doc d where d.abstract_service_id=a.abstract_service_id) as doc_count
-
- from abstract_service a
- left outer join modifier_class c on (a.modifier_class_id=c.modifier_class_id)
- left outer join area g on (a.area_id=g.area_id)
- left outer join measure m on (a.measure_id=m.measure_id)
- left outer join status s on (a.status_id=s.status_id)
- left outer join usr u on (a.manager_id=u.usr_id)
-
- where 1=1
- order by
-
-
-
-
-
-
-
-
-
-select count(*) as cnt from abstract_service where 1=1
-
-
-
-
-
-
-
-
-
-
-
-
- Абстрактные услуги
-
-
-
-
-
-
-
-
-
- select c.param_class_id, c.param_class, m.measure_short
- from param_class c
- left outer join measure m on (c.measure_id=m.measure_id)
- order by 2
-
-
-
-
-
-
-
-
-
-
-
-
- Единица измерения:
- #qParamClass.measure#(нет)
-
- Вариант компонента либо фиксируется в варианте услуги, либо выбирается при формировании спецификации
-
-
-
-
-
Множественный
-
- checked />
- Если отметка стоит, то для экземпляра услуги можно выбирать несколько вариантов компонента, например, несколько типов диска
-
-
-
-
-
Сортировка
-
-
- Целое число - порядок, в котором Компонент будет выводиться в составе данной услуги. Рекомендуется ставить через 100, чтобы потом удобнее было тасовать
-
-Это шаблон для компонента экземпляра услуги (строки спецификации). Если в компонентах услуги определен Компонент, а не конкретный вариант компонента, то нужно присвоить цены всем компонентам этого класса, которые актуальны для данной услуги. Это требуется не только для назначения цен, но и для ограничения списка возможных вариантов выбора компонента для данной услуги. *** Может быть, вместо "компонент" нужно ввести термин "тип компонента", потому что это не экземпляр. Например, Компонент - дисковое пространство, а компонент - дисковое пространство SSD, это уточнение класса компонента, но не конкретный объем на конкретном СХД, и даже не конкретная дисковая квота в рамках контракта (спецификации)
-
-
-
-
-
-
-
Реализации (конкретные параметры вариантов услуг), использующих данный компонент
-
-
- select
- ac.abstract_service_param_class_id
- ,g.area_code
- ,s.abstract_service_id
- ,s.service_id
- ,a.abstract_service
- ,a.code
- ,sp.service_param_id
- ,ac.param_class_id
- ,pc.param_class
- ,p.param_id
- ,p.param
- ,p.code as param_code
- ,p.sort
- ,s.modifier_id /*всегда берем ключ от той таблицы, к которой присоединяем - если нарушена ссылка, останется больше информации*/
- ,m.modifier
- ,a.modifier_class_id
- ,mc.modifier_class
- ,m.code as modifier_code
- ,u.measure_short
- from abstract_service_param_class ac
- left outer join param_class pc on (ac.param_class_id=pc.param_class_id)
- left outer join service_param sp on (ac.abstract_service_param_class_id=sp.abstract_service_param_class_id)
- left outer join param p on (ac.param_class_id=p.param_class_id AND sp.param_id=p.param_id)/***условие выглядит избыточно жестким, сразу из класса и экземпляра, а зачем*/
- left outer join service s on (sp.service_id=s.service_id)
- left outer join abstract_service a on (s.abstract_service_id=a.abstract_service_id) /*** тут снова развилка, можно взять из шаблона, а можно из экземпляра... нельзя ли устранить неоднозначность*/
- left outer join area g on (a.area_id=g.area_id)
- left outer join modifier m on (s.modifier_id=m.modifier_id)
- /*** тут еще можно присоединить класс модификатора, и тоже варианты - из шаблона или экземпляра... но экземпляр бывает пустым*/
- left outer join modifier_class mc on (mc.modifier_class_id=m.modifier_class_id) /*кажется, в данном случае правильно по шаблону*/
- left outer join measure u on (pc.measure_id=u.measure_id)/***единица измерения из класса может быть переопределена - может, здесь вообще без нее обойтись... цены-то нет. А в цене единица должна быть зафиксирована*/
- where ac.abstract_service_param_class_id=
- order by p.sort, ac.abstract_service_param_class_id
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- select distinct
- a.abstract_service_id
- ,a.code
- ,a.abstract_service
- ,(select count(*) from service s where s.abstract_service_id=a.abstract_service_id) as svc_cnt
- ,(select count(*) from abstract_service_param_class ac where ac.abstract_service_id=a.abstract_service_id) as param_cnt
- from abstract_service a
- where a.area_id=
- order by a.code, a.abstract_service
-
-
-
-
Абстрактные услуги (#qAbstractService.recordCount#)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/contract.cfm b/contract.cfm
index 4a75e97..a5711e9 100644
--- a/contract.cfm
+++ b/contract.cfm
@@ -140,56 +140,7 @@
-
-
-
-
- select
- s.specification_id
- ,s.specification
- ,(select count(*) from specification_item i where i.specification_id=s.specification_id) as item_cnt
- /*,(select count(*) from specification_version v where v.specification_id=s.specification_id) as version_cnt*/
- from specification s
- where s.contract_id=
- order by 1
-
-
-
-
Спецификации (#qSpecification.recordCount#)
-
-
-
-
-
-
-
- Как правило, в договоре 1 спецификация, а ее версии определяются дополнительными соглашениями
-
-
-
-
-
Номер спецификации
-
Строк
-
-
-
-
-
-
-
-
-
#specification#
-
- #item_cnt#
-
-
-
-
-
-
-
+
select
@@ -244,6 +195,61 @@
любопытное последствие использования составного ключа: отпадает желание делать для сущности самостоятельный реестр (может быть, только если есть явная сущность-владелец, как договор для соглашения). Это аналогично отразится на структуре ReST API URL, если вдруг
+
+
+
+
+
+
+ select
+ s.specification_id
+ ,s.specification
+ ,s.descr
+ ,(select count(*) from specification_item i where i.specification_id=s.specification_id) as item_cnt
+ /*,(select count(*) from specification_version v where v.specification_id=s.specification_id) as version_cnt*/
+ from specification s
+ where s.contract_id=
+ order by 1
+
+
+
+
Спецификации (#qSpecification.recordCount#)
+
+
+
+
+
+
+
+ Как правило, в договоре 1 спецификация, а ее версии определяются дополнительными соглашениями
+
+
+
+
+
Номер спецификации
+
Строк
+
Описание
+
+
+
+
+
+
+
+
+
#specification#
+
+ #item_cnt#
+
+
#descr#
+
+
+
+
+
+
diff --git a/contract_ls.cfm b/contract_ls.cfm
index 8edaf11..1aa5226 100644
--- a/contract_ls.cfm
+++ b/contract_ls.cfm
@@ -26,7 +26,8 @@
d.contractd.dt_contractd.descr
- (select count(*) from agreement s where s.contract_id=d.contract_id) as spec_cnt
+ (select count(*) from agreement s where s.contract_id=d.contract_id) as agreement_cnt
+ (select count(*) from specification s where s.contract_id=d.contract_id) as spec_cnt
from contract d
join contragent c on (d.contragent_id=c.contragent_id)
@@ -97,13 +98,13 @@ select count(*) as cnt from contract where 1=1
-
+
diff --git a/price_json.cfm b/deal_diff_json.cfm
similarity index 95%
rename from price_json.cfm
rename to deal_diff_json.cfm
index 4f477e2..fb03d68 100644
--- a/price_json.cfm
+++ b/deal_diff_json.cfm
@@ -5,12 +5,7 @@
-
-
-
-
-
diff --git a/etc/db/set_env.cmd b/etc/db/set_env.cmd
index 34f4fc0..706854a 100644
--- a/etc/db/set_env.cmd
+++ b/etc/db/set_env.cmd
@@ -1,8 +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
+setx datasource_spec_class org.postgresql.Driver /M
+setx datasource_spec_connectionString jdbc:postgresql://localhost:5432/spec /M
+setx datasource_spec_username postgres /M
+setx datasource_spec_password encrypted:8ea2101f286dfcf2947cb2162e927cb769b3f845b6d4c57ef2ae89463d72d97842a2228c7ba562a24ee8eaf728350ab6 /M
+setx datasource_spec_connectionLimit 5 /M
pause
diff --git a/etc/db/spec.sql b/etc/db/spec.sql
index 11205ec..067c9c0 100644
--- a/etc/db/spec.sql
+++ b/etc/db/spec.sql
@@ -65,13 +65,12 @@ insert into contract (contragent_id,contract,dt_contract) values (2,'test',CURRE
--
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 - , , ,
+ ,deal_uid uuid NOT NULL DEFAULT gen_random_uuid() -- , -
,descr text NULL
,dt_created timestamptz NOT NULL default CURRENT_TIMESTAMP --
@@ -82,6 +81,8 @@ create table agreement (
);
ALTER TABLE agreement OWNER TO dbo;
insert into agreement (contract_id,agreement_version,dt_agreement,is_actual) values (1,0,CURRENT_TIMESTAMP,true);
+-- alter table agreement add deal_uid uuid NOT NULL DEFAULT gen_random_uuid();
+CREATE INDEX IF NOT EXISTS UX_deal_uid ON agreement(deal_uid);
-- , ( )
drop table if exists specification CASCADE;
diff --git a/etc/spec.txt b/etc/spec.txt
index 9ec0768..57fed07 100644
--- a/etc/spec.txt
+++ b/etc/spec.txt
@@ -1,3 +1,22 @@
+2025-06-14 11:02:46
+Центральный селект
+select * from specification_item_version siv
+join specification_item si on (siv.specification_item_uid=si.specification_item_uid)
+join specification s on (si.specification_id=s.specification_id)
+join agreement a on (s.contract_id=a.contract_id AND siv.agreement_version=a.agreement_version)
+Теперь дифференциальный вариант. Для каждого варианта строки можно найти предыдущий (если он есть) и с ним сравнивать.
+Нужно ли добавить типы экземпляров инсталл и пейг? С пейгом чтобы получить дифф, нужно количество - иначе мы можем дифф только на цену. Если мы хотим брать во внимание дату НОУ, то без количества разницу в стоимости мы не получим.
+Как вообще учитывать дату в диффе? Или никак, просто передавать.
+
+16:12 12.06.2025
+Предлагается использовать конечную дату только для завершения действия всей строки спеки. Тогда ее просто убрать из версии? Некорректно, она же возникает в какой-то версии.
+Если захочется делать одним соглашением 2 изменения строки, можно соглашению сделать суррогатный ключ, а номер соглашения для версии строки убрать из первичного ключа
+2025-06-10
+Отчет-дифф
+Сделать автосоздание нового соглашения (например, если самое новое не действует - аттачить изменения к нему, если действует - создать новое не действующее)
+Сделать прозрачно-версионное редактирование спецификации
+Форма-отчет версии спецификации доделать
+
2025-06-02
можно отметить, что тут смешаны версионность допника и темпоральность строки
Можно сделать таблицу, собирающую версии строк, чтобы не искать каждый раз (а может, нам не нужен снапшот на произвольную дату? или версию допника - вот, я уже запутался)
diff --git a/export1.cfm b/export1.cfm
deleted file mode 100644
index 9c89550..0000000
--- a/export1.cfm
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- #i18("Экспорт","Export")#
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/inc/menu.cfm b/inc/menu.cfm
index 66f1283..25c7d7d 100644
--- a/inc/menu.cfm
+++ b/inc/menu.cfm
@@ -14,6 +14,7 @@
+
Справочники
diff --git a/modifier.cfm b/modifier.cfm
deleted file mode 100644
index 478b4fa..0000000
--- a/modifier.cfm
+++ /dev/null
@@ -1,237 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- pageInfo=#pageInfo#
- id="#d.modifier_id#"
- status=#pageInfo.status#
- trackOut="tr"
- idAttributesOut="id"
-/>
-
-
- select
- a.login as creator, a.shortname as creator_shortname, m.login as updater, m.shortname as updater_shortname
- from #pageInfo.entity# e
- left outer join usr a on (e.creator_id=a.usr_id)
- left outer join usr m on (e.updater_id=m.usr_id)
- where e.#pageInfo.key#=
-
-
-
- select
- m.modifier_id, c.modifier_class
- from modifier m
- left outer join modifier_class c on (m.modifier_class_id=c.modifier_class_id)
- where m.modifier_id=
-
-
-
-
-
-
- Характеристика (модификатор)
-
- #qDecoration.modifier_class#
- [#d.modifier_class_id#]:
- #d.modifier#
- [#d.modifier_id#]
-
-
-
-
-
-
-
#status.errorMessage#
-
-
-
-
-
-
-
-
-
-
-
-
Класс характеристики
-
-
- select modifier_class_id, modifier_class
- from modifier_class
- order by 2
-
-
- />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Характеристика (RUS)
-
-
-
-
-
-
-
Характеристика (ENG)
-
-
-
-
-
-
-
Код
-
-
-
-
-
-
-
Сортировка
-
-
- Целое число - порядок, в котором Характеристика будет выводиться в списке (или соответствующий Вариант услуги в списке вариантов). Рекомендуется ставить через 100, чтобы потом удобнее было тасовать
-
-
-
-
-
-
-
-
-
- select distinct
- s.service_id
- ,a.abstract_service_id
- ,a.code as abstract_service_code
- ,a.abstract_service
- ,m.modifier
- from service s
- left outer join modifier m on (s.modifier_id=m.modifier_id)
- left outer join abstract_service a on (s.abstract_service_id=a.abstract_service_id)
- where s.modifier_id=
- order by a.code, a.abstract_service
-
-
-
-
Конкретные услуги (варианты услуги) определяются значением характеристики-модификатора. В тривиальном случае услуга может иметь только один вариант. Разные варианты услуги могут иметь различный состав компонентов (более того, этот состав определяется именно для конкретной услуги), например, в разных кластерах виртуализации может быть доступен разный набор типов дисков.
-
Один и тот же класс модификатора может применяться к разным абстрактным услугам.
-
Модификатор может состоять из нескольких переменных, например, система виртуализации + частота процессора. В этом случае в справочник нужно включить все актуальные комбинации
-
-
diff --git a/modifier_class.cfm b/modifier_class.cfm
deleted file mode 100644
index aaa81c5..0000000
--- a/modifier_class.cfm
+++ /dev/null
@@ -1,205 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- pageInfo=#pageInfo#
- id="#d.modifier_class_id#"
- status=#pageInfo.status#
- trackOut="tr"
- idAttributesOut="id"
-/>
-
-
- select
- a.login as creator, a.shortname as creator_shortname, m.login as updater, m.shortname as updater_shortname
- from #pageInfo.entity# e
- left outer join usr a on (e.creator_id=a.usr_id)
- left outer join usr m on (e.updater_id=m.usr_id)
- where e.#pageInfo.key#=
-
-
-
-
-
- Класс характеристики (модификатора)
-
- #d.modifier_class#
- [#d.modifier_class_id#]
-
-
-
-
-
-
-
-
-
- select
- a.abstract_service_id
- ,a.code
- ,a.abstract_service
- ,a.abstract_service_en
- from modifier_class c
- join abstract_service a on (c.modifier_class_id = a.modifier_class_id)
- where c.modifier_class_id=
- order by 2
-
-
-
-
Используется абстрактными услугами (#qAbstractService.recordCount#)
-
- #gridFooter#
-
-
-
\ No newline at end of file
diff --git a/price_rpt1.cfm b/price_rpt1.cfm
deleted file mode 100644
index 95e0b26..0000000
--- a/price_rpt1.cfm
+++ /dev/null
@@ -1,239 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- select
-
- prc.service_price_id
- prc.service_param_price_id
- prm.pricing_model
- prm.pricing_model_short
- prm.pricing_model_code
- prm.pricing_model_id
- prc.pricing_period
- prc.rating_period
- prc.price
- case when price*.95 > coalesce(min_price,0) then price*.95 else min_price end as discount_price/***/
- min_price
-
- a.abstract_service_id
- s.service_id
-
- g.area_code
- g.area
- g.analytic_code
- g.area_en
-
- u.status
- u.status_en
-
-
- a.code
- m.code as modifier_code
- p.code as param_code
-
- a.abstract_service
- a.abstract_service_en
-
- m.modifier_id
-
- mc.modifier_class
- m.modifier
- mc.modifier_class_en
- m.modifier_en
-
- sp.service_param_id
- pc.param_class_id
- pc.param_class
-
- p.param
-
- p.param_id
-
- case when p.param_id IS NULL then se.measure_short else e.measure_short end as measure_short
- case when p.param_id IS NULL then se.measure_short_en else e.measure_short_en end as measure_short_en
-
-
- from (
- select
- t.service_param_price_id, t.price, t.min_price, t.service_param_id, t.pricing_model_id
- , null as service_price_id, sp.service_id, t.pricing_period, t.rating_period
- from service_param_price t join service_param sp on (t.service_param_id=sp.service_param_id)
- union all
- select
- null, st.price, st.min_price, null, st.pricing_model_id, st.service_price_id, st.service_id, st.pricing_period, st.rating_period
- from service_price st
- ) prc
- left outer join service s on (prc.service_id=s.service_id)
- left outer join service_param sp on (prc.service_param_id=sp.service_param_id)
- left outer join abstract_service a on (s.abstract_service_id=a.abstract_service_id)
- left outer join modifier m on (s.modifier_id=m.modifier_id)
- left outer join modifier_class mc on (m.modifier_class_id=mc.modifier_class_id)
- left outer join abstract_service_param_class ac on (sp.abstract_service_param_class_id=ac.abstract_service_param_class_id)
- left outer join param_class pc on (ac.param_class_id=pc.param_class_id)
- left outer join param p on (sp.param_id=p.param_id)
- left outer join measure e on (p.measure_id=e.measure_id)
- left outer join measure se on (s.measure_id=se.measure_id)
- left outer join area g on (a.area_id=g.area_id)
- left outer join status u on (a.status_id=u.status_id)
- left outer join pricing_model prm on (prc.pricing_model_id=prm.pricing_model_id)
- where 1=1
- order by g.analytic_code,a.abstract_service, s.service_id, m.sort, m.modifier_id, prc.pricing_model_id, ac.sort, coalesce(p.sort,0), p.param_id
-
-
-
-
-
-select (select count(*) from service_param_price) + (select count(*) from service_price) as cnt;
-
-
-
-
-
-
-
-
-
-
-
- #i18("Прайс-лист на компоненты","Resource Price List")#
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Это цена услуги, не включая компоненты. Если компоненты есть, их суммарная стоимость (количество по каждому компоненту, умноженное на цену этого компонента) добавляется к цене услуги. Если для всех компонентов количество 0, то останется только цена услуги. Если в спецификации количество для данной услуги больше 1, то полученная сумма будет умножена на количество по данной услуге. Если стоимость, как для большинства композитных услуг, формируется только из компонентов, цена самой услуги равна нулю или (что правильнее) отсутствует в прайс-листе.
-
-
\ No newline at end of file
diff --git a/service_price_del.cfm b/service_price_del.cfm
deleted file mode 100644
index 9504f24..0000000
--- a/service_price_del.cfm
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- select t.service_price_id, t.price, t.cost, t.min_price, t.status, t.dt_from, t.dt_to
- ,g.area_code, a.code, a.abstract_service
- ,m.modifier, m.code as modifier_code, mc.modifier_class
- from service_price t
- left outer join service s on (t.service_id=s.service_id)
- left outer join abstract_service a on (s.abstract_service_id=a.abstract_service_id)
- left outer join area g on (a.area_id=g.area_id)
- left outer join modifier m on (s.modifier_id=m.modifier_id)
- left outer join modifier_class mc on (m.modifier_class_id=mc.modifier_class_id)
-
- where t.service_price_id=
-
-
-
-
-
-
-
- Удаление цены услуги
- #request.skuCode(area_code,code,modifier_code)#
- #abstract_service#
- #modifier#
- с #dateFormat(dt_from,"DD.MM.YYYY")#
- по #dateFormat(dt_to,"DD.MM.YYYY")#
- #price#
- [#service_price_id#]
-
-
-
-
-
-
-
-#markup#
-
-
\ No newline at end of file
diff --git a/site.cfm b/site.cfm
deleted file mode 100644
index aa618d7..0000000
--- a/site.cfm
+++ /dev/null
@@ -1,129 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- pageInfo=#pageInfo#
- id="#d.site_id#"
- status=#pageInfo.status#
- trackOut="tr"
- idAttributesOut="id"
-/>
-
-
-
- select
- a.login as creator, a.shortname as creator_shortname, m.login as updater, m.shortname as updater_shortname
- from #pageInfo.entity# e
- left outer join usr a on (e.creator_id=a.usr_id)
- left outer join usr m on (e.updater_id=m.usr_id)
- where e.#pageInfo.key#=
-
-
-
-
-
-
- Площадка
-
- #d.site#
- [#d.site_id#]
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/site_ls.cfm b/site_ls.cfm
deleted file mode 100644
index a548557..0000000
--- a/site_ls.cfm
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- select
-
- m.site_id
- m.site
- m.site_en
-
- from site m
- where 1=1
- order by
-
-
-
-
-
-
-
-
-
-select count(*) as cnt from site where 1=1
-
-
-
-
-
-
-
-
-
-
-
- Площадки
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#site_id#
-
#site#
-
#site_en#
-
-
-
-
-
- #gridFooter#
-
-
-
\ No newline at end of file
diff --git a/specification.cfm b/specification.cfm
index cb7ac2c..43ee26e 100644
--- a/specification.cfm
+++ b/specification.cfm
@@ -163,6 +163,10 @@
join agreement a on (siv.agreement_version=a.agreement_version AND a.contract_id=s.contract_id)
where siv.specification_item_uid=i.specification_item_uid AND a.is_actual
order by siv.agreement_version desc limit 1) as agreement
+ ,(select a.is_actual from specification_item_version siv
+ join agreement a on (siv.agreement_version=a.agreement_version AND a.contract_id=s.contract_id)
+ where siv.specification_item_uid=i.specification_item_uid AND a.is_actual
+ order by siv.agreement_version desc limit 1) as is_actual
,(select a.dt_agreement from specification_item_version siv
join agreement a on (siv.agreement_version=a.agreement_version AND a.contract_id=s.contract_id)
where siv.specification_item_uid=i.specification_item_uid AND a.is_actual
@@ -198,7 +202,7 @@
@@ -283,7 +290,7 @@
where si.specification_id=s.specification_id
AND iv.agreement_version=a.agreement_version
)*/
- order by 2
+ order by a.agreement_version
@@ -303,9 +310,10 @@
diff --git a/specification_item.cfm b/specification_item.cfm
index 50589a0..65b0d75 100644
--- a/specification_item.cfm
+++ b/specification_item.cfm
@@ -180,7 +180,7 @@
Версии строки (#qSpecificationItemVersion.recordCount#) (история инстанса)
-
+
diff --git a/specification_item_version.cfm b/specification_item_version.cfm
index 9a0d15e..b014d0c 100644
--- a/specification_item_version.cfm
+++ b/specification_item_version.cfm
@@ -18,7 +18,8 @@
-
+
+
+
+ select agreement_version, quantity, price, specification_item_version
+ from specification_item_version
+ where specification_item_uid=
+ order by agreement_version desc limit 1
+
+
+
+
+
+
+
-
+
-
-
-
+
+
+
@@ -60,7 +73,7 @@
-
+
select i.svc_id, v.svc
,s.specification_id, s.specification, s.contract_id
,d.contract, d.dt_contract, d.contragent_id
@@ -74,45 +87,8 @@
-
-
-
-
-
-
-
-
+
select
a.login as creator, a.shortname as creator_shortname, m.login as updater, m.shortname as updater_shortname
from specification_item_version e
@@ -169,7 +145,7 @@
select a.agreement_version, a.agreement, a.dt_agreement
from agreement a
where a.contract_id=
- order by 1
+ order by 1 desc
+ Если оставлено пустым, то версия действует до начала действия следующей. Заполнять, если хотим прекратить услугу постоянно или временно
@@ -211,11 +188,11 @@
-
+
-
+
diff --git a/specification_ls.cfm b/specification_ls.cfm
index cb1633b..fb21bb5 100644
--- a/specification_ls.cfm
+++ b/specification_ls.cfm
@@ -17,10 +17,18 @@
select
s.specification_id
+ k.contragent
+ d.contragent_id
+ d.contract
+ d.dt_contract
+ s.contract_ids.specification(select count(*) from specification_item i where i.specification_id=s.specification_id) as item_count
+ (select count(*) from agreement a where a.contract_id=s.contract_id) as agreement_count
from specification s
+ left outer join contract d on (s.contract_id=d.contract_id)
+ left outer join contragent k on (d.contragent_id=k.contragent_id)
where 1=1
order by
@@ -69,8 +77,11 @@ select count(*) as cnt from specification where 1=1
-
-
+
+
+
+
+
@@ -82,6 +93,9 @@ select count(*) as cnt from specification where 1=1
#specification#
#item_count#
+
#contract# #dateFormat(dt_contract,'DD.MM.YYYY')#
+
#agreement_count#
+
#contragent#
diff --git a/specification_version.cfm b/specification_version.cfm
index 43a1b2a..c508eaa 100644
--- a/specification_version.cfm
+++ b/specification_version.cfm
@@ -39,7 +39,9 @@
status=#pageInfo.status#
trackOut="tr"
idAttributesOut="id"
+ queryString="specification_id=#specification_id#&agreement_version=#agreement_version#"
/>
+
@@ -57,13 +59,30 @@
left outer join contragent c on (d.contragent_id=c.contragent_id)
where d.contract_id=
+
- select a.agreement, a.agreement_version, a.dt_agreement
+ select a.agreement, a.agreement_version, a.dt_agreement, a.is_actual
from agreement a
where a.contract_id=
AND a.agreement_version=
+
+ select
+ a.agreement
+ ,a.dt_agreement
+ ,a.agreement_version
+ ,a.is_actual
+ ,(select count(*) from specification_item si
+ join specification_item_version iv on (si.specification_item_uid=iv.specification_item_uid)
+ where si.specification_id=
+ AND iv.agreement_version=a.agreement_version
+ ) as changed_item_cnt
+ from agreement a
+ where a.contract_id=
+ order by a.agreement_version
+
+
-
- ,(select siv.agreement_version from specification_item_version siv
- join agreement a on (siv.agreement_version=a.agreement_version AND a.contract_id=s.contract_id)
- where siv.specification_item_uid=i.specification_item_uid AND a.is_actual
- order by siv.agreement_version desc limit 1) as agreement_version
- ,(select a.agreement from specification_item_version siv
- join agreement a on (siv.agreement_version=a.agreement_version AND a.contract_id=s.contract_id)
- where siv.specification_item_uid=i.specification_item_uid AND a.is_actual
- order by siv.agreement_version desc limit 1) as agreement
- ,(select a.dt_agreement from specification_item_version siv
- join agreement a on (siv.agreement_version=a.agreement_version AND a.contract_id=s.contract_id)
- where siv.specification_item_uid=i.specification_item_uid AND a.is_actual
- order by siv.agreement_version desc limit 1) as dt_agreement
- ,(select siv.specification_item_version from specification_item_version siv
- join agreement a on (siv.agreement_version=a.agreement_version AND a.contract_id=s.contract_id)
- where siv.specification_item_uid=i.specification_item_uid AND a.is_actual
- order by siv.agreement_version desc limit 1) as specification_item
- ,(select siv.quantity from specification_item_version siv
- join agreement a on (siv.agreement_version=a.agreement_version AND a.contract_id=s.contract_id)
- where siv.specification_item_uid=i.specification_item_uid AND a.is_actual
- order by siv.agreement_version desc limit 1) as quantity
- ,(select siv.price from specification_item_version siv
- join agreement a on (siv.agreement_version=a.agreement_version AND a.contract_id=s.contract_id)
- where siv.specification_item_uid=i.specification_item_uid AND a.is_actual
- order by siv.agreement_version desc limit 1) as price
- ,(select siv.dt_from from specification_item_version siv
- join agreement a on (siv.agreement_version=a.agreement_version AND a.contract_id=s.contract_id)
- where siv.specification_item_uid=i.specification_item_uid AND a.is_actual
- order by siv.agreement_version desc limit 1) as dt_from
- ,(select siv.dt_to from specification_item_version siv
- join agreement a on (siv.agreement_version=a.agreement_version AND a.contract_id=s.contract_id)
- where siv.specification_item_uid=i.specification_item_uid AND a.is_actual
- order by siv.agreement_version desc limit 1) as dt_to
,(select count(*) from specification_item_version siv where siv.specification_item_uid=i.specification_item_uid) as item_version_count
+ ,ver.agreement_version
+ ,ver.specification_item_uid
+ ,ver.agreement
+ ,ver.dt_agreement
+ ,ver.is_actual
+ ,ver.specification_item_version as specification_item
+ ,ver.quantity
+ ,ver.price
+ ,ver.dt_from
+ ,ver.dt_to
from specification_item i
join specification s on (i.specification_id=s.specification_id)
- --left outer join ()
+ join (select
+ siv.agreement_version
+ ,siv.specification_item_uid
+ ,a.agreement
+ ,a.contract_id
+ ,a.dt_agreement
+ ,a.is_actual
+ ,siv.specification_item_version
+ ,siv.quantity
+ ,siv.price
+ ,siv.dt_from
+ ,siv.dt_to
+ ,ii1.specification_id
+ from specification_item_version siv
+ join specification_item ii1 on (siv.specification_item_uid=ii1.specification_item_uid)
+ join specification is1 on (ii1.specification_id=is1.specification_id)
+ join agreement a on (siv.agreement_version=a.agreement_version AND is1.contract_id=a.contract_id)
+ where a.agreement_version = (select max(iiv.agreement_version)
+ from specification_item_version iiv
+ join specification_item ii on (iiv.specification_item_uid=ii.specification_item_uid)
+ join specification isp on (ii.specification_id=isp.specification_id)
+ join agreement ia on (isp.contract_id=ia.contract_id AND iiv.agreement_version=ia.agreement_version)
+ where iiv.specification_item_uid=siv.specification_item_uid
+
+ AND ia.is_actual
+
+ AND ia.agreement_version <=
+ )
+ ) ver on (i.specification_item_uid=ver.specification_item_uid AND s.contract_id=ver.contract_id AND ver.specification_id=s.specification_id)
+
left outer join svc on (i.svc_id=svc.svc_id)
where i.specification_id=
order by 2
+
+