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= select a.agreement ,a.dt_agreement ,a.agreement_version ,a.is_actual from agreement a where a.contract_id= order by a.agreement_version Соглашение (сделка) #d.agreement# [#d.agreement_version#]
#status.errorMessage#
Договор
#qContract.contract# #dateFormat(qContract.dt_contract,'DD.MM.YYYY')# а как у нас поведет себя трек для составных ключей?
Номер версии
#d.agreement_version# (некорректный нейминг, в одном месте версией называется номер, а в другом сущность, и это отразилось в именовании таблиц и полей)
Ключ сделки
#d.deal_uid#
Вероятность
Соглашение (номер для печати)
Дата соглашения
для упрощения можно позволить соглашению иметь обратную силу - то есть просто не проверять, что дата изменения строки спецификации не раньше даты соглашения
Действует
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#)
Версии
#agreement_version# #agreement_version#  
Соглашение просто объединяет правки строк спецификации в пакет и оформляет их документом (в случае с допником). То есть версии строк существуют не сами по себе, а связаны с конкретным соглашением. Между прочим, это означает, что в рамках одного доп. соглашения мы не можем сделать 2 изменения строки, например 2 разные цены с разных дат - нужно оформлять отдельными допниками. Можно назвать нулевое соглашение базовым, а остальные дополнительными. (наверное, можно было бы синтезировать базовое соглашение с NULL номером, но NULL проблематично включить в первичный ключ, а любое специальное значение будет нарушать внешний ключ) Дата соглашения не имеет никакого отношения к датам актуальности строк (это чисто формальное поле) Предполагается, что даты актуальности строк согласованы с номерами версий (можно обнаруживать и репортить ошибки) Поскольку соглашение не может дважды изменить строку спецификации, можно говорить о версии спецификации в соответствии с соглашением Есть ли у нас понятие текущего соглашения? Есть ли понятие действующего соглашения, или у нас все действуют, или строки из недействующего соглашения не должны участвовать в цепочке (тогда, видимо, не удастся активировать соглашение задним числом, цепочка может разрушиться) Если к соглашению нет измененных строк спецификации, в нем нет большого смысла (но изменения строк надо к чему-то приписывать). Надо было начать с моделирования данных в таблицах, до интерфейса?
select iv.specification_item_uid ,iv.agreement_version /*лучше читается, когда все одинаково берется из резалтсета*/ ,i.svc_id ,i.pricing_model_id ,p.pricing_model_short ,svc.svc ,svc.code ,iv.specification_item_version /*it is printable name not number*/ ,iv.quantity ,iv.price ,iv.price*iv.quantity as cost ,iv.dt_from ,iv.dt_to ,i.specification_id ,s.specification ,s.contract_id ,d.contract ,d.dt_contract ,d.contragent_id ,k.contragent ,ver.agreement_version as prev_version ,ver.price as prev_price ,ver.quantity as prev_quantity ,ver.dt_from as prev_dt_from ,ver.dt_to as prev_dt_to ,case when ver.agreement_version = iv.agreement_version then '' when ver.agreement_version IS NULL then 'new' else 'changed' end as change_type /*удалить услугу нельзя, можно только завершить ее оказание (после этого в более поздних версиях она должна стать незаметной)*/ ,COALESCE(iv.price*iv.quantity,0) - COALESCE(ver.price*ver.quantity,0) as cost_diff from specification_item_version iv join specification_item i on (iv.specification_item_uid=i.specification_item_uid) join pricing_model p on (i.pricing_model_id=p.pricing_model_id) join specification s on (i.specification_id=s.specification_id) join contract d on (s.contract_id=d.contract_id) join contragent k on (d.contragent_id=k.contragent_id) left outer join svc on (i.svc_id=svc.svc_id) left outer 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 (iv.specification_item_uid=ver.specification_item_uid AND ver.specification_id=s.specification_id) /*а тут не будет замножения впр*/ where s.contract_id= AND iv.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=i.specification_item_uid AND iiv.agreement_version <= ) order by i.specification_id select sum(cost) as cost from qItem

Строки спецификаций (#qItem.recordCount#) (все суммы без вероятности)

Специф-я Договор Контрагент Стабильный ключ строки Код услуги Услуга Имя для печати Модель Версия Дата с Дата по Кол-во Цена Стоимость   Прошлая версия Прошлая дата с Прошлая дата по Прошлое кол-во Прошлая цена Изменение Прибавка стоимости
"edit""view"> #specification# #contract# #dateFormat(dt_contract,'DD.MM.YYYY')# #contragent# #specification_item_uid# #code# #svc# #specification_item_version# #pricing_model_short# #agreement_version# #dateFormat(dt_from,'DD.MM.YYYY')# #dateFormat(dt_to,'DD.MM.YYYY')# #quantity# #price# #cost# #prev_version# #dateFormat(prev_dt_from,'DD.MM.YYYY')# #dateFormat(prev_dt_to,'DD.MM.YYYY')# #prev_quantity# #prev_price# #change_type# #cost_diff#
#cost#