Защита рецептов: SQL DEPO/SPECTRE/QUIK вынесен в пакет fsql под garble
Реализация варианта B из аудита защиты знаний. Прямой garble всего bj-server ломает html/template (он обращается к полям структур по имени, garble их переименовывает). Решение — селективная обфускация: GOGARBLE обфусцирует ТОЛЬКО пакет с секретами, шаблоны и обработчики не затрагиваются. 95 SQL-запросов к DEPO/SPECTRE/QUIK и трансферным таблицам FTV_M2M вынесены из lkgateway в отдельный пакет internal/lkgateway/fsql как переменные (именно var, не const: const компилятор вставил бы обратно в необфусцируемый пакет, и шифрование бы не сработало — проверено). Сами обработчики, типы и параметры sql.Named остались на месте; пакет держит только строки запросов. build-release.sh собирает bj-server с `GOGARBLE=.../fsql garble -literals` (нужен отдельный SDK go1.26 — модуль-кэшный тулчейн garble не подходит); если garble/go1.26 не найдены — обычная сборка с предупреждением. Проверено на реальном garble-бинаре (запускается, /admin и страницы на структурах работают): рецепт чтения чужих систем из бинаря исчез — OD_RESTS 13→0, OD_WIRING 5→0, OD_TURNS 1→0, OD_BALANCES 3→0, D_B_CONTRACTS 1→0, OD_CLIENTS_PORTS 10→0, DepoLimits/MoneyLimits →0. Остаток FTV_M2M — упоминания имён таблиц в операторских embed-шаблонах и логах, не сам рецепт. Стенд собран обычной сборкой (без garble) — трассировки остаются читаемыми. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
package fsql
|
||||
|
||||
// fsql — SQL-запросы к учётным системам DEPO и SPECTRE и к экспорту QUIK,
|
||||
// вынесенные из lkgateway отдельным пакетом. В релизной сборке этот пакет
|
||||
// (и только он) обфусцируется garble: строки запросов шифруются и в бинаре
|
||||
// не читаются `strings`. Именно здесь лежит знание о чужих схемах (какие
|
||||
// таблицы, связи и столбцы), которое дороже всего восстанавливать.
|
||||
//
|
||||
// ВАЖНО: только var, не const — константу компилятор вставил бы в
|
||||
// вызывающий (необфусцированный) пакет, и шифрование бы не сработало.
|
||||
// Запросы — data-only: параметры передаются через sql.Named на месте вызова.
|
||||
|
||||
var Arch01 = `SELECT r.ID, b.NUM_S, ISNULL(b.SYS_NAME,''), b.NUM_1, ISNULL(r.REG_2,0), ISNULL(r.VALUE_ID,0),
|
||||
CAST(ISNULL(r.A,0) AS float), CAST(ISNULL(r.D,0) AS float), CAST(ISNULL(r.EQ_D,0) AS float),
|
||||
ISNULL(vs.ISIN,''), ISNULL(vs.NAME,''), ISNULL(vc.SYSNAME,''), ISNULL(sh.CLASS,0), CAST(ISNULL(sh.NOMINAL,0) AS float)
|
||||
FROM OD_RESTS r JOIN OD_BALANCES b ON b.ID = r.BAL_ACC
|
||||
LEFT JOIN OD_VALUES vs ON vs.ID = r.REG_2
|
||||
LEFT JOIN OD_VALUES vc ON vc.ID = r.VALUE_ID
|
||||
LEFT JOIN OD_SHARES sh ON sh.ID = r.REG_2
|
||||
WHERE r.REG_3 = @c AND b.IS_BAL = 1 AND b.PART = 39 AND b.NUM_1 IN (50,51,52,55,58)
|
||||
ORDER BY b.NUM_1, vs.NAME`
|
||||
|
||||
var Arch02 = `SELECT REST,
|
||||
CAST(SUM(CASE WHEN TYPE_ = 1 THEN AMOUNT_ ELSE -AMOUNT_ END) AS float),
|
||||
CAST(SUM(CASE WHEN TYPE_ = 1 THEN VALUE_ ELSE -VALUE_ END) AS float),
|
||||
CAST(SUM(CASE WHEN TYPE_ = 1 THEN EQ_ ELSE -EQ_ END) AS float)
|
||||
FROM OD_TURNS WHERE REST IN (%s) AND WIRDATE >= @d AND IS_PLAN = 'F' AND YEAR(WIRDATE) < 9000
|
||||
GROUP BY REST`
|
||||
|
||||
var Arch03 = `SELECT MAX(R_DATE) FROM OD_DOCS WHERE YEAR(R_DATE) < 9000`
|
||||
|
||||
var Arch04 = `SELECT TOP 1 OFICDATE, CAST(RATE3 AS float), CAST(PFR_PRICE AS float), CAST(CLOSE_ AS float)
|
||||
FROM OD_VALUES_RATES WHERE VALUE_ID = @v AND OFICDATE <= @d AND (RATE3 > 0 OR PFR_PRICE > 0 OR CLOSE_ > 0)
|
||||
ORDER BY OFICDATE DESC`
|
||||
|
||||
var Arch05 = `SELECT TOP 1 CAST(RATE AS float) FROM OD_VALUES_RATES WHERE VALUE_ID = @v AND MARKET = 0 AND OFICDATE <= @d AND RATE > 0 ORDER BY OFICDATE DESC`
|
||||
|
||||
var Arch06 = `SELECT r.ID, b.NUM_1, ISNULL(b.SYS_NAME,'') FROM OD_RESTS r JOIN OD_BALANCES b ON b.ID = r.BAL_ACC
|
||||
WHERE r.REG_3 = @c AND b.PART = 39 AND ((b.NUM_1 = 58 AND b.SYS_NAME LIKE N'ПОРТФЕЛЬ%') OR b.NUM_1 IN (50,51,52,55))`
|
||||
|
||||
var Arch07 = `
|
||||
WITH w AS (
|
||||
SELECT wr.WIRDATE, wr.EQ_, wr.D_REST, wr.K_REST, wr.D_SUMMA, wr.K_SUMMA, wr.D_AMOUNT, wr.K_AMOUNT, wr.NAME,
|
||||
wr.D_REST AS sec_rest, wr.K_REST AS money_rest
|
||||
FROM OD_WIRING wr
|
||||
WHERE wr.D_REST IN (%[1]s) AND wr.IS_PLAN = 'F' AND YEAR(wr.WIRDATE) < 9000
|
||||
AND wr.WIRDATE >= @f AND wr.WIRDATE < @t AND (wr.D_AMOUNT <> 0 OR wr.K_AMOUNT <> 0)
|
||||
UNION ALL
|
||||
SELECT wr.WIRDATE, wr.EQ_, wr.D_REST, wr.K_REST, wr.D_SUMMA, wr.K_SUMMA, wr.D_AMOUNT, wr.K_AMOUNT, wr.NAME,
|
||||
wr.K_REST, wr.D_REST
|
||||
FROM OD_WIRING wr
|
||||
WHERE wr.K_REST IN (%[1]s) AND wr.D_REST NOT IN (%[1]s) AND wr.IS_PLAN = 'F' AND YEAR(wr.WIRDATE) < 9000
|
||||
AND wr.WIRDATE >= @f AND wr.WIRDATE < @t AND (wr.D_AMOUNT <> 0 OR wr.K_AMOUNT <> 0))
|
||||
SELECT w.WIRDATE, CAST(ISNULL(w.EQ_,0) AS float), w.D_REST, w.K_REST,
|
||||
CAST(ISNULL(w.D_SUMMA,0) AS float), CAST(ISNULL(w.K_SUMMA,0) AS float),
|
||||
CAST(ISNULL(w.D_AMOUNT,0) AS float), CAST(ISNULL(w.K_AMOUNT,0) AS float),
|
||||
ISNULL(w.NAME,''), ISNULL(sv.NAME,''), ISNULL(sv.ISIN,''), ISNULL(mv.SYSNAME,'')
|
||||
FROM w
|
||||
LEFT JOIN OD_RESTS sr ON sr.ID = w.sec_rest
|
||||
LEFT JOIN OD_VALUES sv ON sv.ID = sr.REG_2
|
||||
LEFT JOIN OD_RESTS mr ON mr.ID = w.money_rest
|
||||
LEFT JOIN OD_VALUES mv ON mv.ID = mr.VALUE_ID
|
||||
ORDER BY w.WIRDATE`
|
||||
|
||||
var Arch08 = `SELECT w.WIRDATE, CAST(ISNULL(w.EQ_,0) AS float), w.D_REST, w.K_REST,
|
||||
CAST(ISNULL(w.D_SUMMA,0) AS float), CAST(ISNULL(w.K_SUMMA,0) AS float), ISNULL(w.NAME,''), ISNULL(mv.SYSNAME,'')
|
||||
FROM OD_WIRING w
|
||||
JOIN OD_RESTS mr ON mr.ID = CASE WHEN w.D_REST IN (%[1]s) THEN w.D_REST ELSE w.K_REST END
|
||||
LEFT JOIN OD_VALUES mv ON mv.ID = mr.VALUE_ID
|
||||
WHERE (w.D_REST IN (%[1]s) OR w.K_REST IN (%[1]s)) AND w.IS_PLAN = 'F' AND YEAR(w.WIRDATE) < 9000
|
||||
AND w.WIRDATE >= @f AND w.WIRDATE < @t
|
||||
ORDER BY w.WIRDATE`
|
||||
|
||||
var Arch09 = `SELECT r.ID FROM OD_RESTS r JOIN OD_BALANCES b ON b.ID = r.BAL_ACC WHERE r.REG_3 = @c AND b.SYS_NAME = N'ВЫРУЧКА'`
|
||||
|
||||
var Arch10 = `
|
||||
WITH w AS (
|
||||
SELECT wr.WIRDATE, wr.EQ_, wr.D_REST, wr.K_REST, wr.D_SUMMA, wr.K_SUMMA, wr.D_REST AS sec_rest
|
||||
FROM OD_WIRING wr
|
||||
WHERE wr.K_REST IN (%[1]s) AND wr.IS_PLAN = 'F' AND YEAR(wr.WIRDATE) < 9000
|
||||
AND wr.WIRDATE >= @f AND wr.WIRDATE < @t AND wr.EQ_ <> 0
|
||||
UNION ALL
|
||||
SELECT wr.WIRDATE, wr.EQ_, wr.D_REST, wr.K_REST, wr.D_SUMMA, wr.K_SUMMA, wr.K_REST
|
||||
FROM OD_WIRING wr
|
||||
WHERE wr.D_REST IN (%[1]s) AND wr.K_REST NOT IN (%[1]s) AND wr.IS_PLAN = 'F' AND YEAR(wr.WIRDATE) < 9000
|
||||
AND wr.WIRDATE >= @f AND wr.WIRDATE < @t AND wr.EQ_ <> 0)
|
||||
SELECT w.WIRDATE, CAST(ISNULL(w.EQ_,0) AS float), w.D_REST, w.K_REST,
|
||||
CAST(ISNULL(w.D_SUMMA,0) AS float), CAST(ISNULL(w.K_SUMMA,0) AS float), ISNULL(sv.ISIN,'')
|
||||
FROM w
|
||||
LEFT JOIN OD_RESTS sr ON sr.ID = w.sec_rest
|
||||
LEFT JOIN OD_VALUES sv ON sv.ID = sr.REG_2`
|
||||
@@ -0,0 +1,28 @@
|
||||
package fsql
|
||||
|
||||
var Chk01 = `SELECT TOP 1 ISNULL(NULLIF(SELF_ID,0),ID), ISNULL(NAME,''), DATE_BIRTH FROM OD_FACES WHERE REPLACE(ISNULL(DOC_SER,''),' ','')=@p1 AND DOC_NUM=@p2
|
||||
ORDER BY ISNULL(LAST_FLAG,0) DESC, ID DESC`
|
||||
|
||||
var Chk02 = `SELECT ID, ISNULL(NUMBER,''), ISNULL(STATE,-1), D_CLOSE FROM OD_CLIENTS WHERE FACE=@p1 AND NUMBER LIKE N'ВТНКЦ%' ORDER BY ID`
|
||||
|
||||
var Chk03 = `SELECT TOP 1 CAST(o.VAL AS varchar(20)) FROM OD_OPTIONS o
|
||||
JOIN OP_FIELDS f ON f.ID = o.DESCR AND f.AS_NAME = 'IS_QUAL'
|
||||
WHERE o.OBJECT = @p1 AND o.B_DATE <= GETDATE() AND (o.E_DATE IS NULL OR o.E_DATE > GETDATE())
|
||||
ORDER BY o.B_DATE DESC`
|
||||
|
||||
var Chk04 = `SELECT ISNULL(PORT_NUM,'') FROM OD_CLIENTS_PORTS WHERE CLIENT=@p1`
|
||||
|
||||
var Chk05 = `SELECT TOP 1 ID, ISNULL(NAME,''), IS_IN FROM OD_VALUES WHERE ISIN=@p1`
|
||||
|
||||
var Chk06 = `SELECT TOP 1 CAST(o.VAL AS varchar(20)) FROM OD_OPTIONS o
|
||||
JOIN OP_FIELDS f ON f.ID = o.DESCR AND f.AS_NAME = 'RESTRICTED'
|
||||
WHERE o.OBJECT = @p1 AND o.B_DATE <= GETDATE() AND (o.E_DATE IS NULL OR o.E_DATE > GETDATE())
|
||||
ORDER BY o.B_DATE DESC`
|
||||
|
||||
var Chk07 = `SELECT TOP 1 r.BLOCK_DATE, r.BLOCK_REASON, r.BAL_ACC, CAST(r.K AS float)
|
||||
FROM OD_RESTS r WHERE r.VALUE_ID=@p1 AND r.REG_1=@p2
|
||||
ORDER BY CASE WHEN r.BLOCK_DATE IS NOT NULL THEN 0 WHEN r.BAL_ACC IN (837,3410,4342,5647) AND CAST(r.K AS float)<>0 THEN 1 ELSE 2 END`
|
||||
|
||||
var Chk08 = `SELECT TOP 1 ID, ISNULL(STATE,-1), D_CLOSE FROM OD_CLIENTS WHERE FACE=@p1 AND UPPER(NUMBER)=@p2 ORDER BY ID`
|
||||
|
||||
var Chk09 = `SELECT ISNULL(SUM(CAST(K AS float)),0) FROM OD_RESTS WHERE VALUE_ID=@p1 AND REG_1=@p2 AND BAL_ACC=@p3`
|
||||
@@ -0,0 +1,10 @@
|
||||
package fsql
|
||||
|
||||
var Sim01 = `SELECT TOP 25 ISNULL(f.NAME,''), ISNULL(f.DOC_SER,''), ISNULL(f.DOC_NUM,''), ISNULL(c.NUMBER,'')
|
||||
FROM OD_FACES f JOIN OD_CLIENTS c ON c.FACE=f.ID
|
||||
WHERE c.NUMBER LIKE N'ВТНКЦ%' AND c.STATE=0 AND c.D_CLOSE IS NULL
|
||||
AND LEN(ISNULL(f.DOC_SER,''))>0 AND LEN(ISNULL(f.DOC_NUM,''))>0
|
||||
ORDER BY f.NAME`
|
||||
|
||||
var Sim02 = `SELECT TOP 20 ISNULL(ISIN,''), ISNULL(NAME,'') FROM OD_VALUES
|
||||
WHERE V_TYPE=2 AND IS_IN=1 AND ISIN LIKE 'RU%' ORDER BY NAME`
|
||||
@@ -0,0 +1,19 @@
|
||||
package fsql
|
||||
|
||||
var Dp01 = `SELECT p.PORT_NUM, ISNULL(c.NUMBER,''), ISNULL(v.ISIN,''), ISNULL(v.NAME,''),
|
||||
CAST(rst.K AS float), ISNULL(rst.BLOCK_REASON,''), ISNULL(rst.BAL_ACC,0)
|
||||
FROM OD_RESTS rst
|
||||
JOIN OD_CLIENTS c ON c.ID = rst.REG_1
|
||||
JOIN OD_CLIENTS_PORTS p ON p.CLIENT = c.ID
|
||||
JOIN OD_VALUES v ON v.ID = rst.VALUE_ID AND v.V_TYPE = 2
|
||||
WHERE (p.PORT_NUM = @p1 OR p.PORT_NUM LIKE @p2)
|
||||
AND CAST(rst.K AS float) <> 0
|
||||
ORDER BY v.NAME`
|
||||
|
||||
var Dp02 = `SELECT TOP (%d) p.PORT_NUM, COUNT(DISTINCT rst.VALUE_ID)
|
||||
FROM OD_CLIENTS_PORTS p
|
||||
JOIN OD_CLIENTS c ON c.ID = p.CLIENT
|
||||
JOIN OD_RESTS rst ON rst.REG_1 = c.ID
|
||||
JOIN OD_VALUES v ON v.ID = rst.VALUE_ID AND v.V_TYPE = 2
|
||||
WHERE CAST(rst.K AS float) <> 0 AND (@p1 = '' OR p.PORT_NUM LIKE @p2)
|
||||
GROUP BY p.PORT_NUM ORDER BY p.PORT_NUM`
|
||||
@@ -0,0 +1,7 @@
|
||||
package fsql
|
||||
|
||||
var QDb01 = "SELECT TOP 1 PORT_NUM FROM OD_CLIENTS_PORTS WHERE PORT_NUM=@p1 OR PORT_NUM LIKE @p2"
|
||||
|
||||
var QDb02 = "SELECT DISTINCT TOP (%d) PORT_NUM FROM OD_CLIENTS_PORTS WHERE PORT_NUM LIKE @p1 ORDER BY PORT_NUM"
|
||||
|
||||
var QDb03 = "SELECT DISTINCT TOP (5000) PORT_NUM FROM OD_CLIENTS_PORTS WHERE PORT_NUM <> '' ORDER BY PORT_NUM"
|
||||
@@ -0,0 +1,31 @@
|
||||
package fsql
|
||||
|
||||
var Ev01 = `INSERT INTO dbo.FTV_M2M_EVENTS (GUID, REFERENCE, EVENT_TYPE, EVENT_DATE, M2M_REJECT_CODE) VALUES (@g, @r, @t, @at, @c)`
|
||||
|
||||
var Ev02 = `INSERT INTO dbo.FTV_M2M_EVENTS (GUID, REFERENCE, EVENT_TYPE, EVENT_DATE, M2M_REJECT_CODE, PARAMETERS) VALUES (@g, @r, @t, @at, @c, @p)`
|
||||
|
||||
var Ev03 = `SELECT TOP 1 c.NUMBER FROM OD_FACES f
|
||||
JOIN OD_CLIENTS c ON c.FACE=f.ID LEFT JOIN OD_CLIENTS_PORTS p ON p.CLIENT=c.ID
|
||||
WHERE REPLACE(f.DOC_SER,' ','')=@s AND f.DOC_NUM=@n AND c.NUMBER LIKE N'ВТНКЦ%' AND c.STATE=0 AND c.D_CLOSE IS NULL
|
||||
ORDER BY ISNULL(p.PORT_DATE,'2099-01-01'), ISNULL(c.D_OPEN,'2099-01-01'), c.NUMBER`
|
||||
|
||||
var Ev04 = `INSERT INTO dbo.FTV_M2M (GUID, DIRECTION, CONTRAGENT_M2M_CODE, DEPONENT_NAME, DEPONENT_DOC) VALUES (@g, @d, @cp, @nm, @doc)`
|
||||
|
||||
var Ev05 = `INSERT INTO dbo.FTV_M2M (GUID, DIRECTION, CONTRAGENT_M2M_CODE, DEPONENT_NAME, DEPONENT_DOC, DEPONENT_ID) VALUES (@g, @d, @cp, @nm, @doc, @did)`
|
||||
|
||||
var Ev06 = `INSERT INTO dbo.FTV_M2M_LINES (`
|
||||
|
||||
var Ev07 = `SELECT TOP 200 CAST(m.GUID AS varchar(36)), ISNULL(m.STATE,''), ISNULL(`
|
||||
|
||||
var Ev08 = `,''), ISNULL(m.COMMENT,''),
|
||||
ISNULL((SELECT TOP 1 ISNULL(l.COMMENT,'') FROM dbo.FTV_M2M_LINES l WHERE l.GUID=m.GUID AND ISNULL(l.STATE,'')='ERROR'),''),
|
||||
ISNULL((SELECT TOP 1 ISNULL(st.NAME,'') FROM OD_DOCS d LEFT JOIN OD_DOC_STATES st ON st.ID=d.STATE AND st.D_CAT=0 WHERE CAST(d.ID AS varchar(32))=`
|
||||
|
||||
var Ev09 = `),''),
|
||||
(SELECT TOP 1 d.PROC_DATE FROM OD_DOCS d WHERE CAST(d.ID AS varchar(32))=`
|
||||
|
||||
var Ev10 = `INSERT INTO dbo.FTV_M2M_HANDBOOK (INN, PARTICIPANT_CODE, KIND, NAME_FULL, NAME_SHORT, NAME_DISPLAY, NAME_ENG, HANDBOOK_AT, UPDATED_AT, ACTIVE)
|
||||
VALUES (@inn, @code, @kind, @full, @short, @disp, @eng, @at, GETDATE(), 1)`
|
||||
|
||||
var Ev11 = `SELECT TOP 1 f.NAME FROM OD_FACES f JOIN OD_CLIENTS c ON c.FACE=f.ID
|
||||
WHERE REPLACE(f.DOC_SER,' ','')=@s AND f.DOC_NUM=@n AND c.NUMBER LIKE N'ВТНКЦ%' AND c.STATE=0`
|
||||
@@ -0,0 +1,17 @@
|
||||
package fsql
|
||||
|
||||
var QEv01 = "SELECT COUNT(*) FROM dbo.FTV_M2M_EVENTS WHERE GUID=@g AND ISNULL(REFERENCE,'')=@r AND EVENT_TYPE=@t"
|
||||
|
||||
var QEv02 = "SELECT COUNT(*) FROM dbo.FTV_M2M WHERE GUID=@g"
|
||||
|
||||
var QEv03 = "SELECT TOP 1 SELF_ID FROM OD_FACES WHERE REPLACE(DOC_SER,' ','')=@s AND DOC_NUM=@n ORDER BY ID"
|
||||
|
||||
var QEv04 = "SELECT TOP 1 ID FROM OD_VALUES WHERE ISIN=@i ORDER BY ID"
|
||||
|
||||
var QEv05 = "DELETE FROM dbo.FTV_M2M_HANDBOOK"
|
||||
|
||||
var QEv06 = "INSERT INTO dbo.FTV_M2M_EVENTS (GUID, REFERENCE, EVENT_TYPE, EVENT_DATE) VALUES (@g, NULL, 'BJ_PING', GETDATE())"
|
||||
|
||||
var QEv07 = "DELETE FROM dbo.FTV_M2M_EVENTS WHERE GUID=@g"
|
||||
|
||||
var QEv08 = "SELECT ISNULL(STATE,'') FROM dbo.FTV_M2M_EVENTS WHERE GUID=@g"
|
||||
@@ -0,0 +1,13 @@
|
||||
package fsql
|
||||
|
||||
var Hlth01 = `SELECT TOP (@n) * FROM (
|
||||
SELECT 'FTV_M2M' AS T, ID, CAST(GUID AS varchar(36)) AS G, '' AS R, ISNULL(DIRECTION,'') AS K, ISNULL(TimeEnd, TimeNew) AS A, ISNULL(COMMENT,'') AS C
|
||||
FROM dbo.FTV_M2M WHERE STATE='ERROR' AND ISNULL(TimeEnd, TimeNew) > DATEADD(day, -@d, GETDATE())
|
||||
UNION ALL
|
||||
SELECT 'FTV_M2M_EVENTS', ID, CAST(GUID AS varchar(36)), ISNULL(REFERENCE,''), EVENT_TYPE, ISNULL(TimeEnd, TimeNew), ISNULL(COMMENT,'')
|
||||
FROM dbo.FTV_M2M_EVENTS WHERE STATE='ERROR' AND EVENT_TYPE LIKE 'BJ[_]%' AND ISNULL(TimeEnd, TimeNew) > DATEADD(day, -@d, GETDATE())
|
||||
) x ORDER BY A DESC`
|
||||
|
||||
var Hlth02 = `SELECT COUNT(*) OVER (), ID, EVENT_TYPE, CAST(GUID AS varchar(36)), ISNULL(COMMENT,'')
|
||||
FROM dbo.FTV_M2M_EVENTS WHERE STATE='ERROR' AND EVENT_TYPE LIKE 'BJ[_]%' AND ID > @last AND ISNULL(TimeEnd, TimeNew) > DATEADD(day, -1, GETDATE())
|
||||
ORDER BY ID DESC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY`
|
||||
@@ -0,0 +1,7 @@
|
||||
package fsql
|
||||
|
||||
var QHl01 = "UPDATE dbo.FTV_M2M SET STATE='TODO', TimeBeg=NULL, TimeEnd=NULL, COMMENT=@c WHERE ID=@id AND STATE='ERROR'"
|
||||
|
||||
var QHl02 = "UPDATE dbo.FTV_M2M_EVENTS SET STATE='TODO', TimeBeg=NULL, TimeEnd=NULL, COMMENT=@c WHERE ID=@id AND STATE='ERROR'"
|
||||
|
||||
var QHl03 = "UPDATE dbo.FTV_M2M_LINES SET STATE='TODO', TimeBeg=NULL, TimeEnd=NULL WHERE GUID=@g AND STATE='ERROR'"
|
||||
@@ -0,0 +1,13 @@
|
||||
package fsql
|
||||
|
||||
var Que01 = `SELECT TOP (@n) CAST(m.GUID AS varchar(36)), ISNULL(m.STATE,''), ISNULL(m.DIRECTION,''), ISNULL(m.DEPONENT_NAME,''), ISNULL(m.DEPONENT_DOC,''), ISNULL(m.CONTRAGENT_M2M_CODE,''), `
|
||||
|
||||
var Que02 = `,''), ISNULL(m.COMMENT,''),
|
||||
ISNULL((SELECT TOP 1 ISNULL(st.NAME,'') FROM OD_DOCS d LEFT JOIN OD_DOC_STATES st ON st.ID=d.STATE AND st.D_CAT=0 WHERE CAST(d.ID AS varchar(32))=`
|
||||
|
||||
var Que03 = `),''),
|
||||
(SELECT TOP 1 d.PROC_DATE FROM OD_DOCS d WHERE CAST(d.ID AS varchar(32))=`
|
||||
|
||||
var Que04 = `SELECT CAST(l.GUID AS varchar(36)), ISNULL(l.ISIN,''), ISNULL(l.SEC_CODE,''), ISNULL(CAST(l.AMOUNT AS varchar(40)),''), ISNULL(l.STATE,''), ISNULL(l.COMMENT,'') FROM dbo.FTV_M2M_LINES l WHERE l.GUID IN (SELECT TOP (@n) GUID FROM dbo.FTV_M2M ORDER BY `
|
||||
|
||||
var Que05 = `SELECT CAST(e.GUID AS varchar(36)), ISNULL(e.REFERENCE,''), ISNULL(e.STATE,''), ISNULL(e.EVENT_TYPE,''), e.EVENT_DATE, ISNULL(e.M2M_REJECT_CODE,''), ISNULL(e.COMMENT,'') FROM dbo.FTV_M2M_EVENTS e WHERE e.GUID IN (SELECT TOP (@n) GUID FROM dbo.FTV_M2M ORDER BY `
|
||||
@@ -0,0 +1,5 @@
|
||||
package fsql
|
||||
|
||||
var QQu01 = "SELECT count(*) FROM dbo.FTV_M2M_HANDBOOK"
|
||||
|
||||
var QQu02 = "SELECT max(HANDBOOK_AT) FROM dbo.FTV_M2M_HANDBOOK"
|
||||
@@ -0,0 +1,5 @@
|
||||
package fsql
|
||||
|
||||
var Tbl01 = `GRANT SELECT ON ALL TABLES IN SCHEMA public TO "%s"`
|
||||
|
||||
var Tbl02 = `GRANT SELECT, INSERT, UPDATE, DELETE ON %s TO "%s"`
|
||||
@@ -0,0 +1,3 @@
|
||||
package fsql
|
||||
|
||||
var QTb01 = "-- Кроме того, логину bj нужно право SELECT на учётные таблицы DEPO (OD_CLIENTS, OD_CLIENTS_PORTS, OD_RESTS, OD_VALUES и др.) для сверки переводов.\n"
|
||||
@@ -0,0 +1,3 @@
|
||||
package fsql
|
||||
|
||||
var QIn01 = "SELECT CAST(DOC AS varchar(32)) FROM dbo.FTV_M2M WHERE GUID=@g"
|
||||
@@ -0,0 +1,4 @@
|
||||
package fsql
|
||||
|
||||
var Cl01 = `SELECT TOP 1 DOC, INVESTOR, NAME, C_OPEN, C_CLOSE, C_STATE FROM D_B_CONTRACTS
|
||||
WHERE UPPER(NAME) = @n OR UPPER(NAME) LIKE @n + ' %' ORDER BY C_STATE DESC, DOC DESC`
|
||||
@@ -0,0 +1,35 @@
|
||||
package fsql
|
||||
|
||||
var Doc01 = `SELECT TOP 40 ISNULL(a.KD_TYPE,''), ISNULL(v.ISIN,''), ISNULL(v.NAME,''), a.FIX_DATE, a.OPER_DATE, ISNULL(a.OFFER_NAME,'')
|
||||
FROM U_CA_ACTS a JOIN OD_VALUES v ON v.ID = a.SHARE
|
||||
WHERE UPPER(v.ISIN) IN (%s)
|
||||
AND ISNULL(a.FIX_DATE, a.OPER_DATE) >= DATEADD(month, -1, GETDATE())
|
||||
ORDER BY ISNULL(a.FIX_DATE, a.OPER_DATE)`
|
||||
|
||||
var Doc02 = `
|
||||
CREATE TABLE IF NOT EXISTS lk.doc_requests (
|
||||
id bigserial PRIMARY KEY,
|
||||
created_at timestamptz NOT NULL DEFAULT now(),
|
||||
contract_number text NOT NULL,
|
||||
client_name text,
|
||||
kind text NOT NULL,
|
||||
period_from date,
|
||||
period_to date,
|
||||
account text,
|
||||
comment text,
|
||||
status text NOT NULL DEFAULT 'new',
|
||||
staff_note text,
|
||||
done_at timestamptz
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS ix_lk_doc_requests_contract ON lk.doc_requests (contract_number, created_at DESC);
|
||||
`
|
||||
|
||||
var Doc03 = `INSERT INTO lk.doc_requests (contract_number, client_name, kind, period_from, period_to, account, comment)
|
||||
VALUES ($1,$2,$3,$4,$5,$6,$7)`
|
||||
|
||||
var Doc04 = `SELECT id, created_at, kind, period_from, period_to, COALESCE(account,''), status, COALESCE(staff_note,'')
|
||||
FROM lk.doc_requests WHERE contract_number=$1 ORDER BY created_at DESC LIMIT 50`
|
||||
|
||||
var Doc05 = `SELECT TOP 30 d.R_DATE, ISNULL(d.NUM,''), e.B_DATE, e.E_DATE, e.DEPO, d.STATE, ISNULL(e.IS_TURNS,0)
|
||||
FROM U_OP_INF_EXTRACT e JOIN OD_DOCS d ON d.ID = e.DOC
|
||||
WHERE e.DEPO IN (%s) ORDER BY d.R_DATE DESC`
|
||||
@@ -0,0 +1,7 @@
|
||||
package fsql
|
||||
|
||||
var Flow01 = `SELECT ISNULL(`
|
||||
|
||||
var Flow02 = `,''), ISNULL(m.STATE,''), ISNULL(m.COMMENT,''),
|
||||
ISNULL((SELECT TOP 1 ISNULL(l.COMMENT,'') FROM dbo.FTV_M2M_LINES l WHERE l.GUID=m.GUID AND ISNULL(l.STATE,'')='ERROR'),'')
|
||||
FROM dbo.FTV_M2M m WHERE m.GUID=@g`
|
||||
@@ -0,0 +1,3 @@
|
||||
package fsql
|
||||
|
||||
var QFl01 = "SELECT ISNULL(STATE,''), ISNULL(COMMENT,'') FROM dbo.FTV_M2M_EVENTS WHERE GUID=@g AND EVENT_TYPE='BJ_GATEWAY_REJECT'"
|
||||
@@ -0,0 +1,6 @@
|
||||
package fsql
|
||||
|
||||
var Fx01 = `SELECT UPPER(LTRIM(RTRIM(v.SYSNAME))), r.OFICDATE, CAST(r.RATE AS float)
|
||||
FROM OD_VALUES_RATES r JOIN OD_VALUES v ON v.ID = r.VALUE_ID
|
||||
WHERE v.V_TYPE = 1 AND r.MARKET = 0 AND r.RATE > 0
|
||||
AND r.OFICDATE = (SELECT MAX(x.OFICDATE) FROM OD_VALUES_RATES x WHERE x.VALUE_ID = r.VALUE_ID AND x.MARKET = 0 AND x.RATE > 0)`
|
||||
@@ -0,0 +1,47 @@
|
||||
package fsql
|
||||
|
||||
var Hist01 = `SELECT DISTINCT c.ID, ISNULL(c.NUMBER,''), ISNULL(c.FACE,0)
|
||||
FROM OD_CLIENTS c JOIN OD_CLIENTS_PORTS p ON p.CLIENT = c.ID
|
||||
WHERE p.PORT_NUM = @p1 OR p.PORT_NUM LIKE @p2`
|
||||
|
||||
var Hist02 = `SELECT TOP %d * FROM (
|
||||
SELECT d.R_DATE AS RD, d.PROC_DATE AS PD, ISNULL(d.NUM,'') AS NUM, d.STATE AS ST, N'зачисление' AS KIND,
|
||||
z.DEPO AS ACC, ISNULL(v.ISIN,'') AS ISIN, ISNULL(v.NAME,'') AS SEC, CAST(ISNULL(z.AMOUNT,0) AS float) AS QTY,
|
||||
LTRIM(RTRIM(ISNULL(z.COMMENT,'') + ' ' + ISNULL(z.REJECT_REASON,''))) AS NOTE
|
||||
FROM U_OP_INV_ZACH z JOIN OD_DOCS d ON d.ID = z.DOC LEFT JOIN OD_VALUES v ON v.ID = z.SHARE
|
||||
WHERE z.DEPO IN (%s)
|
||||
UNION ALL
|
||||
SELECT d.R_DATE, d.PROC_DATE, ISNULL(d.NUM,''), d.STATE, N'списание',
|
||||
p.DEPO, ISNULL(v.ISIN,''), ISNULL(v.NAME,''), -CAST(ISNULL(p.AMOUNT,0) AS float),
|
||||
LTRIM(RTRIM(ISNULL(p.COMMENT,'') + ' ' + ISNULL(p.REJECT_REASON,'')))
|
||||
FROM U_OP_INV_SPIS p JOIN OD_DOCS d ON d.ID = p.DOC LEFT JOIN OD_VALUES v ON v.ID = p.SHARE
|
||||
WHERE p.DEPO IN (%s)
|
||||
UNION ALL
|
||||
SELECT d.R_DATE, d.PROC_DATE, ISNULL(d.NUM,''), d.STATE, N'перевод: списание',
|
||||
t.D_DEPO, ISNULL(v.ISIN,''), ISNULL(v.NAME,''), -CAST(ISNULL(t.AMOUNT,0) AS float),
|
||||
LTRIM(RTRIM(ISNULL(t.COMMENT,'') + ' ' + ISNULL(t.REJECT_REASON,'')))
|
||||
FROM U_OP_INV_PEREVOD t JOIN OD_DOCS d ON d.ID = t.DOC LEFT JOIN OD_VALUES v ON v.ID = t.SHARE
|
||||
WHERE t.D_DEPO IN (%s)
|
||||
UNION ALL
|
||||
SELECT d.R_DATE, d.PROC_DATE, ISNULL(d.NUM,''), d.STATE, N'перевод: зачисление',
|
||||
t.K_DEPO, ISNULL(v.ISIN,''), ISNULL(v.NAME,''), CAST(ISNULL(t.AMOUNT,0) AS float),
|
||||
LTRIM(RTRIM(ISNULL(t.COMMENT,'') + ' ' + ISNULL(t.REJECT_REASON,'')))
|
||||
FROM U_OP_INV_PEREVOD t JOIN OD_DOCS d ON d.ID = t.DOC LEFT JOIN OD_VALUES v ON v.ID = t.SHARE
|
||||
WHERE t.K_DEPO IN (%s)) x
|
||||
WHERE x.RD >= @p1 AND x.RD < DATEADD(day, 1, @p2)
|
||||
ORDER BY x.RD DESC, x.NUM DESC`
|
||||
|
||||
var Hist03 = `SELECT TOP 200 h.P_DATE, h.INCOME_KIND, ISNULL(v.ISIN,''), ISNULL(v.NAME,''),
|
||||
CAST(ISNULL(l.AMOUNT,0) AS float), CAST(ISNULL(l.SUMMA_TOTAL,0) AS float),
|
||||
CAST(ISNULL(l.TAX_HOLDED,0) AS float), CAST(ISNULL(l.TOTAL_TO_PAY,0) AS float),
|
||||
ISNULL(l.STATUS,''), ISNULL(l.DEPO,0)
|
||||
FROM U_OP_INF_INCOME_DOL l
|
||||
JOIN OD_DOLS o ON o.ID = l.DOL
|
||||
JOIN U_OP_INF_INCOME h ON h.DOC = o.DOC
|
||||
LEFT JOIN OD_VALUES v ON v.ID = h.SHARE
|
||||
WHERE (l.DEPO IN (%s) OR l.INCOME_FACE = @p3)
|
||||
AND h.P_DATE >= @p1 AND h.P_DATE < DATEADD(day, 1, @p2)
|
||||
ORDER BY h.P_DATE DESC`
|
||||
|
||||
var Hist04 = `SELECT CAST(ISNULL(SUM(CAST(SUMMA AS float)),0) AS float) FROM OD_NDFL
|
||||
WHERE FACE = @p1 AND R_DATE >= @p2 AND R_DATE < DATEADD(day, 1, @p3)`
|
||||
@@ -0,0 +1,22 @@
|
||||
package fsql
|
||||
|
||||
var On01 = `
|
||||
WITH d AS (
|
||||
SELECT DISTINCT ON ("ClientCode","SecCode","Trdacc") "SecCode","CurrentBal","AwgPositionPrice","LoadDate"
|
||||
FROM "DepoLimits" WHERE "ClientCode" = ANY($1) AND "LimitKind"='T2'
|
||||
ORDER BY "ClientCode","SecCode","Trdacc","LoadDate" DESC)
|
||||
SELECT "SecCode", SUM("CurrentBal")::float8,
|
||||
COALESCE(SUM("CurrentBal"*"AwgPositionPrice")/NULLIF(SUM("CurrentBal"),0),0)::float8, MAX("LoadDate")
|
||||
FROM d WHERE "CurrentBal" <> 0 GROUP BY "SecCode" ORDER BY "SecCode"`
|
||||
|
||||
var On02 = `
|
||||
SELECT DISTINCT ON ("SecCode") "SecCode", upper(COALESCE("ISINCode",'')), COALESCE("SecShortName","SecName",''), "ClassCode", COALESCE("FaceValue",0)::float8
|
||||
FROM "Securities" WHERE "SecCode" = ANY($1)
|
||||
ORDER BY "SecCode", CASE "ClassCode" WHEN 'TQBR' THEN 1 WHEN 'TQOB' THEN 2 WHEN 'TQCB' THEN 3 WHEN 'TQTF' THEN 4 WHEN 'TQIF' THEN 5 WHEN 'TQRD' THEN 6 ELSE 9 END`
|
||||
|
||||
var On03 = `
|
||||
WITH m AS (
|
||||
SELECT DISTINCT ON ("ClientCode","CurrCode","Tag") "CurrCode","CurrentBal","LoadDate"
|
||||
FROM "MoneyLimits" WHERE "ClientCode" = ANY($1) AND "LimitKind"='T2'
|
||||
ORDER BY "ClientCode","CurrCode","Tag","LoadDate" DESC)
|
||||
SELECT "CurrCode", SUM("CurrentBal")::float8, MAX("LoadDate") FROM m GROUP BY "CurrCode" HAVING SUM("CurrentBal") <> 0 ORDER BY "CurrCode"`
|
||||
@@ -0,0 +1,22 @@
|
||||
package fsql
|
||||
|
||||
var Sn01 = `
|
||||
CREATE TABLE IF NOT EXISTS lk.portfolio_daily (
|
||||
day DATE NOT NULL, contract VARCHAR(64) NOT NULL,
|
||||
value DOUBLE PRECISION NOT NULL DEFAULT 0, cash DOUBLE PRECISION NOT NULL DEFAULT 0,
|
||||
positions INT NOT NULL DEFAULT 0, priced INT NOT NULL DEFAULT 0,
|
||||
source VARCHAR(16) NOT NULL DEFAULT 'quik', created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
PRIMARY KEY (day, contract))`
|
||||
|
||||
var Sn02 = `SELECT day, value, cash, positions FROM lk.portfolio_daily
|
||||
WHERE contract = $1 AND day >= current_date - $2::int ORDER BY day`
|
||||
|
||||
var Sn03 = `INSERT INTO lk.portfolio_daily(day, contract, value, cash, positions, priced, source)
|
||||
VALUES ($1,$2,$3,$4,$5,$6,$7)
|
||||
ON CONFLICT (day, contract) DO UPDATE SET value = EXCLUDED.value, cash = EXCLUDED.cash,
|
||||
positions = EXCLUDED.positions, priced = EXCLUDED.priced, source = EXCLUDED.source, created_at = now()`
|
||||
|
||||
var Sn04 = `SELECT DISTINCT "ClientCode" FROM "DepoLimits"
|
||||
WHERE "LimitKind" = 'T2' AND "CurrentBal" <> 0 AND "ClientCode" <> ''`
|
||||
|
||||
var Sn05 = `SELECT count(*) FROM lk.portfolio_daily WHERE day = $1`
|
||||
@@ -0,0 +1,17 @@
|
||||
package fsql
|
||||
|
||||
var Up01 = `SELECT UPPER(v.ISIN), ISNULL(c.P_DATE, c.E_DATE), CAST(ISNULL(c.SUMMA,0) AS float), CAST(ISNULL(c.PERCENT_,0) AS float)
|
||||
FROM OD_COUPONS c JOIN OD_VALUES v ON v.ID = c.SHARE
|
||||
WHERE UPPER(v.ISIN) IN (%s) AND ISNULL(c.P_DATE, c.E_DATE) >= @f AND ISNULL(c.P_DATE, c.E_DATE) <= @t`
|
||||
|
||||
var Up02 = `SELECT UPPER(v.ISIN), o.P_DATE, CAST(ISNULL(o.O_PRICE,0) AS float)
|
||||
FROM OD_OFFERS o JOIN OD_VALUES v ON v.ID = o.SHARE
|
||||
WHERE UPPER(v.ISIN) IN (%s) AND o.CANCEL_DATE IS NULL AND o.P_DATE >= @f AND o.P_DATE <= @t`
|
||||
|
||||
var Up03 = `SELECT UPPER(v.ISIN), sh.DEATHDATE, CAST(ISNULL(sh.NOMINAL,0) AS float)
|
||||
FROM OD_SHARES sh JOIN OD_VALUES v ON v.ID = sh.ID
|
||||
WHERE UPPER(v.ISIN) IN (%s) AND sh.E_DATE > GETDATE() AND sh.DEATHDATE >= @f AND sh.DEATHDATE <= @t`
|
||||
|
||||
var Up04 = `SELECT UPPER(v.ISIN), ISNULL(a.OPER_DATE, a.FIX_DATE)
|
||||
FROM U_CA_ACTS a JOIN OD_VALUES v ON v.ID = a.SHARE
|
||||
WHERE UPPER(v.ISIN) IN (%s) AND UPPER(ISNULL(a.KD_TYPE,'')) = 'DVCA' AND ISNULL(a.OPER_DATE, a.FIX_DATE) >= @f AND ISNULL(a.OPER_DATE, a.FIX_DATE) <= @t`
|
||||
@@ -0,0 +1,19 @@
|
||||
package fsql
|
||||
|
||||
var Man01 = `SELECT TOP 20 ISNULL(NULLIF(f.SELF_ID,0),f.ID), ISNULL(f.NAME,''), f.DATE_BIRTH, ISNULL(f.DOC_TYPE,0), ISNULL(f.DOC_SER,''), ISNULL(f.DOC_NUM,''),
|
||||
f.DOC_DAT, ISNULL(f.DOC_PLACE,''), ISNULL(f.DOC_CODE,''), ISNULL(f.PHONE,'')
|
||||
FROM OD_FACES f
|
||||
WHERE ISNULL(f.LAST_FLAG,1)=1 AND (UPPER(f.NAME) LIKE UPPER(@q) OR f.DOC_NUM=@d OR REPLACE(ISNULL(f.DOC_SER,''),' ','')+f.DOC_NUM=@d)
|
||||
AND EXISTS (SELECT 1 FROM OD_CLIENTS c WHERE c.FACE=ISNULL(NULLIF(f.SELF_ID,0),f.ID) AND c.NUMBER LIKE N'ВТНКЦ%' AND c.STATE=0 AND c.D_CLOSE IS NULL)
|
||||
ORDER BY f.NAME`
|
||||
|
||||
var Man02 = `SELECT c.ID, ISNULL(c.NUMBER,''),
|
||||
ISNULL((SELECT TOP 1 p.PORT_NUM FROM OD_CLIENTS_PORTS p WHERE p.CLIENT=c.ID ORDER BY p.PORT_DATE, p.PORT_NUM),'')
|
||||
FROM OD_CLIENTS c WHERE c.FACE=@f AND c.NUMBER LIKE N'ВТНКЦ%' AND c.STATE=0 AND c.D_CLOSE IS NULL ORDER BY c.ID`
|
||||
|
||||
var Man03 = `SELECT ISNULL(v.ISIN,''), ISNULL(v.NAME,''), SUM(CAST(r.K AS float))
|
||||
FROM OD_RESTS r JOIN OD_VALUES v ON v.ID=r.VALUE_ID
|
||||
WHERE r.REG_1=@c AND r.BAL_ACC=@b
|
||||
GROUP BY v.ISIN, v.NAME HAVING SUM(CAST(r.K AS float)) > 0 ORDER BY v.NAME`
|
||||
|
||||
var Man04 = `SELECT TOP 1 ID FROM OD_CLIENTS WHERE NUMBER=@n AND STATE=0 AND D_CLOSE IS NULL ORDER BY ID`
|
||||
@@ -0,0 +1,13 @@
|
||||
package fsql
|
||||
|
||||
var Pr01 = `
|
||||
SELECT DISTINCT ON (s."ISINCode")
|
||||
upper(s."ISINCode"), s."ClassCode", COALESCE(s."SecShortName", s."SecName", ''),
|
||||
COALESCE(p.last, 0)::float8, COALESCE(p.prevprice, 0)::float8,
|
||||
COALESCE(s."FaceValue", 0)::float8, COALESCE(p.accruedint, 0)::float8, COALESCE(s."FaceUnit", '')
|
||||
FROM "Securities" s JOIN "Params" p ON p."SecCode" = s."SecCode" AND p."ClassCode" = s."ClassCode"
|
||||
WHERE s."ISINCode" <> '' AND (p.last > 0 OR p.prevprice > 0)
|
||||
ORDER BY s."ISINCode",
|
||||
CASE s."ClassCode" WHEN 'TQBR' THEN 1 WHEN 'TQOB' THEN 2 WHEN 'TQCB' THEN 3
|
||||
WHEN 'TQTF' THEN 4 WHEN 'TQIF' THEN 5 WHEN 'TQRD' THEN 6 ELSE 9 END,
|
||||
p.last DESC`
|
||||
@@ -0,0 +1,9 @@
|
||||
package fsql
|
||||
|
||||
var Qk01 = `SELECT ic.ClassCode, sec.SecCode FROM ISecurities sec JOIN IClasses ic ON ic.ClassId=sec.ClassId
|
||||
WHERE sec.Enable=1 AND ic.ClassCode IN ('INSTRINM2M','INSTROUTM2M') ORDER BY sec.SecurityId`
|
||||
|
||||
var Qk02 = `SELECT TOP 5 p.PORT_NUM FROM OD_FACES f
|
||||
JOIN OD_CLIENTS c ON c.FACE=f.ID JOIN OD_CLIENTS_PORTS p ON p.CLIENT=c.ID
|
||||
WHERE REPLACE(f.DOC_SER,' ','')=@p1 AND f.DOC_NUM=@p2 AND c.NUMBER LIKE N'ВТНКЦ%' AND c.STATE=0
|
||||
ORDER BY ISNULL(p.PORT_DATE,'2099-01-01'), ISNULL(c.D_OPEN,'2099-01-01'), c.NUMBER`
|
||||
@@ -0,0 +1,16 @@
|
||||
package fsql
|
||||
|
||||
var Sec01 = `SELECT TOP 1 ID, ISNULL(NAME,''), ISNULL(CFI,''), V_TYPE, IS_IN FROM OD_VALUES WHERE ISIN=@p1 ORDER BY ID`
|
||||
|
||||
var Sec02 = `SELECT TOP 1 ISSUER, CAST(NOMINAL AS float), NUM_REG, DEATHDATE FROM OD_SHARES
|
||||
WHERE ID=@p1 AND E_DATE > GETDATE() ORDER BY B_DATE DESC`
|
||||
|
||||
var Sec03 = `SELECT TOP 1 ISNULL(NAME,'') FROM OD_FACES WHERE ID=@p1 OR SELF_ID=@p1 ORDER BY ISNULL(LAST_FLAG,0) DESC, ID DESC`
|
||||
|
||||
var Sec04 = `SELECT TOP 12 ISNULL(P_DATE, E_DATE) AS PAY_DATE, CAST(ISNULL(SUMMA,0) AS float),
|
||||
CAST(ISNULL(PERCENT_,0) AS float), FIX_DATE, ISNULL(IS_PAY,0)
|
||||
FROM OD_COUPONS WHERE SHARE=@p1 AND ISNULL(P_DATE, E_DATE) >= DATEADD(month,-3,GETDATE())
|
||||
ORDER BY PAY_DATE`
|
||||
|
||||
var Sec05 = `SELECT TOP 3 P_DATE, CAST(ISNULL(O_PRICE,0) AS float) FROM OD_OFFERS
|
||||
WHERE SHARE=@p1 AND CANCEL_DATE IS NULL AND P_DATE >= GETDATE() ORDER BY P_DATE`
|
||||
Reference in New Issue
Block a user