pageInfo=#pageInfo# id="#d.contract_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 contract g left outer join usr a on (g.creator_id=a.usr_id) left outer join usr m on (g.updater_id=m.usr_id) where g.contract_id= Договор #d.contract# [#d.contract_id#]
ID
#d.contract_id#
Номер договора
Дата договора
Контрагент
select c.contragent_id, c.contragent from contragent c order by 2
Создано
#dateFormat(d.dt_created,'YYYY-MM-DD')# #timeFormat(d.dt_created,'HH:MM')# #qDecoration.creator# (#qDecoration.creator_shortname#)       Изменено #dateFormat(d.dt_updated,'YYYY-MM-DD')# #timeFormat(d.dt_updated,'HH:MM')# #qDecoration.updater# (#qDecoration.updater_shortname#)
select a.contract_id ,a.agreement_version ,a.agreement ,a.probability_perc ,a.dt_agreement ,a.is_actual ,(select count(*) from specification_item_version iv join specification_item i on (iv.specification_item_uid=i.specification_item_uid AND iv.agreement_version=a.agreement_version) join specification s on (i.specification_id=s.specification_id AND s.contract_id=a.contract_id) ) as items_changed ,(select sum(quantity*price) 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) where a.contract_id=s.contract_id AND a.agreement_version=siv.agreement_version) as agreement_sum ,(select sum(quantity*price)*a.probability_perc/100 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) where a.contract_id=s.contract_id AND a.agreement_version=siv.agreement_version) as agreement_sum_p from agreement a where a.contract_id= order by a.agreement_version

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

Соглашение - это пакет изменений спецификации. Базовое соглашение соответствует исходной спецификации договора (переход от несуществующей спецификации). Остальные - дополнительным соглашениям. Создание базового соглашения надо автоматизировать, но пока вручную.
Номер соглашения (версия) Название Дата Вероятность Действует Строк изменено Сумма измененных Сумма изм. с в.
#agreement_version# #agreement# #dateFormat(dt_agreement,'DD.MM.YYYY')# #probability_perc# #items_changed# #nFmt(agreement_sum)# #nFmt(agreement_sum_p)#
любопытное последствие использования составного ключа: отпадает желание делать для сущности самостоятельный реестр (может быть, только если есть явная сущность-владелец, как договор для соглашения). Это аналогично отразится на структуре 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#
При создании договора сразу создавать спецификацию и базовое соглашение