From 118012e17ea9e89cde0b62c033b7af59123e1c08 Mon Sep 17 00:00:00 2001 From: msyu Date: Fri, 6 Jun 2025 06:03:11 +0300 Subject: [PATCH] intermediate draft --- agreement.cfm | 229 +++++++++++++++++++++++++++++++++ contract.cfm | 61 ++++++++- etc/db/spec.sql | 3 +- lib/dispatch_detail.cfm | 8 +- lib/generic_page_info.cfc | 4 +- lib/prepare_detail.cfm | 9 +- specification.cfm | 9 +- specification_item.cfm | 32 +++-- specification_item_version.cfm | 146 ++++++++++----------- 9 files changed, 394 insertions(+), 107 deletions(-) create mode 100644 agreement.cfm diff --git a/agreement.cfm b/agreement.cfm new file mode 100644 index 0000000..a6a62c9 --- /dev/null +++ b/agreement.cfm @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + select coalesce(max(agreement_version)+1,0) as next_version + from agreement + where contract_id= + + + + + + + + + + + + + + + + + + + + pageInfo=#pageInfo# + id="" + queryString="contract_id=#d.contract_id#&agreement_version=#d.agreement_version#" + 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 agreement 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.contract_id= + AND e.agreement_version= + + + + select d.contract_id, d.contract, d.dt_contract, c.contragent_id, c.contragent + from contract d + left outer join contragent c on (d.contragent_id=c.contragent_id) + where d.contract_id= + + + + + + Соглашение + + #d.agreement# + [#d.agreement_version#] + + + + + + +
#status.errorMessage#
+
+ + + + + + + +
+ + + + +
+
Договор
+
+ #qContract.contract# #dateFormat(qContract.dt_contract,'DD.MM.YYYY')# + а как у нас поведет себя трек для составных ключей? +
+
+ +
+
Номер версии
+
+ #d.agreement_version# (некорректно, в одном месте версией называется номер, а в другом сущность, и это отразилось в именовании таблиц и полей) +
+
+ +
+
Соглашение (номер для печати)
+
+ +
+
+ +
+
Дата соглашения
+
+ + + для упрощения можно позволить соглашению иметь обратную силу - то есть просто не проверять, что дата изменения строки спецификации не раньше даты соглашения +
+
+ +
+
Действует
+
+ checked/> + если соглашение действует, это означает ровно то, что его правки учитываются при формировании спецификации на любую дату +
+
+ +
+
Описание
+
+ +
+
+ +
+
Создано
+
+ #dateFormat(d.dt_created,'DD.MM.YYYY')# #timeFormat(d.dt_created,'HH:MM')# + #qDecoration.creator# (#qDecoration.creator_shortname#) +       + Изменено + #dateFormat(d.dt_updated,'DD.MM.YYYY')# #timeFormat(d.dt_updated,'HH:MM')# + #qDecoration.updater# (#qDecoration.updater_shortname#) +
+
+
+Соглашение просто объединяет правки строк спецификации в пакет и оформляет их документом (в случае с допником). То есть версии строк существуют не сами по себе, а связаны с конкретным соглашением. Между прочим, это означает, что в рамках одного доп. соглашения мы не можем сделать 2 изменения строки, например 2 разные цены с разных дат - нужно оформлять отдельными допниками. +Можно назвать нулевое соглашение базовым, а остальные дополнительными. (наверное, можно было бы синтезировать базовое соглашение с NULL номером) +Есть ли понятие текущего соглашения? +Есть ли понятие действующего соглашения, или у нас все действуют, или строки из недействующего соглашения не должны участвовать в цепочке (тогда, видимо, не удастся активировать соглашение задним числом, цепочка может разрушиться) +Если к соглашению нет измененных строк спецификации, в нем нет большого смысла (но изменения строк надо к чему-то приписывать). +Надо было начать с моделирования данных в таблицах, до интерфейса? +
+ + + + + + + + + + + + + #agreement_item_uid# + #svc# + #code# + #item_version_count# + + + + + + + + ---> + + + diff --git a/contract.cfm b/contract.cfm index a1b3fdd..a11866e 100644 --- a/contract.cfm +++ b/contract.cfm @@ -30,6 +30,8 @@ + + pageInfo=#pageInfo# @@ -146,6 +148,7 @@ 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 @@ -162,13 +165,14 @@ - + Как правило, в договоре 1 спецификация, а ее версии определяются дополнительными соглашениями + @@ -180,6 +184,9 @@ +
Номер спецификации СтрокВерсий
#specification# #item_cnt# + + #version_cnt# @@ -187,6 +194,58 @@
+ + + select + a.contract_id + ,a.agreement_version + ,a.agreement + ,a.dt_agreement + ,a.is_actual + from agreement a + where a.contract_id= + order by 1 + + + +

Соглашения (#qAgreement.recordCount#)

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Номер соглашения (версия)НазваниеДатаДействует
+ + #agreement_version##agreement##dateFormat(dt_agreement,'DD.MM.YYYY')# + +
+ любопытное последствие использования составного ключа: отпадает желание делать для сущности самостоятельный реестр (может быть, только если есть явная сущность-владелец, как договор для соглашения) diff --git a/etc/db/spec.sql b/etc/db/spec.sql index 959ab30..5aa8049 100644 --- a/etc/db/spec.sql +++ b/etc/db/spec.sql @@ -68,7 +68,7 @@ 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_version int NOT NULL -- , ,agreement varchar(255) NULL -- ,dt_agreement timestamptz NOT NULL -- , ( , ) ,is_actual boolean NOT NULL -- , 1 - , , , @@ -101,6 +101,7 @@ insert into specification (specification,contract_id) values ('first spec',1); -- +-- , - , - , , drop table if exists specification_version CASCADE; create table specification_version ( specification_id int diff --git a/lib/dispatch_detail.cfm b/lib/dispatch_detail.cfm index 30bffcd..5c18fcb 100644 --- a/lib/dispatch_detail.cfm +++ b/lib/dispatch_detail.cfm @@ -8,16 +8,16 @@ - + - + - + - + diff --git a/lib/generic_page_info.cfc b/lib/generic_page_info.cfc index 08c50d3..a9171fe 100644 --- a/lib/generic_page_info.cfc +++ b/lib/generic_page_info.cfc @@ -1,6 +1,6 @@  - + @@ -11,7 +11,7 @@ - + diff --git a/lib/prepare_detail.cfm b/lib/prepare_detail.cfm index c98e9bc..ef083f5 100644 --- a/lib/prepare_detail.cfm +++ b/lib/prepare_detail.cfm @@ -1,4 +1,7 @@ - + + + + @@ -8,7 +11,9 @@ + + @@ -18,7 +23,7 @@ - + diff --git a/specification.cfm b/specification.cfm index 7d2d518..2d90f91 100644 --- a/specification.cfm +++ b/specification.cfm @@ -179,7 +179,7 @@ Ключ строки Услуга Код услуги - + Версий @@ -187,13 +187,12 @@ - + #specification_item_uid# #svc# - #quantity# - #price# - #item_version_count# + #code# + #item_version_count# diff --git a/specification_item.cfm b/specification_item.cfm index acbc142..c20a299 100644 --- a/specification_item.cfm +++ b/specification_item.cfm @@ -50,7 +50,6 @@ where s.svc_id= - select @@ -89,7 +88,6 @@
-
Спецификация (номер)
@@ -98,6 +96,13 @@
+
+
Ключ строки
+
+ #d.specification_item_uid# стабильный идентификатор строки +
+
+
Услуга
@@ -117,16 +122,14 @@ class="" onchange="submit();" /> - + + при наличии версий предлагается исключить изменение
- - -
+
+тут можно было бы отобразить начало и конец истории строки/инстанса
@@ -167,15 +171,15 @@

- Версии (#qSpecificationItemVersion.recordCount#) - +

diff --git a/specification_item_version.cfm b/specification_item_version.cfm index 7768d66..848d9dc 100644 --- a/specification_item_version.cfm +++ b/specification_item_version.cfm @@ -15,13 +15,18 @@ - + + - - - - + + + + + + + + @@ -32,34 +37,38 @@ pageInfo=#pageInfo# - id="#d.specification_item_uid#" + id="" + queryString="#request.thisPage#?specification_item_uid=#d.specification_item_uid#&agreement_version=#d.agreement_version#" + defaultBackUrl="specification_item.cfm?specification_item_uid=#d.specification_item_uid#" status=#pageInfo.status# trackOut="tr" idAttributesOut="id" /> - - select s.specification_id, s.specification - from specification s - where s.specification_id= + + + + select s.specification_id, s.specification, i.svc_id, d.contract, d.dt_contract, k.contragent, v.svc + from specification_item i + left join specification s on (i.specification_id=s.specification_id) + left join contract d on (s.contract_id=d.contract_id) + left join contragent k on (d.contragent_id=k.contragent_id) + left join svc v on (i.svc_id=v.svc_id) + where i.specification_item_uid= - - select s.svc, s.code, s.measure_id - from svc s - where s.svc_id= - + - Строка спецификации (экземпляр услуги) - - [#d.specification_item_uid#] - + Версия строки спецификации + [#d.specification_item_uid#]:[#d.agreement_version#] @@ -119,7 +127,7 @@ - + @@ -129,79 +137,61 @@
Спецификация (номер)
Услуга
- - select s.svc_id, s.code - from svc s - order by 2 - - - - - - + [#d.specification_item_uid#] #qSpecificationItem.svc# +
+
+ +
+
Версия
+
+ + #d.agreement_version#
- - + - - - - - - + + ---> + + - ---> +
Количество
- +
-
Стоимость
+
Цена
- - подставить сумму по позициям: - #qCost.cost# + +
@@ -222,13 +212,13 @@ - +

Компоненты (#qSpecificationItemParam.recordCount#) - + + @@ -275,8 +265,8 @@

#min_price# #price# - - + +